From 5f7d96c983a95526bc4e623c2fc93825e3e1ae43 Mon Sep 17 00:00:00 2001 From: Vladimir Ignatov Date: Thu, 5 Sep 2024 14:31:17 -0400 Subject: [PATCH] Add the "next" experiments --- dist/build/fhir-client.next.mjs | 2081 +++++++++++++++++ dist/lib/next/BrowserAdapter.d.ts | 60 + dist/lib/next/BrowserAdapter.js | 117 + dist/lib/next/BrowserStorage.d.ts | 6 + dist/lib/next/BrowserStorage.js | 23 + dist/lib/next/Client.d.ts | 179 ++ dist/lib/next/Client.js | 687 ++++++ dist/lib/next/NodeAdapter.d.ts | 40 + dist/lib/next/NodeAdapter.js | 88 + dist/lib/next/ServerStorage.d.ts | 8 + dist/lib/next/ServerStorage.js | 22 + dist/lib/next/browser.d.ts | 49 + dist/lib/next/browser.js | 264 +++ dist/lib/next/browser_entry.d.ts | 9 + dist/lib/next/browser_entry.js | 26 + dist/lib/next/isomorphic.d.ts | 173 ++ dist/lib/next/isomorphic.js | 548 +++++ dist/lib/next/server.d.ts | 16 + dist/lib/next/server.js | 50 + dist/lib/next/server_entry.d.ts | 6 + dist/lib/next/server_entry.js | 14 + dist/lib/next/settings.d.ts | 33 + dist/lib/next/settings.js | 120 + dist/lib/next/smart.d.ts | 80 + dist/lib/next/smart.js | 458 ++++ dist/lib/next/strings.d.ts | 7 + dist/lib/next/strings.js | 9 + docs/typedoc/assets/highlight.css | 8 +- docs/typedoc/assets/search.js | 2 +- docs/typedoc/classes/Client.default.html | 90 +- docs/typedoc/classes/HttpError.default.html | 12 +- .../adapters_BrowserAdapter.default.html | 28 +- .../classes/adapters_HapiAdapter.default.html | 32 +- .../classes/adapters_NodeAdapter.default.html | 28 +- .../classes/lib_BrowserAdapter.default.html | 32 - .../classes/lib_BrowserStorage.default.html | 11 - docs/typedoc/classes/lib_Client.default.html | 148 -- .../classes/lib_NodeAdapter.default.html | 58 - .../classes/lib_ServerStorage.default.html | 11 - .../storage_BrowserStorage.default.html | 8 +- .../storage_ServerStorage.default.html | 10 +- docs/typedoc/index.html | 2 +- .../interfaces/lib.fhirclient.Adapter.html | 26 - .../lib.fhirclient.AuthorizeParams.html | 110 - .../lib.fhirclient.BrowserFHIRSettings.html | 1 - .../lib.fhirclient.ClientInterface.html | 152 -- .../lib.fhirclient.ClientState.html | 63 - .../lib.fhirclient.CombinedFetchResult.html | 5 - .../interfaces/lib.fhirclient.ES384JWK.html | 1 - .../lib.fhirclient.FHIR.BackboneElement.html | 1 - .../lib.fhirclient.FHIR.Bundle.html | 11 - .../lib.fhirclient.FHIR.BundleEntry.html | 1 - .../lib.fhirclient.FHIR.BundleLink.html | 1 - ...b.fhirclient.FHIR.CapabilityStatement.html | 1 - .../lib.fhirclient.FHIR.CodeableConcept.html | 5 - .../lib.fhirclient.FHIR.Coding.html | 11 - .../lib.fhirclient.FHIR.Element.html | 1 - .../lib.fhirclient.FHIR.Encounter.html | 9 - .../lib.fhirclient.FHIR.Extension.html | 3 - .../lib.fhirclient.FHIR.Identifier.html | 11 - .../interfaces/lib.fhirclient.FHIR.Meta.html | 3 - .../lib.fhirclient.FHIR.Observation.html | 9 - .../lib.fhirclient.FHIR.Patient.html | 9 - .../lib.fhirclient.FHIR.Period.html | 5 - .../lib.fhirclient.FHIR.Practitioner.html | 9 - .../lib.fhirclient.FHIR.Reference.html | 7 - .../lib.fhirclient.FHIR.RelatedPerson.html | 9 - .../lib.fhirclient.FHIR.Resource.html | 9 - .../lib.fhirclient.FetchOptions.html | 33 - .../lib.fhirclient.FhirOptions.html | 96 - .../interfaces/lib.fhirclient.IDToken.html | 1 - .../lib.fhirclient.IncludeResponseHint.html | 1 - .../interfaces/lib.fhirclient.JsonObject.html | 1 - .../lib.fhirclient.JsonPatchAdd.html | 1 - .../lib.fhirclient.JsonPatchCopy.html | 1 - .../lib.fhirclient.JsonPatchMove.html | 1 - .../lib.fhirclient.JsonPatchRemove.html | 1 - .../lib.fhirclient.JsonPatchReplace.html | 1 - .../lib.fhirclient.JsonPatchTest.html | 1 - .../interfaces/lib.fhirclient.RS384JWK.html | 1 - .../lib.fhirclient.ReadyOptions.html | 1 - .../lib.fhirclient.RequestOptions.html | 38 - .../lib.fhirclient.RequestWithSession.html | 469 ---- .../interfaces/lib.fhirclient.SMART_API.html | 40 - .../interfaces/lib.fhirclient.Storage.html | 13 - .../lib.fhirclient.TokenResponse.html | 47 - .../interfaces/types.fhirclient.Adapter.html | 22 +- .../types.fhirclient.AuthorizeParams.html | 40 +- .../types.fhirclient.BrowserFHIRSettings.html | 2 +- .../types.fhirclient.ClientState.html | 40 +- .../types.fhirclient.CodeValue.html | 2 +- .../types.fhirclient.CombinedFetchResult.html | 2 +- .../interfaces/types.fhirclient.ES384JWK.html | 2 +- ...types.fhirclient.FHIR.BackboneElement.html | 2 +- .../types.fhirclient.FHIR.Bundle.html | 12 +- .../types.fhirclient.FHIR.BundleEntry.html | 2 +- .../types.fhirclient.FHIR.BundleLink.html | 2 +- ...s.fhirclient.FHIR.CapabilityStatement.html | 2 +- ...types.fhirclient.FHIR.CodeableConcept.html | 6 +- .../types.fhirclient.FHIR.Coding.html | 12 +- .../types.fhirclient.FHIR.Element.html | 2 +- .../types.fhirclient.FHIR.Encounter.html | 10 +- .../types.fhirclient.FHIR.Extension.html | 4 +- .../types.fhirclient.FHIR.Identifier.html | 12 +- .../types.fhirclient.FHIR.Meta.html | 4 +- .../types.fhirclient.FHIR.Observation.html | 10 +- .../types.fhirclient.FHIR.Patient.html | 10 +- .../types.fhirclient.FHIR.Period.html | 6 +- .../types.fhirclient.FHIR.Practitioner.html | 10 +- .../types.fhirclient.FHIR.Reference.html | 8 +- .../types.fhirclient.FHIR.RelatedPerson.html | 10 +- .../types.fhirclient.FHIR.Resource.html | 10 +- .../types.fhirclient.FetchOptions.html | 4 +- .../types.fhirclient.FhirOptions.html | 18 +- .../interfaces/types.fhirclient.IDToken.html | 2 +- .../types.fhirclient.IncludeResponseHint.html | 2 +- .../types.fhirclient.JsonObject.html | 2 +- .../types.fhirclient.JsonPatchAdd.html | 2 +- .../types.fhirclient.JsonPatchCopy.html | 2 +- .../types.fhirclient.JsonPatchMove.html | 2 +- .../types.fhirclient.JsonPatchRemove.html | 2 +- .../types.fhirclient.JsonPatchReplace.html | 2 +- .../types.fhirclient.JsonPatchTest.html | 2 +- ...es.fhirclient.OAuthSecurityExtensions.html | 10 +- .../types.fhirclient.ObservationMap.html | 2 +- .../interfaces/types.fhirclient.RS384JWK.html | 2 +- .../types.fhirclient.ReadyOptions.html | 2 +- .../types.fhirclient.RequestOptions.html | 6 +- .../types.fhirclient.RequestWithSession.html | 52 +- .../interfaces/types.fhirclient.SMART.html | 14 +- .../interfaces/types.fhirclient.Storage.html | 8 +- .../types.fhirclient.TokenResponse.html | 24 +- ...hirclient.WellKnownSmartConfiguration.html | 24 +- docs/typedoc/modules.html | 2 +- docs/typedoc/modules/Client.html | 2 +- docs/typedoc/modules/HttpError.html | 2 +- .../modules/adapters_BrowserAdapter.html | 2 +- .../typedoc/modules/adapters_HapiAdapter.html | 2 +- .../typedoc/modules/adapters_NodeAdapter.html | 2 +- docs/typedoc/modules/base64_browser.html | 2 +- docs/typedoc/modules/debug.html | 2 +- docs/typedoc/modules/entry_browser.html | 14 +- docs/typedoc/modules/entry_hapi.html | 2 +- docs/typedoc/modules/entry_node.html | 2 +- docs/typedoc/modules/lib.fhirclient.FHIR.html | 51 - docs/typedoc/modules/lib.fhirclient.html | 11 - docs/typedoc/modules/lib.html | 48 +- docs/typedoc/modules/lib_BrowserAdapter.html | 1 - docs/typedoc/modules/lib_BrowserStorage.html | 1 - docs/typedoc/modules/lib_Client.html | 1 - docs/typedoc/modules/lib_NodeAdapter.html | 1 - docs/typedoc/modules/lib_ServerStorage.html | 1 - docs/typedoc/modules/lib_browser.html | 26 - .../modules/lib_browser_entry.default.html | 40 - docs/typedoc/modules/lib_browser_entry.html | 1 - docs/typedoc/modules/lib_isomorphic.html | 130 - docs/typedoc/modules/lib_server.html | 1 - docs/typedoc/modules/lib_server_entry.html | 1 - docs/typedoc/modules/lib_settings.html | 10 - docs/typedoc/modules/lib_smart.html | 60 - docs/typedoc/modules/lib_strings.html | 1 - docs/typedoc/modules/security_browser.html | 2 +- docs/typedoc/modules/security_server.html | 30 +- docs/typedoc/modules/settings.html | 10 +- docs/typedoc/modules/smart.html | 30 +- .../modules/storage_BrowserStorage.html | 2 +- .../modules/storage_ServerStorage.html | 2 +- docs/typedoc/modules/strings.html | 2 +- .../modules/types.fhirclient.FHIR.html | 14 +- docs/typedoc/modules/types.fhirclient.html | 8 +- docs/typedoc/modules/types.html | 2 +- rollup.config.mjs | 26 + src/next/BrowserAdapter.ts | 108 + src/next/BrowserStorage.ts | 25 + src/next/Client.ts | 968 ++++++++ src/next/NodeAdapter.ts | 113 + src/next/ServerStorage.ts | 28 + src/next/browser.ts | 298 +++ src/next/browser_entry.ts | 26 + src/next/index.d.ts | 1340 +++++++++++ src/next/isomorphic.ts | 594 +++++ src/next/server.ts | 62 + src/next/server_entry.ts | 18 + src/next/settings.ts | 121 + src/next/smart.ts | 619 +++++ src/next/strings.ts | 7 + typedoc.js | 2 +- 187 files changed, 9957 insertions(+), 2220 deletions(-) create mode 100644 dist/build/fhir-client.next.mjs create mode 100644 dist/lib/next/BrowserAdapter.d.ts create mode 100644 dist/lib/next/BrowserAdapter.js create mode 100644 dist/lib/next/BrowserStorage.d.ts create mode 100644 dist/lib/next/BrowserStorage.js create mode 100644 dist/lib/next/Client.d.ts create mode 100644 dist/lib/next/Client.js create mode 100644 dist/lib/next/NodeAdapter.d.ts create mode 100644 dist/lib/next/NodeAdapter.js create mode 100644 dist/lib/next/ServerStorage.d.ts create mode 100644 dist/lib/next/ServerStorage.js create mode 100644 dist/lib/next/browser.d.ts create mode 100644 dist/lib/next/browser.js create mode 100644 dist/lib/next/browser_entry.d.ts create mode 100644 dist/lib/next/browser_entry.js create mode 100644 dist/lib/next/isomorphic.d.ts create mode 100644 dist/lib/next/isomorphic.js create mode 100644 dist/lib/next/server.d.ts create mode 100644 dist/lib/next/server.js create mode 100644 dist/lib/next/server_entry.d.ts create mode 100644 dist/lib/next/server_entry.js create mode 100644 dist/lib/next/settings.d.ts create mode 100644 dist/lib/next/settings.js create mode 100644 dist/lib/next/smart.d.ts create mode 100644 dist/lib/next/smart.js create mode 100644 dist/lib/next/strings.d.ts create mode 100644 dist/lib/next/strings.js delete mode 100644 docs/typedoc/classes/lib_BrowserAdapter.default.html delete mode 100644 docs/typedoc/classes/lib_BrowserStorage.default.html delete mode 100644 docs/typedoc/classes/lib_Client.default.html delete mode 100644 docs/typedoc/classes/lib_NodeAdapter.default.html delete mode 100644 docs/typedoc/classes/lib_ServerStorage.default.html delete mode 100644 docs/typedoc/interfaces/lib.fhirclient.Adapter.html delete mode 100644 docs/typedoc/interfaces/lib.fhirclient.AuthorizeParams.html delete mode 100644 docs/typedoc/interfaces/lib.fhirclient.BrowserFHIRSettings.html delete mode 100644 docs/typedoc/interfaces/lib.fhirclient.ClientInterface.html delete mode 100644 docs/typedoc/interfaces/lib.fhirclient.ClientState.html delete mode 100644 docs/typedoc/interfaces/lib.fhirclient.CombinedFetchResult.html delete mode 100644 docs/typedoc/interfaces/lib.fhirclient.ES384JWK.html delete mode 100644 docs/typedoc/interfaces/lib.fhirclient.FHIR.BackboneElement.html delete mode 100644 docs/typedoc/interfaces/lib.fhirclient.FHIR.Bundle.html delete mode 100644 docs/typedoc/interfaces/lib.fhirclient.FHIR.BundleEntry.html delete mode 100644 docs/typedoc/interfaces/lib.fhirclient.FHIR.BundleLink.html delete mode 100644 docs/typedoc/interfaces/lib.fhirclient.FHIR.CapabilityStatement.html delete mode 100644 docs/typedoc/interfaces/lib.fhirclient.FHIR.CodeableConcept.html delete mode 100644 docs/typedoc/interfaces/lib.fhirclient.FHIR.Coding.html delete mode 100644 docs/typedoc/interfaces/lib.fhirclient.FHIR.Element.html delete mode 100644 docs/typedoc/interfaces/lib.fhirclient.FHIR.Encounter.html delete mode 100644 docs/typedoc/interfaces/lib.fhirclient.FHIR.Extension.html delete mode 100644 docs/typedoc/interfaces/lib.fhirclient.FHIR.Identifier.html delete mode 100644 docs/typedoc/interfaces/lib.fhirclient.FHIR.Meta.html delete mode 100644 docs/typedoc/interfaces/lib.fhirclient.FHIR.Observation.html delete mode 100644 docs/typedoc/interfaces/lib.fhirclient.FHIR.Patient.html delete mode 100644 docs/typedoc/interfaces/lib.fhirclient.FHIR.Period.html delete mode 100644 docs/typedoc/interfaces/lib.fhirclient.FHIR.Practitioner.html delete mode 100644 docs/typedoc/interfaces/lib.fhirclient.FHIR.Reference.html delete mode 100644 docs/typedoc/interfaces/lib.fhirclient.FHIR.RelatedPerson.html delete mode 100644 docs/typedoc/interfaces/lib.fhirclient.FHIR.Resource.html delete mode 100644 docs/typedoc/interfaces/lib.fhirclient.FetchOptions.html delete mode 100644 docs/typedoc/interfaces/lib.fhirclient.FhirOptions.html delete mode 100644 docs/typedoc/interfaces/lib.fhirclient.IDToken.html delete mode 100644 docs/typedoc/interfaces/lib.fhirclient.IncludeResponseHint.html delete mode 100644 docs/typedoc/interfaces/lib.fhirclient.JsonObject.html delete mode 100644 docs/typedoc/interfaces/lib.fhirclient.JsonPatchAdd.html delete mode 100644 docs/typedoc/interfaces/lib.fhirclient.JsonPatchCopy.html delete mode 100644 docs/typedoc/interfaces/lib.fhirclient.JsonPatchMove.html delete mode 100644 docs/typedoc/interfaces/lib.fhirclient.JsonPatchRemove.html delete mode 100644 docs/typedoc/interfaces/lib.fhirclient.JsonPatchReplace.html delete mode 100644 docs/typedoc/interfaces/lib.fhirclient.JsonPatchTest.html delete mode 100644 docs/typedoc/interfaces/lib.fhirclient.RS384JWK.html delete mode 100644 docs/typedoc/interfaces/lib.fhirclient.ReadyOptions.html delete mode 100644 docs/typedoc/interfaces/lib.fhirclient.RequestOptions.html delete mode 100644 docs/typedoc/interfaces/lib.fhirclient.RequestWithSession.html delete mode 100644 docs/typedoc/interfaces/lib.fhirclient.SMART_API.html delete mode 100644 docs/typedoc/interfaces/lib.fhirclient.Storage.html delete mode 100644 docs/typedoc/interfaces/lib.fhirclient.TokenResponse.html delete mode 100644 docs/typedoc/modules/lib.fhirclient.FHIR.html delete mode 100644 docs/typedoc/modules/lib.fhirclient.html delete mode 100644 docs/typedoc/modules/lib_BrowserAdapter.html delete mode 100644 docs/typedoc/modules/lib_BrowserStorage.html delete mode 100644 docs/typedoc/modules/lib_Client.html delete mode 100644 docs/typedoc/modules/lib_NodeAdapter.html delete mode 100644 docs/typedoc/modules/lib_ServerStorage.html delete mode 100644 docs/typedoc/modules/lib_browser.html delete mode 100644 docs/typedoc/modules/lib_browser_entry.default.html delete mode 100644 docs/typedoc/modules/lib_browser_entry.html delete mode 100644 docs/typedoc/modules/lib_isomorphic.html delete mode 100644 docs/typedoc/modules/lib_server.html delete mode 100644 docs/typedoc/modules/lib_server_entry.html delete mode 100644 docs/typedoc/modules/lib_settings.html delete mode 100644 docs/typedoc/modules/lib_smart.html delete mode 100644 docs/typedoc/modules/lib_strings.html create mode 100644 src/next/BrowserAdapter.ts create mode 100644 src/next/BrowserStorage.ts create mode 100644 src/next/Client.ts create mode 100644 src/next/NodeAdapter.ts create mode 100644 src/next/ServerStorage.ts create mode 100644 src/next/browser.ts create mode 100644 src/next/browser_entry.ts create mode 100644 src/next/index.d.ts create mode 100644 src/next/isomorphic.ts create mode 100644 src/next/server.ts create mode 100644 src/next/server_entry.ts create mode 100644 src/next/settings.ts create mode 100644 src/next/smart.ts create mode 100644 src/next/strings.ts diff --git a/dist/build/fhir-client.next.mjs b/dist/build/fhir-client.next.mjs new file mode 100644 index 00000000..c7323700 --- /dev/null +++ b/dist/build/fhir-client.next.mjs @@ -0,0 +1,2081 @@ +// This map contains reusable debug messages (only those used in multiple places) +var str = { + expired: "Session expired! Please re-launch the app", + noScopeForId: "Trying to get the ID of the selected %s. Please add 'launch' or 'launch/%s' to the requested scopes and try again.", + noIfNoAuth: "You are trying to get %s but the app is not authorized yet.", + noFreeContext: "Please don't use open fhir servers if you need to access launch context items like the %S." +}; + +/** + * Combined list of FHIR resource types accepting patient parameter in FHIR R2-R4 + */ +/** + * Map of FHIR releases and their abstract version as number + */ +const fhirVersions = { + "0.4.0": 2, + "0.5.0": 2, + "1.0.0": 2, + "1.0.1": 2, + "1.0.2": 2, + "1.1.0": 3, + "1.4.0": 3, + "1.6.0": 3, + "1.8.0": 3, + "3.0.0": 3, + "3.0.1": 3, + "3.3.0": 4, + "3.5.0": 4, + "4.0.0": 4, + "4.0.1": 4 +}; +/** + * The name of the sessionStorage entry that contains the current key + */ +const SMART_KEY = "SMART_KEY"; + +/** + * Combined list of FHIR resource types accepting patient parameter in FHIR R2-R4 + */ +const patientCompartment = [ + "Account", + "AdverseEvent", + "AllergyIntolerance", + "Appointment", + "AppointmentResponse", + "AuditEvent", + "Basic", + "BodySite", + "BodyStructure", + "CarePlan", + "CareTeam", + "ChargeItem", + "Claim", + "ClaimResponse", + "ClinicalImpression", + "Communication", + "CommunicationRequest", + "Composition", + "Condition", + "Consent", + "Coverage", + "CoverageEligibilityRequest", + "CoverageEligibilityResponse", + "DetectedIssue", + "DeviceRequest", + "DeviceUseRequest", + "DeviceUseStatement", + "DiagnosticOrder", + "DiagnosticReport", + "DocumentManifest", + "DocumentReference", + "EligibilityRequest", + "Encounter", + "EnrollmentRequest", + "EpisodeOfCare", + "ExplanationOfBenefit", + "FamilyMemberHistory", + "Flag", + "Goal", + "Group", + "ImagingManifest", + "ImagingObjectSelection", + "ImagingStudy", + "Immunization", + "ImmunizationEvaluation", + "ImmunizationRecommendation", + "Invoice", + "List", + "MeasureReport", + "Media", + "MedicationAdministration", + "MedicationDispense", + "MedicationOrder", + "MedicationRequest", + "MedicationStatement", + "MolecularSequence", + "NutritionOrder", + "Observation", + "Order", + "Patient", + "Person", + "Procedure", + "ProcedureRequest", + "Provenance", + "QuestionnaireResponse", + "ReferralRequest", + "RelatedPerson", + "RequestGroup", + "ResearchSubject", + "RiskAssessment", + "Schedule", + "ServiceRequest", + "Specimen", + "SupplyDelivery", + "SupplyRequest", + "VisionPrescription" +]; +/** + * Combined (FHIR R2-R4) list of search parameters that can be used to scope + * a request by patient ID. + */ +const patientParams = [ + "patient", + "subject", + "requester", + "member", + "actor", + "beneficiary" +]; + +class HttpError extends Error { + constructor(response) { + super(`${response.status} ${response.statusText}\nURL: ${response.url}`); + this.name = "HttpError"; + this.response = response; + this.statusCode = response.status; + this.status = response.status; + this.statusText = response.statusText; + } + async parse() { + if (!this.response.bodyUsed) { + try { + const type = this.response.headers.get("content-type") || "text/plain"; + if (type.match(/\bjson\b/i)) { + let body = await this.response.json(); + if (body.error) { + this.message += "\n" + body.error; + if (body.error_description) { + this.message += ": " + body.error_description; + } + } + else { + this.message += "\n\n" + JSON.stringify(body, null, 4); + } + } + else if (type.match(/^text\//i)) { + let body = await this.response.text(); + if (body) { + this.message += "\n\n" + body; + } + } + } + catch { } + } + return this; + } + toJSON() { + return { + name: this.name, + statusCode: this.statusCode, + status: this.status, + statusText: this.statusText, + message: this.message + }; + } +} + +const debug = typeof window === "undefined" ? + (process.env.NODE_DEBUG || "").match(/\bdebugFhirClient\b/) ? + (...args) => console.debug("FHIR:", ...args) : + () => { } : + (localStorage === null || localStorage === void 0 ? void 0 : localStorage.debugFhirClient) ? + (...args) => console.debug("FHIR:", ...args) : + () => { }; +/** + * The cache for the `getAndCache` function + */ +const cache = {}; +/** + * Used in fetch Promise chains to reject if the "ok" property is not true + */ +async function checkResponse(resp) { + if (!resp.ok) { + const error = new HttpError(resp); + await error.parse(); + throw error; + } + return resp; +} +/** + * Used in fetch Promise chains to return the JSON version of the response. + * Note that `resp.json()` will throw on empty body so we use resp.text() + * instead. + */ +function responseToJSON(resp) { + return resp.text().then(text => text.length ? JSON.parse(text) : ""); +} +function loweCaseKeys(obj) { + // Can be undefined to signal that this key should be removed + if (!obj) { + return obj; + } + // Arrays are valid values in case of recursive calls + if (Array.isArray(obj)) { + return obj.map(v => v && typeof v === "object" ? loweCaseKeys(v) : v); + } + // Plain object + let out = {}; + Object.keys(obj).forEach(key => { + const lowerKey = key.toLowerCase(); + const v = obj[key]; + out[lowerKey] = v && typeof v == "object" ? loweCaseKeys(v) : v; + }); + return out; +} +/** + * This is our built-in request function. It does a few things by default + * (unless told otherwise): + * - Makes CORS requests + * - Sets accept header to "application/json" + * - Handles errors + * - If the response is json return the json object + * - If the response is text return the result text + * - Otherwise return the response object on which we call stuff like `.blob()` + * @param {string | Request} url + * @param {FetchOptions} [requestOptions] + */ +async function request(url, requestOptions = {}) { + const { includeResponse, ...options } = requestOptions; + const response = await fetch(url, { + mode: "cors", + ...options, + headers: { + accept: "application/json", + ...loweCaseKeys(options.headers) + } + }); + await checkResponse(response); + const type = response.headers.get("content-type") + ""; + let body; + if (type.match(/\bjson\b/i)) { + body = await responseToJSON(response); + } + else if (type.match(/^text\//i)) { + body = await response.text(); + } + // Some servers will reply after CREATE with json content type but with + // empty body. In this case check if a location header is received and + // fetch that to use it as the final result. + if (!body && response.status == 201) { + const location = response.headers.get("location"); + if (location) { + return request(location, { ...options, method: "GET", body: null, includeResponse }); + } + } + if (includeResponse) { + return { body, response }; + } + // For any non-text and non-json response return the Response object. + // This to let users decide if they want to call text(), blob() or + // something else on it + if (body === undefined) { + return response; + } + // Otherwise just return the parsed body (can also be "" or null) + return body; +} +/** + * Makes a request using `fetch` and stores the result in internal memory cache. + * The cache is cleared when the page is unloaded. + * @param url The URL to request + * @param requestOptions Request options + * @param [force] If true, reload from source and update the cache, even if it + * has already been cached. + */ +async function getAndCache(url, requestOptions, force) { + var _a, _b; + if (force === void 0) { force = ((_b = (_a = globalThis === null || globalThis === void 0 ? void 0 : globalThis.process) === null || _a === void 0 ? void 0 : _a.env) === null || _b === void 0 ? void 0 : _b.NODE_ENV) === "test"; } + if (force || !cache[url]) { + cache[url] = request(url, requestOptions); + } + return cache[url]; +} +/** + * Fetches the conformance statement from the given base URL. + * Note that the result is cached in memory (until the page is reloaded in the + * browser) because it might have to be re-used by the client + * @param baseUrl The base URL of the FHIR server + * @param [requestOptions] Any options passed to the fetch call + */ +function fetchConformanceStatement(baseUrl = "/", requestOptions) { + const url = String(baseUrl).replace(/\/*$/, "/") + "metadata"; + return getAndCache(url, requestOptions).catch((ex) => { + throw new Error(`Failed to fetch the conformance statement from "${url}". ${ex}`); + }); +} +/** + * Walks through an object (or array) and returns the value found at the + * provided path. This function is very simple so it intentionally does not + * support any argument polymorphism, meaning that the path can only be a + * dot-separated string. If the path is invalid returns undefined. + * @param obj The object (or Array) to walk through + * @param path The path (eg. "a.b.4.c") + * @returns {*} Whatever is found in the path or undefined + */ +function getPath(obj, path = "") { + path = path.trim(); + if (!path) { + return obj; + } + let segments = path.split("."); + let result = obj; + while (result && segments.length) { + const key = segments.shift(); + if (!key && Array.isArray(result)) { + return result.map(o => getPath(o, segments.join("."))); + } + else { + result = result[key + ""]; + } + } + return result; +} +/** + * Like getPath, but if the node is found, its value is set to @value + * @param obj The object (or Array) to walk through + * @param path The path (eg. "a.b.4.c") + * @param value The value to set + * @param createEmpty If true, create missing intermediate objects or arrays + * @returns The modified object + */ +function setPath(obj, path, value, createEmpty = false) { + path.trim().split(".").reduce((out, key, idx, arr) => { + if (out && idx === arr.length - 1) { + out[key] = value; + } + else { + if (out && out[key] === undefined && createEmpty) { + out[key] = arr[idx + 1].match(/^[0-9]+$/) ? [] : {}; + } + return out ? out[key] : undefined; + } + }, obj); + return obj; +} +/** + * If the argument is an array returns it as is. Otherwise puts it in an array + * (`[arg]`) and returns the result + * @param arg The element to test and possibly convert to array + * @category Utility + */ +function makeArray(arg) { + if (Array.isArray(arg)) { + return arg; + } + return [arg]; +} +/** + * Given a path, converts it to absolute url based on the `baseUrl`. If baseUrl + * is not provided, the result would be a rooted path (one that starts with `/`). + * @param path The path to convert + * @param baseUrl The base URL + */ +function absolute(path, baseUrl) { + if (path.match(/^http/)) + return path; + if (path.match(/^urn/)) + return path; + return String(baseUrl || "").replace(/\/+$/, "") + "/" + path.replace(/^\/+/, ""); +} +/** + * Generates random strings. By default this returns random 8 characters long + * alphanumeric strings. + * @param strLength The length of the output string. Defaults to 8. + * @param charSet A string containing all the possible characters. + * Defaults to all the upper and lower-case letters plus digits. + * @category Utility + */ +function randomString(strLength = 8, charSet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789") { + const result = []; + const len = charSet.length; + while (strLength--) { + result.push(charSet.charAt(Math.floor(Math.random() * len))); + } + return result.join(""); +} +/** + * Add a supplied number of seconds to the supplied Date, returning an integer + * number of seconds since the epoch + * @param secondsAhead How far ahead, in seconds (defaults to 120 seconds) + * @param [from] Initial time (defaults to current time) + */ +function getTimeInFuture(secondsAhead = 120, from) { + return Math.floor(+(new Date()) / 1000 + secondsAhead); +} +/** + * Given a conformance statement and a resource type, returns the name of the + * URL parameter that can be used to scope the resource type by patient ID. + */ +function getPatientParam(conformance, resourceType) { + // Find what resources are supported by this server + const resources = getPath(conformance, "rest.0.resource") || []; + // Check if this resource is supported + const meta = resources.find((r) => r.type === resourceType); + if (!meta) { + throw new Error(`Resource "${resourceType}" is not supported by this FHIR server`); + } + // Check if any search parameters are available for this resource + if (!Array.isArray(meta.searchParam)) { + throw new Error(`No search parameters supported for "${resourceType}" on this FHIR server`); + } + // This is a rare case but could happen in generic workflows + if (resourceType == "Patient" && meta.searchParam.find((x) => x.name == "_id")) { + return "_id"; + } + // Now find the first possible parameter name + const out = patientParams.find(p => meta.searchParam.find((x) => x.name == p)); + // If there is no match + if (!out) { + throw new Error("I don't know what param to use for " + resourceType); + } + return out; +} +function assert(condition, message) { + if (!(condition)) { + throw new Error(message); + } +} +function assertJsonPatch(patch) { + assert(Array.isArray(patch), "The JSON patch must be an array"); + assert(patch.length > 0, "The JSON patch array should not be empty"); + patch.forEach((operation) => { + assert(["add", "replace", "test", "move", "copy", "remove"].indexOf(operation.op) > -1, 'Each patch operation must have an "op" property which must be one of: "add", "replace", "test", "move", "copy", "remove"'); + assert(operation.path && typeof operation.path, `Invalid "${operation.op}" operation. Missing "path" property`); + if (operation.op == "add" || operation.op == "replace" || operation.op == "test") { + assert("value" in operation, `Invalid "${operation.op}" operation. Missing "value" property`); + assert(Object.keys(operation).length == 3, `Invalid "${operation.op}" operation. Contains unknown properties`); + } + else if (operation.op == "move" || operation.op == "copy") { + assert(typeof operation.from == "string", `Invalid "${operation.op}" operation. Requires a string "from" property`); + assert(Object.keys(operation).length == 3, `Invalid "${operation.op}" operation. Contains unknown properties`); + } + else { + assert(Object.keys(operation).length == 2, `Invalid "${operation.op}" operation. Contains unknown properties`); + } + }); +} +/** + * Fetches the well-known json file from the given base URL. + * Note that the result is cached in memory (until the page is reloaded in the + * browser) because it might have to be re-used by the client + * @param baseUrl The base URL of the FHIR server + */ +function fetchWellKnownJson(baseUrl = "/", requestOptions) { + const url = String(baseUrl).replace(/\/*$/, "/") + ".well-known/smart-configuration"; + return getAndCache(url, requestOptions).catch((ex) => { + throw new Error(`Failed to fetch the well-known json "${url}". ${ex.message}`); + }); +} +/** + * Fetch a "WellKnownJson" and extract the SMART endpoints from it + */ +function getSecurityExtensionsFromWellKnownJson(baseUrl = "/", requestOptions) { + return fetchWellKnownJson(baseUrl, requestOptions).then(meta => { + if (!meta.authorization_endpoint || !meta.token_endpoint) { + throw new Error("Invalid wellKnownJson"); + } + return { + registrationUri: meta.registration_endpoint || "", + authorizeUri: meta.authorization_endpoint, + tokenUri: meta.token_endpoint, + codeChallengeMethods: meta.code_challenge_methods_supported || [] + }; + }); +} +/** + * Fetch a `CapabilityStatement` and extract the SMART endpoints from it + */ +function getSecurityExtensionsFromConformanceStatement(baseUrl = "/", requestOptions) { + return fetchConformanceStatement(baseUrl, requestOptions).then(meta => { + const nsUri = "http://fhir-registry.smarthealthit.org/StructureDefinition/oauth-uris"; + const extensions = (getPath(meta || {}, "rest.0.security.extension") || []) + .filter(e => e.url === nsUri) + .map(o => o.extension)[0]; + const out = { + registrationUri: "", + authorizeUri: "", + tokenUri: "", + codeChallengeMethods: [], + }; + if (extensions) { + extensions.forEach(ext => { + if (ext.url === "register") { + out.registrationUri = ext.valueUri; + } + if (ext.url === "authorize") { + out.authorizeUri = ext.valueUri; + } + if (ext.url === "token") { + out.tokenUri = ext.valueUri; + } + }); + } + return out; + }); +} +/** + * Given a FHIR server, returns an object with it's Oauth security endpoints + * that we are interested in. This will try to find the info in both the + * `CapabilityStatement` and the `.well-known/smart-configuration`. Whatever + * Arrives first will be used and the other request will be aborted. + * @param [baseUrl = "/"] Fhir server base URL + */ +function getSecurityExtensions(baseUrl = "/") { + return getSecurityExtensionsFromWellKnownJson(baseUrl) + .catch(() => getSecurityExtensionsFromConformanceStatement(baseUrl)); +} +function base64encode(input) { + try { + return Buffer.from(input, "utf8").toString('base64'); + } + catch { + return btoa(input); + } +} +function base64decode(input) { + try { + return Buffer.from(input, "base64").toString('utf8'); + } + catch { + return btoa(input); + } +} +function shouldIncludeChallenge(S256supported, pkceMode) { + if (pkceMode === "disabled") { + return false; + } + if (pkceMode === "unsafeV1") { + return true; + } + if (pkceMode === "required") { + if (!S256supported) { + throw new Error("Required PKCE code challenge method (`S256`) was not found in the server's codeChallengeMethods declaration."); + } + return true; + } + return S256supported; +} +/** + * Decodes a JWT token and returns it's body. + * @param token The token to read + * @category Utility + */ +function jwtDecode(token) { + const payload = token.split(".")[1]; + return payload ? JSON.parse(base64decode(payload)) : null; +} +/** + * Given a token response, computes and returns the expiresAt timestamp. + * Note that this should only be used immediately after an access token is + * received, otherwise the computed timestamp will be incorrect. + * @param tokenResponse + */ +function getAccessTokenExpiration(tokenResponse) { + const now = Math.floor(Date.now() / 1000); + // Option 1 - using the expires_in property of the token response + if (tokenResponse.expires_in) { + return now + tokenResponse.expires_in; + } + // Option 2 - using the exp property of JWT tokens (must not assume JWT!) + if (tokenResponse.access_token) { + let tokenBody = jwtDecode(tokenResponse.access_token); + if (tokenBody && tokenBody.exp) { + return tokenBody.exp; + } + } + // Option 3 - if none of the above worked set this to 5 minutes after now + return now + 300; +} + +/** + * Adds patient context to requestOptions object to be used with [[Client.request]] + * @param requestOptions Can be a string URL (relative to the serviceUrl), or an + * object which will be passed to fetch() + * @param client Current FHIR client object containing patient context + * @return requestOptions object contextualized to current patient + */ +async function contextualize(requestOptions, client) { + const base = absolute("/", client.state.serverUrl); + async function contextualURL(_url) { + const resourceType = _url.pathname.split("/").pop(); + assert(resourceType, `Invalid url "${_url}"`); + assert(patientCompartment.indexOf(resourceType) > -1, `Cannot filter "${resourceType}" resources by patient`); + const conformance = await fetchConformanceStatement(client.state.serverUrl); + const searchParam = getPatientParam(conformance, resourceType); + _url.searchParams.set(searchParam, client.patient.id); + return _url.href; + } + if (typeof requestOptions == "string" || requestOptions instanceof URL) { + return { url: await contextualURL(new URL(requestOptions + "", base)) }; + } + requestOptions.url = await contextualURL(new URL(requestOptions.url + "", base)); + return requestOptions; +} +/** + * Gets single reference by id. Caches the result. + * @param refId + * @param cache A map to store the resolved refs + * @param client The client instance + * @param requestOptions Only signal and headers are currently used if provided + * @returns The resolved reference + * @private + */ +async function getRef(refId, cache, client, requestOptions) { + if (!cache[refId]) { + const { signal, headers } = requestOptions; + // Note that we set cache[refId] immediately! When the promise is + // settled it will be updated. This is to avoid a ref being fetched + // twice because some of these requests are executed in parallel. + cache[refId] = client.request({ + url: refId, + headers, + signal + }).then(res => { + cache[refId] = res; + return res; + }, (error) => { + delete cache[refId]; + throw error; + }); + } + return cache[refId]; +} +/** + * Resolves a reference in the given resource. + * @param obj FHIR Resource + */ +function resolveRef(obj, path, graph, cache, client, requestOptions) { + const node = getPath(obj, path); + if (node) { + const isArray = Array.isArray(node); + return Promise.all(makeArray(node).filter(Boolean).map((item, i) => { + const ref = item.reference; + if (ref) { + return getRef(ref, cache, client, requestOptions).then(sub => { + if (graph) { + if (isArray) { + if (path.indexOf("..") > -1) { + setPath(obj, `${path.replace("..", `.${i}.`)}`, sub); + } + else { + setPath(obj, `${path}.${i}`, sub); + } + } + else { + setPath(obj, path, sub); + } + } + }).catch((ex) => { + /* ignore missing references */ + if (ex.status !== 404) { + throw ex; + } + }); + } + })); + } +} +/** + * Given a resource and a list of ref paths - resolves them all + * @param obj FHIR Resource + * @param fhirOptions The fhir options of the initiating request call + * @param cache A map to store fetched refs + * @param client The client instance + * @private + */ +function resolveRefs(obj, fhirOptions, cache, client, requestOptions) { + // 1. Sanitize paths, remove any invalid ones + let paths = makeArray(fhirOptions.resolveReferences) + .filter(Boolean) // No false, 0, null, undefined or "" + .map(path => String(path).trim()) + .filter(Boolean); // No space-only strings + // 2. Remove duplicates + paths = paths.filter((p, i) => { + const index = paths.indexOf(p, i + 1); + if (index > -1) { + debug("client: Duplicated reference path \"%s\"", p); + return false; + } + return true; + }); + // 3. Early exit if no valid paths are found + if (!paths.length) { + return Promise.resolve(); + } + // 4. Group the paths by depth so that child refs are looked up + // after their parents! + const groups = {}; + paths.forEach(path => { + const len = path.split(".").length; + if (!groups[len]) { + groups[len] = []; + } + groups[len].push(path); + }); + // 5. Execute groups sequentially! Paths within same group are + // fetched in parallel! + let task = Promise.resolve(); + Object.keys(groups).sort().forEach(len => { + const group = groups[len]; + task = task.then(() => Promise.all(group.map((path) => { + return resolveRef(obj, path, !!fhirOptions.graph, cache, client, requestOptions); + }))); + }); + return task; +} +/** + * This is a FHIR client that is returned to you from the `ready()` call of the + * **SMART API**. You can also create it yourself if needed: + * + * ```js + * // BROWSER + * const client = FHIR.client("https://r4.smarthealthit.org"); + * + * // SERVER + * const client = smart(req, res).client("https://r4.smarthealthit.org"); + * ``` + */ +class Client { + /** + * Validates the parameters and creates an instance. + */ + constructor(state, storage) { + const _state = typeof state == "string" ? { serverUrl: state } : state; + // Valid serverUrl is required! + assert(_state.serverUrl && _state.serverUrl.match(/https?:\/\/.+/), "A \"serverUrl\" option is required and must begin with \"http(s)\""); + this.storage = storage; + this.state = _state; + this._refreshTask = null; + const client = this; + // patient api --------------------------------------------------------- + this.patient = { + get id() { return client.getPatientId(); }, + read: (requestOptions) => { + const id = this.patient.id; + return id ? + this.request({ ...requestOptions, url: `Patient/${id}` }) : + Promise.reject(new Error("Patient is not available")); + }, + request: (requestOptions, fhirOptions = {}) => { + if (this.patient.id) { + return (async () => { + const options = await contextualize(requestOptions, this); + return this.request(options, fhirOptions); + })(); + } + else { + return Promise.reject(new Error("Patient is not available")); + } + } + }; + // encounter api ------------------------------------------------------- + this.encounter = { + get id() { return client.getEncounterId(); }, + read: requestOptions => { + const id = this.encounter.id; + return id ? + this.request({ ...requestOptions, url: `Encounter/${id}` }) : + Promise.reject(new Error("Encounter is not available")); + } + }; + // user api ------------------------------------------------------------ + this.user = { + get fhirUser() { return client.getFhirUser(); }, + get id() { return client.getUserId(); }, + get resourceType() { return client.getUserType(); }, + read: requestOptions => { + const fhirUser = this.user.fhirUser; + return fhirUser ? + this.request({ ...requestOptions, url: fhirUser }) : + Promise.reject(new Error("User is not available")); + } + }; + } + getPatientId() { + const tokenResponse = this.state.tokenResponse; + if (tokenResponse) { + // We have been authorized against this server but we don't know + // the patient. This should be a scope issue. + if (!tokenResponse.patient) { + if (!(this.state.scope || "").match(/\blaunch(\/patient)?\b/)) { + debug("client: " + str.noScopeForId, "patient", "patient"); + } + else { + // The server should have returned the patient! + debug("client: The ID of the selected patient is not available. Please check if your server supports that."); + } + return null; + } + return tokenResponse.patient; + } + if (this.state.authorizeUri) { + debug("client: " + str.noIfNoAuth, "the ID of the selected patient"); + } + else { + debug("client: " + str.noFreeContext, "selected patient"); + } + return null; + } + getEncounterId() { + const tokenResponse = this.state.tokenResponse; + if (tokenResponse) { + // We have been authorized against this server but we don't know + // the encounter. This should be a scope issue. + if (!tokenResponse.encounter) { + if (!(this.state.scope || "").match(/\blaunch(\/encounter)?\b/)) { + debug("client: " + str.noScopeForId, "encounter", "encounter"); + } + else { + // The server should have returned the encounter! + debug("client: The ID of the selected encounter is not available. Please check if your server supports that, and that the selected patient has any recorded encounters."); + } + return null; + } + return tokenResponse.encounter; + } + if (this.state.authorizeUri) { + debug("client: " + str.noIfNoAuth, "the ID of the selected encounter"); + } + else { + debug("client: " + str.noFreeContext, "selected encounter"); + } + return null; + } + getIdToken() { + const tokenResponse = this.state.tokenResponse; + if (tokenResponse) { + const idToken = tokenResponse.id_token; + const scope = this.state.scope || ""; + // We have been authorized against this server but we don't have + // the id_token. This should be a scope issue. + if (!idToken) { + const hasOpenid = scope.match(/\bopenid\b/); + const hasProfile = scope.match(/\bprofile\b/); + const hasFhirUser = scope.match(/\bfhirUser\b/); + if (!hasOpenid || !(hasFhirUser || hasProfile)) { + debug("client: You are trying to get the id_token but you are not " + + "using the right scopes. Please add 'openid' and " + + "'fhirUser' or 'profile' to the scopes you are " + + "requesting."); + } + else { + // The server should have returned the id_token! + debug("client: The id_token is not available. Please check if your server supports that."); + } + return null; + } + return jwtDecode(idToken); + } + if (this.state.authorizeUri) { + debug("client: " + str.noIfNoAuth, "the id_token"); + } + else { + debug("client: " + str.noFreeContext, "id_token"); + } + return null; + } + getFhirUser() { + const idToken = this.getIdToken(); + if (idToken) { + // Epic may return a full url + // @see https://github.com/smart-on-fhir/client-js/issues/105 + if (idToken.fhirUser) { + return idToken.fhirUser.split("/").slice(-2).join("/"); + } + return idToken.profile; + } + return null; + } + getUserId() { + const profile = this.getFhirUser(); + if (profile) { + return profile.split("/")[1]; + } + return null; + } + getUserType() { + const profile = this.getFhirUser(); + if (profile) { + return profile.split("/")[0]; + } + return null; + } + getAuthorizationHeader() { + const accessToken = this.getState("tokenResponse.access_token"); + if (accessToken) { + return "Bearer " + accessToken; + } + const { username, password } = this.state; + if (username && password) { + return "Basic " + base64encode(username + ":" + password); + } + return null; + } + /** + * Used internally to clear the state of the instance and the state in the + * associated storage. + */ + async _clearState() { + const key = await this.storage.get("SMART_KEY"); + if (key) { + await this.storage.unset(key); + } + await this.storage.unset("SMART_KEY"); + this.state.tokenResponse = {}; + } + create(resource, requestOptions) { + return this.request({ + ...requestOptions, + url: `${resource.resourceType}`, + method: "POST", + body: JSON.stringify(resource), + headers: { + // TODO: Do we need to alternate with "application/json+fhir"? + "content-type": "application/json", + ...(requestOptions || {}).headers + } + }); + } + update(resource, requestOptions) { + return this.request({ + ...requestOptions, + url: `${resource.resourceType}/${resource.id}`, + method: "PUT", + body: JSON.stringify(resource), + headers: { + // TODO: Do we need to alternate with "application/json+fhir"? + "content-type": "application/json", + ...(requestOptions || {}).headers + } + }); + } + delete(url, requestOptions = {}) { + return this.request({ + ...requestOptions, + url, + method: "DELETE" + }); + } + patch(url, patch, requestOptions = {}) { + assertJsonPatch(patch); + return this.request({ + ...requestOptions, + url, + method: "PATCH", + body: JSON.stringify(patch), + headers: { + "prefer": "return=presentation", + "content-type": "application/json-patch+json; charset=UTF-8", + ...requestOptions.headers, + } + }); + } + async request(requestOptions, fhirOptions = {}, _resolvedRefs = {}) { + var _a; + assert(requestOptions, "request requires an url or request options as argument"); + // url ----------------------------------------------------------------- + let url; + if (typeof requestOptions == "string" || requestOptions instanceof URL) { + url = String(requestOptions); + requestOptions = {}; + } + else { + url = String(requestOptions.url); + } + url = absolute(url, this.state.serverUrl); + const options = { + graph: fhirOptions.graph !== false, + flat: !!fhirOptions.flat, + pageLimit: (_a = fhirOptions.pageLimit) !== null && _a !== void 0 ? _a : 1, + resolveReferences: (fhirOptions.resolveReferences || []), + useRefreshToken: fhirOptions.useRefreshToken !== false, + onPage: typeof fhirOptions.onPage == "function" ? + fhirOptions.onPage : + undefined + }; + const signal = requestOptions.signal || undefined; + // Refresh the access token if needed + const job = options.useRefreshToken ? + this.refreshIfNeeded({ signal }).then(() => requestOptions) : + Promise.resolve(requestOptions); + let response; + return job + // Add the Authorization header now, after the access token might + // have been updated + .then(requestOptions => { + const authHeader = this.getAuthorizationHeader(); + if (authHeader) { + requestOptions.headers = { + ...requestOptions.headers, + authorization: authHeader + }; + } + return requestOptions; + }) + // Make the request + .then(requestOptions => { + debug("client:request: %s, options: %O, fhirOptions: %O", url, requestOptions, options); + return request(url, requestOptions).then(result => { + if (requestOptions.includeResponse) { + response = result.response; + return result.body; + } + return result; + }); + }) + // Handle 401 ------------------------------------------------------ + .catch(async (error) => { + if (error.status == 401) { + // !accessToken -> not authorized -> No session. Need to launch. + if (!this.getState("tokenResponse.access_token")) { + error.message += "\nThis app cannot be accessed directly. Please launch it as SMART app!"; + throw error; + } + // auto-refresh not enabled and Session expired. + // Need to re-launch. Clear state to start over! + if (!options.useRefreshToken) { + debug("client:request: Your session has expired and the useRefreshToken option is set to false. Please re-launch the app."); + await this._clearState(); + error.message += "\n" + str.expired; + throw error; + } + // In rare cases we may have a valid access token and a refresh + // token and the request might still fail with 401 just because + // the access token has just been revoked. + // otherwise -> auto-refresh failed. Session expired. + // Need to re-launch. Clear state to start over! + debug("client:request: Auto-refresh failed! Please re-launch the app."); + await this._clearState(); + error.message += "\n" + str.expired; + throw error; + } + throw error; + }) + // Handle 403 ------------------------------------------------------ + .catch((error) => { + if (error.status == 403) { + debug("client:request: Permission denied! Please make sure that you have requested the proper scopes."); + } + throw error; + }) + .then((data) => { + // At this point we don't know what `data` actually is! + // We might get an empty or falsy result. If so return it as is + // Also handle raw responses + if (!data || typeof data == "string" || data instanceof Response) { + if (requestOptions.includeResponse) { + return { + body: data, + response + }; + } + return data; + } + // Resolve References ------------------------------------------ + return (async (_data) => { + if (_data.resourceType == "Bundle") { + await Promise.all((_data.entry || []).map(item => resolveRefs(item.resource, options, _resolvedRefs, this, requestOptions))); + } + else { + await resolveRefs(_data, options, _resolvedRefs, this, requestOptions); + } + return _data; + })(data) + // Pagination ---------------------------------------------- + .then(async (_data) => { + if (_data && _data.resourceType == "Bundle") { + const links = (_data.link || []); + if (options.flat) { + _data = (_data.entry || []).map((entry) => entry.resource); + } + if (options.onPage) { + await options.onPage(_data, { ..._resolvedRefs }); + } + if (--options.pageLimit) { + const next = links.find(l => l.relation == "next"); + _data = makeArray(_data); + if (next && next.url) { + const nextPage = await this.request({ + url: next.url, + // Aborting the main request (even after it is complete) + // must propagate to any child requests and abort them! + // To do so, just pass the same AbortSignal if one is + // provided. + signal + }, options, _resolvedRefs); + if (options.onPage) { + return null; + } + if (options.resolveReferences.length) { + Object.assign(_resolvedRefs, nextPage.references); + return _data.concat(makeArray(nextPage.data || nextPage)); + } + return _data.concat(makeArray(nextPage)); + } + } + } + return _data; + }) + // Finalize ------------------------------------------------ + .then(_data => { + if (options.graph) { + _resolvedRefs = {}; + } + else if (!options.onPage && options.resolveReferences.length) { + return { + data: _data, + references: _resolvedRefs + }; + } + return _data; + }) + .then(_data => { + if (requestOptions.includeResponse) { + return { + body: _data, + response + }; + } + return _data; + }); + }); + } + refreshIfNeeded(requestOptions = {}) { + const accessToken = this.getState("tokenResponse.access_token"); + const refreshToken = this.getState("tokenResponse.refresh_token"); + const expiresAt = this.state.expiresAt || 0; + if (accessToken && refreshToken && expiresAt - 10 < Date.now() / 1000) { + return this.refresh(requestOptions); + } + return Promise.resolve(this.state); + } + refresh(requestOptions = {}) { + var _a, _b; + debug("client:refresh: Attempting to refresh with refresh_token..."); + const refreshToken = (_b = (_a = this.state) === null || _a === void 0 ? void 0 : _a.tokenResponse) === null || _b === void 0 ? void 0 : _b.refresh_token; + assert(refreshToken, "Unable to refresh. No refresh_token found."); + const tokenUri = this.state.tokenUri; + assert(tokenUri, "Unable to refresh. No tokenUri found."); + const scopes = this.getState("tokenResponse.scope") || ""; + const hasOfflineAccess = scopes.search(/\boffline_access\b/) > -1; + const hasOnlineAccess = scopes.search(/\bonline_access\b/) > -1; + assert(hasOfflineAccess || hasOnlineAccess, "Unable to refresh. No offline_access or online_access scope found."); + // This method is typically called internally from `request` if certain + // request fails with 401. However, clients will often run multiple + // requests in parallel which may result in multiple refresh calls. + // To avoid that, we keep a reference to the current refresh task (if any). + if (!this._refreshTask) { + const refreshRequestOptions = { + credentials: this.state.refreshTokenWithCredentials || "same-origin", + ...requestOptions, + method: "POST", + mode: "cors", + headers: { + ...(requestOptions.headers || {}), + "content-type": "application/x-www-form-urlencoded" + }, + body: `grant_type=refresh_token&refresh_token=${encodeURIComponent(refreshToken)}` + }; + // custom authorization header can be passed on manual calls + if (!("authorization" in refreshRequestOptions.headers)) { + const { clientSecret, clientId } = this.state; + if (clientSecret) { + // @ts-ignore + refreshRequestOptions.headers.authorization = "Basic " + base64encode(clientId + ":" + clientSecret); + } + } + this._refreshTask = request(tokenUri, refreshRequestOptions) + .then(data => { + assert(data.access_token, "No access token received"); + debug("client:refresh: Received new access token response %O", data); + this.state.tokenResponse = { ...this.state.tokenResponse, ...data }; + this.state.expiresAt = getAccessTokenExpiration(data); + return this.state; + }) + .catch((error) => { + var _a, _b; + if ((_b = (_a = this.state) === null || _a === void 0 ? void 0 : _a.tokenResponse) === null || _b === void 0 ? void 0 : _b.refresh_token) { + debug("client:refresh: Deleting the expired or invalid refresh token."); + delete this.state.tokenResponse.refresh_token; + } + throw error; + }) + .finally(() => { + this._refreshTask = null; + const key = this.state.key; + if (key) { + return this.storage.set(key, this.state); + } + else { + debug("client:refresh: No 'key' found in Clint.state. Cannot persist the instance."); + } + }); + } + return this._refreshTask; + } + // utils ------------------------------------------------------------------- + /** + * Walks through an object (or array) and returns the value found at the + * provided path. This function is very simple so it intentionally does not + * support any argument polymorphism, meaning that the path can only be a + * dot-separated string. If the path is invalid returns undefined. + * @param obj The object (or Array) to walk through + * @param path The path (eg. "a.b.4.c") + * @returns {*} Whatever is found in the path or undefined + * @todo This should be deprecated and moved elsewhere. One should not have + * to obtain an instance of [[Client]] just to use utility functions like this. + * @deprecated + * @category Utility + */ + getPath(obj, path = "") { + return getPath(obj, path); + } + /** + * Returns a copy of the client state. Accepts a dot-separated path argument + * (same as for `getPath`) to allow for selecting specific properties. + * Examples: + * ```js + * client.getState(); // -> the entire state object + * client.getState("serverUrl"); // -> the URL we are connected to + * client.getState("tokenResponse.patient"); // -> The selected patient ID (if any) + * ``` + * @param path The path (eg. "a.b.4.c") + * @returns {*} Whatever is found in the path or undefined + */ + getState(path = "") { + return getPath({ ...this.state }, path); + } + /** + * Returns a promise that will be resolved with the fhir version as defined + * in the CapabilityStatement. + */ + getFhirVersion() { + return fetchConformanceStatement(this.state.serverUrl) + .then((metadata) => metadata.fhirVersion); + } + /** + * Returns a promise that will be resolved with the numeric fhir version + * - 2 for DSTU2 + * - 3 for STU3 + * - 4 for R4 + * - 0 if the version is not known + */ + getFhirRelease() { + return this.getFhirVersion().then(v => { var _a; return (_a = fhirVersions[v]) !== null && _a !== void 0 ? _a : 0; }); + } +} + +const subtle = () => { + if (!(crypto === null || crypto === void 0 ? void 0 : crypto.subtle)) { + if (!globalThis.isSecureContext) { + throw new Error("Some of the required subtle crypto functionality is not available " + + "unless you run this app in secure context (using HTTPS or running locally). " + + "See https://developer.mozilla.org/en-US/docs/Web/Security/Secure_Contexts"); + } + throw new Error("Some of the required subtle crypto functionality is not " + + "available in the current environment (no crypto.subtle)"); + } + return crypto.subtle; +}; +const ALGS = { + ES384: { + name: "ECDSA", + namedCurve: "P-384" + }, + RS384: { + name: "RSASSA-PKCS1-v1_5", + modulusLength: 4096, + publicExponent: new Uint8Array([1, 0, 1]), + hash: { + name: 'SHA-384' + } + } +}; +function randomBytes(count) { + return crypto.getRandomValues(new Uint8Array(count)); +} +async function digestSha256(payload) { + const prepared = new TextEncoder().encode(payload); + const hash = await subtle().digest('SHA-256', prepared); + return new Uint8Array(hash); +} +const generatePKCEChallenge = async (entropy = 96) => { + const inputBytes = randomBytes(entropy); + const codeVerifier = base64urlencode(inputBytes); + const codeChallenge = base64urlencode(await digestSha256(codeVerifier)); + return { codeChallenge, codeVerifier }; +}; +async function importJWK(jwk) { + // alg is optional in JWK but we need it here! + if (!jwk.alg) { + throw new Error('The "alg" property of the JWK must be set to "ES384" or "RS384"'); + } + // Use of the "key_ops" member is OPTIONAL, unless the application requires its presence. + // https://www.rfc-editor.org/rfc/rfc7517.html#section-4.3 + // + // In our case the app will only import private keys so we can assume "sign" + if (!Array.isArray(jwk.key_ops)) { + jwk.key_ops = ["sign"]; + } + // In this case the JWK has a "key_ops" array and "sign" is not listed + if (!jwk.key_ops.includes("sign")) { + throw new Error('The "key_ops" property of the JWK does not contain "sign"'); + } + try { + return await subtle().importKey("jwk", jwk, ALGS[jwk.alg], jwk.ext === true, jwk.key_ops // || ['sign'] + ); + } + catch (e) { + throw new Error(`The ${jwk.alg} is not supported by this browser: ${e}`); + } +} +async function signCompactJws(alg, privateKey, header, payload) { + const jwtHeader = JSON.stringify({ ...header, alg }); + const jwtPayload = JSON.stringify(payload); + const jwtAuthenticatedContent = `${base64urlencode(jwtHeader)}.${base64urlencode(jwtPayload)}`; + const signature = await subtle().sign({ ...privateKey.algorithm, hash: 'SHA-384' }, privateKey, new TextEncoder().encode(jwtAuthenticatedContent)); + return `${jwtAuthenticatedContent}.${base64urlencode(new Uint8Array(signature))}`; +} +function base64urlencode(input) { + // Step 1: Convert Uint8Array to binary string if needed + if (input instanceof Uint8Array) { + input = uint8ArrayToBinaryString(input); + } + // Step 2: Encode the binary string to Base64 + let base64 = btoa(input); + // Step 3: Replace Base64 characters with Base64URL characters and remove padding + let base64Url = base64.replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, ""); + return base64Url; +} +function base64urldecode(input) { + // Step 1: Replace Base64URL characters with standard Base64 characters + let base64 = input.replace(/-/g, "+").replace(/_/g, "/"); + // Step 2: Add padding if necessary + const pad = base64.length % 4; + if (pad) { + base64 += "=".repeat(4 - pad); + } + // Step 3: Decode the Base64 string + try { + return atob(base64); + } + catch (e) { + throw new Error("Invalid Base64URL string"); + } +} +function uint8ArrayToBinaryString(input) { + let bin = ""; + for (let i = 0; i < input.length; i++) { + bin += String.fromCharCode(input[i]); + } + return bin; +} +/** + * Resolves a reference to target window. It may also open new window or tab if + * the `target = "popup"` or `target = "_blank"`. + * @param target + * @param width Only used when `target = "popup"` + * @param height Only used when `target = "popup"` + */ +async function getTargetWindow(target, width = 800, height = 720) { + // The target can be a function that returns the target. This can be + // used to open a layer pop-up with an iframe and then return a reference + // to that iframe (or its name) + if (typeof target == "function") { + target = await target(); + } + // The target can be a window reference + if (target && typeof target == "object") { + return target; + } + // At this point target must be a string + if (typeof target != "string") { + debug("Invalid target type '%s'. Failing back to '_self'.", typeof target); + return self; + } + // Current window + if (target == "_self") { + return self; + } + // The parent frame + if (target == "_parent") { + return parent; + } + // The top window + if (target == "_top") { + return top || self; + } + // New tab or window + if (target == "_blank") { + let error, targetWindow = null; + try { + targetWindow = window.open("", "SMARTAuthPopup"); + if (!targetWindow) { + throw new Error("Perhaps window.open was blocked"); + } + } + catch (e) { + error = e; + } + if (!targetWindow) { + debug("Cannot open window. Failing back to '_self'. %s", error); + return self; + } + else { + return targetWindow; + } + } + // Popup window + if (target == "popup") { + let error, targetWindow = null; + // if (!targetWindow || targetWindow.closed) { + try { + targetWindow = window.open("", "SMARTAuthPopup", [ + "height=" + height, + "width=" + width, + "menubar=0", + "resizable=1", + "status=0", + "top=" + (screen.height - height) / 2, + "left=" + (screen.width - width) / 2 + ].join(",")); + if (!targetWindow) { + throw new Error("Perhaps the popup window was blocked"); + } + } + catch (e) { + error = e; + } + if (!targetWindow) { + debug("Cannot open window. Failing back to '_self'. %s", error); + return self; + } + else { + return targetWindow; + } + } + // Frame or window by name + const winOrFrame = frames[target]; + if (winOrFrame) { + return winOrFrame; + } + debug("Unknown target '%s'. Failing back to '_self'.", target); + return self; +} +/** + * Checks if called within a frame. Only works in browsers! + * If the current window has a `parent` or `top` properties that refer to + * another window, returns true. If trying to access `top` or `parent` throws an + * error, returns true. Otherwise returns `false`. + */ +function isInFrame() { + try { + return self !== top && parent !== self; + } + catch (e) { + return true; + } +} +/** + * Checks if called within another window (popup or tab). Only works in browsers! + * To consider itself called in a new window, this function verifies that: + * 1. `self === top` (not in frame) + * 2. `!!opener && opener !== self` The window has an opener + * 3. `!!window.name` The window has a `name` set + */ +function isInPopUp() { + try { + return self === top && + !!opener && + opener !== self && + !!window.name; + } + catch (e) { + return false; + } +} +/** + * Another window can send a "completeAuth" message to this one, making it to + * navigate to e.data.url + * @param e The message event + */ +function onMessage(e) { + if (e.data.type == "completeAuth" && e.origin === new URL(self.location.href).origin) { + window.removeEventListener("message", onMessage); + window.location.href = e.data.url; + } +} + +function isBrowser() { + return typeof window === "object"; +} +/** + * Starts the SMART Launch Sequence. + * > **IMPORTANT**: + * `authorize()` will end up redirecting you to the authorization server. + * This means that you should not add anything to the returned promise chain. + * Any code written directly after the authorize() call might not be executed + * due to that redirect! + * @param env + * @param [params] + */ +async function authorize$1(env, params = {}) { + const url = env.getUrl(); + // Multiple config for EHR launches --------------------------------------- + if (Array.isArray(params)) { + const urlISS = url.searchParams.get("iss") || url.searchParams.get("fhirServiceUrl"); + if (!urlISS) { + throw new Error('Passing in an "iss" url parameter is required if authorize ' + + 'uses multiple configurations'); + } + // pick the right config + const cfg = params.find(x => { + if (x.issMatch) { + if (typeof x.issMatch === "function") { + return !!x.issMatch(urlISS); + } + if (typeof x.issMatch === "string") { + return x.issMatch === urlISS; + } + if (x.issMatch instanceof RegExp) { + return x.issMatch.test(urlISS); + } + } + return false; + }); + assert(cfg, `No configuration found matching the current "iss" parameter "${urlISS}"`); + return await authorize$1(env, cfg); + } + // ------------------------------------------------------------------------ + // Obtain input + const { clientSecret, fakeTokenResponse, encounterId, target, width, height, pkceMode, clientPublicKeySetUrl } = params; + let { iss, launch, patientId, fhirServiceUrl, redirectUri, noRedirect, scope = "", clientId, completeInTarget, clientPrivateJwk } = params; + const storage = env.getStorage(); + // For these, a url param takes precedence over inline option + iss = url.searchParams.get("iss") || iss; + fhirServiceUrl = url.searchParams.get("fhirServiceUrl") || fhirServiceUrl; + launch = url.searchParams.get("launch") || launch; + patientId = url.searchParams.get("patientId") || patientId; + clientId = url.searchParams.get("clientId") || clientId; + if (!redirectUri) { + redirectUri = env.relative("."); + } + else if (!redirectUri.match(/^https?\:\/\//)) { + redirectUri = env.relative(redirectUri); + } + const serverUrl = String(iss || fhirServiceUrl || ""); + // Validate input + if (!serverUrl) { + throw new Error("No server url found. It must be specified as `iss` or as " + + "`fhirServiceUrl` parameter"); + } + if (iss) { + debug("Making %s launch...", launch ? "EHR" : "standalone"); + } + // append launch scope if needed + if (launch && !scope.match(/launch/)) { + scope += " launch"; + } + if (isBrowser()) { + const inFrame = isInFrame(); + const inPopUp = isInPopUp(); + if ((inFrame || inPopUp) && completeInTarget !== true && completeInTarget !== false) { + // completeInTarget will default to true if authorize is called from + // within an iframe. This is to avoid issues when the entire app + // happens to be rendered in an iframe (including in some EHRs), + // even though that was not how the app developer's intention. + completeInTarget = inFrame; + // In this case we can't always make the best decision so ask devs + // to be explicit in their configuration. + console.warn('Your app is being authorized from within an iframe or popup ' + + 'window. Please be explicit and provide a "completeInTarget" ' + + 'option. Use "true" to complete the authorization in the ' + + 'same window, or "false" to try to complete it in the parent ' + + 'or the opener window. See http://docs.smarthealthit.org/client-js/api.html'); + } + } + // If `authorize` is called, make sure we clear any previous state (in case + // this is a re-authorize) + const oldKey = await storage.get(SMART_KEY); + await storage.unset(oldKey); + // create initial state + const stateKey = randomString(16); + const state = { + clientId, + scope, + redirectUri, + serverUrl, + clientSecret, + clientPrivateJwk, + tokenResponse: {}, + key: stateKey, + completeInTarget, + clientPublicKeySetUrl + }; + await storage.set(SMART_KEY, stateKey); + // fakeTokenResponse to override stuff (useful in development) + if (fakeTokenResponse) { + Object.assign(state.tokenResponse, fakeTokenResponse); + } + // Fixed patientId (useful in development) + if (patientId) { + Object.assign(state.tokenResponse, { patient: patientId }); + } + // Fixed encounterId (useful in development) + if (encounterId) { + Object.assign(state.tokenResponse, { encounter: encounterId }); + } + let redirectUrl = redirectUri + "?state=" + encodeURIComponent(stateKey); + // bypass oauth if fhirServiceUrl is used (but iss takes precedence) + if (fhirServiceUrl && !iss) { + debug("Making fake launch..."); + await storage.set(stateKey, state); + if (noRedirect) { + return redirectUrl; + } + return await env.redirect(redirectUrl); + } + // Get oauth endpoints and add them to the state + const extensions = await getSecurityExtensions(serverUrl); + Object.assign(state, extensions); + await storage.set(stateKey, state); + // If this happens to be an open server and there is no authorizeUri + if (!state.authorizeUri) { + if (noRedirect) { + return redirectUrl; + } + return await env.redirect(redirectUrl); + } + // build the redirect uri + const redirectParams = [ + "response_type=code", + "client_id=" + encodeURIComponent(clientId || ""), + "scope=" + encodeURIComponent(scope), + "redirect_uri=" + encodeURIComponent(redirectUri), + "aud=" + encodeURIComponent(serverUrl), + "state=" + encodeURIComponent(stateKey) + ]; + // also pass this in case of EHR launch + if (launch) { + redirectParams.push("launch=" + encodeURIComponent(launch)); + } + if (shouldIncludeChallenge(extensions.codeChallengeMethods.includes('S256'), pkceMode)) { + let codes = await env.security.generatePKCEChallenge(); + Object.assign(state, codes); + await storage.set(stateKey, state); + redirectParams.push("code_challenge=" + state.codeChallenge); // note that the challenge is ALREADY encoded properly + redirectParams.push("code_challenge_method=S256"); + } + redirectUrl = state.authorizeUri + "?" + redirectParams.join("&"); + if (noRedirect) { + return redirectUrl; + } + if (target && isBrowser()) { + let win; + win = await getTargetWindow(target, width, height); + if (win !== self) { + try { + // Also remove any old state from the target window and then + // transfer the current state there + win.sessionStorage.removeItem(oldKey); + win.sessionStorage.setItem(stateKey, JSON.stringify(state)); + } + catch (ex) { + debug(`oauth2: Failed to modify window.sessionStorage. Perhaps it is from different origin?. Failing back to "_self". %s`, ex); + win = self; + } + } + if (win !== self) { + try { + win.location.href = redirectUrl; + self.addEventListener("message", onMessage); + } + catch (ex) { + debug(`oauth2: Failed to modify window.location. Perhaps it is from different origin?. Failing back to "_self". %s`, ex); + self.location.href = redirectUrl; + } + } + else { + self.location.href = redirectUrl; + } + return; + } + return await env.redirect(redirectUrl); +} +/** + * The ready function should only be called on the page that represents + * the redirectUri. We typically land there after a redirect from the + * authorization server, but this code will also be executed upon subsequent + * navigation or page refresh. + */ +async function ready$1(env, options = {}) { + var _a, _b; + const url = env.getUrl(); + const Storage = env.getStorage(); + const params = url.searchParams; + let key = params.get("state"); + const code = params.get("code"); + const authError = params.get("error"); + const authErrorDescription = params.get("error_description"); + if (!key) { + key = await Storage.get(SMART_KEY); + } + // Start by checking the url for `error` and `error_description` parameters. + // This happens when the auth server rejects our authorization attempt. In + // this case it has no other way to tell us what the error was, other than + // appending these parameters to the redirect url. + // From client's point of view, this is not very reliable (because we can't + // know how we have landed on this page - was it a redirect or was it loaded + // manually). However, if `ready()` is being called, we can assume + // that the url comes from the auth server (otherwise the app won't work + // anyway). + if (authError || authErrorDescription) { + throw new Error([ + authError, + authErrorDescription + ].filter(Boolean).join(": ")); + } + debug("key: %s, code: %s", key, code); + // key might be coming from the page url so it might be empty or missing + assert(key, "No 'state' parameter found. Please (re)launch the app."); + // Check if we have a previous state + let state = (await Storage.get(key)); + // If we are in a popup window or an iframe and the authorization is + // complete, send the location back to our opener and exit. + if (isBrowser() && state && !state.completeInTarget) { + const inFrame = isInFrame(); + const inPopUp = isInPopUp(); + // we are about to return to the opener/parent where completeAuth will + // be called again. In rare cases the opener or parent might also be + // a frame or popup. Then inFrame or inPopUp will be true but we still + // have to stop going up the chain. To guard against that weird form of + // recursion we pass one additional parameter to the url which we later + // remove. + if ((inFrame || inPopUp) && !url.searchParams.get("complete")) { + url.searchParams.set("complete", "1"); + const { href, origin } = url; + if (inFrame) { + parent.postMessage({ type: "completeAuth", url: href }, origin); + } + if (inPopUp) { + opener.postMessage({ type: "completeAuth", url: href }, origin); + window.close(); + } + return new Promise(() => { }); + } + } + url.searchParams.delete("complete"); + // Do we have to remove the `code` and `state` params from the URL? + const hasState = params.has("state"); + if (isBrowser() && (code || hasState)) { + // `code` is the flag that tell us to request an access token. + // We have to remove it, otherwise the page will authorize on + // every load! + if (code) { + params.delete("code"); + debug("Removed code parameter from the url."); + } + // We no longer need the `state` key. It will be stored to a well know + // location - sessionStorage[SMART_KEY] + if (hasState) { + params.delete("state"); + debug("Removed state parameter from the url."); + } + // If the browser does not support the replaceState method for the + // History Web API, the "code" parameter cannot be removed. As a + // consequence, the page will (re)authorize on every load. The + // workaround is to reload the page to new location without those + // parameters. + if (window.history.replaceState) { + window.history.replaceState({}, "", url.href); + } + } + // If the state does not exist, it means the page has been loaded directly. + assert(state, "No state found! Please (re)launch the app."); + // Assume the client has already completed a token exchange when + // there is no code (but we have a state) or access token is found in state + const authorized = !code || ((_a = state.tokenResponse) === null || _a === void 0 ? void 0 : _a.access_token); + // If we are authorized already, then this is just a reload. + // Otherwise, we have to complete the code flow + if (!authorized && state.tokenUri) { + assert(code, "'code' url parameter is required"); + debug("Preparing to exchange the code for access token..."); + const requestOptions = await buildTokenRequest(env, { + code, + state, + clientPublicKeySetUrl: options.clientPublicKeySetUrl, + privateKey: options.privateKey || state.clientPrivateJwk + }); + debug("Token request options: %O", requestOptions); + // The EHR authorization server SHALL return a JSON structure that + // includes an access token or a message indicating that the + // authorization request has been denied. + const tokenResponse = await request(state.tokenUri, requestOptions); + debug("Token response: %O", tokenResponse); + assert(tokenResponse.access_token, "Failed to obtain access token."); + // Now we need to determine when is this authorization going to expire + state.expiresAt = getAccessTokenExpiration(tokenResponse); + // save the tokenResponse so that we don't have to re-authorize on + // every page reload + state = { ...state, tokenResponse }; + await Storage.set(key, state); + debug("Authorization successful!"); + } + else { + debug(((_b = state.tokenResponse) === null || _b === void 0 ? void 0 : _b.access_token) ? + "Already authorized" : + "No authorization needed"); + } + await Storage.set(SMART_KEY, key); + const client = new Client(state, env.getStorage()); + debug("Created client instance: %O", client); + return client; +} +/** + * Builds the token request options. Does not make the request, just + * creates it's configuration and returns it in a Promise. + */ +async function buildTokenRequest(env, { code, state, clientPublicKeySetUrl, privateKey }) { + const { redirectUri, clientSecret, tokenUri, clientId, codeVerifier } = state; + assert(redirectUri, "Missing state.redirectUri"); + assert(tokenUri, "Missing state.tokenUri"); + assert(clientId, "Missing state.clientId"); + const requestOptions = { + method: "POST", + headers: { "content-type": "application/x-www-form-urlencoded" }, + body: `code=${code}&grant_type=authorization_code&redirect_uri=${encodeURIComponent(redirectUri)}` + }; + // For public apps, authentication is not possible (and thus not required), + // since a client with no secret cannot prove its identity when it issues a + // call. (The end-to-end system can still be secure because the client comes + // from a known, https protected endpoint specified and enforced by the + // redirect uri.) For confidential apps, an Authorization header using HTTP + // Basic authentication is required, where the username is the app’s + // clientId and the password is the app’s clientSecret (see example). + if (clientSecret) { + requestOptions.headers.authorization = "Basic " + base64encode(clientId + ":" + clientSecret); + debug("Using state.clientSecret to construct the authorization header: %s", requestOptions.headers.authorization); + } + // Asymmetric auth + else if (privateKey) { + const pk = "key" in privateKey ? + privateKey.key : + await env.security.importJWK(privateKey); + const jwtHeaders = { + typ: "JWT", + kid: privateKey.kid, + jku: clientPublicKeySetUrl || state.clientPublicKeySetUrl + }; + const jwtClaims = { + iss: clientId, + sub: clientId, + aud: tokenUri, + jti: env.base64urlencode(env.security.randomBytes(32)), + exp: getTimeInFuture(120) // two minutes in the future + }; + const clientAssertion = await env.security.signCompactJws(privateKey.alg, pk, jwtHeaders, jwtClaims); + requestOptions.body += `&client_assertion_type=${encodeURIComponent("urn:ietf:params:oauth:client-assertion-type:jwt-bearer")}`; + requestOptions.body += `&client_assertion=${encodeURIComponent(clientAssertion)}`; + debug("Using state.clientPrivateJwk to add a client_assertion to the POST body"); + } + // Public client + else { + debug("Public client detected; adding state.clientId to the POST body"); + requestOptions.body += `&client_id=${encodeURIComponent(clientId)}`; + } + if (codeVerifier) { + debug("Found state.codeVerifier, adding to the POST body"); + // Note that the codeVerifier is ALREADY encoded properly + requestOptions.body += "&code_verifier=" + codeVerifier; + } + return requestOptions; +} +/** + * This function can be used when you want to handle everything in one page + * (no launch endpoint needed). You can think of it as if it does: + * ```js + * authorize(options).then(ready) + * ``` + * + * **Be careful with init()!** There are some details you need to be aware of: + * + * 1. It will only work if your launch_uri is the same as your redirect_uri. + * While this should be valid, we can’t promise that every EHR will allow you + * to register client with such settings. + * 2. Internally, `init()` will be called twice. First it will redirect to the + * EHR, then the EHR will redirect back to the page where init() will be + * called again to complete the authorization. This is generally fine, + * because the returned promise will only be resolved once, after the second + * execution, but please also consider the following: + * - You should wrap all your app’s code in a function that is only executed + * after `init()` resolves! + * - Since the page will be loaded twice, you must be careful if your code + * has global side effects that can persist between page reloads + * (for example writing to localStorage). + * 3. For standalone launch, only use init in combination with offline_access + * scope. Once the access_token expires, if you don’t have a refresh_token + * there is no way to re-authorize properly. We detect that and delete the + * expired access token, but it still means that the user will have to + * refresh the page twice to re-authorize. + * @param env The adapter + * @param authorizeOptions The authorize options + * @param [readyOptions] + */ +async function init$1(env, authorizeOptions, readyOptions) { + const url = env.getUrl(); + const code = url.searchParams.get("code"); + const state = url.searchParams.get("state"); + // if `code` and `state` params are present we need to complete the auth flow + if (code && state) { + return ready$1(env, readyOptions); + } + // Check for existing client state. If state is found, it means a client + // instance have already been created in this session and we should try to + // "revive" it. + const storage = env.getStorage(); + const key = state || await storage.get(SMART_KEY); + const cached = await storage.get(key); + if (cached) { + return new Client(cached, env.getStorage()); + } + // Otherwise try to launch + return authorize$1(env, authorizeOptions).then(() => { + // `init` promises a Client but that cannot happen in this case. The + // browser will be redirected (unload the page and be redirected back + // to it later and the same init function will be called again). On + // success, authorize will resolve with the redirect url but we don't + // want to return that from this promise chain because it is not a + // Client instance. At the same time, if authorize fails, we do want to + // pass the error to those waiting for a client instance. + return new Promise(() => { }); + }); +} + +class Storage { + async get(key) { + const value = sessionStorage[key]; + if (value) { + return JSON.parse(value); + } + return null; + } + async set(key, value) { + sessionStorage[key] = JSON.stringify(value); + return value; + } + async unset(key) { + if (key in sessionStorage) { + delete sessionStorage[key]; + return true; + } + return false; + } +} + +/** + * Browser Adapter + */ +class BrowserAdapter { + /** + * @param options Environment-specific options + */ + constructor(options = {}) { + /** + * Stores the URL instance associated with this adapter + */ + this._url = null; + /** + * Holds the Storage instance associated with this instance + */ + this._storage = null; + this.security = { + randomBytes: randomBytes, + digestSha256: digestSha256, + generatePKCEChallenge: generatePKCEChallenge, + importJWK: importJWK, + signCompactJws: signCompactJws + }; + this.options = { ...options }; + } + /** + * Given a relative path, returns an absolute url using the instance base URL + */ + relative(path) { + return new URL(path, this.getUrl().href).href; + } + /** + * Given the current environment, this method must return the current url + * as URL instance + */ + getUrl() { + if (!this._url) { + this._url = new URL(location + ""); + } + return this._url; + } + /** + * Given the current environment, this method must redirect to the given + * path + */ + redirect(to) { + location.href = to; + } + /** + * Returns a BrowserStorage object which is just a wrapper around + * sessionStorage + */ + getStorage() { + if (!this._storage) { + this._storage = new Storage(); + } + return this._storage; + } + base64urlencode(input) { + return base64urlencode(input); + } + base64urldecode(input) { + return base64urldecode(input); + } + /** + * Creates and returns adapter-aware SMART api. Not that while the shape of + * the returned object is well known, the arguments to this function are not. + * Those who override this method are free to require any environment-specific + * arguments. For example in node we will need a request, a response and + * optionally a storage or storage factory function. + */ + getSmartApi() { + return { + ready: (...args) => ready$1(this, ...args), + authorize: options => authorize$1(this, options), + init: options => init$1(this, options), + client: (state) => new Client(state, this.getStorage()), + options: this.options, + utils: { + security: this.security + } + }; + } +} + +const { ready, authorize, init, client, options, utils } = new BrowserAdapter().getSmartApi(); +// export default { +// client, +// utils, +// oauth2: { +// settings: options, +// ready, +// authorize, +// init +// } +// }; +function smart(settings = {}) { + return smart; +} +smart.authorize = authorize; +smart.ready = ready; +smart.init = init; +smart.client = client; +smart.utils = utils; + +export { smart as default }; diff --git a/dist/lib/next/BrowserAdapter.d.ts b/dist/lib/next/BrowserAdapter.d.ts new file mode 100644 index 00000000..8d7bf358 --- /dev/null +++ b/dist/lib/next/BrowserAdapter.d.ts @@ -0,0 +1,60 @@ +import { fhirclient } from "."; +import BrowserStorage from "./BrowserStorage"; +import * as browserLib from "./browser"; +/** + * Browser Adapter + */ +export default class BrowserAdapter implements fhirclient.Adapter { + /** + * Stores the URL instance associated with this adapter + */ + private _url; + /** + * Holds the Storage instance associated with this instance + */ + private _storage; + /** + * Environment-specific options + */ + options: fhirclient.BrowserFHIRSettings; + security: { + randomBytes: typeof browserLib.randomBytes; + digestSha256: typeof browserLib.digestSha256; + generatePKCEChallenge: (entropy?: number) => Promise; + importJWK: typeof browserLib.importJWK; + signCompactJws: typeof browserLib.signCompactJws; + }; + /** + * @param options Environment-specific options + */ + constructor(options?: fhirclient.BrowserFHIRSettings); + /** + * Given a relative path, returns an absolute url using the instance base URL + */ + relative(path: string): string; + /** + * Given the current environment, this method must return the current url + * as URL instance + */ + getUrl(): URL; + /** + * Given the current environment, this method must redirect to the given + * path + */ + redirect(to: string): void; + /** + * Returns a BrowserStorage object which is just a wrapper around + * sessionStorage + */ + getStorage(): BrowserStorage; + base64urlencode(input: string | Uint8Array): string; + base64urldecode(input: string): string; + /** + * Creates and returns adapter-aware SMART api. Not that while the shape of + * the returned object is well known, the arguments to this function are not. + * Those who override this method are free to require any environment-specific + * arguments. For example in node we will need a request, a response and + * optionally a storage or storage factory function. + */ + getSmartApi(): fhirclient.SMART_API; +} diff --git a/dist/lib/next/BrowserAdapter.js b/dist/lib/next/BrowserAdapter.js new file mode 100644 index 00000000..6f4fe17f --- /dev/null +++ b/dist/lib/next/BrowserAdapter.js @@ -0,0 +1,117 @@ +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const smart_1 = require("./smart"); +const Client_1 = __importDefault(require("./Client")); +const BrowserStorage_1 = __importDefault(require("./BrowserStorage")); +const browserLib = __importStar(require("./browser")); +/** + * Browser Adapter + */ +class BrowserAdapter { + /** + * @param options Environment-specific options + */ + constructor(options = {}) { + /** + * Stores the URL instance associated with this adapter + */ + this._url = null; + /** + * Holds the Storage instance associated with this instance + */ + this._storage = null; + this.security = { + randomBytes: browserLib.randomBytes, + digestSha256: browserLib.digestSha256, + generatePKCEChallenge: browserLib.generatePKCEChallenge, + importJWK: browserLib.importJWK, + signCompactJws: browserLib.signCompactJws + }; + this.options = { ...options }; + } + /** + * Given a relative path, returns an absolute url using the instance base URL + */ + relative(path) { + return new URL(path, this.getUrl().href).href; + } + /** + * Given the current environment, this method must return the current url + * as URL instance + */ + getUrl() { + if (!this._url) { + this._url = new URL(location + ""); + } + return this._url; + } + /** + * Given the current environment, this method must redirect to the given + * path + */ + redirect(to) { + location.href = to; + } + /** + * Returns a BrowserStorage object which is just a wrapper around + * sessionStorage + */ + getStorage() { + if (!this._storage) { + this._storage = new BrowserStorage_1.default(); + } + return this._storage; + } + base64urlencode(input) { + return browserLib.base64urlencode(input); + } + base64urldecode(input) { + return browserLib.base64urldecode(input); + } + /** + * Creates and returns adapter-aware SMART api. Not that while the shape of + * the returned object is well known, the arguments to this function are not. + * Those who override this method are free to require any environment-specific + * arguments. For example in node we will need a request, a response and + * optionally a storage or storage factory function. + */ + getSmartApi() { + return { + ready: (...args) => (0, smart_1.ready)(this, ...args), + authorize: options => (0, smart_1.authorize)(this, options), + init: options => (0, smart_1.init)(this, options), + client: (state) => new Client_1.default(state, this.getStorage()), + options: this.options, + utils: { + security: this.security + } + }; + } +} +exports.default = BrowserAdapter; diff --git a/dist/lib/next/BrowserStorage.d.ts b/dist/lib/next/BrowserStorage.d.ts new file mode 100644 index 00000000..3b6572aa --- /dev/null +++ b/dist/lib/next/BrowserStorage.d.ts @@ -0,0 +1,6 @@ +import { fhirclient } from "."; +export default class Storage implements fhirclient.Storage { + get(key: string): Promise; + set(key: string, value: any): Promise; + unset(key: string): Promise; +} diff --git a/dist/lib/next/BrowserStorage.js b/dist/lib/next/BrowserStorage.js new file mode 100644 index 00000000..67b18e83 --- /dev/null +++ b/dist/lib/next/BrowserStorage.js @@ -0,0 +1,23 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +class Storage { + async get(key) { + const value = sessionStorage[key]; + if (value) { + return JSON.parse(value); + } + return null; + } + async set(key, value) { + sessionStorage[key] = JSON.stringify(value); + return value; + } + async unset(key) { + if (key in sessionStorage) { + delete sessionStorage[key]; + return true; + } + return false; + } +} +exports.default = Storage; diff --git a/dist/lib/next/Client.d.ts b/dist/lib/next/Client.d.ts new file mode 100644 index 00000000..4675ec7a --- /dev/null +++ b/dist/lib/next/Client.d.ts @@ -0,0 +1,179 @@ +import { fhirclient } from "."; +/** + * This is a FHIR client that is returned to you from the `ready()` call of the + * **SMART API**. You can also create it yourself if needed: + * + * ```js + * // BROWSER + * const client = FHIR.client("https://r4.smarthealthit.org"); + * + * // SERVER + * const client = smart(req, res).client("https://r4.smarthealthit.org"); + * ``` + */ +export default class Client implements fhirclient.ClientInterface { + /** + * The state of the client instance is an object with various properties. + * It contains some details about how the client has been authorized and + * determines the behavior of the client instance. This state is persisted + * in `SessionStorage` in browsers or in request session on the servers. + */ + readonly state: fhirclient.ClientState; + /** + * The Storage to use + */ + readonly storage: fhirclient.Storage; + /** + * A SMART app is typically associated with a patient. This is a namespace + * for the patient-related functionality of the client. + */ + readonly patient: { + /** + * The ID of the current patient or `null` if there is no current patient + */ + id: string | null; + /** + * A method to fetch the current patient resource from the FHIR server. + * If there is no patient context, it will reject with an error. + * @param {fhirclient.FetchOptions} [requestOptions] Any options to pass to the `fetch` call. + * @category Request + */ + read: fhirclient.RequestFunction; + /** + * This is similar to [[request]] but it makes requests in the + * context of the current patient. For example, instead of doing + * ```js + * client.request("Observation?patient=" + client.patient.id) + * ``` + * you can do + * ```js + * client.patient.request("Observation") + * ``` + * The return type depends on the arguments. Typically it will be the + * response payload JSON object. Can also be a string or the `Response` + * object itself if we have received a non-json result, which allows us + * to handle even binary responses. Can also be a [[CombinedFetchResult]] + * object if the `requestOptions.includeResponse`s has been set to true. + * @category Request + */ + request: (requestOptions: string | URL | fhirclient.RequestOptions, fhirOptions?: fhirclient.FhirOptions) => Promise; + }; + /** + * The client may be associated with a specific encounter, if the scopes + * permit that and if the back-end server supports that. This is a namespace + * for encounter-related functionality. + */ + readonly encounter: { + /** + * The ID of the current encounter or `null` if there is no current + * encounter + */ + id: string | null; + /** + * A method to fetch the current encounter resource from the FHIR server. + * If there is no encounter context, it will reject with an error. + * @param [requestOptions] Any options to pass to the `fetch` call. + * @category Request + */ + read: fhirclient.RequestFunction; + }; + /** + * The client may be associated with a specific user, if the scopes + * permit that. This is a namespace for user-related functionality. + */ + readonly user: { + /** + * The ID of the current user or `null` if there is no current user + */ + id: string | null; + /** + * A method to fetch the current user resource from the FHIR server. + * If there is no user context, it will reject with an error. + * @param [requestOptions] Any options to pass to the `fetch` call. + * @category Request + */ + read: fhirclient.RequestFunction; + /** + * Returns the profile of the logged_in user (if any), or null if the + * user is not available. This is a string having the shape + * `{user type}/{user id}`. For example `Practitioner/abc` or + * `Patient/xyz`. + * @alias client.getFhirUser() + */ + fhirUser: string | null; + /** + * Returns the type of the logged-in user or null. The result can be + * `Practitioner`, `Patient` or `RelatedPerson`. + * @alias client.getUserType() + */ + resourceType: string | null; + }; + /** + * Refers to the refresh task while it is being performed. + * @see [[refresh]] + */ + private _refreshTask; + /** + * Validates the parameters and creates an instance. + */ + constructor(state: fhirclient.ClientState | string, storage: fhirclient.Storage); + getPatientId(): string | null; + getEncounterId(): string | null; + getIdToken(): fhirclient.IDToken | null; + getFhirUser(): any; + getUserId(): any; + getUserType(): any; + getAuthorizationHeader(): string | null; + /** + * Used internally to clear the state of the instance and the state in the + * associated storage. + */ + private _clearState; + create(resource: fhirclient.FHIR.Resource, requestOptions?: O): Promise : R>; + update(resource: fhirclient.FHIR.Resource, requestOptions?: O): Promise : R>; + delete(url: string, requestOptions?: fhirclient.FetchOptions): Promise; + patch(url: string, patch: fhirclient.JsonPatch, requestOptions?: fhirclient.FetchOptions): Promise; + request(requestOptions: string | URL | fhirclient.RequestOptions, fhirOptions?: fhirclient.FhirOptions, _resolvedRefs?: fhirclient.JsonObject): Promise; + refreshIfNeeded(requestOptions?: RequestInit): Promise; + refresh(requestOptions?: RequestInit): Promise; + /** + * Walks through an object (or array) and returns the value found at the + * provided path. This function is very simple so it intentionally does not + * support any argument polymorphism, meaning that the path can only be a + * dot-separated string. If the path is invalid returns undefined. + * @param obj The object (or Array) to walk through + * @param path The path (eg. "a.b.4.c") + * @returns {*} Whatever is found in the path or undefined + * @todo This should be deprecated and moved elsewhere. One should not have + * to obtain an instance of [[Client]] just to use utility functions like this. + * @deprecated + * @category Utility + */ + getPath(obj: Record, path?: string): any; + /** + * Returns a copy of the client state. Accepts a dot-separated path argument + * (same as for `getPath`) to allow for selecting specific properties. + * Examples: + * ```js + * client.getState(); // -> the entire state object + * client.getState("serverUrl"); // -> the URL we are connected to + * client.getState("tokenResponse.patient"); // -> The selected patient ID (if any) + * ``` + * @param path The path (eg. "a.b.4.c") + * @returns {*} Whatever is found in the path or undefined + */ + getState(path?: string): any; + /** + * Returns a promise that will be resolved with the fhir version as defined + * in the CapabilityStatement. + */ + getFhirVersion(): Promise; + /** + * Returns a promise that will be resolved with the numeric fhir version + * - 2 for DSTU2 + * - 3 for STU3 + * - 4 for R4 + * - 0 if the version is not known + */ + getFhirRelease(): Promise; +} diff --git a/dist/lib/next/Client.js b/dist/lib/next/Client.js new file mode 100644 index 00000000..c3f6fcef --- /dev/null +++ b/dist/lib/next/Client.js @@ -0,0 +1,687 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const strings_1 = __importDefault(require("./strings")); +const settings_1 = require("./settings"); +const settings_2 = require("../settings"); +const isomorphic_1 = require("./isomorphic"); +/** + * Adds patient context to requestOptions object to be used with [[Client.request]] + * @param requestOptions Can be a string URL (relative to the serviceUrl), or an + * object which will be passed to fetch() + * @param client Current FHIR client object containing patient context + * @return requestOptions object contextualized to current patient + */ +async function contextualize(requestOptions, client) { + const base = (0, isomorphic_1.absolute)("/", client.state.serverUrl); + async function contextualURL(_url) { + const resourceType = _url.pathname.split("/").pop(); + (0, isomorphic_1.assert)(resourceType, `Invalid url "${_url}"`); + (0, isomorphic_1.assert)(settings_2.patientCompartment.indexOf(resourceType) > -1, `Cannot filter "${resourceType}" resources by patient`); + const conformance = await (0, isomorphic_1.fetchConformanceStatement)(client.state.serverUrl); + const searchParam = (0, isomorphic_1.getPatientParam)(conformance, resourceType); + _url.searchParams.set(searchParam, client.patient.id); + return _url.href; + } + if (typeof requestOptions == "string" || requestOptions instanceof URL) { + return { url: await contextualURL(new URL(requestOptions + "", base)) }; + } + requestOptions.url = await contextualURL(new URL(requestOptions.url + "", base)); + return requestOptions; +} +/** + * Gets single reference by id. Caches the result. + * @param refId + * @param cache A map to store the resolved refs + * @param client The client instance + * @param requestOptions Only signal and headers are currently used if provided + * @returns The resolved reference + * @private + */ +async function getRef(refId, cache, client, requestOptions) { + if (!cache[refId]) { + const { signal, headers } = requestOptions; + // Note that we set cache[refId] immediately! When the promise is + // settled it will be updated. This is to avoid a ref being fetched + // twice because some of these requests are executed in parallel. + cache[refId] = client.request({ + url: refId, + headers, + signal + }).then(res => { + cache[refId] = res; + return res; + }, (error) => { + delete cache[refId]; + throw error; + }); + } + return cache[refId]; +} +/** + * Resolves a reference in the given resource. + * @param obj FHIR Resource + */ +function resolveRef(obj, path, graph, cache, client, requestOptions) { + const node = (0, isomorphic_1.getPath)(obj, path); + if (node) { + const isArray = Array.isArray(node); + return Promise.all((0, isomorphic_1.makeArray)(node).filter(Boolean).map((item, i) => { + const ref = item.reference; + if (ref) { + return getRef(ref, cache, client, requestOptions).then(sub => { + if (graph) { + if (isArray) { + if (path.indexOf("..") > -1) { + (0, isomorphic_1.setPath)(obj, `${path.replace("..", `.${i}.`)}`, sub); + } + else { + (0, isomorphic_1.setPath)(obj, `${path}.${i}`, sub); + } + } + else { + (0, isomorphic_1.setPath)(obj, path, sub); + } + } + }).catch((ex) => { + /* ignore missing references */ + if (ex.status !== 404) { + throw ex; + } + }); + } + })); + } +} +/** + * Given a resource and a list of ref paths - resolves them all + * @param obj FHIR Resource + * @param fhirOptions The fhir options of the initiating request call + * @param cache A map to store fetched refs + * @param client The client instance + * @private + */ +function resolveRefs(obj, fhirOptions, cache, client, requestOptions) { + // 1. Sanitize paths, remove any invalid ones + let paths = (0, isomorphic_1.makeArray)(fhirOptions.resolveReferences) + .filter(Boolean) // No false, 0, null, undefined or "" + .map(path => String(path).trim()) + .filter(Boolean); // No space-only strings + // 2. Remove duplicates + paths = paths.filter((p, i) => { + const index = paths.indexOf(p, i + 1); + if (index > -1) { + (0, isomorphic_1.debug)("client: Duplicated reference path \"%s\"", p); + return false; + } + return true; + }); + // 3. Early exit if no valid paths are found + if (!paths.length) { + return Promise.resolve(); + } + // 4. Group the paths by depth so that child refs are looked up + // after their parents! + const groups = {}; + paths.forEach(path => { + const len = path.split(".").length; + if (!groups[len]) { + groups[len] = []; + } + groups[len].push(path); + }); + // 5. Execute groups sequentially! Paths within same group are + // fetched in parallel! + let task = Promise.resolve(); + Object.keys(groups).sort().forEach(len => { + const group = groups[len]; + task = task.then(() => Promise.all(group.map((path) => { + return resolveRef(obj, path, !!fhirOptions.graph, cache, client, requestOptions); + }))); + }); + return task; +} +/** + * This is a FHIR client that is returned to you from the `ready()` call of the + * **SMART API**. You can also create it yourself if needed: + * + * ```js + * // BROWSER + * const client = FHIR.client("https://r4.smarthealthit.org"); + * + * // SERVER + * const client = smart(req, res).client("https://r4.smarthealthit.org"); + * ``` + */ +class Client { + /** + * Validates the parameters and creates an instance. + */ + constructor(state, storage) { + const _state = typeof state == "string" ? { serverUrl: state } : state; + // Valid serverUrl is required! + (0, isomorphic_1.assert)(_state.serverUrl && _state.serverUrl.match(/https?:\/\/.+/), "A \"serverUrl\" option is required and must begin with \"http(s)\""); + this.storage = storage; + this.state = _state; + this._refreshTask = null; + const client = this; + // patient api --------------------------------------------------------- + this.patient = { + get id() { return client.getPatientId(); }, + read: (requestOptions) => { + const id = this.patient.id; + return id ? + this.request({ ...requestOptions, url: `Patient/${id}` }) : + Promise.reject(new Error("Patient is not available")); + }, + request: (requestOptions, fhirOptions = {}) => { + if (this.patient.id) { + return (async () => { + const options = await contextualize(requestOptions, this); + return this.request(options, fhirOptions); + })(); + } + else { + return Promise.reject(new Error("Patient is not available")); + } + } + }; + // encounter api ------------------------------------------------------- + this.encounter = { + get id() { return client.getEncounterId(); }, + read: requestOptions => { + const id = this.encounter.id; + return id ? + this.request({ ...requestOptions, url: `Encounter/${id}` }) : + Promise.reject(new Error("Encounter is not available")); + } + }; + // user api ------------------------------------------------------------ + this.user = { + get fhirUser() { return client.getFhirUser(); }, + get id() { return client.getUserId(); }, + get resourceType() { return client.getUserType(); }, + read: requestOptions => { + const fhirUser = this.user.fhirUser; + return fhirUser ? + this.request({ ...requestOptions, url: fhirUser }) : + Promise.reject(new Error("User is not available")); + } + }; + } + getPatientId() { + const tokenResponse = this.state.tokenResponse; + if (tokenResponse) { + // We have been authorized against this server but we don't know + // the patient. This should be a scope issue. + if (!tokenResponse.patient) { + if (!(this.state.scope || "").match(/\blaunch(\/patient)?\b/)) { + (0, isomorphic_1.debug)("client: " + strings_1.default.noScopeForId, "patient", "patient"); + } + else { + // The server should have returned the patient! + (0, isomorphic_1.debug)("client: The ID of the selected patient is not available. Please check if your server supports that."); + } + return null; + } + return tokenResponse.patient; + } + if (this.state.authorizeUri) { + (0, isomorphic_1.debug)("client: " + strings_1.default.noIfNoAuth, "the ID of the selected patient"); + } + else { + (0, isomorphic_1.debug)("client: " + strings_1.default.noFreeContext, "selected patient"); + } + return null; + } + getEncounterId() { + const tokenResponse = this.state.tokenResponse; + if (tokenResponse) { + // We have been authorized against this server but we don't know + // the encounter. This should be a scope issue. + if (!tokenResponse.encounter) { + if (!(this.state.scope || "").match(/\blaunch(\/encounter)?\b/)) { + (0, isomorphic_1.debug)("client: " + strings_1.default.noScopeForId, "encounter", "encounter"); + } + else { + // The server should have returned the encounter! + (0, isomorphic_1.debug)("client: The ID of the selected encounter is not available. Please check if your server supports that, and that the selected patient has any recorded encounters."); + } + return null; + } + return tokenResponse.encounter; + } + if (this.state.authorizeUri) { + (0, isomorphic_1.debug)("client: " + strings_1.default.noIfNoAuth, "the ID of the selected encounter"); + } + else { + (0, isomorphic_1.debug)("client: " + strings_1.default.noFreeContext, "selected encounter"); + } + return null; + } + getIdToken() { + const tokenResponse = this.state.tokenResponse; + if (tokenResponse) { + const idToken = tokenResponse.id_token; + const scope = this.state.scope || ""; + // We have been authorized against this server but we don't have + // the id_token. This should be a scope issue. + if (!idToken) { + const hasOpenid = scope.match(/\bopenid\b/); + const hasProfile = scope.match(/\bprofile\b/); + const hasFhirUser = scope.match(/\bfhirUser\b/); + if (!hasOpenid || !(hasFhirUser || hasProfile)) { + (0, isomorphic_1.debug)("client: You are trying to get the id_token but you are not " + + "using the right scopes. Please add 'openid' and " + + "'fhirUser' or 'profile' to the scopes you are " + + "requesting."); + } + else { + // The server should have returned the id_token! + (0, isomorphic_1.debug)("client: The id_token is not available. Please check if your server supports that."); + } + return null; + } + return (0, isomorphic_1.jwtDecode)(idToken); + } + if (this.state.authorizeUri) { + (0, isomorphic_1.debug)("client: " + strings_1.default.noIfNoAuth, "the id_token"); + } + else { + (0, isomorphic_1.debug)("client: " + strings_1.default.noFreeContext, "id_token"); + } + return null; + } + getFhirUser() { + const idToken = this.getIdToken(); + if (idToken) { + // Epic may return a full url + // @see https://github.com/smart-on-fhir/client-js/issues/105 + if (idToken.fhirUser) { + return idToken.fhirUser.split("/").slice(-2).join("/"); + } + return idToken.profile; + } + return null; + } + getUserId() { + const profile = this.getFhirUser(); + if (profile) { + return profile.split("/")[1]; + } + return null; + } + getUserType() { + const profile = this.getFhirUser(); + if (profile) { + return profile.split("/")[0]; + } + return null; + } + getAuthorizationHeader() { + const accessToken = this.getState("tokenResponse.access_token"); + if (accessToken) { + return "Bearer " + accessToken; + } + const { username, password } = this.state; + if (username && password) { + return "Basic " + (0, isomorphic_1.base64encode)(username + ":" + password); + } + return null; + } + /** + * Used internally to clear the state of the instance and the state in the + * associated storage. + */ + async _clearState() { + const key = await this.storage.get("SMART_KEY"); + if (key) { + await this.storage.unset(key); + } + await this.storage.unset("SMART_KEY"); + this.state.tokenResponse = {}; + } + create(resource, requestOptions) { + return this.request({ + ...requestOptions, + url: `${resource.resourceType}`, + method: "POST", + body: JSON.stringify(resource), + headers: { + // TODO: Do we need to alternate with "application/json+fhir"? + "content-type": "application/json", + ...(requestOptions || {}).headers + } + }); + } + update(resource, requestOptions) { + return this.request({ + ...requestOptions, + url: `${resource.resourceType}/${resource.id}`, + method: "PUT", + body: JSON.stringify(resource), + headers: { + // TODO: Do we need to alternate with "application/json+fhir"? + "content-type": "application/json", + ...(requestOptions || {}).headers + } + }); + } + delete(url, requestOptions = {}) { + return this.request({ + ...requestOptions, + url, + method: "DELETE" + }); + } + patch(url, patch, requestOptions = {}) { + (0, isomorphic_1.assertJsonPatch)(patch); + return this.request({ + ...requestOptions, + url, + method: "PATCH", + body: JSON.stringify(patch), + headers: { + "prefer": "return=presentation", + "content-type": "application/json-patch+json; charset=UTF-8", + ...requestOptions.headers, + } + }); + } + async request(requestOptions, fhirOptions = {}, _resolvedRefs = {}) { + var _a; + (0, isomorphic_1.assert)(requestOptions, "request requires an url or request options as argument"); + // url ----------------------------------------------------------------- + let url; + if (typeof requestOptions == "string" || requestOptions instanceof URL) { + url = String(requestOptions); + requestOptions = {}; + } + else { + url = String(requestOptions.url); + } + url = (0, isomorphic_1.absolute)(url, this.state.serverUrl); + const options = { + graph: fhirOptions.graph !== false, + flat: !!fhirOptions.flat, + pageLimit: (_a = fhirOptions.pageLimit) !== null && _a !== void 0 ? _a : 1, + resolveReferences: (fhirOptions.resolveReferences || []), + useRefreshToken: fhirOptions.useRefreshToken !== false, + onPage: typeof fhirOptions.onPage == "function" ? + fhirOptions.onPage : + undefined + }; + const signal = requestOptions.signal || undefined; + // Refresh the access token if needed + const job = options.useRefreshToken ? + this.refreshIfNeeded({ signal }).then(() => requestOptions) : + Promise.resolve(requestOptions); + let response; + return job + // Add the Authorization header now, after the access token might + // have been updated + .then(requestOptions => { + const authHeader = this.getAuthorizationHeader(); + if (authHeader) { + requestOptions.headers = { + ...requestOptions.headers, + authorization: authHeader + }; + } + return requestOptions; + }) + // Make the request + .then(requestOptions => { + (0, isomorphic_1.debug)("client:request: %s, options: %O, fhirOptions: %O", url, requestOptions, options); + return (0, isomorphic_1.request)(url, requestOptions).then(result => { + if (requestOptions.includeResponse) { + response = result.response; + return result.body; + } + return result; + }); + }) + // Handle 401 ------------------------------------------------------ + .catch(async (error) => { + if (error.status == 401) { + // !accessToken -> not authorized -> No session. Need to launch. + if (!this.getState("tokenResponse.access_token")) { + error.message += "\nThis app cannot be accessed directly. Please launch it as SMART app!"; + throw error; + } + // auto-refresh not enabled and Session expired. + // Need to re-launch. Clear state to start over! + if (!options.useRefreshToken) { + (0, isomorphic_1.debug)("client:request: Your session has expired and the useRefreshToken option is set to false. Please re-launch the app."); + await this._clearState(); + error.message += "\n" + strings_1.default.expired; + throw error; + } + // In rare cases we may have a valid access token and a refresh + // token and the request might still fail with 401 just because + // the access token has just been revoked. + // otherwise -> auto-refresh failed. Session expired. + // Need to re-launch. Clear state to start over! + (0, isomorphic_1.debug)("client:request: Auto-refresh failed! Please re-launch the app."); + await this._clearState(); + error.message += "\n" + strings_1.default.expired; + throw error; + } + throw error; + }) + // Handle 403 ------------------------------------------------------ + .catch((error) => { + if (error.status == 403) { + (0, isomorphic_1.debug)("client:request: Permission denied! Please make sure that you have requested the proper scopes."); + } + throw error; + }) + .then((data) => { + // At this point we don't know what `data` actually is! + // We might get an empty or falsy result. If so return it as is + // Also handle raw responses + if (!data || typeof data == "string" || data instanceof Response) { + if (requestOptions.includeResponse) { + return { + body: data, + response + }; + } + return data; + } + // Resolve References ------------------------------------------ + return (async (_data) => { + if (_data.resourceType == "Bundle") { + await Promise.all((_data.entry || []).map(item => resolveRefs(item.resource, options, _resolvedRefs, this, requestOptions))); + } + else { + await resolveRefs(_data, options, _resolvedRefs, this, requestOptions); + } + return _data; + })(data) + // Pagination ---------------------------------------------- + .then(async (_data) => { + if (_data && _data.resourceType == "Bundle") { + const links = (_data.link || []); + if (options.flat) { + _data = (_data.entry || []).map((entry) => entry.resource); + } + if (options.onPage) { + await options.onPage(_data, { ..._resolvedRefs }); + } + if (--options.pageLimit) { + const next = links.find(l => l.relation == "next"); + _data = (0, isomorphic_1.makeArray)(_data); + if (next && next.url) { + const nextPage = await this.request({ + url: next.url, + // Aborting the main request (even after it is complete) + // must propagate to any child requests and abort them! + // To do so, just pass the same AbortSignal if one is + // provided. + signal + }, options, _resolvedRefs); + if (options.onPage) { + return null; + } + if (options.resolveReferences.length) { + Object.assign(_resolvedRefs, nextPage.references); + return _data.concat((0, isomorphic_1.makeArray)(nextPage.data || nextPage)); + } + return _data.concat((0, isomorphic_1.makeArray)(nextPage)); + } + } + } + return _data; + }) + // Finalize ------------------------------------------------ + .then(_data => { + if (options.graph) { + _resolvedRefs = {}; + } + else if (!options.onPage && options.resolveReferences.length) { + return { + data: _data, + references: _resolvedRefs + }; + } + return _data; + }) + .then(_data => { + if (requestOptions.includeResponse) { + return { + body: _data, + response + }; + } + return _data; + }); + }); + } + refreshIfNeeded(requestOptions = {}) { + const accessToken = this.getState("tokenResponse.access_token"); + const refreshToken = this.getState("tokenResponse.refresh_token"); + const expiresAt = this.state.expiresAt || 0; + if (accessToken && refreshToken && expiresAt - 10 < Date.now() / 1000) { + return this.refresh(requestOptions); + } + return Promise.resolve(this.state); + } + refresh(requestOptions = {}) { + var _a, _b; + (0, isomorphic_1.debug)("client:refresh: Attempting to refresh with refresh_token..."); + const refreshToken = (_b = (_a = this.state) === null || _a === void 0 ? void 0 : _a.tokenResponse) === null || _b === void 0 ? void 0 : _b.refresh_token; + (0, isomorphic_1.assert)(refreshToken, "Unable to refresh. No refresh_token found."); + const tokenUri = this.state.tokenUri; + (0, isomorphic_1.assert)(tokenUri, "Unable to refresh. No tokenUri found."); + const scopes = this.getState("tokenResponse.scope") || ""; + const hasOfflineAccess = scopes.search(/\boffline_access\b/) > -1; + const hasOnlineAccess = scopes.search(/\bonline_access\b/) > -1; + (0, isomorphic_1.assert)(hasOfflineAccess || hasOnlineAccess, "Unable to refresh. No offline_access or online_access scope found."); + // This method is typically called internally from `request` if certain + // request fails with 401. However, clients will often run multiple + // requests in parallel which may result in multiple refresh calls. + // To avoid that, we keep a reference to the current refresh task (if any). + if (!this._refreshTask) { + const refreshRequestOptions = { + credentials: this.state.refreshTokenWithCredentials || "same-origin", + ...requestOptions, + method: "POST", + mode: "cors", + headers: { + ...(requestOptions.headers || {}), + "content-type": "application/x-www-form-urlencoded" + }, + body: `grant_type=refresh_token&refresh_token=${encodeURIComponent(refreshToken)}` + }; + // custom authorization header can be passed on manual calls + if (!("authorization" in refreshRequestOptions.headers)) { + const { clientSecret, clientId } = this.state; + if (clientSecret) { + // @ts-ignore + refreshRequestOptions.headers.authorization = "Basic " + (0, isomorphic_1.base64encode)(clientId + ":" + clientSecret); + } + } + this._refreshTask = (0, isomorphic_1.request)(tokenUri, refreshRequestOptions) + .then(data => { + (0, isomorphic_1.assert)(data.access_token, "No access token received"); + (0, isomorphic_1.debug)("client:refresh: Received new access token response %O", data); + this.state.tokenResponse = { ...this.state.tokenResponse, ...data }; + this.state.expiresAt = (0, isomorphic_1.getAccessTokenExpiration)(data); + return this.state; + }) + .catch((error) => { + var _a, _b; + if ((_b = (_a = this.state) === null || _a === void 0 ? void 0 : _a.tokenResponse) === null || _b === void 0 ? void 0 : _b.refresh_token) { + (0, isomorphic_1.debug)("client:refresh: Deleting the expired or invalid refresh token."); + delete this.state.tokenResponse.refresh_token; + } + throw error; + }) + .finally(() => { + this._refreshTask = null; + const key = this.state.key; + if (key) { + return this.storage.set(key, this.state); + } + else { + (0, isomorphic_1.debug)("client:refresh: No 'key' found in Clint.state. Cannot persist the instance."); + } + }); + } + return this._refreshTask; + } + // utils ------------------------------------------------------------------- + /** + * Walks through an object (or array) and returns the value found at the + * provided path. This function is very simple so it intentionally does not + * support any argument polymorphism, meaning that the path can only be a + * dot-separated string. If the path is invalid returns undefined. + * @param obj The object (or Array) to walk through + * @param path The path (eg. "a.b.4.c") + * @returns {*} Whatever is found in the path or undefined + * @todo This should be deprecated and moved elsewhere. One should not have + * to obtain an instance of [[Client]] just to use utility functions like this. + * @deprecated + * @category Utility + */ + getPath(obj, path = "") { + return (0, isomorphic_1.getPath)(obj, path); + } + /** + * Returns a copy of the client state. Accepts a dot-separated path argument + * (same as for `getPath`) to allow for selecting specific properties. + * Examples: + * ```js + * client.getState(); // -> the entire state object + * client.getState("serverUrl"); // -> the URL we are connected to + * client.getState("tokenResponse.patient"); // -> The selected patient ID (if any) + * ``` + * @param path The path (eg. "a.b.4.c") + * @returns {*} Whatever is found in the path or undefined + */ + getState(path = "") { + return (0, isomorphic_1.getPath)({ ...this.state }, path); + } + /** + * Returns a promise that will be resolved with the fhir version as defined + * in the CapabilityStatement. + */ + getFhirVersion() { + return (0, isomorphic_1.fetchConformanceStatement)(this.state.serverUrl) + .then((metadata) => metadata.fhirVersion); + } + /** + * Returns a promise that will be resolved with the numeric fhir version + * - 2 for DSTU2 + * - 3 for STU3 + * - 4 for R4 + * - 0 if the version is not known + */ + getFhirRelease() { + return this.getFhirVersion().then(v => { var _a; return (_a = settings_1.fhirVersions[v]) !== null && _a !== void 0 ? _a : 0; }); + } +} +exports.default = Client; diff --git a/dist/lib/next/NodeAdapter.d.ts b/dist/lib/next/NodeAdapter.d.ts new file mode 100644 index 00000000..a61228a5 --- /dev/null +++ b/dist/lib/next/NodeAdapter.d.ts @@ -0,0 +1,40 @@ +/// +/// +import { IncomingMessage, ServerResponse } from "http"; +import { fhirclient } from "."; +import { digestSha256, generatePKCEChallenge, importJWK, randomBytes, signCompactJws } from "./server"; +interface NodeAdapterOptions { + request: IncomingMessage; + response: ServerResponse; + storage?: fhirclient.Storage | fhirclient.storageFactory; +} +/** + * Node Adapter - works with native NodeJS and with Express + */ +export default class NodeAdapter implements fhirclient.Adapter { + /** + * Holds the Storage instance associated with this instance + */ + protected _storage: fhirclient.Storage | null; + options: NodeAdapterOptions; + security: { + randomBytes: typeof randomBytes; + digestSha256: typeof digestSha256; + generatePKCEChallenge: typeof generatePKCEChallenge; + importJWK: typeof importJWK; + signCompactJws: typeof signCompactJws; + }; + /** + * @param options Environment-specific options + */ + constructor(options: NodeAdapterOptions); + relative(path: string): string; + getProtocol(): string; + getUrl(): URL; + redirect(location: string): void; + getStorage(): fhirclient.Storage; + base64urlencode(input: string | Uint8Array): string; + base64urldecode(input: string): string; + getSmartApi(): fhirclient.SMART_API; +} +export {}; diff --git a/dist/lib/next/NodeAdapter.js b/dist/lib/next/NodeAdapter.js new file mode 100644 index 00000000..cf8bbd94 --- /dev/null +++ b/dist/lib/next/NodeAdapter.js @@ -0,0 +1,88 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const ServerStorage_1 = __importDefault(require("./ServerStorage")); +const server_1 = require("./server"); +const smart_1 = require("./smart"); +const Client_1 = __importDefault(require("./Client")); +/** + * Node Adapter - works with native NodeJS and with Express + */ +class NodeAdapter { + /** + * @param options Environment-specific options + */ + constructor(options) { + /** + * Holds the Storage instance associated with this instance + */ + this._storage = null; + this.security = { + randomBytes: server_1.randomBytes, + digestSha256: server_1.digestSha256, + generatePKCEChallenge: server_1.generatePKCEChallenge, + importJWK: server_1.importJWK, + signCompactJws: server_1.signCompactJws + }; + this.options = { ...options }; + } + relative(path) { + return new URL(path, this.getUrl().href).href; + } + getProtocol() { + const req = this.options.request; + const proto = req.socket.encrypted ? "https" : "http"; + return req.headers["x-forwarded-proto"] || proto; + } + getUrl() { + const req = this.options.request; + let host = req.headers.host; + if (req.headers["x-forwarded-host"]) { + host = req.headers["x-forwarded-host"]; + if (req.headers["x-forwarded-port"] && host.indexOf(":") === -1) { + host += ":" + req.headers["x-forwarded-port"]; + } + } + const protocol = this.getProtocol(); + const orig = String(req.headers["x-original-uri"] || req.url); + return new URL(orig, protocol + "://" + host); + } + redirect(location) { + this.options.response.writeHead(302, { location }); + this.options.response.end(); + } + getStorage() { + if (!this._storage) { + if (this.options.storage) { + if (typeof this.options.storage == "function") { + this._storage = this.options.storage(this.options); + } + else { + this._storage = this.options.storage; + } + } + else { + this._storage = new ServerStorage_1.default(this.options.request); + } + } + return this._storage; + } + base64urlencode(input) { + return (0, server_1.base64urlencode)(input); + } + base64urldecode(input) { + return (0, server_1.base64urldecode)(input); + } + getSmartApi() { + return { + ready: (...args) => (0, smart_1.ready)(this, ...args), + authorize: options => (0, smart_1.authorize)(this, options), + init: options => (0, smart_1.init)(this, options), + client: (state) => new Client_1.default(state, this.getStorage()), + options: this.options + }; + } +} +exports.default = NodeAdapter; diff --git a/dist/lib/next/ServerStorage.d.ts b/dist/lib/next/ServerStorage.d.ts new file mode 100644 index 00000000..68967bf4 --- /dev/null +++ b/dist/lib/next/ServerStorage.d.ts @@ -0,0 +1,8 @@ +import { fhirclient } from "."; +export default class ServerStorage implements fhirclient.Storage { + request: fhirclient.RequestWithSession; + constructor(request: fhirclient.RequestWithSession); + get(key: string): Promise; + set(key: string, value: any): Promise; + unset(key: string): Promise; +} diff --git a/dist/lib/next/ServerStorage.js b/dist/lib/next/ServerStorage.js new file mode 100644 index 00000000..0628939c --- /dev/null +++ b/dist/lib/next/ServerStorage.js @@ -0,0 +1,22 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +class ServerStorage { + constructor(request) { + this.request = request; + } + async get(key) { + return this.request.session[key]; + } + async set(key, value) { + this.request.session[key] = value; + return value; + } + async unset(key) { + if (Object.prototype.hasOwnProperty.call(this.request.session, key)) { + delete this.request.session[key]; + return true; + } + return false; + } +} +exports.default = ServerStorage; diff --git a/dist/lib/next/browser.d.ts b/dist/lib/next/browser.d.ts new file mode 100644 index 00000000..8df2b2c2 --- /dev/null +++ b/dist/lib/next/browser.d.ts @@ -0,0 +1,49 @@ +import { fhirclient } from "../types"; +export interface PkcePair { + codeChallenge: string; + codeVerifier: string; +} +declare const ALGS: { + ES384: EcKeyGenParams; + RS384: RsaHashedKeyGenParams; +}; +export declare function randomBytes(count: number): Uint8Array; +export declare function digestSha256(payload: string): Promise; +export declare const generatePKCEChallenge: (entropy?: number) => Promise; +export declare function importJWK(jwk: fhirclient.JWK): Promise; +export declare function signCompactJws(alg: keyof typeof ALGS, privateKey: CryptoKey, header: any, payload: any): Promise; +export declare function base64urlencode(input: string | Uint8Array): string; +export declare function base64urldecode(input: string): string; +export declare function uint8ArrayToBinaryString(input: Uint8Array): string; +/** + * Resolves a reference to target window. It may also open new window or tab if + * the `target = "popup"` or `target = "_blank"`. + * @param target + * @param width Only used when `target = "popup"` + * @param height Only used when `target = "popup"` + */ +export declare function getTargetWindow(target: fhirclient.WindowTarget, width?: number, height?: number): Promise; +/** + * Checks if called within a frame. Only works in browsers! + * If the current window has a `parent` or `top` properties that refer to + * another window, returns true. If trying to access `top` or `parent` throws an + * error, returns true. Otherwise returns `false`. + */ +export declare function isInFrame(): boolean; +/** + * Checks if called within another window (popup or tab). Only works in browsers! + * To consider itself called in a new window, this function verifies that: + * 1. `self === top` (not in frame) + * 2. `!!opener && opener !== self` The window has an opener + * 3. `!!window.name` The window has a `name` set + */ +export declare function isInPopUp(): boolean; +export declare function relative(path: string): string; +export declare function redirect(to: string): void; +/** + * Another window can send a "completeAuth" message to this one, making it to + * navigate to e.data.url + * @param e The message event + */ +export declare function onMessage(e: MessageEvent): void; +export {}; diff --git a/dist/lib/next/browser.js b/dist/lib/next/browser.js new file mode 100644 index 00000000..b3e7102e --- /dev/null +++ b/dist/lib/next/browser.js @@ -0,0 +1,264 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.onMessage = exports.redirect = exports.relative = exports.isInPopUp = exports.isInFrame = exports.getTargetWindow = exports.uint8ArrayToBinaryString = exports.base64urldecode = exports.base64urlencode = exports.signCompactJws = exports.importJWK = exports.generatePKCEChallenge = exports.digestSha256 = exports.randomBytes = void 0; +const isomorphic_1 = require("./isomorphic"); +const subtle = () => { + if (!(crypto === null || crypto === void 0 ? void 0 : crypto.subtle)) { + if (!globalThis.isSecureContext) { + throw new Error("Some of the required subtle crypto functionality is not available " + + "unless you run this app in secure context (using HTTPS or running locally). " + + "See https://developer.mozilla.org/en-US/docs/Web/Security/Secure_Contexts"); + } + throw new Error("Some of the required subtle crypto functionality is not " + + "available in the current environment (no crypto.subtle)"); + } + return crypto.subtle; +}; +const ALGS = { + ES384: { + name: "ECDSA", + namedCurve: "P-384" + }, + RS384: { + name: "RSASSA-PKCS1-v1_5", + modulusLength: 4096, + publicExponent: new Uint8Array([1, 0, 1]), + hash: { + name: 'SHA-384' + } + } +}; +function randomBytes(count) { + return crypto.getRandomValues(new Uint8Array(count)); +} +exports.randomBytes = randomBytes; +async function digestSha256(payload) { + const prepared = new TextEncoder().encode(payload); + const hash = await subtle().digest('SHA-256', prepared); + return new Uint8Array(hash); +} +exports.digestSha256 = digestSha256; +const generatePKCEChallenge = async (entropy = 96) => { + const inputBytes = randomBytes(entropy); + const codeVerifier = base64urlencode(inputBytes); + const codeChallenge = base64urlencode(await digestSha256(codeVerifier)); + return { codeChallenge, codeVerifier }; +}; +exports.generatePKCEChallenge = generatePKCEChallenge; +async function importJWK(jwk) { + // alg is optional in JWK but we need it here! + if (!jwk.alg) { + throw new Error('The "alg" property of the JWK must be set to "ES384" or "RS384"'); + } + // Use of the "key_ops" member is OPTIONAL, unless the application requires its presence. + // https://www.rfc-editor.org/rfc/rfc7517.html#section-4.3 + // + // In our case the app will only import private keys so we can assume "sign" + if (!Array.isArray(jwk.key_ops)) { + jwk.key_ops = ["sign"]; + } + // In this case the JWK has a "key_ops" array and "sign" is not listed + if (!jwk.key_ops.includes("sign")) { + throw new Error('The "key_ops" property of the JWK does not contain "sign"'); + } + try { + return await subtle().importKey("jwk", jwk, ALGS[jwk.alg], jwk.ext === true, jwk.key_ops // || ['sign'] + ); + } + catch (e) { + throw new Error(`The ${jwk.alg} is not supported by this browser: ${e}`); + } +} +exports.importJWK = importJWK; +async function signCompactJws(alg, privateKey, header, payload) { + const jwtHeader = JSON.stringify({ ...header, alg }); + const jwtPayload = JSON.stringify(payload); + const jwtAuthenticatedContent = `${base64urlencode(jwtHeader)}.${base64urlencode(jwtPayload)}`; + const signature = await subtle().sign({ ...privateKey.algorithm, hash: 'SHA-384' }, privateKey, new TextEncoder().encode(jwtAuthenticatedContent)); + return `${jwtAuthenticatedContent}.${base64urlencode(new Uint8Array(signature))}`; +} +exports.signCompactJws = signCompactJws; +function base64urlencode(input) { + // Step 1: Convert Uint8Array to binary string if needed + if (input instanceof Uint8Array) { + input = uint8ArrayToBinaryString(input); + } + // Step 2: Encode the binary string to Base64 + let base64 = btoa(input); + // Step 3: Replace Base64 characters with Base64URL characters and remove padding + let base64Url = base64.replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, ""); + return base64Url; +} +exports.base64urlencode = base64urlencode; +function base64urldecode(input) { + // Step 1: Replace Base64URL characters with standard Base64 characters + let base64 = input.replace(/-/g, "+").replace(/_/g, "/"); + // Step 2: Add padding if necessary + const pad = base64.length % 4; + if (pad) { + base64 += "=".repeat(4 - pad); + } + // Step 3: Decode the Base64 string + try { + return atob(base64); + } + catch (e) { + throw new Error("Invalid Base64URL string"); + } +} +exports.base64urldecode = base64urldecode; +function uint8ArrayToBinaryString(input) { + let bin = ""; + for (let i = 0; i < input.length; i++) { + bin += String.fromCharCode(input[i]); + } + return bin; +} +exports.uint8ArrayToBinaryString = uint8ArrayToBinaryString; +/** + * Resolves a reference to target window. It may also open new window or tab if + * the `target = "popup"` or `target = "_blank"`. + * @param target + * @param width Only used when `target = "popup"` + * @param height Only used when `target = "popup"` + */ +async function getTargetWindow(target, width = 800, height = 720) { + // The target can be a function that returns the target. This can be + // used to open a layer pop-up with an iframe and then return a reference + // to that iframe (or its name) + if (typeof target == "function") { + target = await target(); + } + // The target can be a window reference + if (target && typeof target == "object") { + return target; + } + // At this point target must be a string + if (typeof target != "string") { + (0, isomorphic_1.debug)("Invalid target type '%s'. Failing back to '_self'.", typeof target); + return self; + } + // Current window + if (target == "_self") { + return self; + } + // The parent frame + if (target == "_parent") { + return parent; + } + // The top window + if (target == "_top") { + return top || self; + } + // New tab or window + if (target == "_blank") { + let error, targetWindow = null; + try { + targetWindow = window.open("", "SMARTAuthPopup"); + if (!targetWindow) { + throw new Error("Perhaps window.open was blocked"); + } + } + catch (e) { + error = e; + } + if (!targetWindow) { + (0, isomorphic_1.debug)("Cannot open window. Failing back to '_self'. %s", error); + return self; + } + else { + return targetWindow; + } + } + // Popup window + if (target == "popup") { + let error, targetWindow = null; + // if (!targetWindow || targetWindow.closed) { + try { + targetWindow = window.open("", "SMARTAuthPopup", [ + "height=" + height, + "width=" + width, + "menubar=0", + "resizable=1", + "status=0", + "top=" + (screen.height - height) / 2, + "left=" + (screen.width - width) / 2 + ].join(",")); + if (!targetWindow) { + throw new Error("Perhaps the popup window was blocked"); + } + } + catch (e) { + error = e; + } + if (!targetWindow) { + (0, isomorphic_1.debug)("Cannot open window. Failing back to '_self'. %s", error); + return self; + } + else { + return targetWindow; + } + } + // Frame or window by name + const winOrFrame = frames[target]; + if (winOrFrame) { + return winOrFrame; + } + (0, isomorphic_1.debug)("Unknown target '%s'. Failing back to '_self'.", target); + return self; +} +exports.getTargetWindow = getTargetWindow; +/** + * Checks if called within a frame. Only works in browsers! + * If the current window has a `parent` or `top` properties that refer to + * another window, returns true. If trying to access `top` or `parent` throws an + * error, returns true. Otherwise returns `false`. + */ +function isInFrame() { + try { + return self !== top && parent !== self; + } + catch (e) { + return true; + } +} +exports.isInFrame = isInFrame; +/** + * Checks if called within another window (popup or tab). Only works in browsers! + * To consider itself called in a new window, this function verifies that: + * 1. `self === top` (not in frame) + * 2. `!!opener && opener !== self` The window has an opener + * 3. `!!window.name` The window has a `name` set + */ +function isInPopUp() { + try { + return self === top && + !!opener && + opener !== self && + !!window.name; + } + catch (e) { + return false; + } +} +exports.isInPopUp = isInPopUp; +function relative(path) { + return new URL(path, window.location.href).href; +} +exports.relative = relative; +function redirect(to) { + window.location.href = to; +} +exports.redirect = redirect; +/** + * Another window can send a "completeAuth" message to this one, making it to + * navigate to e.data.url + * @param e The message event + */ +function onMessage(e) { + if (e.data.type == "completeAuth" && e.origin === new URL(self.location.href).origin) { + window.removeEventListener("message", onMessage); + window.location.href = e.data.url; + } +} +exports.onMessage = onMessage; diff --git a/dist/lib/next/browser_entry.d.ts b/dist/lib/next/browser_entry.d.ts new file mode 100644 index 00000000..75058652 --- /dev/null +++ b/dist/lib/next/browser_entry.d.ts @@ -0,0 +1,9 @@ +declare function smart(settings?: Record): typeof smart; +declare namespace smart { + var authorize: (options: import(".").fhirclient.AuthorizeParams) => Promise; + var ready: (options?: import(".").fhirclient.ReadyOptions | undefined) => Promise; + var init: (options: import(".").fhirclient.AuthorizeParams) => Promise; + var client: (state: string | import(".").fhirclient.ClientState) => import(".").fhirclient.ClientInterface; + var utils: any; +} +export default smart; diff --git a/dist/lib/next/browser_entry.js b/dist/lib/next/browser_entry.js new file mode 100644 index 00000000..c6359ddd --- /dev/null +++ b/dist/lib/next/browser_entry.js @@ -0,0 +1,26 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const BrowserAdapter_1 = __importDefault(require("./BrowserAdapter")); +const { ready, authorize, init, client, options, utils } = new BrowserAdapter_1.default().getSmartApi(); +// export default { +// client, +// utils, +// oauth2: { +// settings: options, +// ready, +// authorize, +// init +// } +// }; +function smart(settings = {}) { + return smart; +} +smart.authorize = authorize; +smart.ready = ready; +smart.init = init; +smart.client = client; +smart.utils = utils; +exports.default = smart; diff --git a/dist/lib/next/isomorphic.d.ts b/dist/lib/next/isomorphic.d.ts new file mode 100644 index 00000000..32fa580b --- /dev/null +++ b/dist/lib/next/isomorphic.d.ts @@ -0,0 +1,173 @@ +import { fhirclient } from "../types"; +export declare const debug: (...args: any[]) => void; +/** + * A namespace with functions for converting between different measurement units + */ +export declare const units: { + cm({ code, value }: fhirclient.CodeValue): number; + kg({ code, value }: fhirclient.CodeValue): number; + any(pq: fhirclient.CodeValue): number; +}; +/** + * Used in fetch Promise chains to reject if the "ok" property is not true + */ +export declare function checkResponse(resp: Response): Promise; +/** + * Used in fetch Promise chains to return the JSON version of the response. + * Note that `resp.json()` will throw on empty body so we use resp.text() + * instead. + */ +export declare function responseToJSON(resp: Response): Promise; +export declare function loweCaseKeys | any[] | undefined>(obj: T): T; +/** + * This is our built-in request function. It does a few things by default + * (unless told otherwise): + * - Makes CORS requests + * - Sets accept header to "application/json" + * - Handles errors + * - If the response is json return the json object + * - If the response is text return the result text + * - Otherwise return the response object on which we call stuff like `.blob()` + * @param {string | Request} url + * @param {FetchOptions} [requestOptions] + */ +export declare function request(url: string | Request, requestOptions?: fhirclient.FetchOptions): Promise; +/** + * Makes a request using `fetch` and stores the result in internal memory cache. + * The cache is cleared when the page is unloaded. + * @param url The URL to request + * @param requestOptions Request options + * @param [force] If true, reload from source and update the cache, even if it + * has already been cached. + */ +export declare function getAndCache(url: string, requestOptions?: RequestInit, force?: boolean): Promise; +/** + * Fetches the conformance statement from the given base URL. + * Note that the result is cached in memory (until the page is reloaded in the + * browser) because it might have to be re-used by the client + * @param baseUrl The base URL of the FHIR server + * @param [requestOptions] Any options passed to the fetch call + */ +export declare function fetchConformanceStatement(baseUrl?: string, requestOptions?: RequestInit): Promise; +/** + * Walks through an object (or array) and returns the value found at the + * provided path. This function is very simple so it intentionally does not + * support any argument polymorphism, meaning that the path can only be a + * dot-separated string. If the path is invalid returns undefined. + * @param obj The object (or Array) to walk through + * @param path The path (eg. "a.b.4.c") + * @returns {*} Whatever is found in the path or undefined + */ +export declare function getPath(obj: Record, path?: string): any; +/** + * Like getPath, but if the node is found, its value is set to @value + * @param obj The object (or Array) to walk through + * @param path The path (eg. "a.b.4.c") + * @param value The value to set + * @param createEmpty If true, create missing intermediate objects or arrays + * @returns The modified object + */ +export declare function setPath(obj: Record, path: string, value: any, createEmpty?: boolean): Record; +/** + * If the argument is an array returns it as is. Otherwise puts it in an array + * (`[arg]`) and returns the result + * @param arg The element to test and possibly convert to array + * @category Utility + */ +export declare function makeArray(arg: any): T[]; +/** + * Given a path, converts it to absolute url based on the `baseUrl`. If baseUrl + * is not provided, the result would be a rooted path (one that starts with `/`). + * @param path The path to convert + * @param baseUrl The base URL + */ +export declare function absolute(path: string, baseUrl?: string): string; +/** + * Generates random strings. By default this returns random 8 characters long + * alphanumeric strings. + * @param strLength The length of the output string. Defaults to 8. + * @param charSet A string containing all the possible characters. + * Defaults to all the upper and lower-case letters plus digits. + * @category Utility + */ +export declare function randomString(strLength?: number, charSet?: string): string; +/** + * Add a supplied number of seconds to the supplied Date, returning an integer + * number of seconds since the epoch + * @param secondsAhead How far ahead, in seconds (defaults to 120 seconds) + * @param [from] Initial time (defaults to current time) + */ +export declare function getTimeInFuture(secondsAhead?: number, from?: Date | number): number; +/** + * Groups the observations by code. Returns a map that will look like: + * ```js + * const map = client.byCodes(observations, "code"); + * // map = { + * // "55284-4": [ observation1, observation2 ], + * // "6082-2": [ observation3 ] + * // } + * ``` + * @param observations Array of observations + * @param property The name of a CodeableConcept property to group by + */ +export declare function byCode(observations: fhirclient.FHIR.Observation | fhirclient.FHIR.Observation[], property: string): fhirclient.ObservationMap; +/** + * First groups the observations by code using `byCode`. Then returns a function + * that accepts codes as arguments and will return a flat array of observations + * having that codes. Example: + * ```js + * const filter = client.byCodes(observations, "category"); + * filter("laboratory") // => [ observation1, observation2 ] + * filter("vital-signs") // => [ observation3 ] + * filter("laboratory", "vital-signs") // => [ observation1, observation2, observation3 ] + * ``` + * @param observations Array of observations + * @param property The name of a CodeableConcept property to group by + */ +export declare function byCodes(observations: fhirclient.FHIR.Observation | fhirclient.FHIR.Observation[], property: string): (...codes: string[]) => any[]; +/** + * Given a conformance statement and a resource type, returns the name of the + * URL parameter that can be used to scope the resource type by patient ID. + */ +export declare function getPatientParam(conformance: fhirclient.FHIR.CapabilityStatement, resourceType: string): string; +export declare function assert(condition: any, message: string): asserts condition; +export declare function assertJsonPatch(patch: fhirclient.JsonPatch): asserts patch; +/** + * Fetches the well-known json file from the given base URL. + * Note that the result is cached in memory (until the page is reloaded in the + * browser) because it might have to be re-used by the client + * @param baseUrl The base URL of the FHIR server + */ +export declare function fetchWellKnownJson(baseUrl?: string, requestOptions?: RequestInit): Promise; +/** + * Fetch a "WellKnownJson" and extract the SMART endpoints from it + */ +export declare function getSecurityExtensionsFromWellKnownJson(baseUrl?: string, requestOptions?: RequestInit): Promise; +/** + * Fetch a `CapabilityStatement` and extract the SMART endpoints from it + */ +export declare function getSecurityExtensionsFromConformanceStatement(baseUrl?: string, requestOptions?: RequestInit): Promise; +/** + * Given a FHIR server, returns an object with it's Oauth security endpoints + * that we are interested in. This will try to find the info in both the + * `CapabilityStatement` and the `.well-known/smart-configuration`. Whatever + * Arrives first will be used and the other request will be aborted. + * @param [baseUrl = "/"] Fhir server base URL + */ +export declare function getSecurityExtensions(baseUrl?: string): Promise; +export declare function base64encode(input: string): string; +export declare function base64decode(input: string): string; +export declare function shouldIncludeChallenge(S256supported: boolean, pkceMode?: string): boolean; +/** + * Decodes a JWT token and returns it's body. + * @param token The token to read + * @category Utility + */ +export declare function jwtDecode(token: string): Record | null; +/** + * Given a token response, computes and returns the expiresAt timestamp. + * Note that this should only be used immediately after an access token is + * received, otherwise the computed timestamp will be incorrect. + * @param tokenResponse + */ +export declare function getAccessTokenExpiration(tokenResponse: fhirclient.TokenResponse): number; diff --git a/dist/lib/next/isomorphic.js b/dist/lib/next/isomorphic.js new file mode 100644 index 00000000..f6b7bb65 --- /dev/null +++ b/dist/lib/next/isomorphic.js @@ -0,0 +1,548 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.getAccessTokenExpiration = exports.jwtDecode = exports.shouldIncludeChallenge = exports.base64decode = exports.base64encode = exports.getSecurityExtensions = exports.getSecurityExtensionsFromConformanceStatement = exports.getSecurityExtensionsFromWellKnownJson = exports.fetchWellKnownJson = exports.assertJsonPatch = exports.assert = exports.getPatientParam = exports.byCodes = exports.byCode = exports.getTimeInFuture = exports.randomString = exports.absolute = exports.makeArray = exports.setPath = exports.getPath = exports.fetchConformanceStatement = exports.getAndCache = exports.request = exports.loweCaseKeys = exports.responseToJSON = exports.checkResponse = exports.units = exports.debug = void 0; +const HttpError_1 = __importDefault(require("../HttpError")); +const settings_1 = require("../settings"); +exports.debug = typeof window === "undefined" ? + (process.env.NODE_DEBUG || "").match(/\bdebugFhirClient\b/) ? + (...args) => console.debug("FHIR:", ...args) : + () => { } : + (localStorage === null || localStorage === void 0 ? void 0 : localStorage.debugFhirClient) ? + (...args) => console.debug("FHIR:", ...args) : + () => { }; +/** + * The cache for the `getAndCache` function + */ +const cache = {}; +/** + * A namespace with functions for converting between different measurement units + */ +exports.units = { + cm({ code, value }) { + ensureNumerical({ code, value }); + if (code == "cm") + return value; + if (code == "m") + return value * 100; + if (code == "in") + return value * 2.54; + if (code == "[in_us]") + return value * 2.54; + if (code == "[in_i]") + return value * 2.54; + if (code == "ft") + return value * 30.48; + if (code == "[ft_us]") + return value * 30.48; + throw new Error("Unrecognized length unit: " + code); + }, + kg({ code, value }) { + ensureNumerical({ code, value }); + if (code == "kg") + return value; + if (code == "g") + return value / 1000; + if (code.match(/lb/)) + return value / 2.20462; + if (code.match(/oz/)) + return value / 35.274; + throw new Error("Unrecognized weight unit: " + code); + }, + any(pq) { + ensureNumerical(pq); + return pq.value; + } +}; +/** + * Assertion function to guard arguments for `units` functions + */ +function ensureNumerical({ value, code }) { + if (typeof value !== "number") { + throw new Error("Found a non-numerical unit: " + value + " " + code); + } +} +/** + * Used in fetch Promise chains to reject if the "ok" property is not true + */ +async function checkResponse(resp) { + if (!resp.ok) { + const error = new HttpError_1.default(resp); + await error.parse(); + throw error; + } + return resp; +} +exports.checkResponse = checkResponse; +/** + * Used in fetch Promise chains to return the JSON version of the response. + * Note that `resp.json()` will throw on empty body so we use resp.text() + * instead. + */ +function responseToJSON(resp) { + return resp.text().then(text => text.length ? JSON.parse(text) : ""); +} +exports.responseToJSON = responseToJSON; +function loweCaseKeys(obj) { + // Can be undefined to signal that this key should be removed + if (!obj) { + return obj; + } + // Arrays are valid values in case of recursive calls + if (Array.isArray(obj)) { + return obj.map(v => v && typeof v === "object" ? loweCaseKeys(v) : v); + } + // Plain object + let out = {}; + Object.keys(obj).forEach(key => { + const lowerKey = key.toLowerCase(); + const v = obj[key]; + out[lowerKey] = v && typeof v == "object" ? loweCaseKeys(v) : v; + }); + return out; +} +exports.loweCaseKeys = loweCaseKeys; +/** + * This is our built-in request function. It does a few things by default + * (unless told otherwise): + * - Makes CORS requests + * - Sets accept header to "application/json" + * - Handles errors + * - If the response is json return the json object + * - If the response is text return the result text + * - Otherwise return the response object on which we call stuff like `.blob()` + * @param {string | Request} url + * @param {FetchOptions} [requestOptions] + */ +async function request(url, requestOptions = {}) { + const { includeResponse, ...options } = requestOptions; + const response = await fetch(url, { + mode: "cors", + ...options, + headers: { + accept: "application/json", + ...loweCaseKeys(options.headers) + } + }); + await checkResponse(response); + const type = response.headers.get("content-type") + ""; + let body; + if (type.match(/\bjson\b/i)) { + body = await responseToJSON(response); + } + else if (type.match(/^text\//i)) { + body = await response.text(); + } + // Some servers will reply after CREATE with json content type but with + // empty body. In this case check if a location header is received and + // fetch that to use it as the final result. + if (!body && response.status == 201) { + const location = response.headers.get("location"); + if (location) { + return request(location, { ...options, method: "GET", body: null, includeResponse }); + } + } + if (includeResponse) { + return { body, response }; + } + // For any non-text and non-json response return the Response object. + // This to let users decide if they want to call text(), blob() or + // something else on it + if (body === undefined) { + return response; + } + // Otherwise just return the parsed body (can also be "" or null) + return body; +} +exports.request = request; +/** + * Makes a request using `fetch` and stores the result in internal memory cache. + * The cache is cleared when the page is unloaded. + * @param url The URL to request + * @param requestOptions Request options + * @param [force] If true, reload from source and update the cache, even if it + * has already been cached. + */ +async function getAndCache(url, requestOptions, force) { + var _a, _b; + if (force === void 0) { force = ((_b = (_a = globalThis === null || globalThis === void 0 ? void 0 : globalThis.process) === null || _a === void 0 ? void 0 : _a.env) === null || _b === void 0 ? void 0 : _b.NODE_ENV) === "test"; } + if (force || !cache[url]) { + cache[url] = request(url, requestOptions); + } + return cache[url]; +} +exports.getAndCache = getAndCache; +/** + * Fetches the conformance statement from the given base URL. + * Note that the result is cached in memory (until the page is reloaded in the + * browser) because it might have to be re-used by the client + * @param baseUrl The base URL of the FHIR server + * @param [requestOptions] Any options passed to the fetch call + */ +function fetchConformanceStatement(baseUrl = "/", requestOptions) { + const url = String(baseUrl).replace(/\/*$/, "/") + "metadata"; + return getAndCache(url, requestOptions).catch((ex) => { + throw new Error(`Failed to fetch the conformance statement from "${url}". ${ex}`); + }); +} +exports.fetchConformanceStatement = fetchConformanceStatement; +/** + * Walks through an object (or array) and returns the value found at the + * provided path. This function is very simple so it intentionally does not + * support any argument polymorphism, meaning that the path can only be a + * dot-separated string. If the path is invalid returns undefined. + * @param obj The object (or Array) to walk through + * @param path The path (eg. "a.b.4.c") + * @returns {*} Whatever is found in the path or undefined + */ +function getPath(obj, path = "") { + path = path.trim(); + if (!path) { + return obj; + } + let segments = path.split("."); + let result = obj; + while (result && segments.length) { + const key = segments.shift(); + if (!key && Array.isArray(result)) { + return result.map(o => getPath(o, segments.join("."))); + } + else { + result = result[key + ""]; + } + } + return result; +} +exports.getPath = getPath; +/** + * Like getPath, but if the node is found, its value is set to @value + * @param obj The object (or Array) to walk through + * @param path The path (eg. "a.b.4.c") + * @param value The value to set + * @param createEmpty If true, create missing intermediate objects or arrays + * @returns The modified object + */ +function setPath(obj, path, value, createEmpty = false) { + path.trim().split(".").reduce((out, key, idx, arr) => { + if (out && idx === arr.length - 1) { + out[key] = value; + } + else { + if (out && out[key] === undefined && createEmpty) { + out[key] = arr[idx + 1].match(/^[0-9]+$/) ? [] : {}; + } + return out ? out[key] : undefined; + } + }, obj); + return obj; +} +exports.setPath = setPath; +/** + * If the argument is an array returns it as is. Otherwise puts it in an array + * (`[arg]`) and returns the result + * @param arg The element to test and possibly convert to array + * @category Utility + */ +function makeArray(arg) { + if (Array.isArray(arg)) { + return arg; + } + return [arg]; +} +exports.makeArray = makeArray; +/** + * Given a path, converts it to absolute url based on the `baseUrl`. If baseUrl + * is not provided, the result would be a rooted path (one that starts with `/`). + * @param path The path to convert + * @param baseUrl The base URL + */ +function absolute(path, baseUrl) { + if (path.match(/^http/)) + return path; + if (path.match(/^urn/)) + return path; + return String(baseUrl || "").replace(/\/+$/, "") + "/" + path.replace(/^\/+/, ""); +} +exports.absolute = absolute; +/** + * Generates random strings. By default this returns random 8 characters long + * alphanumeric strings. + * @param strLength The length of the output string. Defaults to 8. + * @param charSet A string containing all the possible characters. + * Defaults to all the upper and lower-case letters plus digits. + * @category Utility + */ +function randomString(strLength = 8, charSet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789") { + const result = []; + const len = charSet.length; + while (strLength--) { + result.push(charSet.charAt(Math.floor(Math.random() * len))); + } + return result.join(""); +} +exports.randomString = randomString; +/** + * Add a supplied number of seconds to the supplied Date, returning an integer + * number of seconds since the epoch + * @param secondsAhead How far ahead, in seconds (defaults to 120 seconds) + * @param [from] Initial time (defaults to current time) + */ +function getTimeInFuture(secondsAhead = 120, from) { + return Math.floor(+(from || new Date()) / 1000 + secondsAhead); +} +exports.getTimeInFuture = getTimeInFuture; +/** + * Groups the observations by code. Returns a map that will look like: + * ```js + * const map = client.byCodes(observations, "code"); + * // map = { + * // "55284-4": [ observation1, observation2 ], + * // "6082-2": [ observation3 ] + * // } + * ``` + * @param observations Array of observations + * @param property The name of a CodeableConcept property to group by + */ +function byCode(observations, property) { + const ret = {}; + function handleCodeableConcept(concept, observation) { + if (concept && Array.isArray(concept.coding)) { + concept.coding.forEach(({ code }) => { + if (code) { + ret[code] = ret[code] || []; + ret[code].push(observation); + } + }); + } + } + makeArray(observations).forEach(o => { + if (o.resourceType === "Observation" && o[property]) { + if (Array.isArray(o[property])) { + o[property].forEach((concept) => handleCodeableConcept(concept, o)); + } + else { + handleCodeableConcept(o[property], o); + } + } + }); + return ret; +} +exports.byCode = byCode; +/** + * First groups the observations by code using `byCode`. Then returns a function + * that accepts codes as arguments and will return a flat array of observations + * having that codes. Example: + * ```js + * const filter = client.byCodes(observations, "category"); + * filter("laboratory") // => [ observation1, observation2 ] + * filter("vital-signs") // => [ observation3 ] + * filter("laboratory", "vital-signs") // => [ observation1, observation2, observation3 ] + * ``` + * @param observations Array of observations + * @param property The name of a CodeableConcept property to group by + */ +function byCodes(observations, property) { + const bank = byCode(observations, property); + return (...codes) => codes + .filter(code => (code + "") in bank) + .reduce((prev, code) => prev.concat(bank[code + ""]), []); +} +exports.byCodes = byCodes; +/** + * Given a conformance statement and a resource type, returns the name of the + * URL parameter that can be used to scope the resource type by patient ID. + */ +function getPatientParam(conformance, resourceType) { + // Find what resources are supported by this server + const resources = getPath(conformance, "rest.0.resource") || []; + // Check if this resource is supported + const meta = resources.find((r) => r.type === resourceType); + if (!meta) { + throw new Error(`Resource "${resourceType}" is not supported by this FHIR server`); + } + // Check if any search parameters are available for this resource + if (!Array.isArray(meta.searchParam)) { + throw new Error(`No search parameters supported for "${resourceType}" on this FHIR server`); + } + // This is a rare case but could happen in generic workflows + if (resourceType == "Patient" && meta.searchParam.find((x) => x.name == "_id")) { + return "_id"; + } + // Now find the first possible parameter name + const out = settings_1.patientParams.find(p => meta.searchParam.find((x) => x.name == p)); + // If there is no match + if (!out) { + throw new Error("I don't know what param to use for " + resourceType); + } + return out; +} +exports.getPatientParam = getPatientParam; +function assert(condition, message) { + if (!(condition)) { + throw new Error(message); + } +} +exports.assert = assert; +function assertJsonPatch(patch) { + assert(Array.isArray(patch), "The JSON patch must be an array"); + assert(patch.length > 0, "The JSON patch array should not be empty"); + patch.forEach((operation) => { + assert(["add", "replace", "test", "move", "copy", "remove"].indexOf(operation.op) > -1, 'Each patch operation must have an "op" property which must be one of: "add", "replace", "test", "move", "copy", "remove"'); + assert(operation.path && typeof operation.path, `Invalid "${operation.op}" operation. Missing "path" property`); + if (operation.op == "add" || operation.op == "replace" || operation.op == "test") { + assert("value" in operation, `Invalid "${operation.op}" operation. Missing "value" property`); + assert(Object.keys(operation).length == 3, `Invalid "${operation.op}" operation. Contains unknown properties`); + } + else if (operation.op == "move" || operation.op == "copy") { + assert(typeof operation.from == "string", `Invalid "${operation.op}" operation. Requires a string "from" property`); + assert(Object.keys(operation).length == 3, `Invalid "${operation.op}" operation. Contains unknown properties`); + } + else { + assert(Object.keys(operation).length == 2, `Invalid "${operation.op}" operation. Contains unknown properties`); + } + }); +} +exports.assertJsonPatch = assertJsonPatch; +/** + * Fetches the well-known json file from the given base URL. + * Note that the result is cached in memory (until the page is reloaded in the + * browser) because it might have to be re-used by the client + * @param baseUrl The base URL of the FHIR server + */ +function fetchWellKnownJson(baseUrl = "/", requestOptions) { + const url = String(baseUrl).replace(/\/*$/, "/") + ".well-known/smart-configuration"; + return getAndCache(url, requestOptions).catch((ex) => { + throw new Error(`Failed to fetch the well-known json "${url}". ${ex.message}`); + }); +} +exports.fetchWellKnownJson = fetchWellKnownJson; +/** + * Fetch a "WellKnownJson" and extract the SMART endpoints from it + */ +function getSecurityExtensionsFromWellKnownJson(baseUrl = "/", requestOptions) { + return fetchWellKnownJson(baseUrl, requestOptions).then(meta => { + if (!meta.authorization_endpoint || !meta.token_endpoint) { + throw new Error("Invalid wellKnownJson"); + } + return { + registrationUri: meta.registration_endpoint || "", + authorizeUri: meta.authorization_endpoint, + tokenUri: meta.token_endpoint, + codeChallengeMethods: meta.code_challenge_methods_supported || [] + }; + }); +} +exports.getSecurityExtensionsFromWellKnownJson = getSecurityExtensionsFromWellKnownJson; +/** + * Fetch a `CapabilityStatement` and extract the SMART endpoints from it + */ +function getSecurityExtensionsFromConformanceStatement(baseUrl = "/", requestOptions) { + return fetchConformanceStatement(baseUrl, requestOptions).then(meta => { + const nsUri = "http://fhir-registry.smarthealthit.org/StructureDefinition/oauth-uris"; + const extensions = (getPath(meta || {}, "rest.0.security.extension") || []) + .filter(e => e.url === nsUri) + .map(o => o.extension)[0]; + const out = { + registrationUri: "", + authorizeUri: "", + tokenUri: "", + codeChallengeMethods: [], + }; + if (extensions) { + extensions.forEach(ext => { + if (ext.url === "register") { + out.registrationUri = ext.valueUri; + } + if (ext.url === "authorize") { + out.authorizeUri = ext.valueUri; + } + if (ext.url === "token") { + out.tokenUri = ext.valueUri; + } + }); + } + return out; + }); +} +exports.getSecurityExtensionsFromConformanceStatement = getSecurityExtensionsFromConformanceStatement; +/** + * Given a FHIR server, returns an object with it's Oauth security endpoints + * that we are interested in. This will try to find the info in both the + * `CapabilityStatement` and the `.well-known/smart-configuration`. Whatever + * Arrives first will be used and the other request will be aborted. + * @param [baseUrl = "/"] Fhir server base URL + */ +function getSecurityExtensions(baseUrl = "/") { + return getSecurityExtensionsFromWellKnownJson(baseUrl) + .catch(() => getSecurityExtensionsFromConformanceStatement(baseUrl)); +} +exports.getSecurityExtensions = getSecurityExtensions; +function base64encode(input) { + try { + return Buffer.from(input, "utf8").toString('base64'); + } + catch { + return btoa(input); + } +} +exports.base64encode = base64encode; +function base64decode(input) { + try { + return Buffer.from(input, "base64").toString('utf8'); + } + catch { + return btoa(input); + } +} +exports.base64decode = base64decode; +function shouldIncludeChallenge(S256supported, pkceMode) { + if (pkceMode === "disabled") { + return false; + } + if (pkceMode === "unsafeV1") { + return true; + } + if (pkceMode === "required") { + if (!S256supported) { + throw new Error("Required PKCE code challenge method (`S256`) was not found in the server's codeChallengeMethods declaration."); + } + return true; + } + return S256supported; +} +exports.shouldIncludeChallenge = shouldIncludeChallenge; +/** + * Decodes a JWT token and returns it's body. + * @param token The token to read + * @category Utility + */ +function jwtDecode(token) { + const payload = token.split(".")[1]; + return payload ? JSON.parse(base64decode(payload)) : null; +} +exports.jwtDecode = jwtDecode; +/** + * Given a token response, computes and returns the expiresAt timestamp. + * Note that this should only be used immediately after an access token is + * received, otherwise the computed timestamp will be incorrect. + * @param tokenResponse + */ +function getAccessTokenExpiration(tokenResponse) { + const now = Math.floor(Date.now() / 1000); + // Option 1 - using the expires_in property of the token response + if (tokenResponse.expires_in) { + return now + tokenResponse.expires_in; + } + // Option 2 - using the exp property of JWT tokens (must not assume JWT!) + if (tokenResponse.access_token) { + let tokenBody = jwtDecode(tokenResponse.access_token); + if (tokenBody && tokenBody.exp) { + return tokenBody.exp; + } + } + // Option 3 - if none of the above worked set this to 5 minutes after now + return now + 300; +} +exports.getAccessTokenExpiration = getAccessTokenExpiration; diff --git a/dist/lib/next/server.d.ts b/dist/lib/next/server.d.ts new file mode 100644 index 00000000..86fbc6f3 --- /dev/null +++ b/dist/lib/next/server.d.ts @@ -0,0 +1,16 @@ +/// +import { randomBytes } from "crypto"; +import { KeyLike } from "jose"; +import { fhirclient } from "../types"; +interface PkcePair { + codeChallenge: string; + codeVerifier: string; +} +declare type SupportedAlg = 'ES384' | 'RS384'; +export { randomBytes }; +export declare function digestSha256(payload: string): Promise; +export declare function generatePKCEChallenge(entropy?: number): Promise; +export declare function importJWK(jwk: fhirclient.JWK): Promise; +export declare function signCompactJws(alg: SupportedAlg, privateKey: KeyLike, header: any, payload: any): Promise; +export declare function base64urlencode(input: string | Uint8Array): string; +export declare function base64urldecode(input: string): string; diff --git a/dist/lib/next/server.js b/dist/lib/next/server.js new file mode 100644 index 00000000..97027ab3 --- /dev/null +++ b/dist/lib/next/server.js @@ -0,0 +1,50 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.base64urldecode = exports.base64urlencode = exports.signCompactJws = exports.importJWK = exports.generatePKCEChallenge = exports.digestSha256 = exports.randomBytes = void 0; +const crypto_1 = require("crypto"); +Object.defineProperty(exports, "randomBytes", { enumerable: true, get: function () { return crypto_1.randomBytes; } }); +const jose_1 = require("jose"); +async function digestSha256(payload) { + const hash = (0, crypto_1.createHash)('sha256'); + hash.update(payload); + return hash.digest(); +} +exports.digestSha256 = digestSha256; +async function generatePKCEChallenge(entropy = 96) { + const inputBytes = (0, crypto_1.randomBytes)(entropy); + const codeVerifier = jose_1.base64url.encode(inputBytes); + const codeChallenge = jose_1.base64url.encode(await digestSha256(codeVerifier)); + return { codeChallenge, codeVerifier }; +} +exports.generatePKCEChallenge = generatePKCEChallenge; +async function importJWK(jwk) { + // alg is optional in JWK but we need it here! + if (!jwk.alg) { + throw new Error('The "alg" property of the JWK must be set to "ES384" or "RS384"'); + } + // Use of the "key_ops" member is OPTIONAL, unless the application requires its presence. + // https://www.rfc-editor.org/rfc/rfc7517.html#section-4.3 + // + // In our case the app will only import private keys so we can assume "sign" + if (!Array.isArray(jwk.key_ops)) { + jwk.key_ops = ["sign"]; + } + // In this case the JWK has a "key_ops" array and "sign" is not listed + if (!jwk.key_ops.includes("sign")) { + throw new Error('The "key_ops" property of the JWK does not contain "sign"'); + } + return (0, jose_1.importJWK)(jwk); +} +exports.importJWK = importJWK; +async function signCompactJws(alg, privateKey, header, payload) { + return new jose_1.SignJWT(payload).setProtectedHeader({ ...header, alg }).sign(privateKey); +} +exports.signCompactJws = signCompactJws; +function base64urlencode(input) { + return jose_1.base64url.encode(input); +} +exports.base64urlencode = base64urlencode; +function base64urldecode(input) { + return jose_1.base64url.decode(input).toString(); +} +exports.base64urldecode = base64urldecode; diff --git a/dist/lib/next/server_entry.d.ts b/dist/lib/next/server_entry.d.ts new file mode 100644 index 00000000..624413ff --- /dev/null +++ b/dist/lib/next/server_entry.d.ts @@ -0,0 +1,6 @@ +/// +import { IncomingMessage, ServerResponse } from "http"; +import { fhirclient } from "."; +declare type storageFactory = (options?: Record) => fhirclient.Storage; +export default function smart(request: IncomingMessage, response: ServerResponse, storage?: fhirclient.Storage | storageFactory): fhirclient.SMART_API; +export {}; diff --git a/dist/lib/next/server_entry.js b/dist/lib/next/server_entry.js new file mode 100644 index 00000000..c059e6b9 --- /dev/null +++ b/dist/lib/next/server_entry.js @@ -0,0 +1,14 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const NodeAdapter_1 = __importDefault(require("./NodeAdapter")); +function smart(request, response, storage) { + return new NodeAdapter_1.default({ + request, + response, + storage + }).getSmartApi(); +} +exports.default = smart; diff --git a/dist/lib/next/settings.d.ts b/dist/lib/next/settings.d.ts new file mode 100644 index 00000000..5fa8a36e --- /dev/null +++ b/dist/lib/next/settings.d.ts @@ -0,0 +1,33 @@ +/** + * Combined list of FHIR resource types accepting patient parameter in FHIR R2-R4 + */ +export declare const patientCompartment: string[]; +/** + * Map of FHIR releases and their abstract version as number + */ +export declare const fhirVersions: { + "0.4.0": number; + "0.5.0": number; + "1.0.0": number; + "1.0.1": number; + "1.0.2": number; + "1.1.0": number; + "1.4.0": number; + "1.6.0": number; + "1.8.0": number; + "3.0.0": number; + "3.0.1": number; + "3.3.0": number; + "3.5.0": number; + "4.0.0": number; + "4.0.1": number; +}; +/** + * Combined (FHIR R2-R4) list of search parameters that can be used to scope + * a request by patient ID. + */ +export declare const patientParams: string[]; +/** + * The name of the sessionStorage entry that contains the current key + */ +export declare const SMART_KEY = "SMART_KEY"; diff --git a/dist/lib/next/settings.js b/dist/lib/next/settings.js new file mode 100644 index 00000000..77df91b4 --- /dev/null +++ b/dist/lib/next/settings.js @@ -0,0 +1,120 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.SMART_KEY = exports.patientParams = exports.fhirVersions = exports.patientCompartment = void 0; +/** + * Combined list of FHIR resource types accepting patient parameter in FHIR R2-R4 + */ +exports.patientCompartment = [ + "Account", + "AdverseEvent", + "AllergyIntolerance", + "Appointment", + "AppointmentResponse", + "AuditEvent", + "Basic", + "BodySite", + "BodyStructure", + "CarePlan", + "CareTeam", + "ChargeItem", + "Claim", + "ClaimResponse", + "ClinicalImpression", + "Communication", + "CommunicationRequest", + "Composition", + "Condition", + "Consent", + "Coverage", + "CoverageEligibilityRequest", + "CoverageEligibilityResponse", + "DetectedIssue", + "DeviceRequest", + "DeviceUseRequest", + "DeviceUseStatement", + "DiagnosticOrder", + "DiagnosticReport", + "DocumentManifest", + "DocumentReference", + "EligibilityRequest", + "Encounter", + "EnrollmentRequest", + "EpisodeOfCare", + "ExplanationOfBenefit", + "FamilyMemberHistory", + "Flag", + "Goal", + "Group", + "ImagingManifest", + "ImagingObjectSelection", + "ImagingStudy", + "Immunization", + "ImmunizationEvaluation", + "ImmunizationRecommendation", + "Invoice", + "List", + "MeasureReport", + "Media", + "MedicationAdministration", + "MedicationDispense", + "MedicationOrder", + "MedicationRequest", + "MedicationStatement", + "MolecularSequence", + "NutritionOrder", + "Observation", + "Order", + "Patient", + "Person", + "Procedure", + "ProcedureRequest", + "Provenance", + "QuestionnaireResponse", + "ReferralRequest", + "RelatedPerson", + "RequestGroup", + "ResearchSubject", + "RiskAssessment", + "Schedule", + "ServiceRequest", + "Specimen", + "SupplyDelivery", + "SupplyRequest", + "VisionPrescription" +]; +/** + * Map of FHIR releases and their abstract version as number + */ +exports.fhirVersions = { + "0.4.0": 2, + "0.5.0": 2, + "1.0.0": 2, + "1.0.1": 2, + "1.0.2": 2, + "1.1.0": 3, + "1.4.0": 3, + "1.6.0": 3, + "1.8.0": 3, + "3.0.0": 3, + "3.0.1": 3, + "3.3.0": 4, + "3.5.0": 4, + "4.0.0": 4, + "4.0.1": 4 +}; +/** + * Combined (FHIR R2-R4) list of search parameters that can be used to scope + * a request by patient ID. + */ +exports.patientParams = [ + "patient", + "subject", + "requester", + "member", + "actor", + "beneficiary" +]; +/** + * The name of the sessionStorage entry that contains the current key + */ +exports.SMART_KEY = "SMART_KEY"; diff --git a/dist/lib/next/smart.d.ts b/dist/lib/next/smart.d.ts new file mode 100644 index 00000000..3c6fbccf --- /dev/null +++ b/dist/lib/next/smart.d.ts @@ -0,0 +1,80 @@ +import { fhirclient } from "."; +import Client from "./Client"; +/** + * Starts the SMART Launch Sequence. + * > **IMPORTANT**: + * `authorize()` will end up redirecting you to the authorization server. + * This means that you should not add anything to the returned promise chain. + * Any code written directly after the authorize() call might not be executed + * due to that redirect! + * @param env + * @param [params] + */ +export declare function authorize(env: fhirclient.Adapter, params?: fhirclient.AuthorizeParams | fhirclient.AuthorizeParams[]): Promise; +/** + * The ready function should only be called on the page that represents + * the redirectUri. We typically land there after a redirect from the + * authorization server, but this code will also be executed upon subsequent + * navigation or page refresh. + */ +export declare function ready(env: fhirclient.Adapter, options?: fhirclient.ReadyOptions): Promise; +/** + * Builds the token request options. Does not make the request, just + * creates it's configuration and returns it in a Promise. + */ +export declare function buildTokenRequest(env: fhirclient.Adapter, { code, state, clientPublicKeySetUrl, privateKey }: { + /** + * The `code` URL parameter received from the auth redirect + */ + code: string; + /** + * The app state + */ + state: fhirclient.ClientState; + /** + * If provided overrides the `clientPublicKeySetUrl` from the authorize + * options (if any). Used for `jku` token header in case of asymmetric auth. + */ + clientPublicKeySetUrl?: string; + /** + * Can be a private JWK, or an object with alg, kid and key properties, + * where `key` is an un-extractable private CryptoKey object. + */ + privateKey?: fhirclient.JWK | { + key: CryptoKey; + alg: "RS384" | "ES384"; + kid: string; + }; +}): Promise; +/** + * This function can be used when you want to handle everything in one page + * (no launch endpoint needed). You can think of it as if it does: + * ```js + * authorize(options).then(ready) + * ``` + * + * **Be careful with init()!** There are some details you need to be aware of: + * + * 1. It will only work if your launch_uri is the same as your redirect_uri. + * While this should be valid, we can’t promise that every EHR will allow you + * to register client with such settings. + * 2. Internally, `init()` will be called twice. First it will redirect to the + * EHR, then the EHR will redirect back to the page where init() will be + * called again to complete the authorization. This is generally fine, + * because the returned promise will only be resolved once, after the second + * execution, but please also consider the following: + * - You should wrap all your app’s code in a function that is only executed + * after `init()` resolves! + * - Since the page will be loaded twice, you must be careful if your code + * has global side effects that can persist between page reloads + * (for example writing to localStorage). + * 3. For standalone launch, only use init in combination with offline_access + * scope. Once the access_token expires, if you don’t have a refresh_token + * there is no way to re-authorize properly. We detect that and delete the + * expired access token, but it still means that the user will have to + * refresh the page twice to re-authorize. + * @param env The adapter + * @param authorizeOptions The authorize options + * @param [readyOptions] + */ +export declare function init(env: fhirclient.Adapter, authorizeOptions: fhirclient.AuthorizeParams, readyOptions?: fhirclient.ReadyOptions): Promise; diff --git a/dist/lib/next/smart.js b/dist/lib/next/smart.js new file mode 100644 index 00000000..acc28efb --- /dev/null +++ b/dist/lib/next/smart.js @@ -0,0 +1,458 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.init = exports.buildTokenRequest = exports.ready = exports.authorize = void 0; +const Client_1 = __importDefault(require("./Client")); +const settings_1 = require("./settings"); +const isomorphic_1 = require("./isomorphic"); +const browser_1 = require("./browser"); +function isBrowser() { + return typeof window === "object"; +} +/** + * Starts the SMART Launch Sequence. + * > **IMPORTANT**: + * `authorize()` will end up redirecting you to the authorization server. + * This means that you should not add anything to the returned promise chain. + * Any code written directly after the authorize() call might not be executed + * due to that redirect! + * @param env + * @param [params] + */ +async function authorize(env, params = {}) { + const url = env.getUrl(); + // Multiple config for EHR launches --------------------------------------- + if (Array.isArray(params)) { + const urlISS = url.searchParams.get("iss") || url.searchParams.get("fhirServiceUrl"); + if (!urlISS) { + throw new Error('Passing in an "iss" url parameter is required if authorize ' + + 'uses multiple configurations'); + } + // pick the right config + const cfg = params.find(x => { + if (x.issMatch) { + if (typeof x.issMatch === "function") { + return !!x.issMatch(urlISS); + } + if (typeof x.issMatch === "string") { + return x.issMatch === urlISS; + } + if (x.issMatch instanceof RegExp) { + return x.issMatch.test(urlISS); + } + } + return false; + }); + (0, isomorphic_1.assert)(cfg, `No configuration found matching the current "iss" parameter "${urlISS}"`); + return await authorize(env, cfg); + } + // ------------------------------------------------------------------------ + // Obtain input + const { clientSecret, fakeTokenResponse, encounterId, target, width, height, pkceMode, clientPublicKeySetUrl } = params; + let { iss, launch, patientId, fhirServiceUrl, redirectUri, noRedirect, scope = "", clientId, completeInTarget, clientPrivateJwk } = params; + const storage = env.getStorage(); + // For these, a url param takes precedence over inline option + iss = url.searchParams.get("iss") || iss; + fhirServiceUrl = url.searchParams.get("fhirServiceUrl") || fhirServiceUrl; + launch = url.searchParams.get("launch") || launch; + patientId = url.searchParams.get("patientId") || patientId; + clientId = url.searchParams.get("clientId") || clientId; + if (!redirectUri) { + redirectUri = env.relative("."); + } + else if (!redirectUri.match(/^https?\:\/\//)) { + redirectUri = env.relative(redirectUri); + } + const serverUrl = String(iss || fhirServiceUrl || ""); + // Validate input + if (!serverUrl) { + throw new Error("No server url found. It must be specified as `iss` or as " + + "`fhirServiceUrl` parameter"); + } + if (iss) { + (0, isomorphic_1.debug)("Making %s launch...", launch ? "EHR" : "standalone"); + } + // append launch scope if needed + if (launch && !scope.match(/launch/)) { + scope += " launch"; + } + if (isBrowser()) { + const inFrame = (0, browser_1.isInFrame)(); + const inPopUp = (0, browser_1.isInPopUp)(); + if ((inFrame || inPopUp) && completeInTarget !== true && completeInTarget !== false) { + // completeInTarget will default to true if authorize is called from + // within an iframe. This is to avoid issues when the entire app + // happens to be rendered in an iframe (including in some EHRs), + // even though that was not how the app developer's intention. + completeInTarget = inFrame; + // In this case we can't always make the best decision so ask devs + // to be explicit in their configuration. + console.warn('Your app is being authorized from within an iframe or popup ' + + 'window. Please be explicit and provide a "completeInTarget" ' + + 'option. Use "true" to complete the authorization in the ' + + 'same window, or "false" to try to complete it in the parent ' + + 'or the opener window. See http://docs.smarthealthit.org/client-js/api.html'); + } + } + // If `authorize` is called, make sure we clear any previous state (in case + // this is a re-authorize) + const oldKey = await storage.get(settings_1.SMART_KEY); + await storage.unset(oldKey); + // create initial state + const stateKey = (0, isomorphic_1.randomString)(16); + const state = { + clientId, + scope, + redirectUri, + serverUrl, + clientSecret, + clientPrivateJwk, + tokenResponse: {}, + key: stateKey, + completeInTarget, + clientPublicKeySetUrl + }; + await storage.set(settings_1.SMART_KEY, stateKey); + // fakeTokenResponse to override stuff (useful in development) + if (fakeTokenResponse) { + Object.assign(state.tokenResponse, fakeTokenResponse); + } + // Fixed patientId (useful in development) + if (patientId) { + Object.assign(state.tokenResponse, { patient: patientId }); + } + // Fixed encounterId (useful in development) + if (encounterId) { + Object.assign(state.tokenResponse, { encounter: encounterId }); + } + let redirectUrl = redirectUri + "?state=" + encodeURIComponent(stateKey); + // bypass oauth if fhirServiceUrl is used (but iss takes precedence) + if (fhirServiceUrl && !iss) { + (0, isomorphic_1.debug)("Making fake launch..."); + await storage.set(stateKey, state); + if (noRedirect) { + return redirectUrl; + } + return await env.redirect(redirectUrl); + } + // Get oauth endpoints and add them to the state + const extensions = await (0, isomorphic_1.getSecurityExtensions)(serverUrl); + Object.assign(state, extensions); + await storage.set(stateKey, state); + // If this happens to be an open server and there is no authorizeUri + if (!state.authorizeUri) { + if (noRedirect) { + return redirectUrl; + } + return await env.redirect(redirectUrl); + } + // build the redirect uri + const redirectParams = [ + "response_type=code", + "client_id=" + encodeURIComponent(clientId || ""), + "scope=" + encodeURIComponent(scope), + "redirect_uri=" + encodeURIComponent(redirectUri), + "aud=" + encodeURIComponent(serverUrl), + "state=" + encodeURIComponent(stateKey) + ]; + // also pass this in case of EHR launch + if (launch) { + redirectParams.push("launch=" + encodeURIComponent(launch)); + } + if ((0, isomorphic_1.shouldIncludeChallenge)(extensions.codeChallengeMethods.includes('S256'), pkceMode)) { + let codes = await env.security.generatePKCEChallenge(); + Object.assign(state, codes); + await storage.set(stateKey, state); + redirectParams.push("code_challenge=" + state.codeChallenge); // note that the challenge is ALREADY encoded properly + redirectParams.push("code_challenge_method=S256"); + } + redirectUrl = state.authorizeUri + "?" + redirectParams.join("&"); + if (noRedirect) { + return redirectUrl; + } + if (target && isBrowser()) { + let win; + win = await (0, browser_1.getTargetWindow)(target, width, height); + if (win !== self) { + try { + // Also remove any old state from the target window and then + // transfer the current state there + win.sessionStorage.removeItem(oldKey); + win.sessionStorage.setItem(stateKey, JSON.stringify(state)); + } + catch (ex) { + (0, isomorphic_1.debug)(`oauth2: Failed to modify window.sessionStorage. Perhaps it is from different origin?. Failing back to "_self". %s`, ex); + win = self; + } + } + if (win !== self) { + try { + win.location.href = redirectUrl; + self.addEventListener("message", browser_1.onMessage); + } + catch (ex) { + (0, isomorphic_1.debug)(`oauth2: Failed to modify window.location. Perhaps it is from different origin?. Failing back to "_self". %s`, ex); + self.location.href = redirectUrl; + } + } + else { + self.location.href = redirectUrl; + } + return; + } + return await env.redirect(redirectUrl); +} +exports.authorize = authorize; +/** + * The ready function should only be called on the page that represents + * the redirectUri. We typically land there after a redirect from the + * authorization server, but this code will also be executed upon subsequent + * navigation or page refresh. + */ +async function ready(env, options = {}) { + var _a, _b; + const url = env.getUrl(); + const Storage = env.getStorage(); + const params = url.searchParams; + let key = params.get("state"); + const code = params.get("code"); + const authError = params.get("error"); + const authErrorDescription = params.get("error_description"); + if (!key) { + key = await Storage.get(settings_1.SMART_KEY); + } + // Start by checking the url for `error` and `error_description` parameters. + // This happens when the auth server rejects our authorization attempt. In + // this case it has no other way to tell us what the error was, other than + // appending these parameters to the redirect url. + // From client's point of view, this is not very reliable (because we can't + // know how we have landed on this page - was it a redirect or was it loaded + // manually). However, if `ready()` is being called, we can assume + // that the url comes from the auth server (otherwise the app won't work + // anyway). + if (authError || authErrorDescription) { + throw new Error([ + authError, + authErrorDescription + ].filter(Boolean).join(": ")); + } + (0, isomorphic_1.debug)("key: %s, code: %s", key, code); + // key might be coming from the page url so it might be empty or missing + (0, isomorphic_1.assert)(key, "No 'state' parameter found. Please (re)launch the app."); + // Check if we have a previous state + let state = (await Storage.get(key)); + // If we are in a popup window or an iframe and the authorization is + // complete, send the location back to our opener and exit. + if (isBrowser() && state && !state.completeInTarget) { + const inFrame = (0, browser_1.isInFrame)(); + const inPopUp = (0, browser_1.isInPopUp)(); + // we are about to return to the opener/parent where completeAuth will + // be called again. In rare cases the opener or parent might also be + // a frame or popup. Then inFrame or inPopUp will be true but we still + // have to stop going up the chain. To guard against that weird form of + // recursion we pass one additional parameter to the url which we later + // remove. + if ((inFrame || inPopUp) && !url.searchParams.get("complete")) { + url.searchParams.set("complete", "1"); + const { href, origin } = url; + if (inFrame) { + parent.postMessage({ type: "completeAuth", url: href }, origin); + } + if (inPopUp) { + opener.postMessage({ type: "completeAuth", url: href }, origin); + window.close(); + } + return new Promise(() => { }); + } + } + url.searchParams.delete("complete"); + // Do we have to remove the `code` and `state` params from the URL? + const hasState = params.has("state"); + if (isBrowser() && (code || hasState)) { + // `code` is the flag that tell us to request an access token. + // We have to remove it, otherwise the page will authorize on + // every load! + if (code) { + params.delete("code"); + (0, isomorphic_1.debug)("Removed code parameter from the url."); + } + // We no longer need the `state` key. It will be stored to a well know + // location - sessionStorage[SMART_KEY] + if (hasState) { + params.delete("state"); + (0, isomorphic_1.debug)("Removed state parameter from the url."); + } + // If the browser does not support the replaceState method for the + // History Web API, the "code" parameter cannot be removed. As a + // consequence, the page will (re)authorize on every load. The + // workaround is to reload the page to new location without those + // parameters. + if (window.history.replaceState) { + window.history.replaceState({}, "", url.href); + } + } + // If the state does not exist, it means the page has been loaded directly. + (0, isomorphic_1.assert)(state, "No state found! Please (re)launch the app."); + // Assume the client has already completed a token exchange when + // there is no code (but we have a state) or access token is found in state + const authorized = !code || ((_a = state.tokenResponse) === null || _a === void 0 ? void 0 : _a.access_token); + // If we are authorized already, then this is just a reload. + // Otherwise, we have to complete the code flow + if (!authorized && state.tokenUri) { + (0, isomorphic_1.assert)(code, "'code' url parameter is required"); + (0, isomorphic_1.debug)("Preparing to exchange the code for access token..."); + const requestOptions = await buildTokenRequest(env, { + code, + state, + clientPublicKeySetUrl: options.clientPublicKeySetUrl, + privateKey: options.privateKey || state.clientPrivateJwk + }); + (0, isomorphic_1.debug)("Token request options: %O", requestOptions); + // The EHR authorization server SHALL return a JSON structure that + // includes an access token or a message indicating that the + // authorization request has been denied. + const tokenResponse = await (0, isomorphic_1.request)(state.tokenUri, requestOptions); + (0, isomorphic_1.debug)("Token response: %O", tokenResponse); + (0, isomorphic_1.assert)(tokenResponse.access_token, "Failed to obtain access token."); + // Now we need to determine when is this authorization going to expire + state.expiresAt = (0, isomorphic_1.getAccessTokenExpiration)(tokenResponse); + // save the tokenResponse so that we don't have to re-authorize on + // every page reload + state = { ...state, tokenResponse }; + await Storage.set(key, state); + (0, isomorphic_1.debug)("Authorization successful!"); + } + else { + (0, isomorphic_1.debug)(((_b = state.tokenResponse) === null || _b === void 0 ? void 0 : _b.access_token) ? + "Already authorized" : + "No authorization needed"); + } + await Storage.set(settings_1.SMART_KEY, key); + const client = new Client_1.default(state, env.getStorage()); + (0, isomorphic_1.debug)("Created client instance: %O", client); + return client; +} +exports.ready = ready; +/** + * Builds the token request options. Does not make the request, just + * creates it's configuration and returns it in a Promise. + */ +async function buildTokenRequest(env, { code, state, clientPublicKeySetUrl, privateKey }) { + const { redirectUri, clientSecret, tokenUri, clientId, codeVerifier } = state; + (0, isomorphic_1.assert)(redirectUri, "Missing state.redirectUri"); + (0, isomorphic_1.assert)(tokenUri, "Missing state.tokenUri"); + (0, isomorphic_1.assert)(clientId, "Missing state.clientId"); + const requestOptions = { + method: "POST", + headers: { "content-type": "application/x-www-form-urlencoded" }, + body: `code=${code}&grant_type=authorization_code&redirect_uri=${encodeURIComponent(redirectUri)}` + }; + // For public apps, authentication is not possible (and thus not required), + // since a client with no secret cannot prove its identity when it issues a + // call. (The end-to-end system can still be secure because the client comes + // from a known, https protected endpoint specified and enforced by the + // redirect uri.) For confidential apps, an Authorization header using HTTP + // Basic authentication is required, where the username is the app’s + // clientId and the password is the app’s clientSecret (see example). + if (clientSecret) { + requestOptions.headers.authorization = "Basic " + (0, isomorphic_1.base64encode)(clientId + ":" + clientSecret); + (0, isomorphic_1.debug)("Using state.clientSecret to construct the authorization header: %s", requestOptions.headers.authorization); + } + // Asymmetric auth + else if (privateKey) { + const pk = "key" in privateKey ? + privateKey.key : + await env.security.importJWK(privateKey); + const jwtHeaders = { + typ: "JWT", + kid: privateKey.kid, + jku: clientPublicKeySetUrl || state.clientPublicKeySetUrl + }; + const jwtClaims = { + iss: clientId, + sub: clientId, + aud: tokenUri, + jti: env.base64urlencode(env.security.randomBytes(32)), + exp: (0, isomorphic_1.getTimeInFuture)(120) // two minutes in the future + }; + const clientAssertion = await env.security.signCompactJws(privateKey.alg, pk, jwtHeaders, jwtClaims); + requestOptions.body += `&client_assertion_type=${encodeURIComponent("urn:ietf:params:oauth:client-assertion-type:jwt-bearer")}`; + requestOptions.body += `&client_assertion=${encodeURIComponent(clientAssertion)}`; + (0, isomorphic_1.debug)("Using state.clientPrivateJwk to add a client_assertion to the POST body"); + } + // Public client + else { + (0, isomorphic_1.debug)("Public client detected; adding state.clientId to the POST body"); + requestOptions.body += `&client_id=${encodeURIComponent(clientId)}`; + } + if (codeVerifier) { + (0, isomorphic_1.debug)("Found state.codeVerifier, adding to the POST body"); + // Note that the codeVerifier is ALREADY encoded properly + requestOptions.body += "&code_verifier=" + codeVerifier; + } + return requestOptions; +} +exports.buildTokenRequest = buildTokenRequest; +/** + * This function can be used when you want to handle everything in one page + * (no launch endpoint needed). You can think of it as if it does: + * ```js + * authorize(options).then(ready) + * ``` + * + * **Be careful with init()!** There are some details you need to be aware of: + * + * 1. It will only work if your launch_uri is the same as your redirect_uri. + * While this should be valid, we can’t promise that every EHR will allow you + * to register client with such settings. + * 2. Internally, `init()` will be called twice. First it will redirect to the + * EHR, then the EHR will redirect back to the page where init() will be + * called again to complete the authorization. This is generally fine, + * because the returned promise will only be resolved once, after the second + * execution, but please also consider the following: + * - You should wrap all your app’s code in a function that is only executed + * after `init()` resolves! + * - Since the page will be loaded twice, you must be careful if your code + * has global side effects that can persist between page reloads + * (for example writing to localStorage). + * 3. For standalone launch, only use init in combination with offline_access + * scope. Once the access_token expires, if you don’t have a refresh_token + * there is no way to re-authorize properly. We detect that and delete the + * expired access token, but it still means that the user will have to + * refresh the page twice to re-authorize. + * @param env The adapter + * @param authorizeOptions The authorize options + * @param [readyOptions] + */ +async function init(env, authorizeOptions, readyOptions) { + const url = env.getUrl(); + const code = url.searchParams.get("code"); + const state = url.searchParams.get("state"); + // if `code` and `state` params are present we need to complete the auth flow + if (code && state) { + return ready(env, readyOptions); + } + // Check for existing client state. If state is found, it means a client + // instance have already been created in this session and we should try to + // "revive" it. + const storage = env.getStorage(); + const key = state || await storage.get(settings_1.SMART_KEY); + const cached = await storage.get(key); + if (cached) { + return new Client_1.default(cached, env.getStorage()); + } + // Otherwise try to launch + return authorize(env, authorizeOptions).then(() => { + // `init` promises a Client but that cannot happen in this case. The + // browser will be redirected (unload the page and be redirected back + // to it later and the same init function will be called again). On + // success, authorize will resolve with the redirect url but we don't + // want to return that from this promise chain because it is not a + // Client instance. At the same time, if authorize fails, we do want to + // pass the error to those waiting for a client instance. + return new Promise(() => { }); + }); +} +exports.init = init; diff --git a/dist/lib/next/strings.d.ts b/dist/lib/next/strings.d.ts new file mode 100644 index 00000000..2cd7be7b --- /dev/null +++ b/dist/lib/next/strings.d.ts @@ -0,0 +1,7 @@ +declare const _default: { + expired: string; + noScopeForId: string; + noIfNoAuth: string; + noFreeContext: string; +}; +export default _default; diff --git a/dist/lib/next/strings.js b/dist/lib/next/strings.js new file mode 100644 index 00000000..bf0d2274 --- /dev/null +++ b/dist/lib/next/strings.js @@ -0,0 +1,9 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +// This map contains reusable debug messages (only those used in multiple places) +exports.default = { + expired: "Session expired! Please re-launch the app", + noScopeForId: "Trying to get the ID of the selected %s. Please add 'launch' or 'launch/%s' to the requested scopes and try again.", + noIfNoAuth: "You are trying to get %s but the app is not authorized yet.", + noFreeContext: "Please don't use open fhir servers if you need to access launch context items like the %S." +}; diff --git a/docs/typedoc/assets/highlight.css b/docs/typedoc/assets/highlight.css index a8ab880e..c5c90601 100644 --- a/docs/typedoc/assets/highlight.css +++ b/docs/typedoc/assets/highlight.css @@ -13,10 +13,10 @@ --dark-hl-5: #CE9178; --light-hl-6: #001080; --dark-hl-6: #9CDCFE; - --light-hl-7: #098658; - --dark-hl-7: #B5CEA8; - --light-hl-8: #AF00DB; - --dark-hl-8: #C586C0; + --light-hl-7: #AF00DB; + --dark-hl-7: #C586C0; + --light-hl-8: #098658; + --dark-hl-8: #B5CEA8; --light-hl-9: #000000FF; --dark-hl-9: #D4D4D4; --light-hl-10: #267F99; diff --git a/docs/typedoc/assets/search.js b/docs/typedoc/assets/search.js index ba774070..862b79c9 100644 --- a/docs/typedoc/assets/search.js +++ b/docs/typedoc/assets/search.js @@ -1 +1 @@ -window.searchData = JSON.parse("{\"kinds\":{\"2\":\"Module\",\"4\":\"Namespace\",\"32\":\"Variable\",\"64\":\"Function\",\"128\":\"Class\",\"256\":\"Interface\",\"512\":\"Constructor\",\"1024\":\"Property\",\"2048\":\"Method\",\"65536\":\"Type literal\",\"4194304\":\"Type alias\",\"16777216\":\"Reference\"},\"rows\":[{\"id\":0,\"kind\":2,\"name\":\"Client\",\"url\":\"modules/Client.html\",\"classes\":\"tsd-kind-module\"},{\"id\":1,\"kind\":128,\"name\":\"default\",\"url\":\"classes/Client.default.html\",\"classes\":\"tsd-kind-class tsd-parent-kind-module\",\"parent\":\"Client\"},{\"id\":2,\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/Client.default.html#constructor\",\"classes\":\"tsd-kind-constructor tsd-parent-kind-class\",\"parent\":\"Client.default\"},{\"id\":3,\"kind\":1024,\"name\":\"state\",\"url\":\"classes/Client.default.html#state\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Client.default\"},{\"id\":4,\"kind\":1024,\"name\":\"environment\",\"url\":\"classes/Client.default.html#environment\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Client.default\"},{\"id\":5,\"kind\":1024,\"name\":\"patient\",\"url\":\"classes/Client.default.html#patient\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Client.default\"},{\"id\":6,\"kind\":65536,\"name\":\"__type\",\"url\":\"classes/Client.default.html#__type-1\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-class\",\"parent\":\"Client.default\"},{\"id\":7,\"kind\":1024,\"name\":\"id\",\"url\":\"classes/Client.default.html#__type-1.id-1\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"Client.default.__type\"},{\"id\":8,\"kind\":1024,\"name\":\"read\",\"url\":\"classes/Client.default.html#__type-1.read-1\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"Client.default.__type\"},{\"id\":9,\"kind\":2048,\"name\":\"request\",\"url\":\"classes/Client.default.html#__type-1.request\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal tsd-has-type-parameter\",\"parent\":\"Client.default.__type\"},{\"id\":10,\"kind\":1024,\"name\":\"encounter\",\"url\":\"classes/Client.default.html#encounter\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Client.default\"},{\"id\":11,\"kind\":65536,\"name\":\"__type\",\"url\":\"classes/Client.default.html#__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-class\",\"parent\":\"Client.default\"},{\"id\":12,\"kind\":1024,\"name\":\"id\",\"url\":\"classes/Client.default.html#__type.id\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"Client.default.__type\"},{\"id\":13,\"kind\":1024,\"name\":\"read\",\"url\":\"classes/Client.default.html#__type.read\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"Client.default.__type\"},{\"id\":14,\"kind\":1024,\"name\":\"user\",\"url\":\"classes/Client.default.html#user\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Client.default\"},{\"id\":15,\"kind\":65536,\"name\":\"__type\",\"url\":\"classes/Client.default.html#__type-3\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-class\",\"parent\":\"Client.default\"},{\"id\":16,\"kind\":1024,\"name\":\"id\",\"url\":\"classes/Client.default.html#__type-3.id-2\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"Client.default.__type\"},{\"id\":17,\"kind\":1024,\"name\":\"read\",\"url\":\"classes/Client.default.html#__type-3.read-2\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"Client.default.__type\"},{\"id\":18,\"kind\":1024,\"name\":\"fhirUser\",\"url\":\"classes/Client.default.html#__type-3.fhirUser\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"Client.default.__type\"},{\"id\":19,\"kind\":1024,\"name\":\"resourceType\",\"url\":\"classes/Client.default.html#__type-3.resourceType\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"Client.default.__type\"},{\"id\":20,\"kind\":1024,\"name\":\"_refreshTask\",\"url\":\"classes/Client.default.html#_refreshTask\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-private\",\"parent\":\"Client.default\"},{\"id\":21,\"kind\":2048,\"name\":\"getPatientId\",\"url\":\"classes/Client.default.html#getPatientId\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Client.default\"},{\"id\":22,\"kind\":2048,\"name\":\"getEncounterId\",\"url\":\"classes/Client.default.html#getEncounterId\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Client.default\"},{\"id\":23,\"kind\":2048,\"name\":\"getIdToken\",\"url\":\"classes/Client.default.html#getIdToken\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Client.default\"},{\"id\":24,\"kind\":2048,\"name\":\"getFhirUser\",\"url\":\"classes/Client.default.html#getFhirUser\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Client.default\"},{\"id\":25,\"kind\":2048,\"name\":\"getUserId\",\"url\":\"classes/Client.default.html#getUserId\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Client.default\"},{\"id\":26,\"kind\":2048,\"name\":\"getUserType\",\"url\":\"classes/Client.default.html#getUserType\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Client.default\"},{\"id\":27,\"kind\":2048,\"name\":\"getAuthorizationHeader\",\"url\":\"classes/Client.default.html#getAuthorizationHeader\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Client.default\"},{\"id\":28,\"kind\":2048,\"name\":\"_clearState\",\"url\":\"classes/Client.default.html#_clearState\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-private\",\"parent\":\"Client.default\"},{\"id\":29,\"kind\":2048,\"name\":\"create\",\"url\":\"classes/Client.default.html#create\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-has-type-parameter\",\"parent\":\"Client.default\"},{\"id\":30,\"kind\":2048,\"name\":\"update\",\"url\":\"classes/Client.default.html#update\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-has-type-parameter\",\"parent\":\"Client.default\"},{\"id\":31,\"kind\":2048,\"name\":\"delete\",\"url\":\"classes/Client.default.html#delete\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-has-type-parameter\",\"parent\":\"Client.default\"},{\"id\":32,\"kind\":2048,\"name\":\"patch\",\"url\":\"classes/Client.default.html#patch\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-has-type-parameter\",\"parent\":\"Client.default\"},{\"id\":33,\"kind\":2048,\"name\":\"request\",\"url\":\"classes/Client.default.html#request-1\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-has-type-parameter\",\"parent\":\"Client.default\"},{\"id\":34,\"kind\":2048,\"name\":\"refreshIfNeeded\",\"url\":\"classes/Client.default.html#refreshIfNeeded\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Client.default\"},{\"id\":35,\"kind\":2048,\"name\":\"refresh\",\"url\":\"classes/Client.default.html#refresh\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Client.default\"},{\"id\":36,\"kind\":2048,\"name\":\"byCode\",\"url\":\"classes/Client.default.html#byCode\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Client.default\"},{\"id\":37,\"kind\":2048,\"name\":\"byCodes\",\"url\":\"classes/Client.default.html#byCodes\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Client.default\"},{\"id\":38,\"kind\":1024,\"name\":\"units\",\"url\":\"classes/Client.default.html#units\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Client.default\"},{\"id\":39,\"kind\":65536,\"name\":\"__type\",\"url\":\"classes/Client.default.html#__type-2\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-class\",\"parent\":\"Client.default\"},{\"id\":40,\"kind\":2048,\"name\":\"cm\",\"url\":\"classes/Client.default.html#__type-2.cm\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"Client.default.__type\"},{\"id\":41,\"kind\":2048,\"name\":\"kg\",\"url\":\"classes/Client.default.html#__type-2.kg\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"Client.default.__type\"},{\"id\":42,\"kind\":2048,\"name\":\"any\",\"url\":\"classes/Client.default.html#__type-2.any\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"Client.default.__type\"},{\"id\":43,\"kind\":2048,\"name\":\"getPath\",\"url\":\"classes/Client.default.html#getPath\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Client.default\"},{\"id\":44,\"kind\":2048,\"name\":\"getState\",\"url\":\"classes/Client.default.html#getState\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Client.default\"},{\"id\":45,\"kind\":2048,\"name\":\"getFhirVersion\",\"url\":\"classes/Client.default.html#getFhirVersion\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Client.default\"},{\"id\":46,\"kind\":2048,\"name\":\"getFhirRelease\",\"url\":\"classes/Client.default.html#getFhirRelease\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Client.default\"},{\"id\":47,\"kind\":2,\"name\":\"HttpError\",\"url\":\"modules/HttpError.html\",\"classes\":\"tsd-kind-module\"},{\"id\":48,\"kind\":128,\"name\":\"default\",\"url\":\"classes/HttpError.default.html\",\"classes\":\"tsd-kind-class tsd-parent-kind-module\",\"parent\":\"HttpError\"},{\"id\":49,\"kind\":65536,\"name\":\"__type\",\"url\":\"classes/HttpError.default.html#__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-class\",\"parent\":\"HttpError.default\"},{\"id\":50,\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/HttpError.default.html#constructor\",\"classes\":\"tsd-kind-constructor tsd-parent-kind-class tsd-is-overwrite\",\"parent\":\"HttpError.default\"},{\"id\":51,\"kind\":1024,\"name\":\"statusCode\",\"url\":\"classes/HttpError.default.html#statusCode\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"HttpError.default\"},{\"id\":52,\"kind\":1024,\"name\":\"status\",\"url\":\"classes/HttpError.default.html#status\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"HttpError.default\"},{\"id\":53,\"kind\":1024,\"name\":\"statusText\",\"url\":\"classes/HttpError.default.html#statusText\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"HttpError.default\"},{\"id\":54,\"kind\":1024,\"name\":\"response\",\"url\":\"classes/HttpError.default.html#response\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"HttpError.default\"},{\"id\":55,\"kind\":2048,\"name\":\"parse\",\"url\":\"classes/HttpError.default.html#parse\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"HttpError.default\"},{\"id\":56,\"kind\":2048,\"name\":\"toJSON\",\"url\":\"classes/HttpError.default.html#toJSON\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"HttpError.default\"},{\"id\":57,\"kind\":2,\"name\":\"adapters/BrowserAdapter\",\"url\":\"modules/adapters_BrowserAdapter.html\",\"classes\":\"tsd-kind-module\"},{\"id\":58,\"kind\":128,\"name\":\"default\",\"url\":\"classes/adapters_BrowserAdapter.default.html\",\"classes\":\"tsd-kind-class tsd-parent-kind-module\",\"parent\":\"adapters/BrowserAdapter\"},{\"id\":59,\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/adapters_BrowserAdapter.default.html#constructor\",\"classes\":\"tsd-kind-constructor tsd-parent-kind-class\",\"parent\":\"adapters/BrowserAdapter.default\"},{\"id\":60,\"kind\":1024,\"name\":\"_url\",\"url\":\"classes/adapters_BrowserAdapter.default.html#_url\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-private\",\"parent\":\"adapters/BrowserAdapter.default\"},{\"id\":61,\"kind\":1024,\"name\":\"_storage\",\"url\":\"classes/adapters_BrowserAdapter.default.html#_storage\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-private\",\"parent\":\"adapters/BrowserAdapter.default\"},{\"id\":62,\"kind\":1024,\"name\":\"options\",\"url\":\"classes/adapters_BrowserAdapter.default.html#options\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"adapters/BrowserAdapter.default\"},{\"id\":63,\"kind\":1024,\"name\":\"security\",\"url\":\"classes/adapters_BrowserAdapter.default.html#security\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"adapters/BrowserAdapter.default\"},{\"id\":64,\"kind\":2048,\"name\":\"relative\",\"url\":\"classes/adapters_BrowserAdapter.default.html#relative\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"adapters/BrowserAdapter.default\"},{\"id\":65,\"kind\":2048,\"name\":\"getUrl\",\"url\":\"classes/adapters_BrowserAdapter.default.html#getUrl\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"adapters/BrowserAdapter.default\"},{\"id\":66,\"kind\":2048,\"name\":\"redirect\",\"url\":\"classes/adapters_BrowserAdapter.default.html#redirect\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"adapters/BrowserAdapter.default\"},{\"id\":67,\"kind\":2048,\"name\":\"getStorage\",\"url\":\"classes/adapters_BrowserAdapter.default.html#getStorage\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"adapters/BrowserAdapter.default\"},{\"id\":68,\"kind\":2048,\"name\":\"base64encode\",\"url\":\"classes/adapters_BrowserAdapter.default.html#base64encode\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"adapters/BrowserAdapter.default\"},{\"id\":69,\"kind\":2048,\"name\":\"base64decode\",\"url\":\"classes/adapters_BrowserAdapter.default.html#base64decode\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"adapters/BrowserAdapter.default\"},{\"id\":70,\"kind\":2048,\"name\":\"base64urlencode\",\"url\":\"classes/adapters_BrowserAdapter.default.html#base64urlencode\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"adapters/BrowserAdapter.default\"},{\"id\":71,\"kind\":2048,\"name\":\"base64urldecode\",\"url\":\"classes/adapters_BrowserAdapter.default.html#base64urldecode\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"adapters/BrowserAdapter.default\"},{\"id\":72,\"kind\":2048,\"name\":\"getSmartApi\",\"url\":\"classes/adapters_BrowserAdapter.default.html#getSmartApi\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"adapters/BrowserAdapter.default\"},{\"id\":73,\"kind\":2,\"name\":\"adapters/HapiAdapter\",\"url\":\"modules/adapters_HapiAdapter.html\",\"classes\":\"tsd-kind-module\"},{\"id\":74,\"kind\":128,\"name\":\"default\",\"url\":\"classes/adapters_HapiAdapter.default.html\",\"classes\":\"tsd-kind-class tsd-parent-kind-module\",\"parent\":\"adapters/HapiAdapter\"},{\"id\":75,\"kind\":2048,\"name\":\"smart\",\"url\":\"classes/adapters_HapiAdapter.default.html#smart\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"adapters/HapiAdapter.default\"},{\"id\":76,\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/adapters_HapiAdapter.default.html#constructor\",\"classes\":\"tsd-kind-constructor tsd-parent-kind-class tsd-is-overwrite\",\"parent\":\"adapters/HapiAdapter.default\"},{\"id\":77,\"kind\":1024,\"name\":\"_responseToolkit\",\"url\":\"classes/adapters_HapiAdapter.default.html#_responseToolkit\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-private\",\"parent\":\"adapters/HapiAdapter.default\"},{\"id\":78,\"kind\":1024,\"name\":\"_request\",\"url\":\"classes/adapters_HapiAdapter.default.html#_request\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-private\",\"parent\":\"adapters/HapiAdapter.default\"},{\"id\":79,\"kind\":1024,\"name\":\"_storage\",\"url\":\"classes/adapters_HapiAdapter.default.html#_storage\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-overwrite tsd-is-protected\",\"parent\":\"adapters/HapiAdapter.default\"},{\"id\":80,\"kind\":2048,\"name\":\"getStorage\",\"url\":\"classes/adapters_HapiAdapter.default.html#getStorage\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-overwrite\",\"parent\":\"adapters/HapiAdapter.default\"},{\"id\":81,\"kind\":2048,\"name\":\"redirect\",\"url\":\"classes/adapters_HapiAdapter.default.html#redirect\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-overwrite\",\"parent\":\"adapters/HapiAdapter.default\"},{\"id\":82,\"kind\":1024,\"name\":\"options\",\"url\":\"classes/adapters_HapiAdapter.default.html#options\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-inherited\",\"parent\":\"adapters/HapiAdapter.default\"},{\"id\":83,\"kind\":1024,\"name\":\"security\",\"url\":\"classes/adapters_HapiAdapter.default.html#security\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-inherited\",\"parent\":\"adapters/HapiAdapter.default\"},{\"id\":84,\"kind\":2048,\"name\":\"relative\",\"url\":\"classes/adapters_HapiAdapter.default.html#relative\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-inherited\",\"parent\":\"adapters/HapiAdapter.default\"},{\"id\":85,\"kind\":2048,\"name\":\"getProtocol\",\"url\":\"classes/adapters_HapiAdapter.default.html#getProtocol\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-inherited\",\"parent\":\"adapters/HapiAdapter.default\"},{\"id\":86,\"kind\":2048,\"name\":\"getUrl\",\"url\":\"classes/adapters_HapiAdapter.default.html#getUrl\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-inherited\",\"parent\":\"adapters/HapiAdapter.default\"},{\"id\":87,\"kind\":2048,\"name\":\"base64encode\",\"url\":\"classes/adapters_HapiAdapter.default.html#base64encode\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-inherited\",\"parent\":\"adapters/HapiAdapter.default\"},{\"id\":88,\"kind\":2048,\"name\":\"base64decode\",\"url\":\"classes/adapters_HapiAdapter.default.html#base64decode\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-inherited\",\"parent\":\"adapters/HapiAdapter.default\"},{\"id\":89,\"kind\":2048,\"name\":\"base64urlencode\",\"url\":\"classes/adapters_HapiAdapter.default.html#base64urlencode\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-inherited\",\"parent\":\"adapters/HapiAdapter.default\"},{\"id\":90,\"kind\":2048,\"name\":\"base64urldecode\",\"url\":\"classes/adapters_HapiAdapter.default.html#base64urldecode\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-inherited\",\"parent\":\"adapters/HapiAdapter.default\"},{\"id\":91,\"kind\":2048,\"name\":\"getSmartApi\",\"url\":\"classes/adapters_HapiAdapter.default.html#getSmartApi\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-inherited\",\"parent\":\"adapters/HapiAdapter.default\"},{\"id\":92,\"kind\":2,\"name\":\"adapters/NodeAdapter\",\"url\":\"modules/adapters_NodeAdapter.html\",\"classes\":\"tsd-kind-module\"},{\"id\":93,\"kind\":128,\"name\":\"default\",\"url\":\"classes/adapters_NodeAdapter.default.html\",\"classes\":\"tsd-kind-class tsd-parent-kind-module\",\"parent\":\"adapters/NodeAdapter\"},{\"id\":94,\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/adapters_NodeAdapter.default.html#constructor\",\"classes\":\"tsd-kind-constructor tsd-parent-kind-class\",\"parent\":\"adapters/NodeAdapter.default\"},{\"id\":95,\"kind\":1024,\"name\":\"_storage\",\"url\":\"classes/adapters_NodeAdapter.default.html#_storage\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-protected\",\"parent\":\"adapters/NodeAdapter.default\"},{\"id\":96,\"kind\":1024,\"name\":\"options\",\"url\":\"classes/adapters_NodeAdapter.default.html#options\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"adapters/NodeAdapter.default\"},{\"id\":97,\"kind\":1024,\"name\":\"security\",\"url\":\"classes/adapters_NodeAdapter.default.html#security\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"adapters/NodeAdapter.default\"},{\"id\":98,\"kind\":2048,\"name\":\"relative\",\"url\":\"classes/adapters_NodeAdapter.default.html#relative\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"adapters/NodeAdapter.default\"},{\"id\":99,\"kind\":2048,\"name\":\"getProtocol\",\"url\":\"classes/adapters_NodeAdapter.default.html#getProtocol\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"adapters/NodeAdapter.default\"},{\"id\":100,\"kind\":2048,\"name\":\"getUrl\",\"url\":\"classes/adapters_NodeAdapter.default.html#getUrl\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"adapters/NodeAdapter.default\"},{\"id\":101,\"kind\":2048,\"name\":\"redirect\",\"url\":\"classes/adapters_NodeAdapter.default.html#redirect\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"adapters/NodeAdapter.default\"},{\"id\":102,\"kind\":2048,\"name\":\"getStorage\",\"url\":\"classes/adapters_NodeAdapter.default.html#getStorage\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"adapters/NodeAdapter.default\"},{\"id\":103,\"kind\":2048,\"name\":\"base64encode\",\"url\":\"classes/adapters_NodeAdapter.default.html#base64encode\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"adapters/NodeAdapter.default\"},{\"id\":104,\"kind\":2048,\"name\":\"base64decode\",\"url\":\"classes/adapters_NodeAdapter.default.html#base64decode\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"adapters/NodeAdapter.default\"},{\"id\":105,\"kind\":2048,\"name\":\"base64urlencode\",\"url\":\"classes/adapters_NodeAdapter.default.html#base64urlencode\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"adapters/NodeAdapter.default\"},{\"id\":106,\"kind\":2048,\"name\":\"base64urldecode\",\"url\":\"classes/adapters_NodeAdapter.default.html#base64urldecode\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"adapters/NodeAdapter.default\"},{\"id\":107,\"kind\":2048,\"name\":\"getSmartApi\",\"url\":\"classes/adapters_NodeAdapter.default.html#getSmartApi\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"adapters/NodeAdapter.default\"},{\"id\":108,\"kind\":2,\"name\":\"base64/browser\",\"url\":\"modules/base64_browser.html\",\"classes\":\"tsd-kind-module\"},{\"id\":109,\"kind\":64,\"name\":\"base64urlencode\",\"url\":\"modules/base64_browser.html#base64urlencode\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"base64/browser\"},{\"id\":110,\"kind\":64,\"name\":\"base64urldecode\",\"url\":\"modules/base64_browser.html#base64urldecode\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"base64/browser\"},{\"id\":111,\"kind\":64,\"name\":\"uint8ArrayToBinaryString\",\"url\":\"modules/base64_browser.html#uint8ArrayToBinaryString\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"base64/browser\"},{\"id\":112,\"kind\":2,\"name\":\"debug\",\"url\":\"modules/debug.html\",\"classes\":\"tsd-kind-module\"},{\"id\":113,\"kind\":32,\"name\":\"debug\",\"url\":\"modules/debug.html#debug-1\",\"classes\":\"tsd-kind-variable tsd-parent-kind-module\",\"parent\":\"debug\"},{\"id\":114,\"kind\":2,\"name\":\"entry/browser\",\"url\":\"modules/entry_browser.html\",\"classes\":\"tsd-kind-module\"},{\"id\":115,\"kind\":32,\"name\":\"default\",\"url\":\"modules/entry_browser.html#default\",\"classes\":\"tsd-kind-variable tsd-parent-kind-module\",\"parent\":\"entry/browser\"},{\"id\":116,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/entry_browser.html#default.__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-variable\",\"parent\":\"entry/browser.default\"},{\"id\":117,\"kind\":1024,\"name\":\"client\",\"url\":\"modules/entry_browser.html#default.__type.client\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"entry/browser.default.__type\"},{\"id\":118,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/entry_browser.html#default.__type.__type-1\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-literal\",\"parent\":\"entry/browser.default.__type\"},{\"id\":119,\"kind\":1024,\"name\":\"utils\",\"url\":\"modules/entry_browser.html#default.__type.utils\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"entry/browser.default.__type\"},{\"id\":120,\"kind\":1024,\"name\":\"oauth2\",\"url\":\"modules/entry_browser.html#default.__type.oauth2\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"entry/browser.default.__type\"},{\"id\":121,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/entry_browser.html#default.__type.__type-2\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-literal\",\"parent\":\"entry/browser.default.__type\"},{\"id\":122,\"kind\":1024,\"name\":\"settings\",\"url\":\"modules/entry_browser.html#default.__type.__type-2.settings\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"entry/browser.default.__type.__type\"},{\"id\":123,\"kind\":1024,\"name\":\"ready\",\"url\":\"modules/entry_browser.html#default.__type.__type-2.ready\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"entry/browser.default.__type.__type\"},{\"id\":124,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/entry_browser.html#default.__type.__type-2.__type-5\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-literal\",\"parent\":\"entry/browser.default.__type.__type\"},{\"id\":125,\"kind\":1024,\"name\":\"authorize\",\"url\":\"modules/entry_browser.html#default.__type.__type-2.authorize\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"entry/browser.default.__type.__type\"},{\"id\":126,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/entry_browser.html#default.__type.__type-2.__type-3\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-literal\",\"parent\":\"entry/browser.default.__type.__type\"},{\"id\":127,\"kind\":1024,\"name\":\"init\",\"url\":\"modules/entry_browser.html#default.__type.__type-2.init\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"entry/browser.default.__type.__type\"},{\"id\":128,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/entry_browser.html#default.__type.__type-2.__type-4\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-literal\",\"parent\":\"entry/browser.default.__type.__type\"},{\"id\":129,\"kind\":2,\"name\":\"entry/hapi\",\"url\":\"modules/entry_hapi.html\",\"classes\":\"tsd-kind-module\"},{\"id\":130,\"kind\":64,\"name\":\"default\",\"url\":\"modules/entry_hapi.html#default\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"entry/hapi\"},{\"id\":131,\"kind\":2,\"name\":\"entry/node\",\"url\":\"modules/entry_node.html\",\"classes\":\"tsd-kind-module\"},{\"id\":132,\"kind\":64,\"name\":\"default\",\"url\":\"modules/entry_node.html#default\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"entry/node\"},{\"id\":133,\"kind\":2,\"name\":\"lib/BrowserAdapter\",\"url\":\"modules/lib_BrowserAdapter.html\",\"classes\":\"tsd-kind-module\"},{\"id\":134,\"kind\":128,\"name\":\"default\",\"url\":\"classes/lib_BrowserAdapter.default.html\",\"classes\":\"tsd-kind-class tsd-parent-kind-module\",\"parent\":\"lib/BrowserAdapter\"},{\"id\":135,\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/lib_BrowserAdapter.default.html#constructor\",\"classes\":\"tsd-kind-constructor tsd-parent-kind-class\",\"parent\":\"lib/BrowserAdapter.default\"},{\"id\":136,\"kind\":1024,\"name\":\"_url\",\"url\":\"classes/lib_BrowserAdapter.default.html#_url\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-private\",\"parent\":\"lib/BrowserAdapter.default\"},{\"id\":137,\"kind\":1024,\"name\":\"_storage\",\"url\":\"classes/lib_BrowserAdapter.default.html#_storage\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-private\",\"parent\":\"lib/BrowserAdapter.default\"},{\"id\":138,\"kind\":1024,\"name\":\"options\",\"url\":\"classes/lib_BrowserAdapter.default.html#options\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"lib/BrowserAdapter.default\"},{\"id\":139,\"kind\":1024,\"name\":\"security\",\"url\":\"classes/lib_BrowserAdapter.default.html#security\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"lib/BrowserAdapter.default\"},{\"id\":140,\"kind\":65536,\"name\":\"__type\",\"url\":\"classes/lib_BrowserAdapter.default.html#__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-class\",\"parent\":\"lib/BrowserAdapter.default\"},{\"id\":141,\"kind\":1024,\"name\":\"randomBytes\",\"url\":\"classes/lib_BrowserAdapter.default.html#__type.randomBytes\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"lib/BrowserAdapter.default.__type\"},{\"id\":142,\"kind\":65536,\"name\":\"__type\",\"url\":\"classes/lib_BrowserAdapter.default.html#__type.__type-4\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-literal\",\"parent\":\"lib/BrowserAdapter.default.__type\"},{\"id\":143,\"kind\":1024,\"name\":\"digestSha256\",\"url\":\"classes/lib_BrowserAdapter.default.html#__type.digestSha256\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"lib/BrowserAdapter.default.__type\"},{\"id\":144,\"kind\":65536,\"name\":\"__type\",\"url\":\"classes/lib_BrowserAdapter.default.html#__type.__type-1\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-literal\",\"parent\":\"lib/BrowserAdapter.default.__type\"},{\"id\":145,\"kind\":1024,\"name\":\"generatePKCEChallenge\",\"url\":\"classes/lib_BrowserAdapter.default.html#__type.generatePKCEChallenge\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"lib/BrowserAdapter.default.__type\"},{\"id\":146,\"kind\":65536,\"name\":\"__type\",\"url\":\"classes/lib_BrowserAdapter.default.html#__type.__type-2\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-literal\",\"parent\":\"lib/BrowserAdapter.default.__type\"},{\"id\":147,\"kind\":1024,\"name\":\"importJWK\",\"url\":\"classes/lib_BrowserAdapter.default.html#__type.importJWK\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"lib/BrowserAdapter.default.__type\"},{\"id\":148,\"kind\":65536,\"name\":\"__type\",\"url\":\"classes/lib_BrowserAdapter.default.html#__type.__type-3\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-literal\",\"parent\":\"lib/BrowserAdapter.default.__type\"},{\"id\":149,\"kind\":1024,\"name\":\"signCompactJws\",\"url\":\"classes/lib_BrowserAdapter.default.html#__type.signCompactJws\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"lib/BrowserAdapter.default.__type\"},{\"id\":150,\"kind\":65536,\"name\":\"__type\",\"url\":\"classes/lib_BrowserAdapter.default.html#__type.__type-5\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-literal\",\"parent\":\"lib/BrowserAdapter.default.__type\"},{\"id\":151,\"kind\":2048,\"name\":\"relative\",\"url\":\"classes/lib_BrowserAdapter.default.html#relative\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"lib/BrowserAdapter.default\"},{\"id\":152,\"kind\":2048,\"name\":\"getUrl\",\"url\":\"classes/lib_BrowserAdapter.default.html#getUrl\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"lib/BrowserAdapter.default\"},{\"id\":153,\"kind\":2048,\"name\":\"redirect\",\"url\":\"classes/lib_BrowserAdapter.default.html#redirect\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"lib/BrowserAdapter.default\"},{\"id\":154,\"kind\":2048,\"name\":\"getStorage\",\"url\":\"classes/lib_BrowserAdapter.default.html#getStorage\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"lib/BrowserAdapter.default\"},{\"id\":155,\"kind\":2048,\"name\":\"base64urlencode\",\"url\":\"classes/lib_BrowserAdapter.default.html#base64urlencode\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"lib/BrowserAdapter.default\"},{\"id\":156,\"kind\":2048,\"name\":\"base64urldecode\",\"url\":\"classes/lib_BrowserAdapter.default.html#base64urldecode\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"lib/BrowserAdapter.default\"},{\"id\":157,\"kind\":2048,\"name\":\"getSmartApi\",\"url\":\"classes/lib_BrowserAdapter.default.html#getSmartApi\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"lib/BrowserAdapter.default\"},{\"id\":158,\"kind\":2,\"name\":\"lib/BrowserStorage\",\"url\":\"modules/lib_BrowserStorage.html\",\"classes\":\"tsd-kind-module\"},{\"id\":159,\"kind\":128,\"name\":\"default\",\"url\":\"classes/lib_BrowserStorage.default.html\",\"classes\":\"tsd-kind-class tsd-parent-kind-module\",\"parent\":\"lib/BrowserStorage\"},{\"id\":160,\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/lib_BrowserStorage.default.html#constructor\",\"classes\":\"tsd-kind-constructor tsd-parent-kind-class\",\"parent\":\"lib/BrowserStorage.default\"},{\"id\":161,\"kind\":2048,\"name\":\"get\",\"url\":\"classes/lib_BrowserStorage.default.html#get\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"lib/BrowserStorage.default\"},{\"id\":162,\"kind\":2048,\"name\":\"set\",\"url\":\"classes/lib_BrowserStorage.default.html#set\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"lib/BrowserStorage.default\"},{\"id\":163,\"kind\":2048,\"name\":\"unset\",\"url\":\"classes/lib_BrowserStorage.default.html#unset\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"lib/BrowserStorage.default\"},{\"id\":164,\"kind\":2,\"name\":\"lib/Client\",\"url\":\"modules/lib_Client.html\",\"classes\":\"tsd-kind-module\"},{\"id\":165,\"kind\":128,\"name\":\"default\",\"url\":\"classes/lib_Client.default.html\",\"classes\":\"tsd-kind-class tsd-parent-kind-module\",\"parent\":\"lib/Client\"},{\"id\":166,\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/lib_Client.default.html#constructor\",\"classes\":\"tsd-kind-constructor tsd-parent-kind-class\",\"parent\":\"lib/Client.default\"},{\"id\":167,\"kind\":1024,\"name\":\"state\",\"url\":\"classes/lib_Client.default.html#state\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"lib/Client.default\"},{\"id\":168,\"kind\":1024,\"name\":\"storage\",\"url\":\"classes/lib_Client.default.html#storage\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"lib/Client.default\"},{\"id\":169,\"kind\":1024,\"name\":\"patient\",\"url\":\"classes/lib_Client.default.html#patient\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"lib/Client.default\"},{\"id\":170,\"kind\":65536,\"name\":\"__type\",\"url\":\"classes/lib_Client.default.html#__type-1\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-class\",\"parent\":\"lib/Client.default\"},{\"id\":171,\"kind\":1024,\"name\":\"id\",\"url\":\"classes/lib_Client.default.html#__type-1.id-1\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"lib/Client.default.__type\"},{\"id\":172,\"kind\":1024,\"name\":\"read\",\"url\":\"classes/lib_Client.default.html#__type-1.read-1\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"lib/Client.default.__type\"},{\"id\":173,\"kind\":2048,\"name\":\"request\",\"url\":\"classes/lib_Client.default.html#__type-1.request\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal tsd-has-type-parameter\",\"parent\":\"lib/Client.default.__type\"},{\"id\":174,\"kind\":1024,\"name\":\"encounter\",\"url\":\"classes/lib_Client.default.html#encounter\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"lib/Client.default\"},{\"id\":175,\"kind\":65536,\"name\":\"__type\",\"url\":\"classes/lib_Client.default.html#__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-class\",\"parent\":\"lib/Client.default\"},{\"id\":176,\"kind\":1024,\"name\":\"id\",\"url\":\"classes/lib_Client.default.html#__type.id\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"lib/Client.default.__type\"},{\"id\":177,\"kind\":1024,\"name\":\"read\",\"url\":\"classes/lib_Client.default.html#__type.read\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"lib/Client.default.__type\"},{\"id\":178,\"kind\":1024,\"name\":\"user\",\"url\":\"classes/lib_Client.default.html#user\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"lib/Client.default\"},{\"id\":179,\"kind\":65536,\"name\":\"__type\",\"url\":\"classes/lib_Client.default.html#__type-2\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-class\",\"parent\":\"lib/Client.default\"},{\"id\":180,\"kind\":1024,\"name\":\"id\",\"url\":\"classes/lib_Client.default.html#__type-2.id-2\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"lib/Client.default.__type\"},{\"id\":181,\"kind\":1024,\"name\":\"read\",\"url\":\"classes/lib_Client.default.html#__type-2.read-2\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"lib/Client.default.__type\"},{\"id\":182,\"kind\":1024,\"name\":\"fhirUser\",\"url\":\"classes/lib_Client.default.html#__type-2.fhirUser\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"lib/Client.default.__type\"},{\"id\":183,\"kind\":1024,\"name\":\"resourceType\",\"url\":\"classes/lib_Client.default.html#__type-2.resourceType\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"lib/Client.default.__type\"},{\"id\":184,\"kind\":1024,\"name\":\"_refreshTask\",\"url\":\"classes/lib_Client.default.html#_refreshTask\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-private\",\"parent\":\"lib/Client.default\"},{\"id\":185,\"kind\":2048,\"name\":\"getPatientId\",\"url\":\"classes/lib_Client.default.html#getPatientId\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"lib/Client.default\"},{\"id\":186,\"kind\":2048,\"name\":\"getEncounterId\",\"url\":\"classes/lib_Client.default.html#getEncounterId\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"lib/Client.default\"},{\"id\":187,\"kind\":2048,\"name\":\"getIdToken\",\"url\":\"classes/lib_Client.default.html#getIdToken\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"lib/Client.default\"},{\"id\":188,\"kind\":2048,\"name\":\"getFhirUser\",\"url\":\"classes/lib_Client.default.html#getFhirUser\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"lib/Client.default\"},{\"id\":189,\"kind\":2048,\"name\":\"getUserId\",\"url\":\"classes/lib_Client.default.html#getUserId\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"lib/Client.default\"},{\"id\":190,\"kind\":2048,\"name\":\"getUserType\",\"url\":\"classes/lib_Client.default.html#getUserType\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"lib/Client.default\"},{\"id\":191,\"kind\":2048,\"name\":\"getAuthorizationHeader\",\"url\":\"classes/lib_Client.default.html#getAuthorizationHeader\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"lib/Client.default\"},{\"id\":192,\"kind\":2048,\"name\":\"_clearState\",\"url\":\"classes/lib_Client.default.html#_clearState\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-private\",\"parent\":\"lib/Client.default\"},{\"id\":193,\"kind\":2048,\"name\":\"create\",\"url\":\"classes/lib_Client.default.html#create\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-has-type-parameter\",\"parent\":\"lib/Client.default\"},{\"id\":194,\"kind\":2048,\"name\":\"update\",\"url\":\"classes/lib_Client.default.html#update\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-has-type-parameter\",\"parent\":\"lib/Client.default\"},{\"id\":195,\"kind\":2048,\"name\":\"delete\",\"url\":\"classes/lib_Client.default.html#delete\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-has-type-parameter\",\"parent\":\"lib/Client.default\"},{\"id\":196,\"kind\":2048,\"name\":\"patch\",\"url\":\"classes/lib_Client.default.html#patch\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-has-type-parameter\",\"parent\":\"lib/Client.default\"},{\"id\":197,\"kind\":2048,\"name\":\"request\",\"url\":\"classes/lib_Client.default.html#request-1\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-has-type-parameter\",\"parent\":\"lib/Client.default\"},{\"id\":198,\"kind\":2048,\"name\":\"refreshIfNeeded\",\"url\":\"classes/lib_Client.default.html#refreshIfNeeded\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"lib/Client.default\"},{\"id\":199,\"kind\":2048,\"name\":\"refresh\",\"url\":\"classes/lib_Client.default.html#refresh\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"lib/Client.default\"},{\"id\":200,\"kind\":2048,\"name\":\"getPath\",\"url\":\"classes/lib_Client.default.html#getPath\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"lib/Client.default\"},{\"id\":201,\"kind\":2048,\"name\":\"getState\",\"url\":\"classes/lib_Client.default.html#getState\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"lib/Client.default\"},{\"id\":202,\"kind\":2048,\"name\":\"getFhirVersion\",\"url\":\"classes/lib_Client.default.html#getFhirVersion\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"lib/Client.default\"},{\"id\":203,\"kind\":2048,\"name\":\"getFhirRelease\",\"url\":\"classes/lib_Client.default.html#getFhirRelease\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"lib/Client.default\"},{\"id\":204,\"kind\":2,\"name\":\"lib/NodeAdapter\",\"url\":\"modules/lib_NodeAdapter.html\",\"classes\":\"tsd-kind-module\"},{\"id\":205,\"kind\":128,\"name\":\"default\",\"url\":\"classes/lib_NodeAdapter.default.html\",\"classes\":\"tsd-kind-class tsd-parent-kind-module\",\"parent\":\"lib/NodeAdapter\"},{\"id\":206,\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/lib_NodeAdapter.default.html#constructor\",\"classes\":\"tsd-kind-constructor tsd-parent-kind-class\",\"parent\":\"lib/NodeAdapter.default\"},{\"id\":207,\"kind\":1024,\"name\":\"_storage\",\"url\":\"classes/lib_NodeAdapter.default.html#_storage\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-protected\",\"parent\":\"lib/NodeAdapter.default\"},{\"id\":208,\"kind\":1024,\"name\":\"options\",\"url\":\"classes/lib_NodeAdapter.default.html#options\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"lib/NodeAdapter.default\"},{\"id\":209,\"kind\":1024,\"name\":\"security\",\"url\":\"classes/lib_NodeAdapter.default.html#security\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"lib/NodeAdapter.default\"},{\"id\":210,\"kind\":65536,\"name\":\"__type\",\"url\":\"classes/lib_NodeAdapter.default.html#__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-class\",\"parent\":\"lib/NodeAdapter.default\"},{\"id\":211,\"kind\":1024,\"name\":\"randomBytes\",\"url\":\"classes/lib_NodeAdapter.default.html#__type.randomBytes\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"lib/NodeAdapter.default.__type\"},{\"id\":212,\"kind\":65536,\"name\":\"__type\",\"url\":\"classes/lib_NodeAdapter.default.html#__type.__type-4\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-literal\",\"parent\":\"lib/NodeAdapter.default.__type\"},{\"id\":213,\"kind\":1024,\"name\":\"digestSha256\",\"url\":\"classes/lib_NodeAdapter.default.html#__type.digestSha256\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"lib/NodeAdapter.default.__type\"},{\"id\":214,\"kind\":65536,\"name\":\"__type\",\"url\":\"classes/lib_NodeAdapter.default.html#__type.__type-1\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-literal\",\"parent\":\"lib/NodeAdapter.default.__type\"},{\"id\":215,\"kind\":1024,\"name\":\"generatePKCEChallenge\",\"url\":\"classes/lib_NodeAdapter.default.html#__type.generatePKCEChallenge\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"lib/NodeAdapter.default.__type\"},{\"id\":216,\"kind\":65536,\"name\":\"__type\",\"url\":\"classes/lib_NodeAdapter.default.html#__type.__type-2\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-literal\",\"parent\":\"lib/NodeAdapter.default.__type\"},{\"id\":217,\"kind\":1024,\"name\":\"importJWK\",\"url\":\"classes/lib_NodeAdapter.default.html#__type.importJWK\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"lib/NodeAdapter.default.__type\"},{\"id\":218,\"kind\":65536,\"name\":\"__type\",\"url\":\"classes/lib_NodeAdapter.default.html#__type.__type-3\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-literal\",\"parent\":\"lib/NodeAdapter.default.__type\"},{\"id\":219,\"kind\":1024,\"name\":\"signCompactJws\",\"url\":\"classes/lib_NodeAdapter.default.html#__type.signCompactJws\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"lib/NodeAdapter.default.__type\"},{\"id\":220,\"kind\":65536,\"name\":\"__type\",\"url\":\"classes/lib_NodeAdapter.default.html#__type.__type-5\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-literal\",\"parent\":\"lib/NodeAdapter.default.__type\"},{\"id\":221,\"kind\":2048,\"name\":\"relative\",\"url\":\"classes/lib_NodeAdapter.default.html#relative\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"lib/NodeAdapter.default\"},{\"id\":222,\"kind\":2048,\"name\":\"getProtocol\",\"url\":\"classes/lib_NodeAdapter.default.html#getProtocol\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"lib/NodeAdapter.default\"},{\"id\":223,\"kind\":2048,\"name\":\"getUrl\",\"url\":\"classes/lib_NodeAdapter.default.html#getUrl\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"lib/NodeAdapter.default\"},{\"id\":224,\"kind\":2048,\"name\":\"redirect\",\"url\":\"classes/lib_NodeAdapter.default.html#redirect\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"lib/NodeAdapter.default\"},{\"id\":225,\"kind\":2048,\"name\":\"getStorage\",\"url\":\"classes/lib_NodeAdapter.default.html#getStorage\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"lib/NodeAdapter.default\"},{\"id\":226,\"kind\":2048,\"name\":\"base64urlencode\",\"url\":\"classes/lib_NodeAdapter.default.html#base64urlencode\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"lib/NodeAdapter.default\"},{\"id\":227,\"kind\":2048,\"name\":\"base64urldecode\",\"url\":\"classes/lib_NodeAdapter.default.html#base64urldecode\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"lib/NodeAdapter.default\"},{\"id\":228,\"kind\":2048,\"name\":\"getSmartApi\",\"url\":\"classes/lib_NodeAdapter.default.html#getSmartApi\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"lib/NodeAdapter.default\"},{\"id\":229,\"kind\":2,\"name\":\"lib/ServerStorage\",\"url\":\"modules/lib_ServerStorage.html\",\"classes\":\"tsd-kind-module\"},{\"id\":230,\"kind\":128,\"name\":\"default\",\"url\":\"classes/lib_ServerStorage.default.html\",\"classes\":\"tsd-kind-class tsd-parent-kind-module\",\"parent\":\"lib/ServerStorage\"},{\"id\":231,\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/lib_ServerStorage.default.html#constructor\",\"classes\":\"tsd-kind-constructor tsd-parent-kind-class\",\"parent\":\"lib/ServerStorage.default\"},{\"id\":232,\"kind\":1024,\"name\":\"request\",\"url\":\"classes/lib_ServerStorage.default.html#request\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"lib/ServerStorage.default\"},{\"id\":233,\"kind\":2048,\"name\":\"get\",\"url\":\"classes/lib_ServerStorage.default.html#get\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"lib/ServerStorage.default\"},{\"id\":234,\"kind\":2048,\"name\":\"set\",\"url\":\"classes/lib_ServerStorage.default.html#set\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"lib/ServerStorage.default\"},{\"id\":235,\"kind\":2048,\"name\":\"unset\",\"url\":\"classes/lib_ServerStorage.default.html#unset\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"lib/ServerStorage.default\"},{\"id\":236,\"kind\":2,\"name\":\"lib/browser\",\"url\":\"modules/lib_browser.html\",\"classes\":\"tsd-kind-module\"},{\"id\":237,\"kind\":64,\"name\":\"randomBytes\",\"url\":\"modules/lib_browser.html#randomBytes\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"lib/browser\"},{\"id\":238,\"kind\":64,\"name\":\"digestSha256\",\"url\":\"modules/lib_browser.html#digestSha256\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"lib/browser\"},{\"id\":239,\"kind\":64,\"name\":\"importJWK\",\"url\":\"modules/lib_browser.html#importJWK\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"lib/browser\"},{\"id\":240,\"kind\":64,\"name\":\"signCompactJws\",\"url\":\"modules/lib_browser.html#signCompactJws\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"lib/browser\"},{\"id\":241,\"kind\":64,\"name\":\"base64urlencode\",\"url\":\"modules/lib_browser.html#base64urlencode\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"lib/browser\"},{\"id\":242,\"kind\":64,\"name\":\"base64urldecode\",\"url\":\"modules/lib_browser.html#base64urldecode\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"lib/browser\"},{\"id\":243,\"kind\":64,\"name\":\"uint8ArrayToBinaryString\",\"url\":\"modules/lib_browser.html#uint8ArrayToBinaryString\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"lib/browser\"},{\"id\":244,\"kind\":64,\"name\":\"getTargetWindow\",\"url\":\"modules/lib_browser.html#getTargetWindow\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"lib/browser\"},{\"id\":245,\"kind\":64,\"name\":\"isInFrame\",\"url\":\"modules/lib_browser.html#isInFrame\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"lib/browser\"},{\"id\":246,\"kind\":64,\"name\":\"isInPopUp\",\"url\":\"modules/lib_browser.html#isInPopUp\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"lib/browser\"},{\"id\":247,\"kind\":64,\"name\":\"relative\",\"url\":\"modules/lib_browser.html#relative\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"lib/browser\"},{\"id\":248,\"kind\":64,\"name\":\"redirect\",\"url\":\"modules/lib_browser.html#redirect\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"lib/browser\"},{\"id\":249,\"kind\":64,\"name\":\"onMessage\",\"url\":\"modules/lib_browser.html#onMessage\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"lib/browser\"},{\"id\":250,\"kind\":64,\"name\":\"generatePKCEChallenge\",\"url\":\"modules/lib_browser.html#generatePKCEChallenge\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"lib/browser\"},{\"id\":251,\"kind\":2,\"name\":\"lib/browser_entry\",\"url\":\"modules/lib_browser_entry.html\",\"classes\":\"tsd-kind-module\"},{\"id\":252,\"kind\":64,\"name\":\"default\",\"url\":\"modules/lib_browser_entry.html#default-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"lib/browser_entry\"},{\"id\":253,\"kind\":4,\"name\":\"default\",\"url\":\"modules/lib_browser_entry.default.html\",\"classes\":\"tsd-kind-namespace tsd-parent-kind-module\",\"parent\":\"lib/browser_entry\"},{\"id\":254,\"kind\":32,\"name\":\"authorize\",\"url\":\"modules/lib_browser_entry.default.html#authorize\",\"classes\":\"tsd-kind-variable tsd-parent-kind-namespace\",\"parent\":\"lib/browser_entry.default\"},{\"id\":255,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/lib_browser_entry.default.html#__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-namespace\",\"parent\":\"lib/browser_entry.default\"},{\"id\":256,\"kind\":32,\"name\":\"ready\",\"url\":\"modules/lib_browser_entry.default.html#ready\",\"classes\":\"tsd-kind-variable tsd-parent-kind-namespace\",\"parent\":\"lib/browser_entry.default\"},{\"id\":257,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/lib_browser_entry.default.html#__type-3\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-namespace\",\"parent\":\"lib/browser_entry.default\"},{\"id\":258,\"kind\":32,\"name\":\"init\",\"url\":\"modules/lib_browser_entry.default.html#init\",\"classes\":\"tsd-kind-variable tsd-parent-kind-namespace\",\"parent\":\"lib/browser_entry.default\"},{\"id\":259,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/lib_browser_entry.default.html#__type-2\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-namespace\",\"parent\":\"lib/browser_entry.default\"},{\"id\":260,\"kind\":32,\"name\":\"client\",\"url\":\"modules/lib_browser_entry.default.html#client\",\"classes\":\"tsd-kind-variable tsd-parent-kind-namespace\",\"parent\":\"lib/browser_entry.default\"},{\"id\":261,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/lib_browser_entry.default.html#__type-1\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-namespace\",\"parent\":\"lib/browser_entry.default\"},{\"id\":262,\"kind\":32,\"name\":\"utils\",\"url\":\"modules/lib_browser_entry.default.html#utils\",\"classes\":\"tsd-kind-variable tsd-parent-kind-namespace\",\"parent\":\"lib/browser_entry.default\"},{\"id\":263,\"kind\":2,\"name\":\"lib\",\"url\":\"modules/lib.html\",\"classes\":\"tsd-kind-module\"},{\"id\":264,\"kind\":4,\"name\":\"fhirclient\",\"url\":\"modules/lib.fhirclient.html\",\"classes\":\"tsd-kind-namespace tsd-parent-kind-module\",\"parent\":\"lib\"},{\"id\":265,\"kind\":64,\"name\":\"WindowTargetFunction\",\"url\":\"modules/lib.fhirclient.html#WindowTargetFunction\",\"classes\":\"tsd-kind-function tsd-parent-kind-namespace\",\"parent\":\"lib.fhirclient\"},{\"id\":266,\"kind\":256,\"name\":\"JsonObject\",\"url\":\"interfaces/lib.fhirclient.JsonObject.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"lib.fhirclient\"},{\"id\":267,\"kind\":4194304,\"name\":\"JsonPrimitive\",\"url\":\"modules/lib.fhirclient.html#JsonPrimitive\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-namespace\",\"parent\":\"lib.fhirclient\"},{\"id\":268,\"kind\":4194304,\"name\":\"JsonValue\",\"url\":\"modules/lib.fhirclient.html#JsonValue\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-namespace\",\"parent\":\"lib.fhirclient\"},{\"id\":269,\"kind\":4194304,\"name\":\"JsonArray\",\"url\":\"modules/lib.fhirclient.html#JsonArray\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-namespace\",\"parent\":\"lib.fhirclient\"},{\"id\":270,\"kind\":256,\"name\":\"JsonPatchAdd\",\"url\":\"interfaces/lib.fhirclient.JsonPatchAdd.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"lib.fhirclient\"},{\"id\":271,\"kind\":1024,\"name\":\"op\",\"url\":\"interfaces/lib.fhirclient.JsonPatchAdd.html#op\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.JsonPatchAdd\"},{\"id\":272,\"kind\":1024,\"name\":\"path\",\"url\":\"interfaces/lib.fhirclient.JsonPatchAdd.html#path\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.JsonPatchAdd\"},{\"id\":273,\"kind\":1024,\"name\":\"value\",\"url\":\"interfaces/lib.fhirclient.JsonPatchAdd.html#value\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.JsonPatchAdd\"},{\"id\":274,\"kind\":256,\"name\":\"JsonPatchReplace\",\"url\":\"interfaces/lib.fhirclient.JsonPatchReplace.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"lib.fhirclient\"},{\"id\":275,\"kind\":1024,\"name\":\"op\",\"url\":\"interfaces/lib.fhirclient.JsonPatchReplace.html#op\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.JsonPatchReplace\"},{\"id\":276,\"kind\":1024,\"name\":\"path\",\"url\":\"interfaces/lib.fhirclient.JsonPatchReplace.html#path\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.JsonPatchReplace\"},{\"id\":277,\"kind\":1024,\"name\":\"value\",\"url\":\"interfaces/lib.fhirclient.JsonPatchReplace.html#value\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.JsonPatchReplace\"},{\"id\":278,\"kind\":256,\"name\":\"JsonPatchTest\",\"url\":\"interfaces/lib.fhirclient.JsonPatchTest.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"lib.fhirclient\"},{\"id\":279,\"kind\":1024,\"name\":\"op\",\"url\":\"interfaces/lib.fhirclient.JsonPatchTest.html#op\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.JsonPatchTest\"},{\"id\":280,\"kind\":1024,\"name\":\"path\",\"url\":\"interfaces/lib.fhirclient.JsonPatchTest.html#path\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.JsonPatchTest\"},{\"id\":281,\"kind\":1024,\"name\":\"value\",\"url\":\"interfaces/lib.fhirclient.JsonPatchTest.html#value\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.JsonPatchTest\"},{\"id\":282,\"kind\":256,\"name\":\"JsonPatchMove\",\"url\":\"interfaces/lib.fhirclient.JsonPatchMove.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"lib.fhirclient\"},{\"id\":283,\"kind\":1024,\"name\":\"op\",\"url\":\"interfaces/lib.fhirclient.JsonPatchMove.html#op\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.JsonPatchMove\"},{\"id\":284,\"kind\":1024,\"name\":\"path\",\"url\":\"interfaces/lib.fhirclient.JsonPatchMove.html#path\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.JsonPatchMove\"},{\"id\":285,\"kind\":1024,\"name\":\"from\",\"url\":\"interfaces/lib.fhirclient.JsonPatchMove.html#from\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.JsonPatchMove\"},{\"id\":286,\"kind\":256,\"name\":\"JsonPatchCopy\",\"url\":\"interfaces/lib.fhirclient.JsonPatchCopy.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"lib.fhirclient\"},{\"id\":287,\"kind\":1024,\"name\":\"op\",\"url\":\"interfaces/lib.fhirclient.JsonPatchCopy.html#op\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.JsonPatchCopy\"},{\"id\":288,\"kind\":1024,\"name\":\"path\",\"url\":\"interfaces/lib.fhirclient.JsonPatchCopy.html#path\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.JsonPatchCopy\"},{\"id\":289,\"kind\":1024,\"name\":\"from\",\"url\":\"interfaces/lib.fhirclient.JsonPatchCopy.html#from\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.JsonPatchCopy\"},{\"id\":290,\"kind\":256,\"name\":\"JsonPatchRemove\",\"url\":\"interfaces/lib.fhirclient.JsonPatchRemove.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"lib.fhirclient\"},{\"id\":291,\"kind\":1024,\"name\":\"op\",\"url\":\"interfaces/lib.fhirclient.JsonPatchRemove.html#op\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.JsonPatchRemove\"},{\"id\":292,\"kind\":1024,\"name\":\"path\",\"url\":\"interfaces/lib.fhirclient.JsonPatchRemove.html#path\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.JsonPatchRemove\"},{\"id\":293,\"kind\":4194304,\"name\":\"JsonPatchOperation\",\"url\":\"modules/lib.fhirclient.html#JsonPatchOperation\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-namespace\",\"parent\":\"lib.fhirclient\"},{\"id\":294,\"kind\":4194304,\"name\":\"JsonPatch\",\"url\":\"modules/lib.fhirclient.html#JsonPatch\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-namespace\",\"parent\":\"lib.fhirclient\"},{\"id\":295,\"kind\":256,\"name\":\"ES384JWK\",\"url\":\"interfaces/lib.fhirclient.ES384JWK.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"lib.fhirclient\"},{\"id\":296,\"kind\":1024,\"name\":\"alg\",\"url\":\"interfaces/lib.fhirclient.ES384JWK.html#alg\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-overwrite\",\"parent\":\"lib.fhirclient.ES384JWK\"},{\"id\":297,\"kind\":1024,\"name\":\"kty\",\"url\":\"interfaces/lib.fhirclient.ES384JWK.html#kty\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-overwrite\",\"parent\":\"lib.fhirclient.ES384JWK\"},{\"id\":298,\"kind\":1024,\"name\":\"crv\",\"url\":\"interfaces/lib.fhirclient.ES384JWK.html#crv\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-overwrite\",\"parent\":\"lib.fhirclient.ES384JWK\"},{\"id\":299,\"kind\":1024,\"name\":\"kid\",\"url\":\"interfaces/lib.fhirclient.ES384JWK.html#kid\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.ES384JWK\"},{\"id\":300,\"kind\":1024,\"name\":\"key_ops\",\"url\":\"interfaces/lib.fhirclient.ES384JWK.html#key_ops\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-overwrite\",\"parent\":\"lib.fhirclient.ES384JWK\"},{\"id\":301,\"kind\":256,\"name\":\"RS384JWK\",\"url\":\"interfaces/lib.fhirclient.RS384JWK.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"lib.fhirclient\"},{\"id\":302,\"kind\":1024,\"name\":\"alg\",\"url\":\"interfaces/lib.fhirclient.RS384JWK.html#alg\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-overwrite\",\"parent\":\"lib.fhirclient.RS384JWK\"},{\"id\":303,\"kind\":1024,\"name\":\"kty\",\"url\":\"interfaces/lib.fhirclient.RS384JWK.html#kty\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-overwrite\",\"parent\":\"lib.fhirclient.RS384JWK\"},{\"id\":304,\"kind\":1024,\"name\":\"kid\",\"url\":\"interfaces/lib.fhirclient.RS384JWK.html#kid\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.RS384JWK\"},{\"id\":305,\"kind\":1024,\"name\":\"key_ops\",\"url\":\"interfaces/lib.fhirclient.RS384JWK.html#key_ops\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-overwrite\",\"parent\":\"lib.fhirclient.RS384JWK\"},{\"id\":306,\"kind\":4194304,\"name\":\"JWK\",\"url\":\"modules/lib.fhirclient.html#JWK\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-namespace\",\"parent\":\"lib.fhirclient\"},{\"id\":307,\"kind\":4194304,\"name\":\"WindowTargetVariable\",\"url\":\"modules/lib.fhirclient.html#WindowTargetVariable\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-namespace\",\"parent\":\"lib.fhirclient\"},{\"id\":308,\"kind\":4194304,\"name\":\"WindowTarget\",\"url\":\"modules/lib.fhirclient.html#WindowTarget\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-namespace\",\"parent\":\"lib.fhirclient\"},{\"id\":309,\"kind\":4194304,\"name\":\"PkceMode\",\"url\":\"modules/lib.fhirclient.html#PkceMode\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-namespace\",\"parent\":\"lib.fhirclient\"},{\"id\":310,\"kind\":4194304,\"name\":\"storageFactory\",\"url\":\"modules/lib.fhirclient.html#storageFactory\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-namespace\",\"parent\":\"lib.fhirclient\"},{\"id\":311,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/lib.fhirclient.html#storageFactory.__type-1\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-alias\",\"parent\":\"lib.fhirclient.storageFactory\"},{\"id\":312,\"kind\":256,\"name\":\"ReadyOptions\",\"url\":\"interfaces/lib.fhirclient.ReadyOptions.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"lib.fhirclient\"},{\"id\":313,\"kind\":1024,\"name\":\"privateKey\",\"url\":\"interfaces/lib.fhirclient.ReadyOptions.html#privateKey\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.ReadyOptions\"},{\"id\":314,\"kind\":1024,\"name\":\"clientPublicKeySetUrl\",\"url\":\"interfaces/lib.fhirclient.ReadyOptions.html#clientPublicKeySetUrl\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.ReadyOptions\"},{\"id\":315,\"kind\":256,\"name\":\"FhirOptions\",\"url\":\"interfaces/lib.fhirclient.FhirOptions.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"lib.fhirclient\"},{\"id\":316,\"kind\":1024,\"name\":\"pageLimit\",\"url\":\"interfaces/lib.fhirclient.FhirOptions.html#pageLimit\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.FhirOptions\"},{\"id\":317,\"kind\":2048,\"name\":\"onPage\",\"url\":\"interfaces/lib.fhirclient.FhirOptions.html#onPage\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.FhirOptions\"},{\"id\":318,\"kind\":1024,\"name\":\"flat\",\"url\":\"interfaces/lib.fhirclient.FhirOptions.html#flat\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.FhirOptions\"},{\"id\":319,\"kind\":1024,\"name\":\"graph\",\"url\":\"interfaces/lib.fhirclient.FhirOptions.html#graph\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.FhirOptions\"},{\"id\":320,\"kind\":1024,\"name\":\"resolveReferences\",\"url\":\"interfaces/lib.fhirclient.FhirOptions.html#resolveReferences\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.FhirOptions\"},{\"id\":321,\"kind\":1024,\"name\":\"useRefreshToken\",\"url\":\"interfaces/lib.fhirclient.FhirOptions.html#useRefreshToken\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.FhirOptions\"},{\"id\":322,\"kind\":256,\"name\":\"AuthorizeParams\",\"url\":\"interfaces/lib.fhirclient.AuthorizeParams.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"lib.fhirclient\"},{\"id\":323,\"kind\":1024,\"name\":\"iss\",\"url\":\"interfaces/lib.fhirclient.AuthorizeParams.html#iss\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.AuthorizeParams\"},{\"id\":324,\"kind\":1024,\"name\":\"issMatch\",\"url\":\"interfaces/lib.fhirclient.AuthorizeParams.html#issMatch\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.AuthorizeParams\"},{\"id\":325,\"kind\":1024,\"name\":\"launch\",\"url\":\"interfaces/lib.fhirclient.AuthorizeParams.html#launch\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.AuthorizeParams\"},{\"id\":326,\"kind\":1024,\"name\":\"fhirServiceUrl\",\"url\":\"interfaces/lib.fhirclient.AuthorizeParams.html#fhirServiceUrl\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.AuthorizeParams\"},{\"id\":327,\"kind\":1024,\"name\":\"redirectUri\",\"url\":\"interfaces/lib.fhirclient.AuthorizeParams.html#redirectUri\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.AuthorizeParams\"},{\"id\":328,\"kind\":1024,\"name\":\"noRedirect\",\"url\":\"interfaces/lib.fhirclient.AuthorizeParams.html#noRedirect\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.AuthorizeParams\"},{\"id\":329,\"kind\":1024,\"name\":\"clientId\",\"url\":\"interfaces/lib.fhirclient.AuthorizeParams.html#clientId\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.AuthorizeParams\"},{\"id\":330,\"kind\":1024,\"name\":\"scope\",\"url\":\"interfaces/lib.fhirclient.AuthorizeParams.html#scope\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.AuthorizeParams\"},{\"id\":331,\"kind\":1024,\"name\":\"patientId\",\"url\":\"interfaces/lib.fhirclient.AuthorizeParams.html#patientId\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.AuthorizeParams\"},{\"id\":332,\"kind\":1024,\"name\":\"encounterId\",\"url\":\"interfaces/lib.fhirclient.AuthorizeParams.html#encounterId\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.AuthorizeParams\"},{\"id\":333,\"kind\":1024,\"name\":\"clientSecret\",\"url\":\"interfaces/lib.fhirclient.AuthorizeParams.html#clientSecret\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.AuthorizeParams\"},{\"id\":334,\"kind\":1024,\"name\":\"clientPublicKeySetUrl\",\"url\":\"interfaces/lib.fhirclient.AuthorizeParams.html#clientPublicKeySetUrl\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.AuthorizeParams\"},{\"id\":335,\"kind\":1024,\"name\":\"clientPrivateJwk\",\"url\":\"interfaces/lib.fhirclient.AuthorizeParams.html#clientPrivateJwk\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.AuthorizeParams\"},{\"id\":336,\"kind\":1024,\"name\":\"fakeTokenResponse\",\"url\":\"interfaces/lib.fhirclient.AuthorizeParams.html#fakeTokenResponse\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.AuthorizeParams\"},{\"id\":337,\"kind\":1024,\"name\":\"target\",\"url\":\"interfaces/lib.fhirclient.AuthorizeParams.html#target\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.AuthorizeParams\"},{\"id\":338,\"kind\":1024,\"name\":\"width\",\"url\":\"interfaces/lib.fhirclient.AuthorizeParams.html#width\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.AuthorizeParams\"},{\"id\":339,\"kind\":1024,\"name\":\"height\",\"url\":\"interfaces/lib.fhirclient.AuthorizeParams.html#height\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.AuthorizeParams\"},{\"id\":340,\"kind\":1024,\"name\":\"completeInTarget\",\"url\":\"interfaces/lib.fhirclient.AuthorizeParams.html#completeInTarget\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.AuthorizeParams\"},{\"id\":341,\"kind\":1024,\"name\":\"pkceMode\",\"url\":\"interfaces/lib.fhirclient.AuthorizeParams.html#pkceMode\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.AuthorizeParams\"},{\"id\":342,\"kind\":1024,\"name\":\"refreshTokenWithCredentials\",\"url\":\"interfaces/lib.fhirclient.AuthorizeParams.html#refreshTokenWithCredentials\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.AuthorizeParams\"},{\"id\":343,\"kind\":256,\"name\":\"SMART_API\",\"url\":\"interfaces/lib.fhirclient.SMART_API.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"lib.fhirclient\"},{\"id\":344,\"kind\":1024,\"name\":\"options\",\"url\":\"interfaces/lib.fhirclient.SMART_API.html#options\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.SMART_API\"},{\"id\":345,\"kind\":2048,\"name\":\"ready\",\"url\":\"interfaces/lib.fhirclient.SMART_API.html#ready\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.SMART_API\"},{\"id\":346,\"kind\":2048,\"name\":\"authorize\",\"url\":\"interfaces/lib.fhirclient.SMART_API.html#authorize\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.SMART_API\"},{\"id\":347,\"kind\":2048,\"name\":\"init\",\"url\":\"interfaces/lib.fhirclient.SMART_API.html#init\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.SMART_API\"},{\"id\":348,\"kind\":2048,\"name\":\"client\",\"url\":\"interfaces/lib.fhirclient.SMART_API.html#client\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.SMART_API\"},{\"id\":349,\"kind\":256,\"name\":\"ClientState\",\"url\":\"interfaces/lib.fhirclient.ClientState.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"lib.fhirclient\"},{\"id\":350,\"kind\":1024,\"name\":\"serverUrl\",\"url\":\"interfaces/lib.fhirclient.ClientState.html#serverUrl\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.ClientState\"},{\"id\":351,\"kind\":1024,\"name\":\"clientId\",\"url\":\"interfaces/lib.fhirclient.ClientState.html#clientId\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.ClientState\"},{\"id\":352,\"kind\":1024,\"name\":\"redirectUri\",\"url\":\"interfaces/lib.fhirclient.ClientState.html#redirectUri\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.ClientState\"},{\"id\":353,\"kind\":1024,\"name\":\"scope\",\"url\":\"interfaces/lib.fhirclient.ClientState.html#scope\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.ClientState\"},{\"id\":354,\"kind\":1024,\"name\":\"clientPublicKeySetUrl\",\"url\":\"interfaces/lib.fhirclient.ClientState.html#clientPublicKeySetUrl\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.ClientState\"},{\"id\":355,\"kind\":1024,\"name\":\"clientPrivateJwk\",\"url\":\"interfaces/lib.fhirclient.ClientState.html#clientPrivateJwk\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.ClientState\"},{\"id\":356,\"kind\":1024,\"name\":\"clientSecret\",\"url\":\"interfaces/lib.fhirclient.ClientState.html#clientSecret\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.ClientState\"},{\"id\":357,\"kind\":1024,\"name\":\"tokenResponse\",\"url\":\"interfaces/lib.fhirclient.ClientState.html#tokenResponse\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.ClientState\"},{\"id\":358,\"kind\":1024,\"name\":\"username\",\"url\":\"interfaces/lib.fhirclient.ClientState.html#username\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.ClientState\"},{\"id\":359,\"kind\":1024,\"name\":\"password\",\"url\":\"interfaces/lib.fhirclient.ClientState.html#password\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.ClientState\"},{\"id\":360,\"kind\":1024,\"name\":\"registrationUri\",\"url\":\"interfaces/lib.fhirclient.ClientState.html#registrationUri\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.ClientState\"},{\"id\":361,\"kind\":1024,\"name\":\"authorizeUri\",\"url\":\"interfaces/lib.fhirclient.ClientState.html#authorizeUri\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.ClientState\"},{\"id\":362,\"kind\":1024,\"name\":\"tokenUri\",\"url\":\"interfaces/lib.fhirclient.ClientState.html#tokenUri\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.ClientState\"},{\"id\":363,\"kind\":1024,\"name\":\"key\",\"url\":\"interfaces/lib.fhirclient.ClientState.html#key\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.ClientState\"},{\"id\":364,\"kind\":1024,\"name\":\"completeInTarget\",\"url\":\"interfaces/lib.fhirclient.ClientState.html#completeInTarget\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.ClientState\"},{\"id\":365,\"kind\":1024,\"name\":\"expiresAt\",\"url\":\"interfaces/lib.fhirclient.ClientState.html#expiresAt\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.ClientState\"},{\"id\":366,\"kind\":1024,\"name\":\"codeChallenge\",\"url\":\"interfaces/lib.fhirclient.ClientState.html#codeChallenge\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.ClientState\"},{\"id\":367,\"kind\":1024,\"name\":\"codeVerifier\",\"url\":\"interfaces/lib.fhirclient.ClientState.html#codeVerifier\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.ClientState\"},{\"id\":368,\"kind\":1024,\"name\":\"refreshTokenWithCredentials\",\"url\":\"interfaces/lib.fhirclient.ClientState.html#refreshTokenWithCredentials\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.ClientState\"},{\"id\":369,\"kind\":256,\"name\":\"TokenResponse\",\"url\":\"interfaces/lib.fhirclient.TokenResponse.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"lib.fhirclient\"},{\"id\":370,\"kind\":1024,\"name\":\"need_patient_banner\",\"url\":\"interfaces/lib.fhirclient.TokenResponse.html#need_patient_banner\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.TokenResponse\"},{\"id\":371,\"kind\":1024,\"name\":\"smart_style_url\",\"url\":\"interfaces/lib.fhirclient.TokenResponse.html#smart_style_url\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.TokenResponse\"},{\"id\":372,\"kind\":1024,\"name\":\"patient\",\"url\":\"interfaces/lib.fhirclient.TokenResponse.html#patient\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.TokenResponse\"},{\"id\":373,\"kind\":1024,\"name\":\"encounter\",\"url\":\"interfaces/lib.fhirclient.TokenResponse.html#encounter\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.TokenResponse\"},{\"id\":374,\"kind\":1024,\"name\":\"client_id\",\"url\":\"interfaces/lib.fhirclient.TokenResponse.html#client_id\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.TokenResponse\"},{\"id\":375,\"kind\":1024,\"name\":\"token_type\",\"url\":\"interfaces/lib.fhirclient.TokenResponse.html#token_type\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.TokenResponse\"},{\"id\":376,\"kind\":1024,\"name\":\"scope\",\"url\":\"interfaces/lib.fhirclient.TokenResponse.html#scope\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.TokenResponse\"},{\"id\":377,\"kind\":1024,\"name\":\"expires_in\",\"url\":\"interfaces/lib.fhirclient.TokenResponse.html#expires_in\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.TokenResponse\"},{\"id\":378,\"kind\":1024,\"name\":\"access_token\",\"url\":\"interfaces/lib.fhirclient.TokenResponse.html#access_token\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.TokenResponse\"},{\"id\":379,\"kind\":1024,\"name\":\"id_token\",\"url\":\"interfaces/lib.fhirclient.TokenResponse.html#id_token\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.TokenResponse\"},{\"id\":380,\"kind\":1024,\"name\":\"refresh_token\",\"url\":\"interfaces/lib.fhirclient.TokenResponse.html#refresh_token\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.TokenResponse\"},{\"id\":381,\"kind\":256,\"name\":\"Storage\",\"url\":\"interfaces/lib.fhirclient.Storage.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"lib.fhirclient\"},{\"id\":382,\"kind\":2048,\"name\":\"set\",\"url\":\"interfaces/lib.fhirclient.Storage.html#set\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.Storage\"},{\"id\":383,\"kind\":2048,\"name\":\"get\",\"url\":\"interfaces/lib.fhirclient.Storage.html#get\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.Storage\"},{\"id\":384,\"kind\":2048,\"name\":\"unset\",\"url\":\"interfaces/lib.fhirclient.Storage.html#unset\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.Storage\"},{\"id\":385,\"kind\":256,\"name\":\"ClientInterface\",\"url\":\"interfaces/lib.fhirclient.ClientInterface.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"lib.fhirclient\"},{\"id\":386,\"kind\":1024,\"name\":\"state\",\"url\":\"interfaces/lib.fhirclient.ClientInterface.html#state\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.ClientInterface\"},{\"id\":387,\"kind\":1024,\"name\":\"storage\",\"url\":\"interfaces/lib.fhirclient.ClientInterface.html#storage\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.ClientInterface\"},{\"id\":388,\"kind\":1024,\"name\":\"patient\",\"url\":\"interfaces/lib.fhirclient.ClientInterface.html#patient\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.ClientInterface\"},{\"id\":389,\"kind\":65536,\"name\":\"__type\",\"url\":\"interfaces/lib.fhirclient.ClientInterface.html#__type-1\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.ClientInterface\"},{\"id\":390,\"kind\":1024,\"name\":\"id\",\"url\":\"interfaces/lib.fhirclient.ClientInterface.html#__type-1.id-1\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"lib.fhirclient.ClientInterface.__type\"},{\"id\":391,\"kind\":1024,\"name\":\"read\",\"url\":\"interfaces/lib.fhirclient.ClientInterface.html#__type-1.read-1\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"lib.fhirclient.ClientInterface.__type\"},{\"id\":392,\"kind\":2048,\"name\":\"request\",\"url\":\"interfaces/lib.fhirclient.ClientInterface.html#__type-1.request\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal tsd-has-type-parameter\",\"parent\":\"lib.fhirclient.ClientInterface.__type\"},{\"id\":393,\"kind\":1024,\"name\":\"encounter\",\"url\":\"interfaces/lib.fhirclient.ClientInterface.html#encounter\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.ClientInterface\"},{\"id\":394,\"kind\":65536,\"name\":\"__type\",\"url\":\"interfaces/lib.fhirclient.ClientInterface.html#__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.ClientInterface\"},{\"id\":395,\"kind\":1024,\"name\":\"id\",\"url\":\"interfaces/lib.fhirclient.ClientInterface.html#__type.id\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"lib.fhirclient.ClientInterface.__type\"},{\"id\":396,\"kind\":1024,\"name\":\"read\",\"url\":\"interfaces/lib.fhirclient.ClientInterface.html#__type.read\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"lib.fhirclient.ClientInterface.__type\"},{\"id\":397,\"kind\":1024,\"name\":\"user\",\"url\":\"interfaces/lib.fhirclient.ClientInterface.html#user\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.ClientInterface\"},{\"id\":398,\"kind\":65536,\"name\":\"__type\",\"url\":\"interfaces/lib.fhirclient.ClientInterface.html#__type-2\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.ClientInterface\"},{\"id\":399,\"kind\":1024,\"name\":\"id\",\"url\":\"interfaces/lib.fhirclient.ClientInterface.html#__type-2.id-2\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"lib.fhirclient.ClientInterface.__type\"},{\"id\":400,\"kind\":1024,\"name\":\"read\",\"url\":\"interfaces/lib.fhirclient.ClientInterface.html#__type-2.read-2\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"lib.fhirclient.ClientInterface.__type\"},{\"id\":401,\"kind\":1024,\"name\":\"fhirUser\",\"url\":\"interfaces/lib.fhirclient.ClientInterface.html#__type-2.fhirUser\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"lib.fhirclient.ClientInterface.__type\"},{\"id\":402,\"kind\":1024,\"name\":\"resourceType\",\"url\":\"interfaces/lib.fhirclient.ClientInterface.html#__type-2.resourceType\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"lib.fhirclient.ClientInterface.__type\"},{\"id\":403,\"kind\":2048,\"name\":\"getPatientId\",\"url\":\"interfaces/lib.fhirclient.ClientInterface.html#getPatientId\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.ClientInterface\"},{\"id\":404,\"kind\":2048,\"name\":\"getEncounterId\",\"url\":\"interfaces/lib.fhirclient.ClientInterface.html#getEncounterId\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.ClientInterface\"},{\"id\":405,\"kind\":2048,\"name\":\"getIdToken\",\"url\":\"interfaces/lib.fhirclient.ClientInterface.html#getIdToken\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.ClientInterface\"},{\"id\":406,\"kind\":2048,\"name\":\"getFhirUser\",\"url\":\"interfaces/lib.fhirclient.ClientInterface.html#getFhirUser\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.ClientInterface\"},{\"id\":407,\"kind\":2048,\"name\":\"getUserId\",\"url\":\"interfaces/lib.fhirclient.ClientInterface.html#getUserId\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.ClientInterface\"},{\"id\":408,\"kind\":2048,\"name\":\"getUserType\",\"url\":\"interfaces/lib.fhirclient.ClientInterface.html#getUserType\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.ClientInterface\"},{\"id\":409,\"kind\":2048,\"name\":\"getAuthorizationHeader\",\"url\":\"interfaces/lib.fhirclient.ClientInterface.html#getAuthorizationHeader\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.ClientInterface\"},{\"id\":410,\"kind\":2048,\"name\":\"create\",\"url\":\"interfaces/lib.fhirclient.ClientInterface.html#create\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface tsd-has-type-parameter\",\"parent\":\"lib.fhirclient.ClientInterface\"},{\"id\":411,\"kind\":2048,\"name\":\"update\",\"url\":\"interfaces/lib.fhirclient.ClientInterface.html#update\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface tsd-has-type-parameter\",\"parent\":\"lib.fhirclient.ClientInterface\"},{\"id\":412,\"kind\":2048,\"name\":\"delete\",\"url\":\"interfaces/lib.fhirclient.ClientInterface.html#delete\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface tsd-has-type-parameter\",\"parent\":\"lib.fhirclient.ClientInterface\"},{\"id\":413,\"kind\":2048,\"name\":\"patch\",\"url\":\"interfaces/lib.fhirclient.ClientInterface.html#patch\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface tsd-has-type-parameter\",\"parent\":\"lib.fhirclient.ClientInterface\"},{\"id\":414,\"kind\":2048,\"name\":\"request\",\"url\":\"interfaces/lib.fhirclient.ClientInterface.html#request-1\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface tsd-has-type-parameter\",\"parent\":\"lib.fhirclient.ClientInterface\"},{\"id\":415,\"kind\":2048,\"name\":\"refreshIfNeeded\",\"url\":\"interfaces/lib.fhirclient.ClientInterface.html#refreshIfNeeded\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.ClientInterface\"},{\"id\":416,\"kind\":2048,\"name\":\"refresh\",\"url\":\"interfaces/lib.fhirclient.ClientInterface.html#refresh\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.ClientInterface\"},{\"id\":417,\"kind\":1024,\"name\":\"getPath\",\"url\":\"interfaces/lib.fhirclient.ClientInterface.html#getPath\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.ClientInterface\"},{\"id\":418,\"kind\":1024,\"name\":\"getState\",\"url\":\"interfaces/lib.fhirclient.ClientInterface.html#getState\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.ClientInterface\"},{\"id\":419,\"kind\":1024,\"name\":\"getFhirVersion\",\"url\":\"interfaces/lib.fhirclient.ClientInterface.html#getFhirVersion\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.ClientInterface\"},{\"id\":420,\"kind\":1024,\"name\":\"getFhirRelease\",\"url\":\"interfaces/lib.fhirclient.ClientInterface.html#getFhirRelease\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.ClientInterface\"},{\"id\":421,\"kind\":256,\"name\":\"FetchOptions\",\"url\":\"interfaces/lib.fhirclient.FetchOptions.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"lib.fhirclient\"},{\"id\":422,\"kind\":1024,\"name\":\"includeResponse\",\"url\":\"interfaces/lib.fhirclient.FetchOptions.html#includeResponse\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.FetchOptions\"},{\"id\":423,\"kind\":4194304,\"name\":\"RequestFunction\",\"url\":\"modules/lib.fhirclient.html#RequestFunction\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-namespace tsd-has-type-parameter\",\"parent\":\"lib.fhirclient\"},{\"id\":424,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/lib.fhirclient.html#RequestFunction.__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-alias tsd-has-type-parameter\",\"parent\":\"lib.fhirclient.RequestFunction\"},{\"id\":425,\"kind\":256,\"name\":\"IncludeResponseHint\",\"url\":\"interfaces/lib.fhirclient.IncludeResponseHint.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"lib.fhirclient\"},{\"id\":426,\"kind\":1024,\"name\":\"includeResponse\",\"url\":\"interfaces/lib.fhirclient.IncludeResponseHint.html#includeResponse\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.IncludeResponseHint\"},{\"id\":427,\"kind\":256,\"name\":\"CombinedFetchResult\",\"url\":\"interfaces/lib.fhirclient.CombinedFetchResult.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace tsd-has-type-parameter\",\"parent\":\"lib.fhirclient\"},{\"id\":428,\"kind\":1024,\"name\":\"body\",\"url\":\"interfaces/lib.fhirclient.CombinedFetchResult.html#body\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.CombinedFetchResult\"},{\"id\":429,\"kind\":1024,\"name\":\"response\",\"url\":\"interfaces/lib.fhirclient.CombinedFetchResult.html#response\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.CombinedFetchResult\"},{\"id\":430,\"kind\":4194304,\"name\":\"FetchResult\",\"url\":\"modules/lib.fhirclient.html#FetchResult\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-namespace\",\"parent\":\"lib.fhirclient\"},{\"id\":431,\"kind\":256,\"name\":\"RequestOptions\",\"url\":\"interfaces/lib.fhirclient.RequestOptions.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"lib.fhirclient\"},{\"id\":432,\"kind\":1024,\"name\":\"url\",\"url\":\"interfaces/lib.fhirclient.RequestOptions.html#url\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.RequestOptions\"},{\"id\":433,\"kind\":1024,\"name\":\"includeResponse\",\"url\":\"interfaces/lib.fhirclient.RequestOptions.html#includeResponse\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.RequestOptions\"},{\"id\":434,\"kind\":256,\"name\":\"IDToken\",\"url\":\"interfaces/lib.fhirclient.IDToken.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"lib.fhirclient\"},{\"id\":435,\"kind\":1024,\"name\":\"profile\",\"url\":\"interfaces/lib.fhirclient.IDToken.html#profile\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.IDToken\"},{\"id\":436,\"kind\":1024,\"name\":\"aud\",\"url\":\"interfaces/lib.fhirclient.IDToken.html#aud\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.IDToken\"},{\"id\":437,\"kind\":1024,\"name\":\"sub\",\"url\":\"interfaces/lib.fhirclient.IDToken.html#sub\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.IDToken\"},{\"id\":438,\"kind\":1024,\"name\":\"iss\",\"url\":\"interfaces/lib.fhirclient.IDToken.html#iss\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.IDToken\"},{\"id\":439,\"kind\":1024,\"name\":\"iat\",\"url\":\"interfaces/lib.fhirclient.IDToken.html#iat\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.IDToken\"},{\"id\":440,\"kind\":1024,\"name\":\"exp\",\"url\":\"interfaces/lib.fhirclient.IDToken.html#exp\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.IDToken\"},{\"id\":441,\"kind\":4,\"name\":\"FHIR\",\"url\":\"modules/lib.fhirclient.FHIR.html\",\"classes\":\"tsd-kind-namespace tsd-parent-kind-namespace\",\"parent\":\"lib.fhirclient\"},{\"id\":442,\"kind\":4194304,\"name\":\"id\",\"url\":\"modules/lib.fhirclient.FHIR.html#id\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-namespace\",\"parent\":\"lib.fhirclient.FHIR\"},{\"id\":443,\"kind\":4194304,\"name\":\"uri\",\"url\":\"modules/lib.fhirclient.FHIR.html#uri\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-namespace\",\"parent\":\"lib.fhirclient.FHIR\"},{\"id\":444,\"kind\":4194304,\"name\":\"code\",\"url\":\"modules/lib.fhirclient.FHIR.html#code\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-namespace\",\"parent\":\"lib.fhirclient.FHIR\"},{\"id\":445,\"kind\":4194304,\"name\":\"instant\",\"url\":\"modules/lib.fhirclient.FHIR.html#instant\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-namespace\",\"parent\":\"lib.fhirclient.FHIR\"},{\"id\":446,\"kind\":4194304,\"name\":\"dateTime\",\"url\":\"modules/lib.fhirclient.FHIR.html#dateTime\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-namespace\",\"parent\":\"lib.fhirclient.FHIR\"},{\"id\":447,\"kind\":4194304,\"name\":\"unsignedInt\",\"url\":\"modules/lib.fhirclient.FHIR.html#unsignedInt\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-namespace\",\"parent\":\"lib.fhirclient.FHIR\"},{\"id\":448,\"kind\":4194304,\"name\":\"valueX\",\"url\":\"modules/lib.fhirclient.FHIR.html#valueX\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-namespace\",\"parent\":\"lib.fhirclient.FHIR\"},{\"id\":449,\"kind\":256,\"name\":\"Element\",\"url\":\"interfaces/lib.fhirclient.FHIR.Element.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"lib.fhirclient.FHIR\"},{\"id\":450,\"kind\":1024,\"name\":\"id\",\"url\":\"interfaces/lib.fhirclient.FHIR.Element.html#id\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.FHIR.Element\"},{\"id\":451,\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/lib.fhirclient.FHIR.Element.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.FHIR.Element\"},{\"id\":452,\"kind\":256,\"name\":\"Extension\",\"url\":\"interfaces/lib.fhirclient.FHIR.Extension.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace tsd-has-type-parameter\",\"parent\":\"lib.fhirclient.FHIR\"},{\"id\":453,\"kind\":1024,\"name\":\"url\",\"url\":\"interfaces/lib.fhirclient.FHIR.Extension.html#url\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.FHIR.Extension\"},{\"id\":454,\"kind\":1024,\"name\":\"id\",\"url\":\"interfaces/lib.fhirclient.FHIR.Extension.html#id\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"lib.fhirclient.FHIR.Extension\"},{\"id\":455,\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/lib.fhirclient.FHIR.Extension.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"lib.fhirclient.FHIR.Extension\"},{\"id\":456,\"kind\":256,\"name\":\"CapabilityStatement\",\"url\":\"interfaces/lib.fhirclient.FHIR.CapabilityStatement.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"lib.fhirclient.FHIR\"},{\"id\":457,\"kind\":1024,\"name\":\"resourceType\",\"url\":\"interfaces/lib.fhirclient.FHIR.CapabilityStatement.html#resourceType\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.FHIR.CapabilityStatement\"},{\"id\":458,\"kind\":1024,\"name\":\"fhirVersion\",\"url\":\"interfaces/lib.fhirclient.FHIR.CapabilityStatement.html#fhirVersion\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.FHIR.CapabilityStatement\"},{\"id\":459,\"kind\":1024,\"name\":\"rest\",\"url\":\"interfaces/lib.fhirclient.FHIR.CapabilityStatement.html#rest\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.FHIR.CapabilityStatement\"},{\"id\":460,\"kind\":256,\"name\":\"Resource\",\"url\":\"interfaces/lib.fhirclient.FHIR.Resource.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"lib.fhirclient.FHIR\"},{\"id\":461,\"kind\":1024,\"name\":\"id\",\"url\":\"interfaces/lib.fhirclient.FHIR.Resource.html#id\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.FHIR.Resource\"},{\"id\":462,\"kind\":1024,\"name\":\"resourceType\",\"url\":\"interfaces/lib.fhirclient.FHIR.Resource.html#resourceType\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.FHIR.Resource\"},{\"id\":463,\"kind\":1024,\"name\":\"meta\",\"url\":\"interfaces/lib.fhirclient.FHIR.Resource.html#meta\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.FHIR.Resource\"},{\"id\":464,\"kind\":1024,\"name\":\"implicitRules\",\"url\":\"interfaces/lib.fhirclient.FHIR.Resource.html#implicitRules\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.FHIR.Resource\"},{\"id\":465,\"kind\":1024,\"name\":\"language\",\"url\":\"interfaces/lib.fhirclient.FHIR.Resource.html#language\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.FHIR.Resource\"},{\"id\":466,\"kind\":256,\"name\":\"Meta\",\"url\":\"interfaces/lib.fhirclient.FHIR.Meta.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"lib.fhirclient.FHIR\"},{\"id\":467,\"kind\":1024,\"name\":\"lastUpdated\",\"url\":\"interfaces/lib.fhirclient.FHIR.Meta.html#lastUpdated\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.FHIR.Meta\"},{\"id\":468,\"kind\":1024,\"name\":\"id\",\"url\":\"interfaces/lib.fhirclient.FHIR.Meta.html#id\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"lib.fhirclient.FHIR.Meta\"},{\"id\":469,\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/lib.fhirclient.FHIR.Meta.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"lib.fhirclient.FHIR.Meta\"},{\"id\":470,\"kind\":256,\"name\":\"Observation\",\"url\":\"interfaces/lib.fhirclient.FHIR.Observation.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"lib.fhirclient.FHIR\"},{\"id\":471,\"kind\":1024,\"name\":\"resourceType\",\"url\":\"interfaces/lib.fhirclient.FHIR.Observation.html#resourceType\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-overwrite\",\"parent\":\"lib.fhirclient.FHIR.Observation\"},{\"id\":472,\"kind\":1024,\"name\":\"id\",\"url\":\"interfaces/lib.fhirclient.FHIR.Observation.html#id\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"lib.fhirclient.FHIR.Observation\"},{\"id\":473,\"kind\":1024,\"name\":\"meta\",\"url\":\"interfaces/lib.fhirclient.FHIR.Observation.html#meta\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"lib.fhirclient.FHIR.Observation\"},{\"id\":474,\"kind\":1024,\"name\":\"implicitRules\",\"url\":\"interfaces/lib.fhirclient.FHIR.Observation.html#implicitRules\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"lib.fhirclient.FHIR.Observation\"},{\"id\":475,\"kind\":1024,\"name\":\"language\",\"url\":\"interfaces/lib.fhirclient.FHIR.Observation.html#language\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"lib.fhirclient.FHIR.Observation\"},{\"id\":476,\"kind\":256,\"name\":\"Patient\",\"url\":\"interfaces/lib.fhirclient.FHIR.Patient.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"lib.fhirclient.FHIR\"},{\"id\":477,\"kind\":1024,\"name\":\"resourceType\",\"url\":\"interfaces/lib.fhirclient.FHIR.Patient.html#resourceType\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-overwrite\",\"parent\":\"lib.fhirclient.FHIR.Patient\"},{\"id\":478,\"kind\":1024,\"name\":\"id\",\"url\":\"interfaces/lib.fhirclient.FHIR.Patient.html#id\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"lib.fhirclient.FHIR.Patient\"},{\"id\":479,\"kind\":1024,\"name\":\"meta\",\"url\":\"interfaces/lib.fhirclient.FHIR.Patient.html#meta\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"lib.fhirclient.FHIR.Patient\"},{\"id\":480,\"kind\":1024,\"name\":\"implicitRules\",\"url\":\"interfaces/lib.fhirclient.FHIR.Patient.html#implicitRules\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"lib.fhirclient.FHIR.Patient\"},{\"id\":481,\"kind\":1024,\"name\":\"language\",\"url\":\"interfaces/lib.fhirclient.FHIR.Patient.html#language\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"lib.fhirclient.FHIR.Patient\"},{\"id\":482,\"kind\":256,\"name\":\"Practitioner\",\"url\":\"interfaces/lib.fhirclient.FHIR.Practitioner.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"lib.fhirclient.FHIR\"},{\"id\":483,\"kind\":1024,\"name\":\"resourceType\",\"url\":\"interfaces/lib.fhirclient.FHIR.Practitioner.html#resourceType\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-overwrite\",\"parent\":\"lib.fhirclient.FHIR.Practitioner\"},{\"id\":484,\"kind\":1024,\"name\":\"id\",\"url\":\"interfaces/lib.fhirclient.FHIR.Practitioner.html#id\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"lib.fhirclient.FHIR.Practitioner\"},{\"id\":485,\"kind\":1024,\"name\":\"meta\",\"url\":\"interfaces/lib.fhirclient.FHIR.Practitioner.html#meta\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"lib.fhirclient.FHIR.Practitioner\"},{\"id\":486,\"kind\":1024,\"name\":\"implicitRules\",\"url\":\"interfaces/lib.fhirclient.FHIR.Practitioner.html#implicitRules\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"lib.fhirclient.FHIR.Practitioner\"},{\"id\":487,\"kind\":1024,\"name\":\"language\",\"url\":\"interfaces/lib.fhirclient.FHIR.Practitioner.html#language\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"lib.fhirclient.FHIR.Practitioner\"},{\"id\":488,\"kind\":256,\"name\":\"RelatedPerson\",\"url\":\"interfaces/lib.fhirclient.FHIR.RelatedPerson.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"lib.fhirclient.FHIR\"},{\"id\":489,\"kind\":1024,\"name\":\"resourceType\",\"url\":\"interfaces/lib.fhirclient.FHIR.RelatedPerson.html#resourceType\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-overwrite\",\"parent\":\"lib.fhirclient.FHIR.RelatedPerson\"},{\"id\":490,\"kind\":1024,\"name\":\"id\",\"url\":\"interfaces/lib.fhirclient.FHIR.RelatedPerson.html#id\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"lib.fhirclient.FHIR.RelatedPerson\"},{\"id\":491,\"kind\":1024,\"name\":\"meta\",\"url\":\"interfaces/lib.fhirclient.FHIR.RelatedPerson.html#meta\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"lib.fhirclient.FHIR.RelatedPerson\"},{\"id\":492,\"kind\":1024,\"name\":\"implicitRules\",\"url\":\"interfaces/lib.fhirclient.FHIR.RelatedPerson.html#implicitRules\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"lib.fhirclient.FHIR.RelatedPerson\"},{\"id\":493,\"kind\":1024,\"name\":\"language\",\"url\":\"interfaces/lib.fhirclient.FHIR.RelatedPerson.html#language\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"lib.fhirclient.FHIR.RelatedPerson\"},{\"id\":494,\"kind\":256,\"name\":\"Encounter\",\"url\":\"interfaces/lib.fhirclient.FHIR.Encounter.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"lib.fhirclient.FHIR\"},{\"id\":495,\"kind\":1024,\"name\":\"resourceType\",\"url\":\"interfaces/lib.fhirclient.FHIR.Encounter.html#resourceType\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-overwrite\",\"parent\":\"lib.fhirclient.FHIR.Encounter\"},{\"id\":496,\"kind\":1024,\"name\":\"id\",\"url\":\"interfaces/lib.fhirclient.FHIR.Encounter.html#id\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"lib.fhirclient.FHIR.Encounter\"},{\"id\":497,\"kind\":1024,\"name\":\"meta\",\"url\":\"interfaces/lib.fhirclient.FHIR.Encounter.html#meta\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"lib.fhirclient.FHIR.Encounter\"},{\"id\":498,\"kind\":1024,\"name\":\"implicitRules\",\"url\":\"interfaces/lib.fhirclient.FHIR.Encounter.html#implicitRules\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"lib.fhirclient.FHIR.Encounter\"},{\"id\":499,\"kind\":1024,\"name\":\"language\",\"url\":\"interfaces/lib.fhirclient.FHIR.Encounter.html#language\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"lib.fhirclient.FHIR.Encounter\"},{\"id\":500,\"kind\":256,\"name\":\"Period\",\"url\":\"interfaces/lib.fhirclient.FHIR.Period.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"lib.fhirclient.FHIR\"},{\"id\":501,\"kind\":1024,\"name\":\"start\",\"url\":\"interfaces/lib.fhirclient.FHIR.Period.html#start\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.FHIR.Period\"},{\"id\":502,\"kind\":1024,\"name\":\"end\",\"url\":\"interfaces/lib.fhirclient.FHIR.Period.html#end\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.FHIR.Period\"},{\"id\":503,\"kind\":1024,\"name\":\"id\",\"url\":\"interfaces/lib.fhirclient.FHIR.Period.html#id\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"lib.fhirclient.FHIR.Period\"},{\"id\":504,\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/lib.fhirclient.FHIR.Period.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"lib.fhirclient.FHIR.Period\"},{\"id\":505,\"kind\":256,\"name\":\"BackboneElement\",\"url\":\"interfaces/lib.fhirclient.FHIR.BackboneElement.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"lib.fhirclient.FHIR\"},{\"id\":506,\"kind\":1024,\"name\":\"modifierExtension\",\"url\":\"interfaces/lib.fhirclient.FHIR.BackboneElement.html#modifierExtension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.FHIR.BackboneElement\"},{\"id\":507,\"kind\":1024,\"name\":\"id\",\"url\":\"interfaces/lib.fhirclient.FHIR.BackboneElement.html#id\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"lib.fhirclient.FHIR.BackboneElement\"},{\"id\":508,\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/lib.fhirclient.FHIR.BackboneElement.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"lib.fhirclient.FHIR.BackboneElement\"},{\"id\":509,\"kind\":256,\"name\":\"CodeableConcept\",\"url\":\"interfaces/lib.fhirclient.FHIR.CodeableConcept.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"lib.fhirclient.FHIR\"},{\"id\":510,\"kind\":1024,\"name\":\"coding\",\"url\":\"interfaces/lib.fhirclient.FHIR.CodeableConcept.html#coding\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.FHIR.CodeableConcept\"},{\"id\":511,\"kind\":1024,\"name\":\"text\",\"url\":\"interfaces/lib.fhirclient.FHIR.CodeableConcept.html#text\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.FHIR.CodeableConcept\"},{\"id\":512,\"kind\":1024,\"name\":\"id\",\"url\":\"interfaces/lib.fhirclient.FHIR.CodeableConcept.html#id\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"lib.fhirclient.FHIR.CodeableConcept\"},{\"id\":513,\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/lib.fhirclient.FHIR.CodeableConcept.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"lib.fhirclient.FHIR.CodeableConcept\"},{\"id\":514,\"kind\":256,\"name\":\"Coding\",\"url\":\"interfaces/lib.fhirclient.FHIR.Coding.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"lib.fhirclient.FHIR\"},{\"id\":515,\"kind\":1024,\"name\":\"system\",\"url\":\"interfaces/lib.fhirclient.FHIR.Coding.html#system\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.FHIR.Coding\"},{\"id\":516,\"kind\":1024,\"name\":\"version\",\"url\":\"interfaces/lib.fhirclient.FHIR.Coding.html#version\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.FHIR.Coding\"},{\"id\":517,\"kind\":1024,\"name\":\"code\",\"url\":\"interfaces/lib.fhirclient.FHIR.Coding.html#code\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.FHIR.Coding\"},{\"id\":518,\"kind\":1024,\"name\":\"display\",\"url\":\"interfaces/lib.fhirclient.FHIR.Coding.html#display\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.FHIR.Coding\"},{\"id\":519,\"kind\":1024,\"name\":\"userSelected\",\"url\":\"interfaces/lib.fhirclient.FHIR.Coding.html#userSelected\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.FHIR.Coding\"},{\"id\":520,\"kind\":1024,\"name\":\"id\",\"url\":\"interfaces/lib.fhirclient.FHIR.Coding.html#id\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"lib.fhirclient.FHIR.Coding\"},{\"id\":521,\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/lib.fhirclient.FHIR.Coding.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"lib.fhirclient.FHIR.Coding\"},{\"id\":522,\"kind\":256,\"name\":\"Identifier\",\"url\":\"interfaces/lib.fhirclient.FHIR.Identifier.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"lib.fhirclient.FHIR\"},{\"id\":523,\"kind\":1024,\"name\":\"use\",\"url\":\"interfaces/lib.fhirclient.FHIR.Identifier.html#use\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.FHIR.Identifier\"},{\"id\":524,\"kind\":1024,\"name\":\"type\",\"url\":\"interfaces/lib.fhirclient.FHIR.Identifier.html#type\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.FHIR.Identifier\"},{\"id\":525,\"kind\":1024,\"name\":\"system\",\"url\":\"interfaces/lib.fhirclient.FHIR.Identifier.html#system\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.FHIR.Identifier\"},{\"id\":526,\"kind\":1024,\"name\":\"value\",\"url\":\"interfaces/lib.fhirclient.FHIR.Identifier.html#value\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.FHIR.Identifier\"},{\"id\":527,\"kind\":1024,\"name\":\"period\",\"url\":\"interfaces/lib.fhirclient.FHIR.Identifier.html#period\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.FHIR.Identifier\"},{\"id\":528,\"kind\":1024,\"name\":\"assigner\",\"url\":\"interfaces/lib.fhirclient.FHIR.Identifier.html#assigner\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.FHIR.Identifier\"},{\"id\":529,\"kind\":1024,\"name\":\"id\",\"url\":\"interfaces/lib.fhirclient.FHIR.Identifier.html#id\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"lib.fhirclient.FHIR.Identifier\"},{\"id\":530,\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/lib.fhirclient.FHIR.Identifier.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"lib.fhirclient.FHIR.Identifier\"},{\"id\":531,\"kind\":256,\"name\":\"Reference\",\"url\":\"interfaces/lib.fhirclient.FHIR.Reference.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"lib.fhirclient.FHIR\"},{\"id\":532,\"kind\":1024,\"name\":\"reference\",\"url\":\"interfaces/lib.fhirclient.FHIR.Reference.html#reference\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.FHIR.Reference\"},{\"id\":533,\"kind\":1024,\"name\":\"identifier\",\"url\":\"interfaces/lib.fhirclient.FHIR.Reference.html#identifier\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.FHIR.Reference\"},{\"id\":534,\"kind\":1024,\"name\":\"display\",\"url\":\"interfaces/lib.fhirclient.FHIR.Reference.html#display\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.FHIR.Reference\"},{\"id\":535,\"kind\":1024,\"name\":\"id\",\"url\":\"interfaces/lib.fhirclient.FHIR.Reference.html#id\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"lib.fhirclient.FHIR.Reference\"},{\"id\":536,\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/lib.fhirclient.FHIR.Reference.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"lib.fhirclient.FHIR.Reference\"},{\"id\":537,\"kind\":256,\"name\":\"BundleLink\",\"url\":\"interfaces/lib.fhirclient.FHIR.BundleLink.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"lib.fhirclient.FHIR\"},{\"id\":538,\"kind\":1024,\"name\":\"relation\",\"url\":\"interfaces/lib.fhirclient.FHIR.BundleLink.html#relation\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.FHIR.BundleLink\"},{\"id\":539,\"kind\":1024,\"name\":\"url\",\"url\":\"interfaces/lib.fhirclient.FHIR.BundleLink.html#url\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.FHIR.BundleLink\"},{\"id\":540,\"kind\":1024,\"name\":\"modifierExtension\",\"url\":\"interfaces/lib.fhirclient.FHIR.BundleLink.html#modifierExtension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"lib.fhirclient.FHIR.BundleLink\"},{\"id\":541,\"kind\":1024,\"name\":\"id\",\"url\":\"interfaces/lib.fhirclient.FHIR.BundleLink.html#id\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"lib.fhirclient.FHIR.BundleLink\"},{\"id\":542,\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/lib.fhirclient.FHIR.BundleLink.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"lib.fhirclient.FHIR.BundleLink\"},{\"id\":543,\"kind\":256,\"name\":\"BundleEntry\",\"url\":\"interfaces/lib.fhirclient.FHIR.BundleEntry.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"lib.fhirclient.FHIR\"},{\"id\":544,\"kind\":1024,\"name\":\"fullUrl\",\"url\":\"interfaces/lib.fhirclient.FHIR.BundleEntry.html#fullUrl\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.FHIR.BundleEntry\"},{\"id\":545,\"kind\":1024,\"name\":\"resource\",\"url\":\"interfaces/lib.fhirclient.FHIR.BundleEntry.html#resource\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.FHIR.BundleEntry\"},{\"id\":546,\"kind\":1024,\"name\":\"modifierExtension\",\"url\":\"interfaces/lib.fhirclient.FHIR.BundleEntry.html#modifierExtension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"lib.fhirclient.FHIR.BundleEntry\"},{\"id\":547,\"kind\":1024,\"name\":\"id\",\"url\":\"interfaces/lib.fhirclient.FHIR.BundleEntry.html#id\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"lib.fhirclient.FHIR.BundleEntry\"},{\"id\":548,\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/lib.fhirclient.FHIR.BundleEntry.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"lib.fhirclient.FHIR.BundleEntry\"},{\"id\":549,\"kind\":256,\"name\":\"Bundle\",\"url\":\"interfaces/lib.fhirclient.FHIR.Bundle.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"lib.fhirclient.FHIR\"},{\"id\":550,\"kind\":1024,\"name\":\"identifier\",\"url\":\"interfaces/lib.fhirclient.FHIR.Bundle.html#identifier\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.FHIR.Bundle\"},{\"id\":551,\"kind\":1024,\"name\":\"type\",\"url\":\"interfaces/lib.fhirclient.FHIR.Bundle.html#type\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.FHIR.Bundle\"},{\"id\":552,\"kind\":1024,\"name\":\"total\",\"url\":\"interfaces/lib.fhirclient.FHIR.Bundle.html#total\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.FHIR.Bundle\"},{\"id\":553,\"kind\":1024,\"name\":\"link\",\"url\":\"interfaces/lib.fhirclient.FHIR.Bundle.html#link\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.FHIR.Bundle\"},{\"id\":554,\"kind\":1024,\"name\":\"entry\",\"url\":\"interfaces/lib.fhirclient.FHIR.Bundle.html#entry\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.FHIR.Bundle\"},{\"id\":555,\"kind\":1024,\"name\":\"id\",\"url\":\"interfaces/lib.fhirclient.FHIR.Bundle.html#id\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"lib.fhirclient.FHIR.Bundle\"},{\"id\":556,\"kind\":1024,\"name\":\"resourceType\",\"url\":\"interfaces/lib.fhirclient.FHIR.Bundle.html#resourceType\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"lib.fhirclient.FHIR.Bundle\"},{\"id\":557,\"kind\":1024,\"name\":\"meta\",\"url\":\"interfaces/lib.fhirclient.FHIR.Bundle.html#meta\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"lib.fhirclient.FHIR.Bundle\"},{\"id\":558,\"kind\":1024,\"name\":\"implicitRules\",\"url\":\"interfaces/lib.fhirclient.FHIR.Bundle.html#implicitRules\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"lib.fhirclient.FHIR.Bundle\"},{\"id\":559,\"kind\":1024,\"name\":\"language\",\"url\":\"interfaces/lib.fhirclient.FHIR.Bundle.html#language\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"lib.fhirclient.FHIR.Bundle\"},{\"id\":560,\"kind\":256,\"name\":\"RequestWithSession\",\"url\":\"interfaces/lib.fhirclient.RequestWithSession.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"lib.fhirclient\"},{\"id\":561,\"kind\":1024,\"name\":\"session\",\"url\":\"interfaces/lib.fhirclient.RequestWithSession.html#session\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.RequestWithSession\"},{\"id\":562,\"kind\":256,\"name\":\"Adapter\",\"url\":\"interfaces/lib.fhirclient.Adapter.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"lib.fhirclient\"},{\"id\":563,\"kind\":1024,\"name\":\"options\",\"url\":\"interfaces/lib.fhirclient.Adapter.html#options\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.Adapter\"},{\"id\":564,\"kind\":2048,\"name\":\"getUrl\",\"url\":\"interfaces/lib.fhirclient.Adapter.html#getUrl\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.Adapter\"},{\"id\":565,\"kind\":2048,\"name\":\"redirect\",\"url\":\"interfaces/lib.fhirclient.Adapter.html#redirect\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.Adapter\"},{\"id\":566,\"kind\":2048,\"name\":\"getStorage\",\"url\":\"interfaces/lib.fhirclient.Adapter.html#getStorage\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.Adapter\"},{\"id\":567,\"kind\":2048,\"name\":\"relative\",\"url\":\"interfaces/lib.fhirclient.Adapter.html#relative\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.Adapter\"},{\"id\":568,\"kind\":2048,\"name\":\"base64urlencode\",\"url\":\"interfaces/lib.fhirclient.Adapter.html#base64urlencode\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.Adapter\"},{\"id\":569,\"kind\":2048,\"name\":\"base64urldecode\",\"url\":\"interfaces/lib.fhirclient.Adapter.html#base64urldecode\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.Adapter\"},{\"id\":570,\"kind\":2048,\"name\":\"getSmartApi\",\"url\":\"interfaces/lib.fhirclient.Adapter.html#getSmartApi\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.Adapter\"},{\"id\":571,\"kind\":1024,\"name\":\"security\",\"url\":\"interfaces/lib.fhirclient.Adapter.html#security\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.Adapter\"},{\"id\":572,\"kind\":65536,\"name\":\"__type\",\"url\":\"interfaces/lib.fhirclient.Adapter.html#__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-interface\",\"parent\":\"lib.fhirclient.Adapter\"},{\"id\":573,\"kind\":2048,\"name\":\"randomBytes\",\"url\":\"interfaces/lib.fhirclient.Adapter.html#__type.randomBytes\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"lib.fhirclient.Adapter.__type\"},{\"id\":574,\"kind\":2048,\"name\":\"digestSha256\",\"url\":\"interfaces/lib.fhirclient.Adapter.html#__type.digestSha256\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"lib.fhirclient.Adapter.__type\"},{\"id\":575,\"kind\":2048,\"name\":\"generatePKCEChallenge\",\"url\":\"interfaces/lib.fhirclient.Adapter.html#__type.generatePKCEChallenge\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"lib.fhirclient.Adapter.__type\"},{\"id\":576,\"kind\":2048,\"name\":\"importJWK\",\"url\":\"interfaces/lib.fhirclient.Adapter.html#__type.importJWK\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"lib.fhirclient.Adapter.__type\"},{\"id\":577,\"kind\":2048,\"name\":\"signCompactJws\",\"url\":\"interfaces/lib.fhirclient.Adapter.html#__type.signCompactJws\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"lib.fhirclient.Adapter.__type\"},{\"id\":578,\"kind\":256,\"name\":\"BrowserFHIRSettings\",\"url\":\"interfaces/lib.fhirclient.BrowserFHIRSettings.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"lib.fhirclient\"},{\"id\":579,\"kind\":2,\"name\":\"lib/isomorphic\",\"url\":\"modules/lib_isomorphic.html\",\"classes\":\"tsd-kind-module\"},{\"id\":580,\"kind\":64,\"name\":\"checkResponse\",\"url\":\"modules/lib_isomorphic.html#checkResponse\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"lib/isomorphic\"},{\"id\":581,\"kind\":64,\"name\":\"responseToJSON\",\"url\":\"modules/lib_isomorphic.html#responseToJSON\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"lib/isomorphic\"},{\"id\":582,\"kind\":64,\"name\":\"loweCaseKeys\",\"url\":\"modules/lib_isomorphic.html#loweCaseKeys\",\"classes\":\"tsd-kind-function tsd-parent-kind-module tsd-has-type-parameter\",\"parent\":\"lib/isomorphic\"},{\"id\":583,\"kind\":64,\"name\":\"request\",\"url\":\"modules/lib_isomorphic.html#request\",\"classes\":\"tsd-kind-function tsd-parent-kind-module tsd-has-type-parameter\",\"parent\":\"lib/isomorphic\"},{\"id\":584,\"kind\":64,\"name\":\"getAndCache\",\"url\":\"modules/lib_isomorphic.html#getAndCache\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"lib/isomorphic\"},{\"id\":585,\"kind\":64,\"name\":\"fetchConformanceStatement\",\"url\":\"modules/lib_isomorphic.html#fetchConformanceStatement\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"lib/isomorphic\"},{\"id\":586,\"kind\":64,\"name\":\"getPath\",\"url\":\"modules/lib_isomorphic.html#getPath\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"lib/isomorphic\"},{\"id\":587,\"kind\":64,\"name\":\"setPath\",\"url\":\"modules/lib_isomorphic.html#setPath\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"lib/isomorphic\"},{\"id\":588,\"kind\":64,\"name\":\"makeArray\",\"url\":\"modules/lib_isomorphic.html#makeArray\",\"classes\":\"tsd-kind-function tsd-parent-kind-module tsd-has-type-parameter\",\"parent\":\"lib/isomorphic\"},{\"id\":589,\"kind\":64,\"name\":\"absolute\",\"url\":\"modules/lib_isomorphic.html#absolute\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"lib/isomorphic\"},{\"id\":590,\"kind\":64,\"name\":\"randomString\",\"url\":\"modules/lib_isomorphic.html#randomString\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"lib/isomorphic\"},{\"id\":591,\"kind\":64,\"name\":\"getTimeInFuture\",\"url\":\"modules/lib_isomorphic.html#getTimeInFuture\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"lib/isomorphic\"},{\"id\":592,\"kind\":64,\"name\":\"byCode\",\"url\":\"modules/lib_isomorphic.html#byCode\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"lib/isomorphic\"},{\"id\":593,\"kind\":64,\"name\":\"byCodes\",\"url\":\"modules/lib_isomorphic.html#byCodes\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"lib/isomorphic\"},{\"id\":594,\"kind\":64,\"name\":\"getPatientParam\",\"url\":\"modules/lib_isomorphic.html#getPatientParam\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"lib/isomorphic\"},{\"id\":595,\"kind\":64,\"name\":\"assert\",\"url\":\"modules/lib_isomorphic.html#assert\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"lib/isomorphic\"},{\"id\":596,\"kind\":64,\"name\":\"assertJsonPatch\",\"url\":\"modules/lib_isomorphic.html#assertJsonPatch\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"lib/isomorphic\"},{\"id\":597,\"kind\":64,\"name\":\"fetchWellKnownJson\",\"url\":\"modules/lib_isomorphic.html#fetchWellKnownJson\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"lib/isomorphic\"},{\"id\":598,\"kind\":64,\"name\":\"getSecurityExtensionsFromWellKnownJson\",\"url\":\"modules/lib_isomorphic.html#getSecurityExtensionsFromWellKnownJson\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"lib/isomorphic\"},{\"id\":599,\"kind\":64,\"name\":\"getSecurityExtensionsFromConformanceStatement\",\"url\":\"modules/lib_isomorphic.html#getSecurityExtensionsFromConformanceStatement\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"lib/isomorphic\"},{\"id\":600,\"kind\":64,\"name\":\"getSecurityExtensions\",\"url\":\"modules/lib_isomorphic.html#getSecurityExtensions\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"lib/isomorphic\"},{\"id\":601,\"kind\":64,\"name\":\"base64encode\",\"url\":\"modules/lib_isomorphic.html#base64encode\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"lib/isomorphic\"},{\"id\":602,\"kind\":64,\"name\":\"base64decode\",\"url\":\"modules/lib_isomorphic.html#base64decode\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"lib/isomorphic\"},{\"id\":603,\"kind\":64,\"name\":\"shouldIncludeChallenge\",\"url\":\"modules/lib_isomorphic.html#shouldIncludeChallenge\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"lib/isomorphic\"},{\"id\":604,\"kind\":64,\"name\":\"jwtDecode\",\"url\":\"modules/lib_isomorphic.html#jwtDecode\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"lib/isomorphic\"},{\"id\":605,\"kind\":64,\"name\":\"getAccessTokenExpiration\",\"url\":\"modules/lib_isomorphic.html#getAccessTokenExpiration\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"lib/isomorphic\"},{\"id\":606,\"kind\":64,\"name\":\"debug\",\"url\":\"modules/lib_isomorphic.html#debug\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"lib/isomorphic\"},{\"id\":607,\"kind\":32,\"name\":\"units\",\"url\":\"modules/lib_isomorphic.html#units\",\"classes\":\"tsd-kind-variable tsd-parent-kind-module\",\"parent\":\"lib/isomorphic\"},{\"id\":608,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/lib_isomorphic.html#units.__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-variable\",\"parent\":\"lib/isomorphic.units\"},{\"id\":609,\"kind\":2048,\"name\":\"cm\",\"url\":\"modules/lib_isomorphic.html#units.__type.cm\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"lib/isomorphic.units.__type\"},{\"id\":610,\"kind\":2048,\"name\":\"kg\",\"url\":\"modules/lib_isomorphic.html#units.__type.kg\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"lib/isomorphic.units.__type\"},{\"id\":611,\"kind\":2048,\"name\":\"any\",\"url\":\"modules/lib_isomorphic.html#units.__type.any\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"lib/isomorphic.units.__type\"},{\"id\":612,\"kind\":2,\"name\":\"lib/server\",\"url\":\"modules/lib_server.html\",\"classes\":\"tsd-kind-module\"},{\"id\":613,\"kind\":64,\"name\":\"digestSha256\",\"url\":\"modules/lib_server.html#digestSha256\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"lib/server\"},{\"id\":614,\"kind\":64,\"name\":\"generatePKCEChallenge\",\"url\":\"modules/lib_server.html#generatePKCEChallenge\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"lib/server\"},{\"id\":615,\"kind\":64,\"name\":\"importJWK\",\"url\":\"modules/lib_server.html#importJWK\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"lib/server\"},{\"id\":616,\"kind\":64,\"name\":\"signCompactJws\",\"url\":\"modules/lib_server.html#signCompactJws\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"lib/server\"},{\"id\":617,\"kind\":64,\"name\":\"base64urlencode\",\"url\":\"modules/lib_server.html#base64urlencode\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"lib/server\"},{\"id\":618,\"kind\":64,\"name\":\"base64urldecode\",\"url\":\"modules/lib_server.html#base64urldecode\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"lib/server\"},{\"id\":619,\"kind\":2,\"name\":\"lib/server_entry\",\"url\":\"modules/lib_server_entry.html\",\"classes\":\"tsd-kind-module\"},{\"id\":620,\"kind\":64,\"name\":\"default\",\"url\":\"modules/lib_server_entry.html#default\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"lib/server_entry\"},{\"id\":621,\"kind\":2,\"name\":\"lib/settings\",\"url\":\"modules/lib_settings.html\",\"classes\":\"tsd-kind-module\"},{\"id\":622,\"kind\":32,\"name\":\"patientCompartment\",\"url\":\"modules/lib_settings.html#patientCompartment\",\"classes\":\"tsd-kind-variable tsd-parent-kind-module\",\"parent\":\"lib/settings\"},{\"id\":623,\"kind\":32,\"name\":\"fhirVersions\",\"url\":\"modules/lib_settings.html#fhirVersions\",\"classes\":\"tsd-kind-variable tsd-parent-kind-module\",\"parent\":\"lib/settings\"},{\"id\":624,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/lib_settings.html#fhirVersions.__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-variable\",\"parent\":\"lib/settings.fhirVersions\"},{\"id\":625,\"kind\":1024,\"name\":\"0.4.0\",\"url\":\"modules/lib_settings.html#fhirVersions.__type.0_4_0\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"lib/settings.fhirVersions.__type\"},{\"id\":626,\"kind\":1024,\"name\":\"0.5.0\",\"url\":\"modules/lib_settings.html#fhirVersions.__type.0_5_0\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"lib/settings.fhirVersions.__type\"},{\"id\":627,\"kind\":1024,\"name\":\"1.0.0\",\"url\":\"modules/lib_settings.html#fhirVersions.__type.1_0_0\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"lib/settings.fhirVersions.__type\"},{\"id\":628,\"kind\":1024,\"name\":\"1.0.1\",\"url\":\"modules/lib_settings.html#fhirVersions.__type.1_0_1\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"lib/settings.fhirVersions.__type\"},{\"id\":629,\"kind\":1024,\"name\":\"1.0.2\",\"url\":\"modules/lib_settings.html#fhirVersions.__type.1_0_2\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"lib/settings.fhirVersions.__type\"},{\"id\":630,\"kind\":1024,\"name\":\"1.1.0\",\"url\":\"modules/lib_settings.html#fhirVersions.__type.1_1_0\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"lib/settings.fhirVersions.__type\"},{\"id\":631,\"kind\":1024,\"name\":\"1.4.0\",\"url\":\"modules/lib_settings.html#fhirVersions.__type.1_4_0\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"lib/settings.fhirVersions.__type\"},{\"id\":632,\"kind\":1024,\"name\":\"1.6.0\",\"url\":\"modules/lib_settings.html#fhirVersions.__type.1_6_0\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"lib/settings.fhirVersions.__type\"},{\"id\":633,\"kind\":1024,\"name\":\"1.8.0\",\"url\":\"modules/lib_settings.html#fhirVersions.__type.1_8_0\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"lib/settings.fhirVersions.__type\"},{\"id\":634,\"kind\":1024,\"name\":\"3.0.0\",\"url\":\"modules/lib_settings.html#fhirVersions.__type.3_0_0\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"lib/settings.fhirVersions.__type\"},{\"id\":635,\"kind\":1024,\"name\":\"3.0.1\",\"url\":\"modules/lib_settings.html#fhirVersions.__type.3_0_1\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"lib/settings.fhirVersions.__type\"},{\"id\":636,\"kind\":1024,\"name\":\"3.3.0\",\"url\":\"modules/lib_settings.html#fhirVersions.__type.3_3_0\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"lib/settings.fhirVersions.__type\"},{\"id\":637,\"kind\":1024,\"name\":\"3.5.0\",\"url\":\"modules/lib_settings.html#fhirVersions.__type.3_5_0\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"lib/settings.fhirVersions.__type\"},{\"id\":638,\"kind\":1024,\"name\":\"4.0.0\",\"url\":\"modules/lib_settings.html#fhirVersions.__type.4_0_0\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"lib/settings.fhirVersions.__type\"},{\"id\":639,\"kind\":1024,\"name\":\"4.0.1\",\"url\":\"modules/lib_settings.html#fhirVersions.__type.4_0_1\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"lib/settings.fhirVersions.__type\"},{\"id\":640,\"kind\":32,\"name\":\"patientParams\",\"url\":\"modules/lib_settings.html#patientParams\",\"classes\":\"tsd-kind-variable tsd-parent-kind-module\",\"parent\":\"lib/settings\"},{\"id\":641,\"kind\":32,\"name\":\"SMART_KEY\",\"url\":\"modules/lib_settings.html#SMART_KEY\",\"classes\":\"tsd-kind-variable tsd-parent-kind-module\",\"parent\":\"lib/settings\"},{\"id\":642,\"kind\":2,\"name\":\"lib/smart\",\"url\":\"modules/lib_smart.html\",\"classes\":\"tsd-kind-module\"},{\"id\":643,\"kind\":64,\"name\":\"authorize\",\"url\":\"modules/lib_smart.html#authorize\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"lib/smart\"},{\"id\":644,\"kind\":64,\"name\":\"ready\",\"url\":\"modules/lib_smart.html#ready\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"lib/smart\"},{\"id\":645,\"kind\":64,\"name\":\"buildTokenRequest\",\"url\":\"modules/lib_smart.html#buildTokenRequest\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"lib/smart\"},{\"id\":646,\"kind\":64,\"name\":\"init\",\"url\":\"modules/lib_smart.html#init\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"lib/smart\"},{\"id\":647,\"kind\":2,\"name\":\"lib/strings\",\"url\":\"modules/lib_strings.html\",\"classes\":\"tsd-kind-module\"},{\"id\":648,\"kind\":32,\"name\":\"default\",\"url\":\"modules/lib_strings.html#default\",\"classes\":\"tsd-kind-variable tsd-parent-kind-module\",\"parent\":\"lib/strings\"},{\"id\":649,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/lib_strings.html#default.__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-variable\",\"parent\":\"lib/strings.default\"},{\"id\":650,\"kind\":1024,\"name\":\"expired\",\"url\":\"modules/lib_strings.html#default.__type.expired\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"lib/strings.default.__type\"},{\"id\":651,\"kind\":1024,\"name\":\"noScopeForId\",\"url\":\"modules/lib_strings.html#default.__type.noScopeForId\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"lib/strings.default.__type\"},{\"id\":652,\"kind\":1024,\"name\":\"noIfNoAuth\",\"url\":\"modules/lib_strings.html#default.__type.noIfNoAuth\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"lib/strings.default.__type\"},{\"id\":653,\"kind\":1024,\"name\":\"noFreeContext\",\"url\":\"modules/lib_strings.html#default.__type.noFreeContext\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"lib/strings.default.__type\"},{\"id\":654,\"kind\":2,\"name\":\"lib\",\"url\":\"modules/lib.html\",\"classes\":\"tsd-kind-module\"},{\"id\":655,\"kind\":64,\"name\":\"checkResponse\",\"url\":\"modules/lib.html#checkResponse\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"lib\"},{\"id\":656,\"kind\":64,\"name\":\"responseToJSON\",\"url\":\"modules/lib.html#responseToJSON\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"lib\"},{\"id\":657,\"kind\":64,\"name\":\"loweCaseKeys\",\"url\":\"modules/lib.html#loweCaseKeys\",\"classes\":\"tsd-kind-function tsd-parent-kind-module tsd-has-type-parameter\",\"parent\":\"lib\"},{\"id\":658,\"kind\":64,\"name\":\"request\",\"url\":\"modules/lib.html#request\",\"classes\":\"tsd-kind-function tsd-parent-kind-module tsd-has-type-parameter\",\"parent\":\"lib\"},{\"id\":659,\"kind\":64,\"name\":\"getAndCache\",\"url\":\"modules/lib.html#getAndCache\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"lib\"},{\"id\":660,\"kind\":64,\"name\":\"fetchConformanceStatement\",\"url\":\"modules/lib.html#fetchConformanceStatement\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"lib\"},{\"id\":661,\"kind\":64,\"name\":\"getPath\",\"url\":\"modules/lib.html#getPath\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"lib\"},{\"id\":662,\"kind\":64,\"name\":\"setPath\",\"url\":\"modules/lib.html#setPath\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"lib\"},{\"id\":663,\"kind\":64,\"name\":\"makeArray\",\"url\":\"modules/lib.html#makeArray\",\"classes\":\"tsd-kind-function tsd-parent-kind-module tsd-has-type-parameter\",\"parent\":\"lib\"},{\"id\":664,\"kind\":64,\"name\":\"absolute\",\"url\":\"modules/lib.html#absolute\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"lib\"},{\"id\":665,\"kind\":64,\"name\":\"randomString\",\"url\":\"modules/lib.html#randomString\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"lib\"},{\"id\":666,\"kind\":64,\"name\":\"jwtDecode\",\"url\":\"modules/lib.html#jwtDecode\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"lib\"},{\"id\":667,\"kind\":64,\"name\":\"getTimeInFuture\",\"url\":\"modules/lib.html#getTimeInFuture\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"lib\"},{\"id\":668,\"kind\":64,\"name\":\"getAccessTokenExpiration\",\"url\":\"modules/lib.html#getAccessTokenExpiration\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"lib\"},{\"id\":669,\"kind\":64,\"name\":\"byCode\",\"url\":\"modules/lib.html#byCode\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"lib\"},{\"id\":670,\"kind\":64,\"name\":\"byCodes\",\"url\":\"modules/lib.html#byCodes\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"lib\"},{\"id\":671,\"kind\":64,\"name\":\"getPatientParam\",\"url\":\"modules/lib.html#getPatientParam\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"lib\"},{\"id\":672,\"kind\":64,\"name\":\"getTargetWindow\",\"url\":\"modules/lib.html#getTargetWindow\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"lib\"},{\"id\":673,\"kind\":64,\"name\":\"assert\",\"url\":\"modules/lib.html#assert\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"lib\"},{\"id\":674,\"kind\":64,\"name\":\"assertJsonPatch\",\"url\":\"modules/lib.html#assertJsonPatch\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"lib\"},{\"id\":675,\"kind\":32,\"name\":\"units\",\"url\":\"modules/lib.html#units\",\"classes\":\"tsd-kind-variable tsd-parent-kind-module\",\"parent\":\"lib\"},{\"id\":676,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/lib.html#units.__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-variable\",\"parent\":\"lib.units\"},{\"id\":677,\"kind\":2048,\"name\":\"cm\",\"url\":\"modules/lib.html#units.__type.cm\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"lib.units.__type\"},{\"id\":678,\"kind\":2048,\"name\":\"kg\",\"url\":\"modules/lib.html#units.__type.kg\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"lib.units.__type\"},{\"id\":679,\"kind\":2048,\"name\":\"any\",\"url\":\"modules/lib.html#units.__type.any\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"lib.units.__type\"},{\"id\":680,\"kind\":2,\"name\":\"security/browser\",\"url\":\"modules/security_browser.html\",\"classes\":\"tsd-kind-module\"},{\"id\":681,\"kind\":64,\"name\":\"randomBytes\",\"url\":\"modules/security_browser.html#randomBytes\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"security/browser\"},{\"id\":682,\"kind\":64,\"name\":\"digestSha256\",\"url\":\"modules/security_browser.html#digestSha256\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"security/browser\"},{\"id\":683,\"kind\":64,\"name\":\"importJWK\",\"url\":\"modules/security_browser.html#importJWK\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"security/browser\"},{\"id\":684,\"kind\":64,\"name\":\"signCompactJws\",\"url\":\"modules/security_browser.html#signCompactJws\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"security/browser\"},{\"id\":685,\"kind\":64,\"name\":\"subtle\",\"url\":\"modules/security_browser.html#subtle\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"security/browser\"},{\"id\":686,\"kind\":64,\"name\":\"generatePKCEChallenge\",\"url\":\"modules/security_browser.html#generatePKCEChallenge\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"security/browser\"},{\"id\":687,\"kind\":2,\"name\":\"security/server\",\"url\":\"modules/security_server.html\",\"classes\":\"tsd-kind-module\"},{\"id\":688,\"kind\":64,\"name\":\"digestSha256\",\"url\":\"modules/security_server.html#digestSha256\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"security/server\"},{\"id\":689,\"kind\":64,\"name\":\"generatePKCEChallenge\",\"url\":\"modules/security_server.html#generatePKCEChallenge\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"security/server\"},{\"id\":690,\"kind\":64,\"name\":\"importJWK\",\"url\":\"modules/security_server.html#importJWK\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"security/server\"},{\"id\":691,\"kind\":64,\"name\":\"signCompactJws\",\"url\":\"modules/security_server.html#signCompactJws\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"security/server\"},{\"id\":692,\"kind\":2,\"name\":\"settings\",\"url\":\"modules/settings.html\",\"classes\":\"tsd-kind-module\"},{\"id\":693,\"kind\":32,\"name\":\"patientCompartment\",\"url\":\"modules/settings.html#patientCompartment\",\"classes\":\"tsd-kind-variable tsd-parent-kind-module\",\"parent\":\"settings\"},{\"id\":694,\"kind\":32,\"name\":\"fhirVersions\",\"url\":\"modules/settings.html#fhirVersions\",\"classes\":\"tsd-kind-variable tsd-parent-kind-module\",\"parent\":\"settings\"},{\"id\":695,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/settings.html#fhirVersions.__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-variable\",\"parent\":\"settings.fhirVersions\"},{\"id\":696,\"kind\":1024,\"name\":\"0.4.0\",\"url\":\"modules/settings.html#fhirVersions.__type.0_4_0\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"settings.fhirVersions.__type\"},{\"id\":697,\"kind\":1024,\"name\":\"0.5.0\",\"url\":\"modules/settings.html#fhirVersions.__type.0_5_0\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"settings.fhirVersions.__type\"},{\"id\":698,\"kind\":1024,\"name\":\"1.0.0\",\"url\":\"modules/settings.html#fhirVersions.__type.1_0_0\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"settings.fhirVersions.__type\"},{\"id\":699,\"kind\":1024,\"name\":\"1.0.1\",\"url\":\"modules/settings.html#fhirVersions.__type.1_0_1\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"settings.fhirVersions.__type\"},{\"id\":700,\"kind\":1024,\"name\":\"1.0.2\",\"url\":\"modules/settings.html#fhirVersions.__type.1_0_2\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"settings.fhirVersions.__type\"},{\"id\":701,\"kind\":1024,\"name\":\"1.1.0\",\"url\":\"modules/settings.html#fhirVersions.__type.1_1_0\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"settings.fhirVersions.__type\"},{\"id\":702,\"kind\":1024,\"name\":\"1.4.0\",\"url\":\"modules/settings.html#fhirVersions.__type.1_4_0\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"settings.fhirVersions.__type\"},{\"id\":703,\"kind\":1024,\"name\":\"1.6.0\",\"url\":\"modules/settings.html#fhirVersions.__type.1_6_0\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"settings.fhirVersions.__type\"},{\"id\":704,\"kind\":1024,\"name\":\"1.8.0\",\"url\":\"modules/settings.html#fhirVersions.__type.1_8_0\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"settings.fhirVersions.__type\"},{\"id\":705,\"kind\":1024,\"name\":\"3.0.0\",\"url\":\"modules/settings.html#fhirVersions.__type.3_0_0\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"settings.fhirVersions.__type\"},{\"id\":706,\"kind\":1024,\"name\":\"3.0.1\",\"url\":\"modules/settings.html#fhirVersions.__type.3_0_1\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"settings.fhirVersions.__type\"},{\"id\":707,\"kind\":1024,\"name\":\"3.3.0\",\"url\":\"modules/settings.html#fhirVersions.__type.3_3_0\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"settings.fhirVersions.__type\"},{\"id\":708,\"kind\":1024,\"name\":\"3.5.0\",\"url\":\"modules/settings.html#fhirVersions.__type.3_5_0\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"settings.fhirVersions.__type\"},{\"id\":709,\"kind\":1024,\"name\":\"4.0.0\",\"url\":\"modules/settings.html#fhirVersions.__type.4_0_0\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"settings.fhirVersions.__type\"},{\"id\":710,\"kind\":1024,\"name\":\"4.0.1\",\"url\":\"modules/settings.html#fhirVersions.__type.4_0_1\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"settings.fhirVersions.__type\"},{\"id\":711,\"kind\":32,\"name\":\"patientParams\",\"url\":\"modules/settings.html#patientParams\",\"classes\":\"tsd-kind-variable tsd-parent-kind-module\",\"parent\":\"settings\"},{\"id\":712,\"kind\":32,\"name\":\"SMART_KEY\",\"url\":\"modules/settings.html#SMART_KEY\",\"classes\":\"tsd-kind-variable tsd-parent-kind-module\",\"parent\":\"settings\"},{\"id\":713,\"kind\":2,\"name\":\"smart\",\"url\":\"modules/smart.html\",\"classes\":\"tsd-kind-module\"},{\"id\":714,\"kind\":64,\"name\":\"fetchWellKnownJson\",\"url\":\"modules/smart.html#fetchWellKnownJson\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"smart\"},{\"id\":715,\"kind\":64,\"name\":\"getSecurityExtensions\",\"url\":\"modules/smart.html#getSecurityExtensions\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"smart\"},{\"id\":716,\"kind\":64,\"name\":\"authorize\",\"url\":\"modules/smart.html#authorize\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"smart\"},{\"id\":717,\"kind\":64,\"name\":\"isInFrame\",\"url\":\"modules/smart.html#isInFrame\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"smart\"},{\"id\":718,\"kind\":64,\"name\":\"isInPopUp\",\"url\":\"modules/smart.html#isInPopUp\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"smart\"},{\"id\":719,\"kind\":64,\"name\":\"onMessage\",\"url\":\"modules/smart.html#onMessage\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"smart\"},{\"id\":720,\"kind\":64,\"name\":\"ready\",\"url\":\"modules/smart.html#ready\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"smart\"},{\"id\":721,\"kind\":64,\"name\":\"buildTokenRequest\",\"url\":\"modules/smart.html#buildTokenRequest\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"smart\"},{\"id\":722,\"kind\":64,\"name\":\"init\",\"url\":\"modules/smart.html#init\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"smart\"},{\"id\":723,\"kind\":2,\"name\":\"storage/BrowserStorage\",\"url\":\"modules/storage_BrowserStorage.html\",\"classes\":\"tsd-kind-module\"},{\"id\":724,\"kind\":128,\"name\":\"default\",\"url\":\"classes/storage_BrowserStorage.default.html\",\"classes\":\"tsd-kind-class tsd-parent-kind-module\",\"parent\":\"storage/BrowserStorage\"},{\"id\":725,\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/storage_BrowserStorage.default.html#constructor\",\"classes\":\"tsd-kind-constructor tsd-parent-kind-class\",\"parent\":\"storage/BrowserStorage.default\"},{\"id\":726,\"kind\":2048,\"name\":\"get\",\"url\":\"classes/storage_BrowserStorage.default.html#get\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"storage/BrowserStorage.default\"},{\"id\":727,\"kind\":2048,\"name\":\"set\",\"url\":\"classes/storage_BrowserStorage.default.html#set\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"storage/BrowserStorage.default\"},{\"id\":728,\"kind\":2048,\"name\":\"unset\",\"url\":\"classes/storage_BrowserStorage.default.html#unset\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"storage/BrowserStorage.default\"},{\"id\":729,\"kind\":2,\"name\":\"storage/ServerStorage\",\"url\":\"modules/storage_ServerStorage.html\",\"classes\":\"tsd-kind-module\"},{\"id\":730,\"kind\":128,\"name\":\"default\",\"url\":\"classes/storage_ServerStorage.default.html\",\"classes\":\"tsd-kind-class tsd-parent-kind-module\",\"parent\":\"storage/ServerStorage\"},{\"id\":731,\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/storage_ServerStorage.default.html#constructor\",\"classes\":\"tsd-kind-constructor tsd-parent-kind-class\",\"parent\":\"storage/ServerStorage.default\"},{\"id\":732,\"kind\":1024,\"name\":\"request\",\"url\":\"classes/storage_ServerStorage.default.html#request\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"storage/ServerStorage.default\"},{\"id\":733,\"kind\":2048,\"name\":\"get\",\"url\":\"classes/storage_ServerStorage.default.html#get\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"storage/ServerStorage.default\"},{\"id\":734,\"kind\":2048,\"name\":\"set\",\"url\":\"classes/storage_ServerStorage.default.html#set\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"storage/ServerStorage.default\"},{\"id\":735,\"kind\":2048,\"name\":\"unset\",\"url\":\"classes/storage_ServerStorage.default.html#unset\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"storage/ServerStorage.default\"},{\"id\":736,\"kind\":2,\"name\":\"strings\",\"url\":\"modules/strings.html\",\"classes\":\"tsd-kind-module\"},{\"id\":737,\"kind\":32,\"name\":\"default\",\"url\":\"modules/strings.html#default\",\"classes\":\"tsd-kind-variable tsd-parent-kind-module\",\"parent\":\"strings\"},{\"id\":738,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/strings.html#default.__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-variable\",\"parent\":\"strings.default\"},{\"id\":739,\"kind\":1024,\"name\":\"expired\",\"url\":\"modules/strings.html#default.__type.expired\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"strings.default.__type\"},{\"id\":740,\"kind\":1024,\"name\":\"noScopeForId\",\"url\":\"modules/strings.html#default.__type.noScopeForId\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"strings.default.__type\"},{\"id\":741,\"kind\":1024,\"name\":\"noIfNoAuth\",\"url\":\"modules/strings.html#default.__type.noIfNoAuth\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"strings.default.__type\"},{\"id\":742,\"kind\":1024,\"name\":\"noFreeContext\",\"url\":\"modules/strings.html#default.__type.noFreeContext\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"strings.default.__type\"},{\"id\":743,\"kind\":2,\"name\":\"types\",\"url\":\"modules/types.html\",\"classes\":\"tsd-kind-module\"},{\"id\":744,\"kind\":4,\"name\":\"fhirclient\",\"url\":\"modules/types.fhirclient.html\",\"classes\":\"tsd-kind-namespace tsd-parent-kind-module\",\"parent\":\"types\"},{\"id\":745,\"kind\":64,\"name\":\"WindowTargetFunction\",\"url\":\"modules/types.fhirclient.html#WindowTargetFunction\",\"classes\":\"tsd-kind-function tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient\"},{\"id\":746,\"kind\":256,\"name\":\"RequestWithSession\",\"url\":\"interfaces/types.fhirclient.RequestWithSession.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient\"},{\"id\":747,\"kind\":1024,\"name\":\"session\",\"url\":\"interfaces/types.fhirclient.RequestWithSession.html#session\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.RequestWithSession\"},{\"id\":748,\"kind\":256,\"name\":\"SMART\",\"url\":\"interfaces/types.fhirclient.SMART.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient\"},{\"id\":749,\"kind\":1024,\"name\":\"options\",\"url\":\"interfaces/types.fhirclient.SMART.html#options\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.SMART\"},{\"id\":750,\"kind\":2048,\"name\":\"ready\",\"url\":\"interfaces/types.fhirclient.SMART.html#ready\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.SMART\"},{\"id\":751,\"kind\":2048,\"name\":\"authorize\",\"url\":\"interfaces/types.fhirclient.SMART.html#authorize\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.SMART\"},{\"id\":752,\"kind\":2048,\"name\":\"init\",\"url\":\"interfaces/types.fhirclient.SMART.html#init\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.SMART\"},{\"id\":753,\"kind\":2048,\"name\":\"client\",\"url\":\"interfaces/types.fhirclient.SMART.html#client\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.SMART\"},{\"id\":754,\"kind\":256,\"name\":\"BrowserFHIRSettings\",\"url\":\"interfaces/types.fhirclient.BrowserFHIRSettings.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient\"},{\"id\":755,\"kind\":256,\"name\":\"CodeValue\",\"url\":\"interfaces/types.fhirclient.CodeValue.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient\"},{\"id\":756,\"kind\":1024,\"name\":\"code\",\"url\":\"interfaces/types.fhirclient.CodeValue.html#code\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.CodeValue\"},{\"id\":757,\"kind\":1024,\"name\":\"value\",\"url\":\"interfaces/types.fhirclient.CodeValue.html#value\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.CodeValue\"},{\"id\":758,\"kind\":256,\"name\":\"ObservationMap\",\"url\":\"interfaces/types.fhirclient.ObservationMap.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient\"},{\"id\":759,\"kind\":256,\"name\":\"Adapter\",\"url\":\"interfaces/types.fhirclient.Adapter.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient\"},{\"id\":760,\"kind\":1024,\"name\":\"options\",\"url\":\"interfaces/types.fhirclient.Adapter.html#options\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.Adapter\"},{\"id\":761,\"kind\":2048,\"name\":\"getUrl\",\"url\":\"interfaces/types.fhirclient.Adapter.html#getUrl\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.Adapter\"},{\"id\":762,\"kind\":2048,\"name\":\"redirect\",\"url\":\"interfaces/types.fhirclient.Adapter.html#redirect\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.Adapter\"},{\"id\":763,\"kind\":2048,\"name\":\"getStorage\",\"url\":\"interfaces/types.fhirclient.Adapter.html#getStorage\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.Adapter\"},{\"id\":764,\"kind\":2048,\"name\":\"relative\",\"url\":\"interfaces/types.fhirclient.Adapter.html#relative\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.Adapter\"},{\"id\":765,\"kind\":2048,\"name\":\"base64decode\",\"url\":\"interfaces/types.fhirclient.Adapter.html#base64decode\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.Adapter\"},{\"id\":766,\"kind\":2048,\"name\":\"base64encode\",\"url\":\"interfaces/types.fhirclient.Adapter.html#base64encode\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.Adapter\"},{\"id\":767,\"kind\":2048,\"name\":\"base64urlencode\",\"url\":\"interfaces/types.fhirclient.Adapter.html#base64urlencode\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.Adapter\"},{\"id\":768,\"kind\":2048,\"name\":\"base64urldecode\",\"url\":\"interfaces/types.fhirclient.Adapter.html#base64urldecode\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.Adapter\"},{\"id\":769,\"kind\":2048,\"name\":\"getSmartApi\",\"url\":\"interfaces/types.fhirclient.Adapter.html#getSmartApi\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.Adapter\"},{\"id\":770,\"kind\":1024,\"name\":\"security\",\"url\":\"interfaces/types.fhirclient.Adapter.html#security\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.Adapter\"},{\"id\":771,\"kind\":65536,\"name\":\"__type\",\"url\":\"interfaces/types.fhirclient.Adapter.html#__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.Adapter\"},{\"id\":772,\"kind\":2048,\"name\":\"randomBytes\",\"url\":\"interfaces/types.fhirclient.Adapter.html#__type.randomBytes\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"types.fhirclient.Adapter.__type\"},{\"id\":773,\"kind\":2048,\"name\":\"digestSha256\",\"url\":\"interfaces/types.fhirclient.Adapter.html#__type.digestSha256\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"types.fhirclient.Adapter.__type\"},{\"id\":774,\"kind\":2048,\"name\":\"generatePKCEChallenge\",\"url\":\"interfaces/types.fhirclient.Adapter.html#__type.generatePKCEChallenge\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"types.fhirclient.Adapter.__type\"},{\"id\":775,\"kind\":2048,\"name\":\"importJWK\",\"url\":\"interfaces/types.fhirclient.Adapter.html#__type.importJWK\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"types.fhirclient.Adapter.__type\"},{\"id\":776,\"kind\":2048,\"name\":\"signCompactJws\",\"url\":\"interfaces/types.fhirclient.Adapter.html#__type.signCompactJws\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"types.fhirclient.Adapter.__type\"},{\"id\":777,\"kind\":256,\"name\":\"Storage\",\"url\":\"interfaces/types.fhirclient.Storage.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient\"},{\"id\":778,\"kind\":2048,\"name\":\"set\",\"url\":\"interfaces/types.fhirclient.Storage.html#set\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.Storage\"},{\"id\":779,\"kind\":2048,\"name\":\"get\",\"url\":\"interfaces/types.fhirclient.Storage.html#get\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.Storage\"},{\"id\":780,\"kind\":2048,\"name\":\"unset\",\"url\":\"interfaces/types.fhirclient.Storage.html#unset\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.Storage\"},{\"id\":781,\"kind\":4194304,\"name\":\"WindowTargetVariable\",\"url\":\"modules/types.fhirclient.html#WindowTargetVariable\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient\"},{\"id\":782,\"kind\":4194304,\"name\":\"WindowTarget\",\"url\":\"modules/types.fhirclient.html#WindowTarget\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient\"},{\"id\":783,\"kind\":4194304,\"name\":\"PkceMode\",\"url\":\"modules/types.fhirclient.html#PkceMode\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient\"},{\"id\":784,\"kind\":4194304,\"name\":\"storageFactory\",\"url\":\"modules/types.fhirclient.html#storageFactory\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient\"},{\"id\":785,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/types.fhirclient.html#storageFactory.__type-1\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-alias\",\"parent\":\"types.fhirclient.storageFactory\"},{\"id\":786,\"kind\":256,\"name\":\"IncludeResponseHint\",\"url\":\"interfaces/types.fhirclient.IncludeResponseHint.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient\"},{\"id\":787,\"kind\":1024,\"name\":\"includeResponse\",\"url\":\"interfaces/types.fhirclient.IncludeResponseHint.html#includeResponse\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.IncludeResponseHint\"},{\"id\":788,\"kind\":4194304,\"name\":\"RequestFunction\",\"url\":\"modules/types.fhirclient.html#RequestFunction\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-namespace tsd-has-type-parameter\",\"parent\":\"types.fhirclient\"},{\"id\":789,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/types.fhirclient.html#RequestFunction.__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-alias tsd-has-type-parameter\",\"parent\":\"types.fhirclient.RequestFunction\"},{\"id\":790,\"kind\":256,\"name\":\"FetchOptions\",\"url\":\"interfaces/types.fhirclient.FetchOptions.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient\"},{\"id\":791,\"kind\":1024,\"name\":\"includeResponse\",\"url\":\"interfaces/types.fhirclient.FetchOptions.html#includeResponse\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.FetchOptions\"},{\"id\":792,\"kind\":256,\"name\":\"CombinedFetchResult\",\"url\":\"interfaces/types.fhirclient.CombinedFetchResult.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace tsd-has-type-parameter\",\"parent\":\"types.fhirclient\"},{\"id\":793,\"kind\":1024,\"name\":\"body\",\"url\":\"interfaces/types.fhirclient.CombinedFetchResult.html#body\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.CombinedFetchResult\"},{\"id\":794,\"kind\":1024,\"name\":\"response\",\"url\":\"interfaces/types.fhirclient.CombinedFetchResult.html#response\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.CombinedFetchResult\"},{\"id\":795,\"kind\":4194304,\"name\":\"FetchResult\",\"url\":\"modules/types.fhirclient.html#FetchResult\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient\"},{\"id\":796,\"kind\":256,\"name\":\"ES384JWK\",\"url\":\"interfaces/types.fhirclient.ES384JWK.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient\"},{\"id\":797,\"kind\":1024,\"name\":\"alg\",\"url\":\"interfaces/types.fhirclient.ES384JWK.html#alg\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-overwrite\",\"parent\":\"types.fhirclient.ES384JWK\"},{\"id\":798,\"kind\":1024,\"name\":\"kty\",\"url\":\"interfaces/types.fhirclient.ES384JWK.html#kty\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-overwrite\",\"parent\":\"types.fhirclient.ES384JWK\"},{\"id\":799,\"kind\":1024,\"name\":\"crv\",\"url\":\"interfaces/types.fhirclient.ES384JWK.html#crv\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-overwrite\",\"parent\":\"types.fhirclient.ES384JWK\"},{\"id\":800,\"kind\":1024,\"name\":\"kid\",\"url\":\"interfaces/types.fhirclient.ES384JWK.html#kid\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.ES384JWK\"},{\"id\":801,\"kind\":1024,\"name\":\"key_ops\",\"url\":\"interfaces/types.fhirclient.ES384JWK.html#key_ops\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-overwrite\",\"parent\":\"types.fhirclient.ES384JWK\"},{\"id\":802,\"kind\":256,\"name\":\"RS384JWK\",\"url\":\"interfaces/types.fhirclient.RS384JWK.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient\"},{\"id\":803,\"kind\":1024,\"name\":\"alg\",\"url\":\"interfaces/types.fhirclient.RS384JWK.html#alg\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-overwrite\",\"parent\":\"types.fhirclient.RS384JWK\"},{\"id\":804,\"kind\":1024,\"name\":\"kty\",\"url\":\"interfaces/types.fhirclient.RS384JWK.html#kty\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-overwrite\",\"parent\":\"types.fhirclient.RS384JWK\"},{\"id\":805,\"kind\":1024,\"name\":\"kid\",\"url\":\"interfaces/types.fhirclient.RS384JWK.html#kid\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.RS384JWK\"},{\"id\":806,\"kind\":1024,\"name\":\"key_ops\",\"url\":\"interfaces/types.fhirclient.RS384JWK.html#key_ops\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-overwrite\",\"parent\":\"types.fhirclient.RS384JWK\"},{\"id\":807,\"kind\":4194304,\"name\":\"JWK\",\"url\":\"modules/types.fhirclient.html#JWK\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient\"},{\"id\":808,\"kind\":256,\"name\":\"RequestOptions\",\"url\":\"interfaces/types.fhirclient.RequestOptions.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient\"},{\"id\":809,\"kind\":1024,\"name\":\"url\",\"url\":\"interfaces/types.fhirclient.RequestOptions.html#url\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.RequestOptions\"},{\"id\":810,\"kind\":1024,\"name\":\"includeResponse\",\"url\":\"interfaces/types.fhirclient.RequestOptions.html#includeResponse\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.RequestOptions\"},{\"id\":811,\"kind\":256,\"name\":\"OAuthSecurityExtensions\",\"url\":\"interfaces/types.fhirclient.OAuthSecurityExtensions.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient\"},{\"id\":812,\"kind\":1024,\"name\":\"registrationUri\",\"url\":\"interfaces/types.fhirclient.OAuthSecurityExtensions.html#registrationUri\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.OAuthSecurityExtensions\"},{\"id\":813,\"kind\":1024,\"name\":\"authorizeUri\",\"url\":\"interfaces/types.fhirclient.OAuthSecurityExtensions.html#authorizeUri\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.OAuthSecurityExtensions\"},{\"id\":814,\"kind\":1024,\"name\":\"tokenUri\",\"url\":\"interfaces/types.fhirclient.OAuthSecurityExtensions.html#tokenUri\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.OAuthSecurityExtensions\"},{\"id\":815,\"kind\":1024,\"name\":\"codeChallengeMethods\",\"url\":\"interfaces/types.fhirclient.OAuthSecurityExtensions.html#codeChallengeMethods\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.OAuthSecurityExtensions\"},{\"id\":816,\"kind\":256,\"name\":\"ClientState\",\"url\":\"interfaces/types.fhirclient.ClientState.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient\"},{\"id\":817,\"kind\":1024,\"name\":\"serverUrl\",\"url\":\"interfaces/types.fhirclient.ClientState.html#serverUrl\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.ClientState\"},{\"id\":818,\"kind\":1024,\"name\":\"clientId\",\"url\":\"interfaces/types.fhirclient.ClientState.html#clientId\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.ClientState\"},{\"id\":819,\"kind\":1024,\"name\":\"redirectUri\",\"url\":\"interfaces/types.fhirclient.ClientState.html#redirectUri\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.ClientState\"},{\"id\":820,\"kind\":1024,\"name\":\"scope\",\"url\":\"interfaces/types.fhirclient.ClientState.html#scope\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.ClientState\"},{\"id\":821,\"kind\":1024,\"name\":\"clientPublicKeySetUrl\",\"url\":\"interfaces/types.fhirclient.ClientState.html#clientPublicKeySetUrl\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.ClientState\"},{\"id\":822,\"kind\":1024,\"name\":\"clientPrivateJwk\",\"url\":\"interfaces/types.fhirclient.ClientState.html#clientPrivateJwk\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.ClientState\"},{\"id\":823,\"kind\":1024,\"name\":\"clientSecret\",\"url\":\"interfaces/types.fhirclient.ClientState.html#clientSecret\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.ClientState\"},{\"id\":824,\"kind\":1024,\"name\":\"tokenResponse\",\"url\":\"interfaces/types.fhirclient.ClientState.html#tokenResponse\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.ClientState\"},{\"id\":825,\"kind\":1024,\"name\":\"username\",\"url\":\"interfaces/types.fhirclient.ClientState.html#username\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.ClientState\"},{\"id\":826,\"kind\":1024,\"name\":\"password\",\"url\":\"interfaces/types.fhirclient.ClientState.html#password\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.ClientState\"},{\"id\":827,\"kind\":1024,\"name\":\"registrationUri\",\"url\":\"interfaces/types.fhirclient.ClientState.html#registrationUri\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.ClientState\"},{\"id\":828,\"kind\":1024,\"name\":\"authorizeUri\",\"url\":\"interfaces/types.fhirclient.ClientState.html#authorizeUri\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.ClientState\"},{\"id\":829,\"kind\":1024,\"name\":\"tokenUri\",\"url\":\"interfaces/types.fhirclient.ClientState.html#tokenUri\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.ClientState\"},{\"id\":830,\"kind\":1024,\"name\":\"key\",\"url\":\"interfaces/types.fhirclient.ClientState.html#key\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.ClientState\"},{\"id\":831,\"kind\":1024,\"name\":\"completeInTarget\",\"url\":\"interfaces/types.fhirclient.ClientState.html#completeInTarget\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.ClientState\"},{\"id\":832,\"kind\":1024,\"name\":\"expiresAt\",\"url\":\"interfaces/types.fhirclient.ClientState.html#expiresAt\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.ClientState\"},{\"id\":833,\"kind\":1024,\"name\":\"codeChallenge\",\"url\":\"interfaces/types.fhirclient.ClientState.html#codeChallenge\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.ClientState\"},{\"id\":834,\"kind\":1024,\"name\":\"codeVerifier\",\"url\":\"interfaces/types.fhirclient.ClientState.html#codeVerifier\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.ClientState\"},{\"id\":835,\"kind\":1024,\"name\":\"refreshTokenWithCredentials\",\"url\":\"interfaces/types.fhirclient.ClientState.html#refreshTokenWithCredentials\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.ClientState\"},{\"id\":836,\"kind\":256,\"name\":\"AuthorizeParams\",\"url\":\"interfaces/types.fhirclient.AuthorizeParams.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient\"},{\"id\":837,\"kind\":1024,\"name\":\"iss\",\"url\":\"interfaces/types.fhirclient.AuthorizeParams.html#iss\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.AuthorizeParams\"},{\"id\":838,\"kind\":1024,\"name\":\"issMatch\",\"url\":\"interfaces/types.fhirclient.AuthorizeParams.html#issMatch\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.AuthorizeParams\"},{\"id\":839,\"kind\":1024,\"name\":\"launch\",\"url\":\"interfaces/types.fhirclient.AuthorizeParams.html#launch\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.AuthorizeParams\"},{\"id\":840,\"kind\":1024,\"name\":\"fhirServiceUrl\",\"url\":\"interfaces/types.fhirclient.AuthorizeParams.html#fhirServiceUrl\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.AuthorizeParams\"},{\"id\":841,\"kind\":1024,\"name\":\"redirectUri\",\"url\":\"interfaces/types.fhirclient.AuthorizeParams.html#redirectUri\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.AuthorizeParams\"},{\"id\":842,\"kind\":1024,\"name\":\"noRedirect\",\"url\":\"interfaces/types.fhirclient.AuthorizeParams.html#noRedirect\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.AuthorizeParams\"},{\"id\":843,\"kind\":1024,\"name\":\"clientId\",\"url\":\"interfaces/types.fhirclient.AuthorizeParams.html#clientId\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.AuthorizeParams\"},{\"id\":844,\"kind\":1024,\"name\":\"scope\",\"url\":\"interfaces/types.fhirclient.AuthorizeParams.html#scope\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.AuthorizeParams\"},{\"id\":845,\"kind\":1024,\"name\":\"patientId\",\"url\":\"interfaces/types.fhirclient.AuthorizeParams.html#patientId\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.AuthorizeParams\"},{\"id\":846,\"kind\":1024,\"name\":\"encounterId\",\"url\":\"interfaces/types.fhirclient.AuthorizeParams.html#encounterId\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.AuthorizeParams\"},{\"id\":847,\"kind\":1024,\"name\":\"clientSecret\",\"url\":\"interfaces/types.fhirclient.AuthorizeParams.html#clientSecret\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.AuthorizeParams\"},{\"id\":848,\"kind\":1024,\"name\":\"clientPublicKeySetUrl\",\"url\":\"interfaces/types.fhirclient.AuthorizeParams.html#clientPublicKeySetUrl\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.AuthorizeParams\"},{\"id\":849,\"kind\":1024,\"name\":\"clientPrivateJwk\",\"url\":\"interfaces/types.fhirclient.AuthorizeParams.html#clientPrivateJwk\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.AuthorizeParams\"},{\"id\":850,\"kind\":1024,\"name\":\"fakeTokenResponse\",\"url\":\"interfaces/types.fhirclient.AuthorizeParams.html#fakeTokenResponse\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.AuthorizeParams\"},{\"id\":851,\"kind\":1024,\"name\":\"target\",\"url\":\"interfaces/types.fhirclient.AuthorizeParams.html#target\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.AuthorizeParams\"},{\"id\":852,\"kind\":1024,\"name\":\"width\",\"url\":\"interfaces/types.fhirclient.AuthorizeParams.html#width\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.AuthorizeParams\"},{\"id\":853,\"kind\":1024,\"name\":\"height\",\"url\":\"interfaces/types.fhirclient.AuthorizeParams.html#height\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.AuthorizeParams\"},{\"id\":854,\"kind\":1024,\"name\":\"completeInTarget\",\"url\":\"interfaces/types.fhirclient.AuthorizeParams.html#completeInTarget\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.AuthorizeParams\"},{\"id\":855,\"kind\":1024,\"name\":\"pkceMode\",\"url\":\"interfaces/types.fhirclient.AuthorizeParams.html#pkceMode\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.AuthorizeParams\"},{\"id\":856,\"kind\":1024,\"name\":\"refreshTokenWithCredentials\",\"url\":\"interfaces/types.fhirclient.AuthorizeParams.html#refreshTokenWithCredentials\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.AuthorizeParams\"},{\"id\":857,\"kind\":256,\"name\":\"ReadyOptions\",\"url\":\"interfaces/types.fhirclient.ReadyOptions.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient\"},{\"id\":858,\"kind\":1024,\"name\":\"privateKey\",\"url\":\"interfaces/types.fhirclient.ReadyOptions.html#privateKey\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.ReadyOptions\"},{\"id\":859,\"kind\":1024,\"name\":\"clientPublicKeySetUrl\",\"url\":\"interfaces/types.fhirclient.ReadyOptions.html#clientPublicKeySetUrl\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.ReadyOptions\"},{\"id\":860,\"kind\":256,\"name\":\"FhirOptions\",\"url\":\"interfaces/types.fhirclient.FhirOptions.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient\"},{\"id\":861,\"kind\":1024,\"name\":\"pageLimit\",\"url\":\"interfaces/types.fhirclient.FhirOptions.html#pageLimit\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.FhirOptions\"},{\"id\":862,\"kind\":2048,\"name\":\"onPage\",\"url\":\"interfaces/types.fhirclient.FhirOptions.html#onPage\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.FhirOptions\"},{\"id\":863,\"kind\":1024,\"name\":\"flat\",\"url\":\"interfaces/types.fhirclient.FhirOptions.html#flat\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.FhirOptions\"},{\"id\":864,\"kind\":1024,\"name\":\"graph\",\"url\":\"interfaces/types.fhirclient.FhirOptions.html#graph\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.FhirOptions\"},{\"id\":865,\"kind\":1024,\"name\":\"resolveReferences\",\"url\":\"interfaces/types.fhirclient.FhirOptions.html#resolveReferences\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.FhirOptions\"},{\"id\":866,\"kind\":1024,\"name\":\"useRefreshToken\",\"url\":\"interfaces/types.fhirclient.FhirOptions.html#useRefreshToken\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.FhirOptions\"},{\"id\":867,\"kind\":256,\"name\":\"TokenResponse\",\"url\":\"interfaces/types.fhirclient.TokenResponse.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient\"},{\"id\":868,\"kind\":1024,\"name\":\"need_patient_banner\",\"url\":\"interfaces/types.fhirclient.TokenResponse.html#need_patient_banner\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.TokenResponse\"},{\"id\":869,\"kind\":1024,\"name\":\"smart_style_url\",\"url\":\"interfaces/types.fhirclient.TokenResponse.html#smart_style_url\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.TokenResponse\"},{\"id\":870,\"kind\":1024,\"name\":\"patient\",\"url\":\"interfaces/types.fhirclient.TokenResponse.html#patient\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.TokenResponse\"},{\"id\":871,\"kind\":1024,\"name\":\"encounter\",\"url\":\"interfaces/types.fhirclient.TokenResponse.html#encounter\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.TokenResponse\"},{\"id\":872,\"kind\":1024,\"name\":\"client_id\",\"url\":\"interfaces/types.fhirclient.TokenResponse.html#client_id\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.TokenResponse\"},{\"id\":873,\"kind\":1024,\"name\":\"token_type\",\"url\":\"interfaces/types.fhirclient.TokenResponse.html#token_type\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.TokenResponse\"},{\"id\":874,\"kind\":1024,\"name\":\"scope\",\"url\":\"interfaces/types.fhirclient.TokenResponse.html#scope\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.TokenResponse\"},{\"id\":875,\"kind\":1024,\"name\":\"expires_in\",\"url\":\"interfaces/types.fhirclient.TokenResponse.html#expires_in\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.TokenResponse\"},{\"id\":876,\"kind\":1024,\"name\":\"access_token\",\"url\":\"interfaces/types.fhirclient.TokenResponse.html#access_token\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.TokenResponse\"},{\"id\":877,\"kind\":1024,\"name\":\"id_token\",\"url\":\"interfaces/types.fhirclient.TokenResponse.html#id_token\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.TokenResponse\"},{\"id\":878,\"kind\":1024,\"name\":\"refresh_token\",\"url\":\"interfaces/types.fhirclient.TokenResponse.html#refresh_token\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.TokenResponse\"},{\"id\":879,\"kind\":256,\"name\":\"IDToken\",\"url\":\"interfaces/types.fhirclient.IDToken.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient\"},{\"id\":880,\"kind\":1024,\"name\":\"profile\",\"url\":\"interfaces/types.fhirclient.IDToken.html#profile\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.IDToken\"},{\"id\":881,\"kind\":1024,\"name\":\"aud\",\"url\":\"interfaces/types.fhirclient.IDToken.html#aud\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.IDToken\"},{\"id\":882,\"kind\":1024,\"name\":\"sub\",\"url\":\"interfaces/types.fhirclient.IDToken.html#sub\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.IDToken\"},{\"id\":883,\"kind\":1024,\"name\":\"iss\",\"url\":\"interfaces/types.fhirclient.IDToken.html#iss\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.IDToken\"},{\"id\":884,\"kind\":1024,\"name\":\"iat\",\"url\":\"interfaces/types.fhirclient.IDToken.html#iat\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.IDToken\"},{\"id\":885,\"kind\":1024,\"name\":\"exp\",\"url\":\"interfaces/types.fhirclient.IDToken.html#exp\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.IDToken\"},{\"id\":886,\"kind\":256,\"name\":\"JsonObject\",\"url\":\"interfaces/types.fhirclient.JsonObject.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient\"},{\"id\":887,\"kind\":4194304,\"name\":\"JsonPrimitive\",\"url\":\"modules/types.fhirclient.html#JsonPrimitive\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient\"},{\"id\":888,\"kind\":4194304,\"name\":\"JsonValue\",\"url\":\"modules/types.fhirclient.html#JsonValue\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient\"},{\"id\":889,\"kind\":4194304,\"name\":\"JsonArray\",\"url\":\"modules/types.fhirclient.html#JsonArray\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient\"},{\"id\":890,\"kind\":256,\"name\":\"JsonPatchAdd\",\"url\":\"interfaces/types.fhirclient.JsonPatchAdd.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient\"},{\"id\":891,\"kind\":1024,\"name\":\"op\",\"url\":\"interfaces/types.fhirclient.JsonPatchAdd.html#op\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.JsonPatchAdd\"},{\"id\":892,\"kind\":1024,\"name\":\"path\",\"url\":\"interfaces/types.fhirclient.JsonPatchAdd.html#path\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.JsonPatchAdd\"},{\"id\":893,\"kind\":1024,\"name\":\"value\",\"url\":\"interfaces/types.fhirclient.JsonPatchAdd.html#value\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.JsonPatchAdd\"},{\"id\":894,\"kind\":256,\"name\":\"JsonPatchReplace\",\"url\":\"interfaces/types.fhirclient.JsonPatchReplace.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient\"},{\"id\":895,\"kind\":1024,\"name\":\"op\",\"url\":\"interfaces/types.fhirclient.JsonPatchReplace.html#op\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.JsonPatchReplace\"},{\"id\":896,\"kind\":1024,\"name\":\"path\",\"url\":\"interfaces/types.fhirclient.JsonPatchReplace.html#path\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.JsonPatchReplace\"},{\"id\":897,\"kind\":1024,\"name\":\"value\",\"url\":\"interfaces/types.fhirclient.JsonPatchReplace.html#value\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.JsonPatchReplace\"},{\"id\":898,\"kind\":256,\"name\":\"JsonPatchTest\",\"url\":\"interfaces/types.fhirclient.JsonPatchTest.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient\"},{\"id\":899,\"kind\":1024,\"name\":\"op\",\"url\":\"interfaces/types.fhirclient.JsonPatchTest.html#op\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.JsonPatchTest\"},{\"id\":900,\"kind\":1024,\"name\":\"path\",\"url\":\"interfaces/types.fhirclient.JsonPatchTest.html#path\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.JsonPatchTest\"},{\"id\":901,\"kind\":1024,\"name\":\"value\",\"url\":\"interfaces/types.fhirclient.JsonPatchTest.html#value\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.JsonPatchTest\"},{\"id\":902,\"kind\":256,\"name\":\"JsonPatchMove\",\"url\":\"interfaces/types.fhirclient.JsonPatchMove.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient\"},{\"id\":903,\"kind\":1024,\"name\":\"op\",\"url\":\"interfaces/types.fhirclient.JsonPatchMove.html#op\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.JsonPatchMove\"},{\"id\":904,\"kind\":1024,\"name\":\"path\",\"url\":\"interfaces/types.fhirclient.JsonPatchMove.html#path\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.JsonPatchMove\"},{\"id\":905,\"kind\":1024,\"name\":\"from\",\"url\":\"interfaces/types.fhirclient.JsonPatchMove.html#from\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.JsonPatchMove\"},{\"id\":906,\"kind\":256,\"name\":\"JsonPatchCopy\",\"url\":\"interfaces/types.fhirclient.JsonPatchCopy.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient\"},{\"id\":907,\"kind\":1024,\"name\":\"op\",\"url\":\"interfaces/types.fhirclient.JsonPatchCopy.html#op\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.JsonPatchCopy\"},{\"id\":908,\"kind\":1024,\"name\":\"path\",\"url\":\"interfaces/types.fhirclient.JsonPatchCopy.html#path\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.JsonPatchCopy\"},{\"id\":909,\"kind\":1024,\"name\":\"from\",\"url\":\"interfaces/types.fhirclient.JsonPatchCopy.html#from\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.JsonPatchCopy\"},{\"id\":910,\"kind\":256,\"name\":\"JsonPatchRemove\",\"url\":\"interfaces/types.fhirclient.JsonPatchRemove.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient\"},{\"id\":911,\"kind\":1024,\"name\":\"op\",\"url\":\"interfaces/types.fhirclient.JsonPatchRemove.html#op\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.JsonPatchRemove\"},{\"id\":912,\"kind\":1024,\"name\":\"path\",\"url\":\"interfaces/types.fhirclient.JsonPatchRemove.html#path\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.JsonPatchRemove\"},{\"id\":913,\"kind\":4194304,\"name\":\"JsonPatchOperation\",\"url\":\"modules/types.fhirclient.html#JsonPatchOperation\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient\"},{\"id\":914,\"kind\":4194304,\"name\":\"JsonPatch\",\"url\":\"modules/types.fhirclient.html#JsonPatch\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient\"},{\"id\":915,\"kind\":4194304,\"name\":\"codeChallengeMethod\",\"url\":\"modules/types.fhirclient.html#codeChallengeMethod\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient\"},{\"id\":916,\"kind\":4194304,\"name\":\"SMARTAuthenticationMethod\",\"url\":\"modules/types.fhirclient.html#SMARTAuthenticationMethod\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient\"},{\"id\":917,\"kind\":4194304,\"name\":\"launchMode\",\"url\":\"modules/types.fhirclient.html#launchMode\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient\"},{\"id\":918,\"kind\":4194304,\"name\":\"clientType\",\"url\":\"modules/types.fhirclient.html#clientType\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient\"},{\"id\":919,\"kind\":4194304,\"name\":\"singleSignOn\",\"url\":\"modules/types.fhirclient.html#singleSignOn\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient\"},{\"id\":920,\"kind\":4194304,\"name\":\"launchContext\",\"url\":\"modules/types.fhirclient.html#launchContext\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient\"},{\"id\":921,\"kind\":4194304,\"name\":\"launchContextEHR\",\"url\":\"modules/types.fhirclient.html#launchContextEHR\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient\"},{\"id\":922,\"kind\":4194304,\"name\":\"launchContextStandalone\",\"url\":\"modules/types.fhirclient.html#launchContextStandalone\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient\"},{\"id\":923,\"kind\":4194304,\"name\":\"permissions\",\"url\":\"modules/types.fhirclient.html#permissions\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient\"},{\"id\":924,\"kind\":256,\"name\":\"WellKnownSmartConfiguration\",\"url\":\"interfaces/types.fhirclient.WellKnownSmartConfiguration.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient\"},{\"id\":925,\"kind\":1024,\"name\":\"authorization_endpoint\",\"url\":\"interfaces/types.fhirclient.WellKnownSmartConfiguration.html#authorization_endpoint\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.WellKnownSmartConfiguration\"},{\"id\":926,\"kind\":1024,\"name\":\"token_endpoint\",\"url\":\"interfaces/types.fhirclient.WellKnownSmartConfiguration.html#token_endpoint\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.WellKnownSmartConfiguration\"},{\"id\":927,\"kind\":1024,\"name\":\"registration_endpoint\",\"url\":\"interfaces/types.fhirclient.WellKnownSmartConfiguration.html#registration_endpoint\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.WellKnownSmartConfiguration\"},{\"id\":928,\"kind\":1024,\"name\":\"management_endpoint\",\"url\":\"interfaces/types.fhirclient.WellKnownSmartConfiguration.html#management_endpoint\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.WellKnownSmartConfiguration\"},{\"id\":929,\"kind\":1024,\"name\":\"introspection_endpoint\",\"url\":\"interfaces/types.fhirclient.WellKnownSmartConfiguration.html#introspection_endpoint\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.WellKnownSmartConfiguration\"},{\"id\":930,\"kind\":1024,\"name\":\"revocation_endpoint\",\"url\":\"interfaces/types.fhirclient.WellKnownSmartConfiguration.html#revocation_endpoint\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.WellKnownSmartConfiguration\"},{\"id\":931,\"kind\":1024,\"name\":\"code_challenge_methods_supported\",\"url\":\"interfaces/types.fhirclient.WellKnownSmartConfiguration.html#code_challenge_methods_supported\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.WellKnownSmartConfiguration\"},{\"id\":932,\"kind\":1024,\"name\":\"token_endpoint_auth_methods\",\"url\":\"interfaces/types.fhirclient.WellKnownSmartConfiguration.html#token_endpoint_auth_methods\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.WellKnownSmartConfiguration\"},{\"id\":933,\"kind\":1024,\"name\":\"scopes_supported\",\"url\":\"interfaces/types.fhirclient.WellKnownSmartConfiguration.html#scopes_supported\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.WellKnownSmartConfiguration\"},{\"id\":934,\"kind\":1024,\"name\":\"response_types_supported\",\"url\":\"interfaces/types.fhirclient.WellKnownSmartConfiguration.html#response_types_supported\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.WellKnownSmartConfiguration\"},{\"id\":935,\"kind\":1024,\"name\":\"capabilities\",\"url\":\"interfaces/types.fhirclient.WellKnownSmartConfiguration.html#capabilities\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.WellKnownSmartConfiguration\"},{\"id\":936,\"kind\":4,\"name\":\"FHIR\",\"url\":\"modules/types.fhirclient.FHIR.html\",\"classes\":\"tsd-kind-namespace tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient\"},{\"id\":937,\"kind\":4194304,\"name\":\"id\",\"url\":\"modules/types.fhirclient.FHIR.html#id\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient.FHIR\"},{\"id\":938,\"kind\":4194304,\"name\":\"uri\",\"url\":\"modules/types.fhirclient.FHIR.html#uri\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient.FHIR\"},{\"id\":939,\"kind\":4194304,\"name\":\"code\",\"url\":\"modules/types.fhirclient.FHIR.html#code\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient.FHIR\"},{\"id\":940,\"kind\":4194304,\"name\":\"instant\",\"url\":\"modules/types.fhirclient.FHIR.html#instant\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient.FHIR\"},{\"id\":941,\"kind\":4194304,\"name\":\"dateTime\",\"url\":\"modules/types.fhirclient.FHIR.html#dateTime\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient.FHIR\"},{\"id\":942,\"kind\":4194304,\"name\":\"unsignedInt\",\"url\":\"modules/types.fhirclient.FHIR.html#unsignedInt\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient.FHIR\"},{\"id\":943,\"kind\":4194304,\"name\":\"valueX\",\"url\":\"modules/types.fhirclient.FHIR.html#valueX\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient.FHIR\"},{\"id\":944,\"kind\":256,\"name\":\"Element\",\"url\":\"interfaces/types.fhirclient.FHIR.Element.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient.FHIR\"},{\"id\":945,\"kind\":1024,\"name\":\"id\",\"url\":\"interfaces/types.fhirclient.FHIR.Element.html#id\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.FHIR.Element\"},{\"id\":946,\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/types.fhirclient.FHIR.Element.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.FHIR.Element\"},{\"id\":947,\"kind\":256,\"name\":\"Extension\",\"url\":\"interfaces/types.fhirclient.FHIR.Extension.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace tsd-has-type-parameter\",\"parent\":\"types.fhirclient.FHIR\"},{\"id\":948,\"kind\":1024,\"name\":\"url\",\"url\":\"interfaces/types.fhirclient.FHIR.Extension.html#url\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.FHIR.Extension\"},{\"id\":949,\"kind\":1024,\"name\":\"id\",\"url\":\"interfaces/types.fhirclient.FHIR.Extension.html#id\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"types.fhirclient.FHIR.Extension\"},{\"id\":950,\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/types.fhirclient.FHIR.Extension.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"types.fhirclient.FHIR.Extension\"},{\"id\":951,\"kind\":256,\"name\":\"CapabilityStatement\",\"url\":\"interfaces/types.fhirclient.FHIR.CapabilityStatement.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient.FHIR\"},{\"id\":952,\"kind\":1024,\"name\":\"resourceType\",\"url\":\"interfaces/types.fhirclient.FHIR.CapabilityStatement.html#resourceType\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.FHIR.CapabilityStatement\"},{\"id\":953,\"kind\":1024,\"name\":\"fhirVersion\",\"url\":\"interfaces/types.fhirclient.FHIR.CapabilityStatement.html#fhirVersion\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.FHIR.CapabilityStatement\"},{\"id\":954,\"kind\":1024,\"name\":\"rest\",\"url\":\"interfaces/types.fhirclient.FHIR.CapabilityStatement.html#rest\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.FHIR.CapabilityStatement\"},{\"id\":955,\"kind\":256,\"name\":\"Resource\",\"url\":\"interfaces/types.fhirclient.FHIR.Resource.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient.FHIR\"},{\"id\":956,\"kind\":1024,\"name\":\"id\",\"url\":\"interfaces/types.fhirclient.FHIR.Resource.html#id\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.FHIR.Resource\"},{\"id\":957,\"kind\":1024,\"name\":\"resourceType\",\"url\":\"interfaces/types.fhirclient.FHIR.Resource.html#resourceType\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.FHIR.Resource\"},{\"id\":958,\"kind\":1024,\"name\":\"meta\",\"url\":\"interfaces/types.fhirclient.FHIR.Resource.html#meta\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.FHIR.Resource\"},{\"id\":959,\"kind\":1024,\"name\":\"implicitRules\",\"url\":\"interfaces/types.fhirclient.FHIR.Resource.html#implicitRules\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.FHIR.Resource\"},{\"id\":960,\"kind\":1024,\"name\":\"language\",\"url\":\"interfaces/types.fhirclient.FHIR.Resource.html#language\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.FHIR.Resource\"},{\"id\":961,\"kind\":256,\"name\":\"Meta\",\"url\":\"interfaces/types.fhirclient.FHIR.Meta.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient.FHIR\"},{\"id\":962,\"kind\":1024,\"name\":\"lastUpdated\",\"url\":\"interfaces/types.fhirclient.FHIR.Meta.html#lastUpdated\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.FHIR.Meta\"},{\"id\":963,\"kind\":1024,\"name\":\"id\",\"url\":\"interfaces/types.fhirclient.FHIR.Meta.html#id\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"types.fhirclient.FHIR.Meta\"},{\"id\":964,\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/types.fhirclient.FHIR.Meta.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"types.fhirclient.FHIR.Meta\"},{\"id\":965,\"kind\":256,\"name\":\"Observation\",\"url\":\"interfaces/types.fhirclient.FHIR.Observation.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient.FHIR\"},{\"id\":966,\"kind\":1024,\"name\":\"resourceType\",\"url\":\"interfaces/types.fhirclient.FHIR.Observation.html#resourceType\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-overwrite\",\"parent\":\"types.fhirclient.FHIR.Observation\"},{\"id\":967,\"kind\":1024,\"name\":\"id\",\"url\":\"interfaces/types.fhirclient.FHIR.Observation.html#id\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"types.fhirclient.FHIR.Observation\"},{\"id\":968,\"kind\":1024,\"name\":\"meta\",\"url\":\"interfaces/types.fhirclient.FHIR.Observation.html#meta\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"types.fhirclient.FHIR.Observation\"},{\"id\":969,\"kind\":1024,\"name\":\"implicitRules\",\"url\":\"interfaces/types.fhirclient.FHIR.Observation.html#implicitRules\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"types.fhirclient.FHIR.Observation\"},{\"id\":970,\"kind\":1024,\"name\":\"language\",\"url\":\"interfaces/types.fhirclient.FHIR.Observation.html#language\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"types.fhirclient.FHIR.Observation\"},{\"id\":971,\"kind\":256,\"name\":\"Patient\",\"url\":\"interfaces/types.fhirclient.FHIR.Patient.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient.FHIR\"},{\"id\":972,\"kind\":1024,\"name\":\"resourceType\",\"url\":\"interfaces/types.fhirclient.FHIR.Patient.html#resourceType\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-overwrite\",\"parent\":\"types.fhirclient.FHIR.Patient\"},{\"id\":973,\"kind\":1024,\"name\":\"id\",\"url\":\"interfaces/types.fhirclient.FHIR.Patient.html#id\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"types.fhirclient.FHIR.Patient\"},{\"id\":974,\"kind\":1024,\"name\":\"meta\",\"url\":\"interfaces/types.fhirclient.FHIR.Patient.html#meta\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"types.fhirclient.FHIR.Patient\"},{\"id\":975,\"kind\":1024,\"name\":\"implicitRules\",\"url\":\"interfaces/types.fhirclient.FHIR.Patient.html#implicitRules\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"types.fhirclient.FHIR.Patient\"},{\"id\":976,\"kind\":1024,\"name\":\"language\",\"url\":\"interfaces/types.fhirclient.FHIR.Patient.html#language\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"types.fhirclient.FHIR.Patient\"},{\"id\":977,\"kind\":256,\"name\":\"Practitioner\",\"url\":\"interfaces/types.fhirclient.FHIR.Practitioner.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient.FHIR\"},{\"id\":978,\"kind\":1024,\"name\":\"resourceType\",\"url\":\"interfaces/types.fhirclient.FHIR.Practitioner.html#resourceType\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-overwrite\",\"parent\":\"types.fhirclient.FHIR.Practitioner\"},{\"id\":979,\"kind\":1024,\"name\":\"id\",\"url\":\"interfaces/types.fhirclient.FHIR.Practitioner.html#id\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"types.fhirclient.FHIR.Practitioner\"},{\"id\":980,\"kind\":1024,\"name\":\"meta\",\"url\":\"interfaces/types.fhirclient.FHIR.Practitioner.html#meta\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"types.fhirclient.FHIR.Practitioner\"},{\"id\":981,\"kind\":1024,\"name\":\"implicitRules\",\"url\":\"interfaces/types.fhirclient.FHIR.Practitioner.html#implicitRules\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"types.fhirclient.FHIR.Practitioner\"},{\"id\":982,\"kind\":1024,\"name\":\"language\",\"url\":\"interfaces/types.fhirclient.FHIR.Practitioner.html#language\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"types.fhirclient.FHIR.Practitioner\"},{\"id\":983,\"kind\":256,\"name\":\"RelatedPerson\",\"url\":\"interfaces/types.fhirclient.FHIR.RelatedPerson.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient.FHIR\"},{\"id\":984,\"kind\":1024,\"name\":\"resourceType\",\"url\":\"interfaces/types.fhirclient.FHIR.RelatedPerson.html#resourceType\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-overwrite\",\"parent\":\"types.fhirclient.FHIR.RelatedPerson\"},{\"id\":985,\"kind\":1024,\"name\":\"id\",\"url\":\"interfaces/types.fhirclient.FHIR.RelatedPerson.html#id\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"types.fhirclient.FHIR.RelatedPerson\"},{\"id\":986,\"kind\":1024,\"name\":\"meta\",\"url\":\"interfaces/types.fhirclient.FHIR.RelatedPerson.html#meta\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"types.fhirclient.FHIR.RelatedPerson\"},{\"id\":987,\"kind\":1024,\"name\":\"implicitRules\",\"url\":\"interfaces/types.fhirclient.FHIR.RelatedPerson.html#implicitRules\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"types.fhirclient.FHIR.RelatedPerson\"},{\"id\":988,\"kind\":1024,\"name\":\"language\",\"url\":\"interfaces/types.fhirclient.FHIR.RelatedPerson.html#language\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"types.fhirclient.FHIR.RelatedPerson\"},{\"id\":989,\"kind\":256,\"name\":\"Encounter\",\"url\":\"interfaces/types.fhirclient.FHIR.Encounter.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient.FHIR\"},{\"id\":990,\"kind\":1024,\"name\":\"resourceType\",\"url\":\"interfaces/types.fhirclient.FHIR.Encounter.html#resourceType\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-overwrite\",\"parent\":\"types.fhirclient.FHIR.Encounter\"},{\"id\":991,\"kind\":1024,\"name\":\"id\",\"url\":\"interfaces/types.fhirclient.FHIR.Encounter.html#id\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"types.fhirclient.FHIR.Encounter\"},{\"id\":992,\"kind\":1024,\"name\":\"meta\",\"url\":\"interfaces/types.fhirclient.FHIR.Encounter.html#meta\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"types.fhirclient.FHIR.Encounter\"},{\"id\":993,\"kind\":1024,\"name\":\"implicitRules\",\"url\":\"interfaces/types.fhirclient.FHIR.Encounter.html#implicitRules\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"types.fhirclient.FHIR.Encounter\"},{\"id\":994,\"kind\":1024,\"name\":\"language\",\"url\":\"interfaces/types.fhirclient.FHIR.Encounter.html#language\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"types.fhirclient.FHIR.Encounter\"},{\"id\":995,\"kind\":256,\"name\":\"Period\",\"url\":\"interfaces/types.fhirclient.FHIR.Period.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient.FHIR\"},{\"id\":996,\"kind\":1024,\"name\":\"start\",\"url\":\"interfaces/types.fhirclient.FHIR.Period.html#start\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.FHIR.Period\"},{\"id\":997,\"kind\":1024,\"name\":\"end\",\"url\":\"interfaces/types.fhirclient.FHIR.Period.html#end\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.FHIR.Period\"},{\"id\":998,\"kind\":1024,\"name\":\"id\",\"url\":\"interfaces/types.fhirclient.FHIR.Period.html#id\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"types.fhirclient.FHIR.Period\"},{\"id\":999,\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/types.fhirclient.FHIR.Period.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"types.fhirclient.FHIR.Period\"},{\"id\":1000,\"kind\":256,\"name\":\"BackboneElement\",\"url\":\"interfaces/types.fhirclient.FHIR.BackboneElement.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient.FHIR\"},{\"id\":1001,\"kind\":1024,\"name\":\"modifierExtension\",\"url\":\"interfaces/types.fhirclient.FHIR.BackboneElement.html#modifierExtension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.FHIR.BackboneElement\"},{\"id\":1002,\"kind\":1024,\"name\":\"id\",\"url\":\"interfaces/types.fhirclient.FHIR.BackboneElement.html#id\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"types.fhirclient.FHIR.BackboneElement\"},{\"id\":1003,\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/types.fhirclient.FHIR.BackboneElement.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"types.fhirclient.FHIR.BackboneElement\"},{\"id\":1004,\"kind\":256,\"name\":\"CodeableConcept\",\"url\":\"interfaces/types.fhirclient.FHIR.CodeableConcept.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient.FHIR\"},{\"id\":1005,\"kind\":1024,\"name\":\"coding\",\"url\":\"interfaces/types.fhirclient.FHIR.CodeableConcept.html#coding\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.FHIR.CodeableConcept\"},{\"id\":1006,\"kind\":1024,\"name\":\"text\",\"url\":\"interfaces/types.fhirclient.FHIR.CodeableConcept.html#text\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.FHIR.CodeableConcept\"},{\"id\":1007,\"kind\":1024,\"name\":\"id\",\"url\":\"interfaces/types.fhirclient.FHIR.CodeableConcept.html#id\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"types.fhirclient.FHIR.CodeableConcept\"},{\"id\":1008,\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/types.fhirclient.FHIR.CodeableConcept.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"types.fhirclient.FHIR.CodeableConcept\"},{\"id\":1009,\"kind\":256,\"name\":\"Coding\",\"url\":\"interfaces/types.fhirclient.FHIR.Coding.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient.FHIR\"},{\"id\":1010,\"kind\":1024,\"name\":\"system\",\"url\":\"interfaces/types.fhirclient.FHIR.Coding.html#system\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.FHIR.Coding\"},{\"id\":1011,\"kind\":1024,\"name\":\"version\",\"url\":\"interfaces/types.fhirclient.FHIR.Coding.html#version\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.FHIR.Coding\"},{\"id\":1012,\"kind\":1024,\"name\":\"code\",\"url\":\"interfaces/types.fhirclient.FHIR.Coding.html#code\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.FHIR.Coding\"},{\"id\":1013,\"kind\":1024,\"name\":\"display\",\"url\":\"interfaces/types.fhirclient.FHIR.Coding.html#display\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.FHIR.Coding\"},{\"id\":1014,\"kind\":1024,\"name\":\"userSelected\",\"url\":\"interfaces/types.fhirclient.FHIR.Coding.html#userSelected\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.FHIR.Coding\"},{\"id\":1015,\"kind\":1024,\"name\":\"id\",\"url\":\"interfaces/types.fhirclient.FHIR.Coding.html#id\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"types.fhirclient.FHIR.Coding\"},{\"id\":1016,\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/types.fhirclient.FHIR.Coding.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"types.fhirclient.FHIR.Coding\"},{\"id\":1017,\"kind\":256,\"name\":\"Identifier\",\"url\":\"interfaces/types.fhirclient.FHIR.Identifier.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient.FHIR\"},{\"id\":1018,\"kind\":1024,\"name\":\"use\",\"url\":\"interfaces/types.fhirclient.FHIR.Identifier.html#use\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.FHIR.Identifier\"},{\"id\":1019,\"kind\":1024,\"name\":\"type\",\"url\":\"interfaces/types.fhirclient.FHIR.Identifier.html#type\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.FHIR.Identifier\"},{\"id\":1020,\"kind\":1024,\"name\":\"system\",\"url\":\"interfaces/types.fhirclient.FHIR.Identifier.html#system\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.FHIR.Identifier\"},{\"id\":1021,\"kind\":1024,\"name\":\"value\",\"url\":\"interfaces/types.fhirclient.FHIR.Identifier.html#value\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.FHIR.Identifier\"},{\"id\":1022,\"kind\":1024,\"name\":\"period\",\"url\":\"interfaces/types.fhirclient.FHIR.Identifier.html#period\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.FHIR.Identifier\"},{\"id\":1023,\"kind\":1024,\"name\":\"assigner\",\"url\":\"interfaces/types.fhirclient.FHIR.Identifier.html#assigner\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.FHIR.Identifier\"},{\"id\":1024,\"kind\":1024,\"name\":\"id\",\"url\":\"interfaces/types.fhirclient.FHIR.Identifier.html#id\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"types.fhirclient.FHIR.Identifier\"},{\"id\":1025,\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/types.fhirclient.FHIR.Identifier.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"types.fhirclient.FHIR.Identifier\"},{\"id\":1026,\"kind\":256,\"name\":\"Reference\",\"url\":\"interfaces/types.fhirclient.FHIR.Reference.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient.FHIR\"},{\"id\":1027,\"kind\":1024,\"name\":\"reference\",\"url\":\"interfaces/types.fhirclient.FHIR.Reference.html#reference\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.FHIR.Reference\"},{\"id\":1028,\"kind\":1024,\"name\":\"identifier\",\"url\":\"interfaces/types.fhirclient.FHIR.Reference.html#identifier\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.FHIR.Reference\"},{\"id\":1029,\"kind\":1024,\"name\":\"display\",\"url\":\"interfaces/types.fhirclient.FHIR.Reference.html#display\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.FHIR.Reference\"},{\"id\":1030,\"kind\":1024,\"name\":\"id\",\"url\":\"interfaces/types.fhirclient.FHIR.Reference.html#id\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"types.fhirclient.FHIR.Reference\"},{\"id\":1031,\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/types.fhirclient.FHIR.Reference.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"types.fhirclient.FHIR.Reference\"},{\"id\":1032,\"kind\":256,\"name\":\"BundleLink\",\"url\":\"interfaces/types.fhirclient.FHIR.BundleLink.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient.FHIR\"},{\"id\":1033,\"kind\":1024,\"name\":\"relation\",\"url\":\"interfaces/types.fhirclient.FHIR.BundleLink.html#relation\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.FHIR.BundleLink\"},{\"id\":1034,\"kind\":1024,\"name\":\"url\",\"url\":\"interfaces/types.fhirclient.FHIR.BundleLink.html#url\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.FHIR.BundleLink\"},{\"id\":1035,\"kind\":1024,\"name\":\"modifierExtension\",\"url\":\"interfaces/types.fhirclient.FHIR.BundleLink.html#modifierExtension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"types.fhirclient.FHIR.BundleLink\"},{\"id\":1036,\"kind\":1024,\"name\":\"id\",\"url\":\"interfaces/types.fhirclient.FHIR.BundleLink.html#id\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"types.fhirclient.FHIR.BundleLink\"},{\"id\":1037,\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/types.fhirclient.FHIR.BundleLink.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"types.fhirclient.FHIR.BundleLink\"},{\"id\":1038,\"kind\":256,\"name\":\"BundleEntry\",\"url\":\"interfaces/types.fhirclient.FHIR.BundleEntry.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient.FHIR\"},{\"id\":1039,\"kind\":1024,\"name\":\"fullUrl\",\"url\":\"interfaces/types.fhirclient.FHIR.BundleEntry.html#fullUrl\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.FHIR.BundleEntry\"},{\"id\":1040,\"kind\":1024,\"name\":\"resource\",\"url\":\"interfaces/types.fhirclient.FHIR.BundleEntry.html#resource\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.FHIR.BundleEntry\"},{\"id\":1041,\"kind\":1024,\"name\":\"modifierExtension\",\"url\":\"interfaces/types.fhirclient.FHIR.BundleEntry.html#modifierExtension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"types.fhirclient.FHIR.BundleEntry\"},{\"id\":1042,\"kind\":1024,\"name\":\"id\",\"url\":\"interfaces/types.fhirclient.FHIR.BundleEntry.html#id\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"types.fhirclient.FHIR.BundleEntry\"},{\"id\":1043,\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/types.fhirclient.FHIR.BundleEntry.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"types.fhirclient.FHIR.BundleEntry\"},{\"id\":1044,\"kind\":256,\"name\":\"Bundle\",\"url\":\"interfaces/types.fhirclient.FHIR.Bundle.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient.FHIR\"},{\"id\":1045,\"kind\":1024,\"name\":\"identifier\",\"url\":\"interfaces/types.fhirclient.FHIR.Bundle.html#identifier\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.FHIR.Bundle\"},{\"id\":1046,\"kind\":1024,\"name\":\"type\",\"url\":\"interfaces/types.fhirclient.FHIR.Bundle.html#type\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.FHIR.Bundle\"},{\"id\":1047,\"kind\":1024,\"name\":\"total\",\"url\":\"interfaces/types.fhirclient.FHIR.Bundle.html#total\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.FHIR.Bundle\"},{\"id\":1048,\"kind\":1024,\"name\":\"link\",\"url\":\"interfaces/types.fhirclient.FHIR.Bundle.html#link\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.FHIR.Bundle\"},{\"id\":1049,\"kind\":1024,\"name\":\"entry\",\"url\":\"interfaces/types.fhirclient.FHIR.Bundle.html#entry\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.FHIR.Bundle\"},{\"id\":1050,\"kind\":1024,\"name\":\"id\",\"url\":\"interfaces/types.fhirclient.FHIR.Bundle.html#id\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"types.fhirclient.FHIR.Bundle\"},{\"id\":1051,\"kind\":1024,\"name\":\"resourceType\",\"url\":\"interfaces/types.fhirclient.FHIR.Bundle.html#resourceType\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"types.fhirclient.FHIR.Bundle\"},{\"id\":1052,\"kind\":1024,\"name\":\"meta\",\"url\":\"interfaces/types.fhirclient.FHIR.Bundle.html#meta\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"types.fhirclient.FHIR.Bundle\"},{\"id\":1053,\"kind\":1024,\"name\":\"implicitRules\",\"url\":\"interfaces/types.fhirclient.FHIR.Bundle.html#implicitRules\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"types.fhirclient.FHIR.Bundle\"},{\"id\":1054,\"kind\":1024,\"name\":\"language\",\"url\":\"interfaces/types.fhirclient.FHIR.Bundle.html#language\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"types.fhirclient.FHIR.Bundle\"},{\"id\":1055,\"kind\":16777216,\"name\":\"randomBytes\",\"url\":\"modules/lib_server.html#randomBytes\",\"classes\":\"tsd-kind-reference tsd-parent-kind-module\",\"parent\":\"lib/server\"},{\"id\":1056,\"kind\":16777216,\"name\":\"randomBytes\",\"url\":\"modules/security_server.html#randomBytes\",\"classes\":\"tsd-kind-reference tsd-parent-kind-module\",\"parent\":\"security/server\"},{\"id\":1057,\"kind\":16777216,\"name\":\"KEY\",\"url\":\"modules/smart.html#KEY\",\"classes\":\"tsd-kind-reference tsd-parent-kind-module\",\"parent\":\"smart\"}],\"index\":{\"version\":\"2.3.9\",\"fields\":[\"name\",\"parent\"],\"fieldVectors\":[[\"name/0\",[0,50.933]],[\"parent/0\",[]],[\"name/1\",[1,39.447]],[\"parent/1\",[0,5.027]],[\"name/2\",[2,44.394]],[\"parent/2\",[3,3.409]],[\"name/3\",[4,57.123]],[\"parent/3\",[3,3.409]],[\"name/4\",[5,65.596]],[\"parent/4\",[3,3.409]],[\"name/5\",[6,49.502]],[\"parent/5\",[3,3.409]],[\"name/6\",[7,31.474]],[\"parent/6\",[3,3.409]],[\"name/7\",[8,31.044]],[\"parent/7\",[9,4.382]],[\"name/8\",[10,47.138]],[\"parent/8\",[9,4.382]],[\"name/9\",[11,46.137]],[\"parent/9\",[9,4.382]],[\"name/10\",[12,49.502]],[\"parent/10\",[3,3.409]],[\"name/11\",[7,31.474]],[\"parent/11\",[3,3.409]],[\"name/12\",[8,31.044]],[\"parent/12\",[9,4.382]],[\"name/13\",[10,47.138]],[\"parent/13\",[9,4.382]],[\"name/14\",[13,57.123]],[\"parent/14\",[3,3.409]],[\"name/15\",[7,31.474]],[\"parent/15\",[3,3.409]],[\"name/16\",[8,31.044]],[\"parent/16\",[9,4.382]],[\"name/17\",[10,47.138]],[\"parent/17\",[9,4.382]],[\"name/18\",[14,57.123]],[\"parent/18\",[9,4.382]],[\"name/19\",[15,39.947]],[\"parent/19\",[9,4.382]],[\"name/20\",[16,60.488]],[\"parent/20\",[3,3.409]],[\"name/21\",[17,57.123]],[\"parent/21\",[3,3.409]],[\"name/22\",[18,57.123]],[\"parent/22\",[3,3.409]],[\"name/23\",[19,57.123]],[\"parent/23\",[3,3.409]],[\"name/24\",[20,57.123]],[\"parent/24\",[3,3.409]],[\"name/25\",[21,57.123]],[\"parent/25\",[3,3.409]],[\"name/26\",[22,57.123]],[\"parent/26\",[3,3.409]],[\"name/27\",[23,57.123]],[\"parent/27\",[3,3.409]],[\"name/28\",[24,60.488]],[\"parent/28\",[3,3.409]],[\"name/29\",[25,57.123]],[\"parent/29\",[3,3.409]],[\"name/30\",[26,57.123]],[\"parent/30\",[3,3.409]],[\"name/31\",[27,57.123]],[\"parent/31\",[3,3.409]],[\"name/32\",[28,57.123]],[\"parent/32\",[3,3.409]],[\"name/33\",[11,46.137]],[\"parent/33\",[3,3.409]],[\"name/34\",[29,57.123]],[\"parent/34\",[3,3.409]],[\"name/35\",[30,57.123]],[\"parent/35\",[3,3.409]],[\"name/36\",[31,57.123]],[\"parent/36\",[3,3.409]],[\"name/37\",[32,57.123]],[\"parent/37\",[3,3.409]],[\"name/38\",[33,57.123]],[\"parent/38\",[3,3.409]],[\"name/39\",[7,31.474]],[\"parent/39\",[3,3.409]],[\"name/40\",[34,57.123]],[\"parent/40\",[9,4.382]],[\"name/41\",[35,57.123]],[\"parent/41\",[9,4.382]],[\"name/42\",[36,57.123]],[\"parent/42\",[9,4.382]],[\"name/43\",[37,52.603]],[\"parent/43\",[3,3.409]],[\"name/44\",[38,57.123]],[\"parent/44\",[3,3.409]],[\"name/45\",[39,57.123]],[\"parent/45\",[3,3.409]],[\"name/46\",[40,57.123]],[\"parent/46\",[3,3.409]],[\"name/47\",[41,60.488]],[\"parent/47\",[]],[\"name/48\",[1,39.447]],[\"parent/48\",[41,5.97]],[\"name/49\",[7,31.474]],[\"parent/49\",[42,4.762]],[\"name/50\",[2,44.394]],[\"parent/50\",[42,4.762]],[\"name/51\",[43,65.596]],[\"parent/51\",[42,4.762]],[\"name/52\",[44,65.596]],[\"parent/52\",[42,4.762]],[\"name/53\",[45,65.596]],[\"parent/53\",[42,4.762]],[\"name/54\",[46,57.123]],[\"parent/54\",[42,4.762]],[\"name/55\",[47,65.596]],[\"parent/55\",[42,4.762]],[\"name/56\",[48,65.596]],[\"parent/56\",[42,4.762]],[\"name/57\",[49,60.488]],[\"parent/57\",[]],[\"name/58\",[1,39.447]],[\"parent/58\",[49,5.97]],[\"name/59\",[2,44.394]],[\"parent/59\",[50,4.235]],[\"name/60\",[51,60.488]],[\"parent/60\",[50,4.235]],[\"name/61\",[52,52.603]],[\"parent/61\",[50,4.235]],[\"name/62\",[53,47.138]],[\"parent/62\",[50,4.235]],[\"name/63\",[54,49.502]],[\"parent/63\",[50,4.235]],[\"name/64\",[55,48.25]],[\"parent/64\",[50,4.235]],[\"name/65\",[56,49.502]],[\"parent/65\",[50,4.235]],[\"name/66\",[57,48.25]],[\"parent/66\",[50,4.235]],[\"name/67\",[58,49.502]],[\"parent/67\",[50,4.235]],[\"name/68\",[59,52.603]],[\"parent/68\",[50,4.235]],[\"name/69\",[60,52.603]],[\"parent/69\",[50,4.235]],[\"name/70\",[61,46.137]],[\"parent/70\",[50,4.235]],[\"name/71\",[62,46.137]],[\"parent/71\",[50,4.235]],[\"name/72\",[63,49.502]],[\"parent/72\",[50,4.235]],[\"name/73\",[64,60.488]],[\"parent/73\",[]],[\"name/74\",[1,39.447]],[\"parent/74\",[64,5.97]],[\"name/75\",[65,43.624]],[\"parent/75\",[66,4.05]],[\"name/76\",[2,44.394]],[\"parent/76\",[66,4.05]],[\"name/77\",[67,65.596]],[\"parent/77\",[66,4.05]],[\"name/78\",[68,65.596]],[\"parent/78\",[66,4.05]],[\"name/79\",[52,52.603]],[\"parent/79\",[66,4.05]],[\"name/80\",[58,49.502]],[\"parent/80\",[66,4.05]],[\"name/81\",[57,48.25]],[\"parent/81\",[66,4.05]],[\"name/82\",[53,47.138]],[\"parent/82\",[66,4.05]],[\"name/83\",[54,49.502]],[\"parent/83\",[66,4.05]],[\"name/84\",[55,48.25]],[\"parent/84\",[66,4.05]],[\"name/85\",[69,57.123]],[\"parent/85\",[66,4.05]],[\"name/86\",[56,49.502]],[\"parent/86\",[66,4.05]],[\"name/87\",[59,52.603]],[\"parent/87\",[66,4.05]],[\"name/88\",[60,52.603]],[\"parent/88\",[66,4.05]],[\"name/89\",[61,46.137]],[\"parent/89\",[66,4.05]],[\"name/90\",[62,46.137]],[\"parent/90\",[66,4.05]],[\"name/91\",[63,49.502]],[\"parent/91\",[66,4.05]],[\"name/92\",[70,60.488]],[\"parent/92\",[]],[\"name/93\",[1,39.447]],[\"parent/93\",[70,5.97]],[\"name/94\",[2,44.394]],[\"parent/94\",[71,4.235]],[\"name/95\",[52,52.603]],[\"parent/95\",[71,4.235]],[\"name/96\",[53,47.138]],[\"parent/96\",[71,4.235]],[\"name/97\",[54,49.502]],[\"parent/97\",[71,4.235]],[\"name/98\",[55,48.25]],[\"parent/98\",[71,4.235]],[\"name/99\",[69,57.123]],[\"parent/99\",[71,4.235]],[\"name/100\",[56,49.502]],[\"parent/100\",[71,4.235]],[\"name/101\",[57,48.25]],[\"parent/101\",[71,4.235]],[\"name/102\",[58,49.502]],[\"parent/102\",[71,4.235]],[\"name/103\",[59,52.603]],[\"parent/103\",[71,4.235]],[\"name/104\",[60,52.603]],[\"parent/104\",[71,4.235]],[\"name/105\",[61,46.137]],[\"parent/105\",[71,4.235]],[\"name/106\",[62,46.137]],[\"parent/106\",[71,4.235]],[\"name/107\",[63,49.502]],[\"parent/107\",[71,4.235]],[\"name/108\",[72,54.61]],[\"parent/108\",[]],[\"name/109\",[61,46.137]],[\"parent/109\",[72,5.39]],[\"name/110\",[62,46.137]],[\"parent/110\",[72,5.39]],[\"name/111\",[73,60.488]],[\"parent/111\",[72,5.39]],[\"name/112\",[74,54.61]],[\"parent/112\",[]],[\"name/113\",[74,54.61]],[\"parent/113\",[74,5.39]],[\"name/114\",[75,60.488]],[\"parent/114\",[]],[\"name/115\",[1,39.447]],[\"parent/115\",[75,5.97]],[\"name/116\",[7,31.474]],[\"parent/116\",[76,6.474]],[\"name/117\",[0,50.933]],[\"parent/117\",[77,5.192]],[\"name/118\",[7,31.474]],[\"parent/118\",[77,5.192]],[\"name/119\",[78,60.488]],[\"parent/119\",[77,5.192]],[\"name/120\",[79,65.596]],[\"parent/120\",[77,5.192]],[\"name/121\",[7,31.474]],[\"parent/121\",[77,5.192]],[\"name/122\",[80,50.933]],[\"parent/122\",[81,4.886]],[\"name/123\",[82,50.933]],[\"parent/123\",[81,4.886]],[\"name/124\",[7,31.474]],[\"parent/124\",[81,4.886]],[\"name/125\",[83,50.933]],[\"parent/125\",[81,4.886]],[\"name/126\",[7,31.474]],[\"parent/126\",[81,4.886]],[\"name/127\",[84,50.933]],[\"parent/127\",[81,4.886]],[\"name/128\",[7,31.474]],[\"parent/128\",[81,4.886]],[\"name/129\",[85,60.488]],[\"parent/129\",[]],[\"name/130\",[1,39.447]],[\"parent/130\",[85,5.97]],[\"name/131\",[86,60.488]],[\"parent/131\",[]],[\"name/132\",[1,39.447]],[\"parent/132\",[86,5.97]],[\"name/133\",[87,60.488]],[\"parent/133\",[]],[\"name/134\",[1,39.447]],[\"parent/134\",[87,5.97]],[\"name/135\",[2,44.394]],[\"parent/135\",[88,4.306]],[\"name/136\",[51,60.488]],[\"parent/136\",[88,4.306]],[\"name/137\",[52,52.603]],[\"parent/137\",[88,4.306]],[\"name/138\",[53,47.138]],[\"parent/138\",[88,4.306]],[\"name/139\",[54,49.502]],[\"parent/139\",[88,4.306]],[\"name/140\",[7,31.474]],[\"parent/140\",[88,4.306]],[\"name/141\",[89,48.25]],[\"parent/141\",[90,4.554]],[\"name/142\",[7,31.474]],[\"parent/142\",[90,4.554]],[\"name/143\",[91,48.25]],[\"parent/143\",[90,4.554]],[\"name/144\",[7,31.474]],[\"parent/144\",[90,4.554]],[\"name/145\",[92,48.25]],[\"parent/145\",[90,4.554]],[\"name/146\",[7,31.474]],[\"parent/146\",[90,4.554]],[\"name/147\",[93,48.25]],[\"parent/147\",[90,4.554]],[\"name/148\",[7,31.474]],[\"parent/148\",[90,4.554]],[\"name/149\",[94,48.25]],[\"parent/149\",[90,4.554]],[\"name/150\",[7,31.474]],[\"parent/150\",[90,4.554]],[\"name/151\",[55,48.25]],[\"parent/151\",[88,4.306]],[\"name/152\",[56,49.502]],[\"parent/152\",[88,4.306]],[\"name/153\",[57,48.25]],[\"parent/153\",[88,4.306]],[\"name/154\",[58,49.502]],[\"parent/154\",[88,4.306]],[\"name/155\",[61,46.137]],[\"parent/155\",[88,4.306]],[\"name/156\",[62,46.137]],[\"parent/156\",[88,4.306]],[\"name/157\",[63,49.502]],[\"parent/157\",[88,4.306]],[\"name/158\",[95,60.488]],[\"parent/158\",[]],[\"name/159\",[1,39.447]],[\"parent/159\",[95,5.97]],[\"name/160\",[2,44.394]],[\"parent/160\",[96,5.39]],[\"name/161\",[97,50.933]],[\"parent/161\",[96,5.39]],[\"name/162\",[98,50.933]],[\"parent/162\",[96,5.39]],[\"name/163\",[99,50.933]],[\"parent/163\",[96,5.39]],[\"name/164\",[100,60.488]],[\"parent/164\",[]],[\"name/165\",[1,39.447]],[\"parent/165\",[100,5.97]],[\"name/166\",[2,44.394]],[\"parent/166\",[101,3.534]],[\"name/167\",[4,57.123]],[\"parent/167\",[101,3.534]],[\"name/168\",[102,54.61]],[\"parent/168\",[101,3.534]],[\"name/169\",[6,49.502]],[\"parent/169\",[101,3.534]],[\"name/170\",[7,31.474]],[\"parent/170\",[101,3.534]],[\"name/171\",[8,31.044]],[\"parent/171\",[103,4.653]],[\"name/172\",[10,47.138]],[\"parent/172\",[103,4.653]],[\"name/173\",[11,46.137]],[\"parent/173\",[103,4.653]],[\"name/174\",[12,49.502]],[\"parent/174\",[101,3.534]],[\"name/175\",[7,31.474]],[\"parent/175\",[101,3.534]],[\"name/176\",[8,31.044]],[\"parent/176\",[103,4.653]],[\"name/177\",[10,47.138]],[\"parent/177\",[103,4.653]],[\"name/178\",[13,57.123]],[\"parent/178\",[101,3.534]],[\"name/179\",[7,31.474]],[\"parent/179\",[101,3.534]],[\"name/180\",[8,31.044]],[\"parent/180\",[103,4.653]],[\"name/181\",[10,47.138]],[\"parent/181\",[103,4.653]],[\"name/182\",[14,57.123]],[\"parent/182\",[103,4.653]],[\"name/183\",[15,39.947]],[\"parent/183\",[103,4.653]],[\"name/184\",[16,60.488]],[\"parent/184\",[101,3.534]],[\"name/185\",[17,57.123]],[\"parent/185\",[101,3.534]],[\"name/186\",[18,57.123]],[\"parent/186\",[101,3.534]],[\"name/187\",[19,57.123]],[\"parent/187\",[101,3.534]],[\"name/188\",[20,57.123]],[\"parent/188\",[101,3.534]],[\"name/189\",[21,57.123]],[\"parent/189\",[101,3.534]],[\"name/190\",[22,57.123]],[\"parent/190\",[101,3.534]],[\"name/191\",[23,57.123]],[\"parent/191\",[101,3.534]],[\"name/192\",[24,60.488]],[\"parent/192\",[101,3.534]],[\"name/193\",[25,57.123]],[\"parent/193\",[101,3.534]],[\"name/194\",[26,57.123]],[\"parent/194\",[101,3.534]],[\"name/195\",[27,57.123]],[\"parent/195\",[101,3.534]],[\"name/196\",[28,57.123]],[\"parent/196\",[101,3.534]],[\"name/197\",[11,46.137]],[\"parent/197\",[101,3.534]],[\"name/198\",[29,57.123]],[\"parent/198\",[101,3.534]],[\"name/199\",[30,57.123]],[\"parent/199\",[101,3.534]],[\"name/200\",[37,52.603]],[\"parent/200\",[101,3.534]],[\"name/201\",[38,57.123]],[\"parent/201\",[101,3.534]],[\"name/202\",[39,57.123]],[\"parent/202\",[101,3.534]],[\"name/203\",[40,57.123]],[\"parent/203\",[101,3.534]],[\"name/204\",[104,60.488]],[\"parent/204\",[]],[\"name/205\",[1,39.447]],[\"parent/205\",[104,5.97]],[\"name/206\",[2,44.394]],[\"parent/206\",[105,4.306]],[\"name/207\",[52,52.603]],[\"parent/207\",[105,4.306]],[\"name/208\",[53,47.138]],[\"parent/208\",[105,4.306]],[\"name/209\",[54,49.502]],[\"parent/209\",[105,4.306]],[\"name/210\",[7,31.474]],[\"parent/210\",[105,4.306]],[\"name/211\",[89,48.25]],[\"parent/211\",[106,4.554]],[\"name/212\",[7,31.474]],[\"parent/212\",[106,4.554]],[\"name/213\",[91,48.25]],[\"parent/213\",[106,4.554]],[\"name/214\",[7,31.474]],[\"parent/214\",[106,4.554]],[\"name/215\",[92,48.25]],[\"parent/215\",[106,4.554]],[\"name/216\",[7,31.474]],[\"parent/216\",[106,4.554]],[\"name/217\",[93,48.25]],[\"parent/217\",[106,4.554]],[\"name/218\",[7,31.474]],[\"parent/218\",[106,4.554]],[\"name/219\",[94,48.25]],[\"parent/219\",[106,4.554]],[\"name/220\",[7,31.474]],[\"parent/220\",[106,4.554]],[\"name/221\",[55,48.25]],[\"parent/221\",[105,4.306]],[\"name/222\",[69,57.123]],[\"parent/222\",[105,4.306]],[\"name/223\",[56,49.502]],[\"parent/223\",[105,4.306]],[\"name/224\",[57,48.25]],[\"parent/224\",[105,4.306]],[\"name/225\",[58,49.502]],[\"parent/225\",[105,4.306]],[\"name/226\",[61,46.137]],[\"parent/226\",[105,4.306]],[\"name/227\",[62,46.137]],[\"parent/227\",[105,4.306]],[\"name/228\",[63,49.502]],[\"parent/228\",[105,4.306]],[\"name/229\",[107,60.488]],[\"parent/229\",[]],[\"name/230\",[1,39.447]],[\"parent/230\",[107,5.97]],[\"name/231\",[2,44.394]],[\"parent/231\",[108,5.192]],[\"name/232\",[11,46.137]],[\"parent/232\",[108,5.192]],[\"name/233\",[97,50.933]],[\"parent/233\",[108,5.192]],[\"name/234\",[98,50.933]],[\"parent/234\",[108,5.192]],[\"name/235\",[99,50.933]],[\"parent/235\",[108,5.192]],[\"name/236\",[109,42.242]],[\"parent/236\",[]],[\"name/237\",[89,48.25]],[\"parent/237\",[109,4.169]],[\"name/238\",[91,48.25]],[\"parent/238\",[109,4.169]],[\"name/239\",[93,48.25]],[\"parent/239\",[109,4.169]],[\"name/240\",[94,48.25]],[\"parent/240\",[109,4.169]],[\"name/241\",[61,46.137]],[\"parent/241\",[109,4.169]],[\"name/242\",[62,46.137]],[\"parent/242\",[109,4.169]],[\"name/243\",[73,60.488]],[\"parent/243\",[109,4.169]],[\"name/244\",[110,60.488]],[\"parent/244\",[109,4.169]],[\"name/245\",[111,60.488]],[\"parent/245\",[109,4.169]],[\"name/246\",[112,60.488]],[\"parent/246\",[109,4.169]],[\"name/247\",[55,48.25]],[\"parent/247\",[109,4.169]],[\"name/248\",[57,48.25]],[\"parent/248\",[109,4.169]],[\"name/249\",[113,60.488]],[\"parent/249\",[109,4.169]],[\"name/250\",[92,48.25]],[\"parent/250\",[109,4.169]],[\"name/251\",[114,57.123]],[\"parent/251\",[]],[\"name/252\",[1,39.447]],[\"parent/252\",[114,5.638]],[\"name/253\",[1,39.447]],[\"parent/253\",[114,5.638]],[\"name/254\",[83,50.933]],[\"parent/254\",[115,4.653]],[\"name/255\",[7,31.474]],[\"parent/255\",[115,4.653]],[\"name/256\",[82,50.933]],[\"parent/256\",[115,4.653]],[\"name/257\",[7,31.474]],[\"parent/257\",[115,4.653]],[\"name/258\",[84,50.933]],[\"parent/258\",[115,4.653]],[\"name/259\",[7,31.474]],[\"parent/259\",[115,4.653]],[\"name/260\",[0,50.933]],[\"parent/260\",[115,4.653]],[\"name/261\",[7,31.474]],[\"parent/261\",[115,4.653]],[\"name/262\",[78,60.488]],[\"parent/262\",[115,4.653]],[\"name/263\",[116,37.664]],[\"parent/263\",[]],[\"name/264\",[117,60.488]],[\"parent/264\",[116,3.717]],[\"name/265\",[118,60.488]],[\"parent/265\",[119,3.246]],[\"name/266\",[120,60.488]],[\"parent/266\",[119,3.246]],[\"name/267\",[121,60.488]],[\"parent/267\",[119,3.246]],[\"name/268\",[122,60.488]],[\"parent/268\",[119,3.246]],[\"name/269\",[123,60.488]],[\"parent/269\",[119,3.246]],[\"name/270\",[124,60.488]],[\"parent/270\",[119,3.246]],[\"name/271\",[125,44.394]],[\"parent/271\",[126,5.638]],[\"name/272\",[127,44.394]],[\"parent/272\",[126,5.638]],[\"name/273\",[128,47.138]],[\"parent/273\",[126,5.638]],[\"name/274\",[129,60.488]],[\"parent/274\",[119,3.246]],[\"name/275\",[125,44.394]],[\"parent/275\",[130,5.638]],[\"name/276\",[127,44.394]],[\"parent/276\",[130,5.638]],[\"name/277\",[128,47.138]],[\"parent/277\",[130,5.638]],[\"name/278\",[131,60.488]],[\"parent/278\",[119,3.246]],[\"name/279\",[125,44.394]],[\"parent/279\",[132,5.638]],[\"name/280\",[127,44.394]],[\"parent/280\",[132,5.638]],[\"name/281\",[128,47.138]],[\"parent/281\",[132,5.638]],[\"name/282\",[133,60.488]],[\"parent/282\",[119,3.246]],[\"name/283\",[125,44.394]],[\"parent/283\",[134,5.638]],[\"name/284\",[127,44.394]],[\"parent/284\",[134,5.638]],[\"name/285\",[135,54.61]],[\"parent/285\",[134,5.638]],[\"name/286\",[136,60.488]],[\"parent/286\",[119,3.246]],[\"name/287\",[125,44.394]],[\"parent/287\",[137,5.638]],[\"name/288\",[127,44.394]],[\"parent/288\",[137,5.638]],[\"name/289\",[135,54.61]],[\"parent/289\",[137,5.638]],[\"name/290\",[138,60.488]],[\"parent/290\",[119,3.246]],[\"name/291\",[125,44.394]],[\"parent/291\",[139,5.97]],[\"name/292\",[127,44.394]],[\"parent/292\",[139,5.97]],[\"name/293\",[140,60.488]],[\"parent/293\",[119,3.246]],[\"name/294\",[141,60.488]],[\"parent/294\",[119,3.246]],[\"name/295\",[142,60.488]],[\"parent/295\",[119,3.246]],[\"name/296\",[143,54.61]],[\"parent/296\",[144,5.192]],[\"name/297\",[145,54.61]],[\"parent/297\",[144,5.192]],[\"name/298\",[146,60.488]],[\"parent/298\",[144,5.192]],[\"name/299\",[147,54.61]],[\"parent/299\",[144,5.192]],[\"name/300\",[148,54.61]],[\"parent/300\",[144,5.192]],[\"name/301\",[149,60.488]],[\"parent/301\",[119,3.246]],[\"name/302\",[143,54.61]],[\"parent/302\",[150,5.39]],[\"name/303\",[145,54.61]],[\"parent/303\",[150,5.39]],[\"name/304\",[147,54.61]],[\"parent/304\",[150,5.39]],[\"name/305\",[148,54.61]],[\"parent/305\",[150,5.39]],[\"name/306\",[151,60.488]],[\"parent/306\",[119,3.246]],[\"name/307\",[152,60.488]],[\"parent/307\",[119,3.246]],[\"name/308\",[153,60.488]],[\"parent/308\",[119,3.246]],[\"name/309\",[154,54.61]],[\"parent/309\",[119,3.246]],[\"name/310\",[155,60.488]],[\"parent/310\",[119,3.246]],[\"name/311\",[7,31.474]],[\"parent/311\",[156,6.474]],[\"name/312\",[157,60.488]],[\"parent/312\",[119,3.246]],[\"name/313\",[158,60.488]],[\"parent/313\",[159,5.97]],[\"name/314\",[160,50.933]],[\"parent/314\",[159,5.97]],[\"name/315\",[161,60.488]],[\"parent/315\",[119,3.246]],[\"name/316\",[162,60.488]],[\"parent/316\",[163,5.027]],[\"name/317\",[164,60.488]],[\"parent/317\",[163,5.027]],[\"name/318\",[165,60.488]],[\"parent/318\",[163,5.027]],[\"name/319\",[166,60.488]],[\"parent/319\",[163,5.027]],[\"name/320\",[167,60.488]],[\"parent/320\",[163,5.027]],[\"name/321\",[168,60.488]],[\"parent/321\",[163,5.027]],[\"name/322\",[169,60.488]],[\"parent/322\",[119,3.246]],[\"name/323\",[170,54.61]],[\"parent/323\",[171,3.893]],[\"name/324\",[172,60.488]],[\"parent/324\",[171,3.893]],[\"name/325\",[173,60.488]],[\"parent/325\",[171,3.893]],[\"name/326\",[174,60.488]],[\"parent/326\",[171,3.893]],[\"name/327\",[175,54.61]],[\"parent/327\",[171,3.893]],[\"name/328\",[176,60.488]],[\"parent/328\",[171,3.893]],[\"name/329\",[177,54.61]],[\"parent/329\",[171,3.893]],[\"name/330\",[178,50.933]],[\"parent/330\",[171,3.893]],[\"name/331\",[179,60.488]],[\"parent/331\",[171,3.893]],[\"name/332\",[180,60.488]],[\"parent/332\",[171,3.893]],[\"name/333\",[181,54.61]],[\"parent/333\",[171,3.893]],[\"name/334\",[160,50.933]],[\"parent/334\",[171,3.893]],[\"name/335\",[182,54.61]],[\"parent/335\",[171,3.893]],[\"name/336\",[183,60.488]],[\"parent/336\",[171,3.893]],[\"name/337\",[184,60.488]],[\"parent/337\",[171,3.893]],[\"name/338\",[185,60.488]],[\"parent/338\",[171,3.893]],[\"name/339\",[186,60.488]],[\"parent/339\",[171,3.893]],[\"name/340\",[187,54.61]],[\"parent/340\",[171,3.893]],[\"name/341\",[154,54.61]],[\"parent/341\",[171,3.893]],[\"name/342\",[188,54.61]],[\"parent/342\",[171,3.893]],[\"name/343\",[189,65.596]],[\"parent/343\",[119,3.246]],[\"name/344\",[53,47.138]],[\"parent/344\",[190,5.192]],[\"name/345\",[82,50.933]],[\"parent/345\",[190,5.192]],[\"name/346\",[83,50.933]],[\"parent/346\",[190,5.192]],[\"name/347\",[84,50.933]],[\"parent/347\",[190,5.192]],[\"name/348\",[0,50.933]],[\"parent/348\",[190,5.192]],[\"name/349\",[191,60.488]],[\"parent/349\",[119,3.246]],[\"name/350\",[192,60.488]],[\"parent/350\",[193,3.943]],[\"name/351\",[177,54.61]],[\"parent/351\",[193,3.943]],[\"name/352\",[175,54.61]],[\"parent/352\",[193,3.943]],[\"name/353\",[178,50.933]],[\"parent/353\",[193,3.943]],[\"name/354\",[160,50.933]],[\"parent/354\",[193,3.943]],[\"name/355\",[182,54.61]],[\"parent/355\",[193,3.943]],[\"name/356\",[181,54.61]],[\"parent/356\",[193,3.943]],[\"name/357\",[194,54.61]],[\"parent/357\",[193,3.943]],[\"name/358\",[195,60.488]],[\"parent/358\",[193,3.943]],[\"name/359\",[196,60.488]],[\"parent/359\",[193,3.943]],[\"name/360\",[197,57.123]],[\"parent/360\",[193,3.943]],[\"name/361\",[198,57.123]],[\"parent/361\",[193,3.943]],[\"name/362\",[199,57.123]],[\"parent/362\",[193,3.943]],[\"name/363\",[200,57.123]],[\"parent/363\",[193,3.943]],[\"name/364\",[187,54.61]],[\"parent/364\",[193,3.943]],[\"name/365\",[201,60.488]],[\"parent/365\",[193,3.943]],[\"name/366\",[202,60.488]],[\"parent/366\",[193,3.943]],[\"name/367\",[203,60.488]],[\"parent/367\",[193,3.943]],[\"name/368\",[188,54.61]],[\"parent/368\",[193,3.943]],[\"name/369\",[194,54.61]],[\"parent/369\",[119,3.246]],[\"name/370\",[204,60.488]],[\"parent/370\",[205,4.464]],[\"name/371\",[206,60.488]],[\"parent/371\",[205,4.464]],[\"name/372\",[6,49.502]],[\"parent/372\",[205,4.464]],[\"name/373\",[12,49.502]],[\"parent/373\",[205,4.464]],[\"name/374\",[207,60.488]],[\"parent/374\",[205,4.464]],[\"name/375\",[208,60.488]],[\"parent/375\",[205,4.464]],[\"name/376\",[178,50.933]],[\"parent/376\",[205,4.464]],[\"name/377\",[209,60.488]],[\"parent/377\",[205,4.464]],[\"name/378\",[210,60.488]],[\"parent/378\",[205,4.464]],[\"name/379\",[211,60.488]],[\"parent/379\",[205,4.464]],[\"name/380\",[212,60.488]],[\"parent/380\",[205,4.464]],[\"name/381\",[102,54.61]],[\"parent/381\",[119,3.246]],[\"name/382\",[98,50.933]],[\"parent/382\",[213,5.638]],[\"name/383\",[97,50.933]],[\"parent/383\",[213,5.638]],[\"name/384\",[99,50.933]],[\"parent/384\",[213,5.638]],[\"name/385\",[214,65.596]],[\"parent/385\",[119,3.246]],[\"name/386\",[4,57.123]],[\"parent/386\",[215,3.64]],[\"name/387\",[102,54.61]],[\"parent/387\",[215,3.64]],[\"name/388\",[6,49.502]],[\"parent/388\",[215,3.64]],[\"name/389\",[7,31.474]],[\"parent/389\",[215,3.64]],[\"name/390\",[8,31.044]],[\"parent/390\",[216,4.653]],[\"name/391\",[10,47.138]],[\"parent/391\",[216,4.653]],[\"name/392\",[11,46.137]],[\"parent/392\",[216,4.653]],[\"name/393\",[12,49.502]],[\"parent/393\",[215,3.64]],[\"name/394\",[7,31.474]],[\"parent/394\",[215,3.64]],[\"name/395\",[8,31.044]],[\"parent/395\",[216,4.653]],[\"name/396\",[10,47.138]],[\"parent/396\",[216,4.653]],[\"name/397\",[13,57.123]],[\"parent/397\",[215,3.64]],[\"name/398\",[7,31.474]],[\"parent/398\",[215,3.64]],[\"name/399\",[8,31.044]],[\"parent/399\",[216,4.653]],[\"name/400\",[10,47.138]],[\"parent/400\",[216,4.653]],[\"name/401\",[14,57.123]],[\"parent/401\",[216,4.653]],[\"name/402\",[15,39.947]],[\"parent/402\",[216,4.653]],[\"name/403\",[17,57.123]],[\"parent/403\",[215,3.64]],[\"name/404\",[18,57.123]],[\"parent/404\",[215,3.64]],[\"name/405\",[19,57.123]],[\"parent/405\",[215,3.64]],[\"name/406\",[20,57.123]],[\"parent/406\",[215,3.64]],[\"name/407\",[21,57.123]],[\"parent/407\",[215,3.64]],[\"name/408\",[22,57.123]],[\"parent/408\",[215,3.64]],[\"name/409\",[23,57.123]],[\"parent/409\",[215,3.64]],[\"name/410\",[25,57.123]],[\"parent/410\",[215,3.64]],[\"name/411\",[26,57.123]],[\"parent/411\",[215,3.64]],[\"name/412\",[27,57.123]],[\"parent/412\",[215,3.64]],[\"name/413\",[28,57.123]],[\"parent/413\",[215,3.64]],[\"name/414\",[11,46.137]],[\"parent/414\",[215,3.64]],[\"name/415\",[29,57.123]],[\"parent/415\",[215,3.64]],[\"name/416\",[30,57.123]],[\"parent/416\",[215,3.64]],[\"name/417\",[37,52.603]],[\"parent/417\",[215,3.64]],[\"name/418\",[38,57.123]],[\"parent/418\",[215,3.64]],[\"name/419\",[39,57.123]],[\"parent/419\",[215,3.64]],[\"name/420\",[40,57.123]],[\"parent/420\",[215,3.64]],[\"name/421\",[217,60.488]],[\"parent/421\",[119,3.246]],[\"name/422\",[218,50.933]],[\"parent/422\",[219,6.474]],[\"name/423\",[220,60.488]],[\"parent/423\",[119,3.246]],[\"name/424\",[7,31.474]],[\"parent/424\",[221,6.474]],[\"name/425\",[222,60.488]],[\"parent/425\",[119,3.246]],[\"name/426\",[218,50.933]],[\"parent/426\",[223,6.474]],[\"name/427\",[224,60.488]],[\"parent/427\",[119,3.246]],[\"name/428\",[225,60.488]],[\"parent/428\",[226,5.97]],[\"name/429\",[46,57.123]],[\"parent/429\",[226,5.97]],[\"name/430\",[227,60.488]],[\"parent/430\",[119,3.246]],[\"name/431\",[228,60.488]],[\"parent/431\",[119,3.246]],[\"name/432\",[229,50.933]],[\"parent/432\",[230,5.97]],[\"name/433\",[218,50.933]],[\"parent/433\",[230,5.97]],[\"name/434\",[231,60.488]],[\"parent/434\",[119,3.246]],[\"name/435\",[232,60.488]],[\"parent/435\",[233,5.027]],[\"name/436\",[234,60.488]],[\"parent/436\",[233,5.027]],[\"name/437\",[235,60.488]],[\"parent/437\",[233,5.027]],[\"name/438\",[170,54.61]],[\"parent/438\",[233,5.027]],[\"name/439\",[236,60.488]],[\"parent/439\",[233,5.027]],[\"name/440\",[237,60.488]],[\"parent/440\",[233,5.027]],[\"name/441\",[238,60.488]],[\"parent/441\",[119,3.246]],[\"name/442\",[8,31.044]],[\"parent/442\",[239,3.64]],[\"name/443\",[240,60.488]],[\"parent/443\",[239,3.64]],[\"name/444\",[241,52.603]],[\"parent/444\",[239,3.64]],[\"name/445\",[242,60.488]],[\"parent/445\",[239,3.64]],[\"name/446\",[243,60.488]],[\"parent/446\",[239,3.64]],[\"name/447\",[244,60.488]],[\"parent/447\",[239,3.64]],[\"name/448\",[245,60.488]],[\"parent/448\",[239,3.64]],[\"name/449\",[246,60.488]],[\"parent/449\",[239,3.64]],[\"name/450\",[8,31.044]],[\"parent/450\",[247,5.97]],[\"name/451\",[248,37.664]],[\"parent/451\",[247,5.97]],[\"name/452\",[248,37.664]],[\"parent/452\",[239,3.64]],[\"name/453\",[229,50.933]],[\"parent/453\",[249,5.638]],[\"name/454\",[8,31.044]],[\"parent/454\",[249,5.638]],[\"name/455\",[248,37.664]],[\"parent/455\",[249,5.638]],[\"name/456\",[250,60.488]],[\"parent/456\",[239,3.64]],[\"name/457\",[15,39.947]],[\"parent/457\",[251,5.638]],[\"name/458\",[252,60.488]],[\"parent/458\",[251,5.638]],[\"name/459\",[253,60.488]],[\"parent/459\",[251,5.638]],[\"name/460\",[254,54.61]],[\"parent/460\",[239,3.64]],[\"name/461\",[8,31.044]],[\"parent/461\",[255,5.192]],[\"name/462\",[15,39.947]],[\"parent/462\",[255,5.192]],[\"name/463\",[256,41.617]],[\"parent/463\",[255,5.192]],[\"name/464\",[257,42.909]],[\"parent/464\",[255,5.192]],[\"name/465\",[258,42.909]],[\"parent/465\",[255,5.192]],[\"name/466\",[256,41.617]],[\"parent/466\",[239,3.64]],[\"name/467\",[259,60.488]],[\"parent/467\",[260,5.638]],[\"name/468\",[8,31.044]],[\"parent/468\",[260,5.638]],[\"name/469\",[248,37.664]],[\"parent/469\",[260,5.638]],[\"name/470\",[261,60.488]],[\"parent/470\",[239,3.64]],[\"name/471\",[15,39.947]],[\"parent/471\",[262,5.192]],[\"name/472\",[8,31.044]],[\"parent/472\",[262,5.192]],[\"name/473\",[256,41.617]],[\"parent/473\",[262,5.192]],[\"name/474\",[257,42.909]],[\"parent/474\",[262,5.192]],[\"name/475\",[258,42.909]],[\"parent/475\",[262,5.192]],[\"name/476\",[6,49.502]],[\"parent/476\",[239,3.64]],[\"name/477\",[15,39.947]],[\"parent/477\",[263,5.192]],[\"name/478\",[8,31.044]],[\"parent/478\",[263,5.192]],[\"name/479\",[256,41.617]],[\"parent/479\",[263,5.192]],[\"name/480\",[257,42.909]],[\"parent/480\",[263,5.192]],[\"name/481\",[258,42.909]],[\"parent/481\",[263,5.192]],[\"name/482\",[264,60.488]],[\"parent/482\",[239,3.64]],[\"name/483\",[15,39.947]],[\"parent/483\",[265,5.192]],[\"name/484\",[8,31.044]],[\"parent/484\",[265,5.192]],[\"name/485\",[256,41.617]],[\"parent/485\",[265,5.192]],[\"name/486\",[257,42.909]],[\"parent/486\",[265,5.192]],[\"name/487\",[258,42.909]],[\"parent/487\",[265,5.192]],[\"name/488\",[266,60.488]],[\"parent/488\",[239,3.64]],[\"name/489\",[15,39.947]],[\"parent/489\",[267,5.192]],[\"name/490\",[8,31.044]],[\"parent/490\",[267,5.192]],[\"name/491\",[256,41.617]],[\"parent/491\",[267,5.192]],[\"name/492\",[257,42.909]],[\"parent/492\",[267,5.192]],[\"name/493\",[258,42.909]],[\"parent/493\",[267,5.192]],[\"name/494\",[12,49.502]],[\"parent/494\",[239,3.64]],[\"name/495\",[15,39.947]],[\"parent/495\",[268,5.192]],[\"name/496\",[8,31.044]],[\"parent/496\",[268,5.192]],[\"name/497\",[256,41.617]],[\"parent/497\",[268,5.192]],[\"name/498\",[257,42.909]],[\"parent/498\",[268,5.192]],[\"name/499\",[258,42.909]],[\"parent/499\",[268,5.192]],[\"name/500\",[269,54.61]],[\"parent/500\",[239,3.64]],[\"name/501\",[270,60.488]],[\"parent/501\",[271,5.39]],[\"name/502\",[272,60.488]],[\"parent/502\",[271,5.39]],[\"name/503\",[8,31.044]],[\"parent/503\",[271,5.39]],[\"name/504\",[248,37.664]],[\"parent/504\",[271,5.39]],[\"name/505\",[273,60.488]],[\"parent/505\",[239,3.64]],[\"name/506\",[274,50.933]],[\"parent/506\",[275,5.638]],[\"name/507\",[8,31.044]],[\"parent/507\",[275,5.638]],[\"name/508\",[248,37.664]],[\"parent/508\",[275,5.638]],[\"name/509\",[276,60.488]],[\"parent/509\",[239,3.64]],[\"name/510\",[277,54.61]],[\"parent/510\",[278,5.39]],[\"name/511\",[279,60.488]],[\"parent/511\",[278,5.39]],[\"name/512\",[8,31.044]],[\"parent/512\",[278,5.39]],[\"name/513\",[248,37.664]],[\"parent/513\",[278,5.39]],[\"name/514\",[277,54.61]],[\"parent/514\",[239,3.64]],[\"name/515\",[280,54.61]],[\"parent/515\",[281,4.886]],[\"name/516\",[282,60.488]],[\"parent/516\",[281,4.886]],[\"name/517\",[241,52.603]],[\"parent/517\",[281,4.886]],[\"name/518\",[283,54.61]],[\"parent/518\",[281,4.886]],[\"name/519\",[284,60.488]],[\"parent/519\",[281,4.886]],[\"name/520\",[8,31.044]],[\"parent/520\",[281,4.886]],[\"name/521\",[248,37.664]],[\"parent/521\",[281,4.886]],[\"name/522\",[285,50.933]],[\"parent/522\",[239,3.64]],[\"name/523\",[286,60.488]],[\"parent/523\",[287,4.762]],[\"name/524\",[288,54.61]],[\"parent/524\",[287,4.762]],[\"name/525\",[280,54.61]],[\"parent/525\",[287,4.762]],[\"name/526\",[128,47.138]],[\"parent/526\",[287,4.762]],[\"name/527\",[269,54.61]],[\"parent/527\",[287,4.762]],[\"name/528\",[289,60.488]],[\"parent/528\",[287,4.762]],[\"name/529\",[8,31.044]],[\"parent/529\",[287,4.762]],[\"name/530\",[248,37.664]],[\"parent/530\",[287,4.762]],[\"name/531\",[290,54.61]],[\"parent/531\",[239,3.64]],[\"name/532\",[290,54.61]],[\"parent/532\",[291,5.192]],[\"name/533\",[285,50.933]],[\"parent/533\",[291,5.192]],[\"name/534\",[283,54.61]],[\"parent/534\",[291,5.192]],[\"name/535\",[8,31.044]],[\"parent/535\",[291,5.192]],[\"name/536\",[248,37.664]],[\"parent/536\",[291,5.192]],[\"name/537\",[292,60.488]],[\"parent/537\",[239,3.64]],[\"name/538\",[293,60.488]],[\"parent/538\",[294,5.192]],[\"name/539\",[229,50.933]],[\"parent/539\",[294,5.192]],[\"name/540\",[274,50.933]],[\"parent/540\",[294,5.192]],[\"name/541\",[8,31.044]],[\"parent/541\",[294,5.192]],[\"name/542\",[248,37.664]],[\"parent/542\",[294,5.192]],[\"name/543\",[295,60.488]],[\"parent/543\",[239,3.64]],[\"name/544\",[296,60.488]],[\"parent/544\",[297,5.192]],[\"name/545\",[254,54.61]],[\"parent/545\",[297,5.192]],[\"name/546\",[274,50.933]],[\"parent/546\",[297,5.192]],[\"name/547\",[8,31.044]],[\"parent/547\",[297,5.192]],[\"name/548\",[248,37.664]],[\"parent/548\",[297,5.192]],[\"name/549\",[298,60.488]],[\"parent/549\",[239,3.64]],[\"name/550\",[285,50.933]],[\"parent/550\",[299,4.554]],[\"name/551\",[288,54.61]],[\"parent/551\",[299,4.554]],[\"name/552\",[300,60.488]],[\"parent/552\",[299,4.554]],[\"name/553\",[301,60.488]],[\"parent/553\",[299,4.554]],[\"name/554\",[302,60.488]],[\"parent/554\",[299,4.554]],[\"name/555\",[8,31.044]],[\"parent/555\",[299,4.554]],[\"name/556\",[15,39.947]],[\"parent/556\",[299,4.554]],[\"name/557\",[256,41.617]],[\"parent/557\",[299,4.554]],[\"name/558\",[257,42.909]],[\"parent/558\",[299,4.554]],[\"name/559\",[258,42.909]],[\"parent/559\",[299,4.554]],[\"name/560\",[303,60.488]],[\"parent/560\",[119,3.246]],[\"name/561\",[304,60.488]],[\"parent/561\",[305,6.474]],[\"name/562\",[306,60.488]],[\"parent/562\",[119,3.246]],[\"name/563\",[53,47.138]],[\"parent/563\",[307,4.554]],[\"name/564\",[56,49.502]],[\"parent/564\",[307,4.554]],[\"name/565\",[57,48.25]],[\"parent/565\",[307,4.554]],[\"name/566\",[58,49.502]],[\"parent/566\",[307,4.554]],[\"name/567\",[55,48.25]],[\"parent/567\",[307,4.554]],[\"name/568\",[61,46.137]],[\"parent/568\",[307,4.554]],[\"name/569\",[62,46.137]],[\"parent/569\",[307,4.554]],[\"name/570\",[63,49.502]],[\"parent/570\",[307,4.554]],[\"name/571\",[54,49.502]],[\"parent/571\",[307,4.554]],[\"name/572\",[7,31.474]],[\"parent/572\",[307,4.554]],[\"name/573\",[89,48.25]],[\"parent/573\",[308,5.192]],[\"name/574\",[91,48.25]],[\"parent/574\",[308,5.192]],[\"name/575\",[92,48.25]],[\"parent/575\",[308,5.192]],[\"name/576\",[93,48.25]],[\"parent/576\",[308,5.192]],[\"name/577\",[94,48.25]],[\"parent/577\",[308,5.192]],[\"name/578\",[309,60.488]],[\"parent/578\",[119,3.246]],[\"name/579\",[310,35.807]],[\"parent/579\",[]],[\"name/580\",[311,60.488]],[\"parent/580\",[310,3.534]],[\"name/581\",[312,60.488]],[\"parent/581\",[310,3.534]],[\"name/582\",[313,60.488]],[\"parent/582\",[310,3.534]],[\"name/583\",[11,46.137]],[\"parent/583\",[310,3.534]],[\"name/584\",[314,60.488]],[\"parent/584\",[310,3.534]],[\"name/585\",[315,60.488]],[\"parent/585\",[310,3.534]],[\"name/586\",[37,52.603]],[\"parent/586\",[310,3.534]],[\"name/587\",[316,60.488]],[\"parent/587\",[310,3.534]],[\"name/588\",[317,60.488]],[\"parent/588\",[310,3.534]],[\"name/589\",[318,60.488]],[\"parent/589\",[310,3.534]],[\"name/590\",[319,60.488]],[\"parent/590\",[310,3.534]],[\"name/591\",[320,60.488]],[\"parent/591\",[310,3.534]],[\"name/592\",[31,57.123]],[\"parent/592\",[310,3.534]],[\"name/593\",[32,57.123]],[\"parent/593\",[310,3.534]],[\"name/594\",[321,60.488]],[\"parent/594\",[310,3.534]],[\"name/595\",[322,60.488]],[\"parent/595\",[310,3.534]],[\"name/596\",[323,60.488]],[\"parent/596\",[310,3.534]],[\"name/597\",[324,60.488]],[\"parent/597\",[310,3.534]],[\"name/598\",[325,65.596]],[\"parent/598\",[310,3.534]],[\"name/599\",[326,65.596]],[\"parent/599\",[310,3.534]],[\"name/600\",[327,60.488]],[\"parent/600\",[310,3.534]],[\"name/601\",[59,52.603]],[\"parent/601\",[310,3.534]],[\"name/602\",[60,52.603]],[\"parent/602\",[310,3.534]],[\"name/603\",[328,65.596]],[\"parent/603\",[310,3.534]],[\"name/604\",[329,60.488]],[\"parent/604\",[310,3.534]],[\"name/605\",[330,60.488]],[\"parent/605\",[310,3.534]],[\"name/606\",[74,54.61]],[\"parent/606\",[310,3.534]],[\"name/607\",[33,57.123]],[\"parent/607\",[310,3.534]],[\"name/608\",[7,31.474]],[\"parent/608\",[331,6.474]],[\"name/609\",[34,57.123]],[\"parent/609\",[332,5.638]],[\"name/610\",[35,57.123]],[\"parent/610\",[332,5.638]],[\"name/611\",[36,57.123]],[\"parent/611\",[332,5.638]],[\"name/612\",[333,48.25]],[\"parent/612\",[]],[\"name/613\",[91,48.25]],[\"parent/613\",[333,4.762]],[\"name/614\",[92,48.25]],[\"parent/614\",[333,4.762]],[\"name/615\",[93,48.25]],[\"parent/615\",[333,4.762]],[\"name/616\",[94,48.25]],[\"parent/616\",[333,4.762]],[\"name/617\",[61,46.137]],[\"parent/617\",[333,4.762]],[\"name/618\",[62,46.137]],[\"parent/618\",[333,4.762]],[\"name/619\",[334,60.488]],[\"parent/619\",[]],[\"name/620\",[1,39.447]],[\"parent/620\",[334,5.97]],[\"name/621\",[335,52.603]],[\"parent/621\",[]],[\"name/622\",[336,60.488]],[\"parent/622\",[335,5.192]],[\"name/623\",[337,60.488]],[\"parent/623\",[335,5.192]],[\"name/624\",[7,31.474]],[\"parent/624\",[338,6.474]],[\"name/625\",[339,60.488]],[\"parent/625\",[340,4.169]],[\"name/626\",[341,60.488]],[\"parent/626\",[340,4.169]],[\"name/627\",[342,60.488]],[\"parent/627\",[340,4.169]],[\"name/628\",[343,60.488]],[\"parent/628\",[340,4.169]],[\"name/629\",[344,60.488]],[\"parent/629\",[340,4.169]],[\"name/630\",[345,60.488]],[\"parent/630\",[340,4.169]],[\"name/631\",[346,60.488]],[\"parent/631\",[340,4.169]],[\"name/632\",[347,60.488]],[\"parent/632\",[340,4.169]],[\"name/633\",[348,60.488]],[\"parent/633\",[340,4.169]],[\"name/634\",[349,60.488]],[\"parent/634\",[340,4.169]],[\"name/635\",[350,60.488]],[\"parent/635\",[340,4.169]],[\"name/636\",[351,60.488]],[\"parent/636\",[340,4.169]],[\"name/637\",[352,60.488]],[\"parent/637\",[340,4.169]],[\"name/638\",[353,60.488]],[\"parent/638\",[340,4.169]],[\"name/639\",[354,60.488]],[\"parent/639\",[340,4.169]],[\"name/640\",[355,60.488]],[\"parent/640\",[335,5.192]],[\"name/641\",[356,60.488]],[\"parent/641\",[335,5.192]],[\"name/642\",[357,52.603]],[\"parent/642\",[]],[\"name/643\",[83,50.933]],[\"parent/643\",[357,5.192]],[\"name/644\",[82,50.933]],[\"parent/644\",[357,5.192]],[\"name/645\",[358,60.488]],[\"parent/645\",[357,5.192]],[\"name/646\",[84,50.933]],[\"parent/646\",[357,5.192]],[\"name/647\",[359,60.488]],[\"parent/647\",[]],[\"name/648\",[1,39.447]],[\"parent/648\",[359,5.97]],[\"name/649\",[7,31.474]],[\"parent/649\",[360,6.474]],[\"name/650\",[361,60.488]],[\"parent/650\",[362,5.39]],[\"name/651\",[363,60.488]],[\"parent/651\",[362,5.39]],[\"name/652\",[364,60.488]],[\"parent/652\",[362,5.39]],[\"name/653\",[365,60.488]],[\"parent/653\",[362,5.39]],[\"name/654\",[116,37.664]],[\"parent/654\",[]],[\"name/655\",[311,60.488]],[\"parent/655\",[116,3.717]],[\"name/656\",[312,60.488]],[\"parent/656\",[116,3.717]],[\"name/657\",[313,60.488]],[\"parent/657\",[116,3.717]],[\"name/658\",[11,46.137]],[\"parent/658\",[116,3.717]],[\"name/659\",[314,60.488]],[\"parent/659\",[116,3.717]],[\"name/660\",[315,60.488]],[\"parent/660\",[116,3.717]],[\"name/661\",[37,52.603]],[\"parent/661\",[116,3.717]],[\"name/662\",[316,60.488]],[\"parent/662\",[116,3.717]],[\"name/663\",[317,60.488]],[\"parent/663\",[116,3.717]],[\"name/664\",[318,60.488]],[\"parent/664\",[116,3.717]],[\"name/665\",[319,60.488]],[\"parent/665\",[116,3.717]],[\"name/666\",[329,60.488]],[\"parent/666\",[116,3.717]],[\"name/667\",[320,60.488]],[\"parent/667\",[116,3.717]],[\"name/668\",[330,60.488]],[\"parent/668\",[116,3.717]],[\"name/669\",[31,57.123]],[\"parent/669\",[116,3.717]],[\"name/670\",[32,57.123]],[\"parent/670\",[116,3.717]],[\"name/671\",[321,60.488]],[\"parent/671\",[116,3.717]],[\"name/672\",[110,60.488]],[\"parent/672\",[116,3.717]],[\"name/673\",[322,60.488]],[\"parent/673\",[116,3.717]],[\"name/674\",[323,60.488]],[\"parent/674\",[116,3.717]],[\"name/675\",[33,57.123]],[\"parent/675\",[116,3.717]],[\"name/676\",[7,31.474]],[\"parent/676\",[366,6.474]],[\"name/677\",[34,57.123]],[\"parent/677\",[367,5.638]],[\"name/678\",[35,57.123]],[\"parent/678\",[367,5.638]],[\"name/679\",[36,57.123]],[\"parent/679\",[367,5.638]],[\"name/680\",[368,49.502]],[\"parent/680\",[]],[\"name/681\",[89,48.25]],[\"parent/681\",[368,4.886]],[\"name/682\",[91,48.25]],[\"parent/682\",[368,4.886]],[\"name/683\",[93,48.25]],[\"parent/683\",[368,4.886]],[\"name/684\",[94,48.25]],[\"parent/684\",[368,4.886]],[\"name/685\",[369,65.596]],[\"parent/685\",[368,4.886]],[\"name/686\",[92,48.25]],[\"parent/686\",[368,4.886]],[\"name/687\",[370,50.933]],[\"parent/687\",[]],[\"name/688\",[91,48.25]],[\"parent/688\",[370,5.027]],[\"name/689\",[92,48.25]],[\"parent/689\",[370,5.027]],[\"name/690\",[93,48.25]],[\"parent/690\",[370,5.027]],[\"name/691\",[94,48.25]],[\"parent/691\",[370,5.027]],[\"name/692\",[80,50.933]],[\"parent/692\",[]],[\"name/693\",[336,60.488]],[\"parent/693\",[80,5.027]],[\"name/694\",[337,60.488]],[\"parent/694\",[80,5.027]],[\"name/695\",[7,31.474]],[\"parent/695\",[371,6.474]],[\"name/696\",[339,60.488]],[\"parent/696\",[372,4.169]],[\"name/697\",[341,60.488]],[\"parent/697\",[372,4.169]],[\"name/698\",[342,60.488]],[\"parent/698\",[372,4.169]],[\"name/699\",[343,60.488]],[\"parent/699\",[372,4.169]],[\"name/700\",[344,60.488]],[\"parent/700\",[372,4.169]],[\"name/701\",[345,60.488]],[\"parent/701\",[372,4.169]],[\"name/702\",[346,60.488]],[\"parent/702\",[372,4.169]],[\"name/703\",[347,60.488]],[\"parent/703\",[372,4.169]],[\"name/704\",[348,60.488]],[\"parent/704\",[372,4.169]],[\"name/705\",[349,60.488]],[\"parent/705\",[372,4.169]],[\"name/706\",[350,60.488]],[\"parent/706\",[372,4.169]],[\"name/707\",[351,60.488]],[\"parent/707\",[372,4.169]],[\"name/708\",[352,60.488]],[\"parent/708\",[372,4.169]],[\"name/709\",[353,60.488]],[\"parent/709\",[372,4.169]],[\"name/710\",[354,60.488]],[\"parent/710\",[372,4.169]],[\"name/711\",[355,60.488]],[\"parent/711\",[80,5.027]],[\"name/712\",[356,60.488]],[\"parent/712\",[80,5.027]],[\"name/713\",[65,43.624]],[\"parent/713\",[]],[\"name/714\",[324,60.488]],[\"parent/714\",[65,4.306]],[\"name/715\",[327,60.488]],[\"parent/715\",[65,4.306]],[\"name/716\",[83,50.933]],[\"parent/716\",[65,4.306]],[\"name/717\",[111,60.488]],[\"parent/717\",[65,4.306]],[\"name/718\",[112,60.488]],[\"parent/718\",[65,4.306]],[\"name/719\",[113,60.488]],[\"parent/719\",[65,4.306]],[\"name/720\",[82,50.933]],[\"parent/720\",[65,4.306]],[\"name/721\",[358,60.488]],[\"parent/721\",[65,4.306]],[\"name/722\",[84,50.933]],[\"parent/722\",[65,4.306]],[\"name/723\",[373,60.488]],[\"parent/723\",[]],[\"name/724\",[1,39.447]],[\"parent/724\",[373,5.97]],[\"name/725\",[2,44.394]],[\"parent/725\",[374,5.39]],[\"name/726\",[97,50.933]],[\"parent/726\",[374,5.39]],[\"name/727\",[98,50.933]],[\"parent/727\",[374,5.39]],[\"name/728\",[99,50.933]],[\"parent/728\",[374,5.39]],[\"name/729\",[375,60.488]],[\"parent/729\",[]],[\"name/730\",[1,39.447]],[\"parent/730\",[375,5.97]],[\"name/731\",[2,44.394]],[\"parent/731\",[376,5.192]],[\"name/732\",[11,46.137]],[\"parent/732\",[376,5.192]],[\"name/733\",[97,50.933]],[\"parent/733\",[376,5.192]],[\"name/734\",[98,50.933]],[\"parent/734\",[376,5.192]],[\"name/735\",[99,50.933]],[\"parent/735\",[376,5.192]],[\"name/736\",[377,60.488]],[\"parent/736\",[]],[\"name/737\",[1,39.447]],[\"parent/737\",[377,5.97]],[\"name/738\",[7,31.474]],[\"parent/738\",[378,6.474]],[\"name/739\",[361,60.488]],[\"parent/739\",[379,5.39]],[\"name/740\",[363,60.488]],[\"parent/740\",[379,5.39]],[\"name/741\",[364,60.488]],[\"parent/741\",[379,5.39]],[\"name/742\",[365,60.488]],[\"parent/742\",[379,5.39]],[\"name/743\",[380,60.488]],[\"parent/743\",[]],[\"name/744\",[117,60.488]],[\"parent/744\",[380,5.97]],[\"name/745\",[118,60.488]],[\"parent/745\",[381,2.984]],[\"name/746\",[303,60.488]],[\"parent/746\",[381,2.984]],[\"name/747\",[304,60.488]],[\"parent/747\",[382,6.474]],[\"name/748\",[65,43.624]],[\"parent/748\",[381,2.984]],[\"name/749\",[53,47.138]],[\"parent/749\",[383,5.192]],[\"name/750\",[82,50.933]],[\"parent/750\",[383,5.192]],[\"name/751\",[83,50.933]],[\"parent/751\",[383,5.192]],[\"name/752\",[84,50.933]],[\"parent/752\",[383,5.192]],[\"name/753\",[0,50.933]],[\"parent/753\",[383,5.192]],[\"name/754\",[309,60.488]],[\"parent/754\",[381,2.984]],[\"name/755\",[384,65.596]],[\"parent/755\",[381,2.984]],[\"name/756\",[241,52.603]],[\"parent/756\",[385,5.97]],[\"name/757\",[128,47.138]],[\"parent/757\",[385,5.97]],[\"name/758\",[386,65.596]],[\"parent/758\",[381,2.984]],[\"name/759\",[306,60.488]],[\"parent/759\",[381,2.984]],[\"name/760\",[53,47.138]],[\"parent/760\",[387,4.382]],[\"name/761\",[56,49.502]],[\"parent/761\",[387,4.382]],[\"name/762\",[57,48.25]],[\"parent/762\",[387,4.382]],[\"name/763\",[58,49.502]],[\"parent/763\",[387,4.382]],[\"name/764\",[55,48.25]],[\"parent/764\",[387,4.382]],[\"name/765\",[60,52.603]],[\"parent/765\",[387,4.382]],[\"name/766\",[59,52.603]],[\"parent/766\",[387,4.382]],[\"name/767\",[61,46.137]],[\"parent/767\",[387,4.382]],[\"name/768\",[62,46.137]],[\"parent/768\",[387,4.382]],[\"name/769\",[63,49.502]],[\"parent/769\",[387,4.382]],[\"name/770\",[54,49.502]],[\"parent/770\",[387,4.382]],[\"name/771\",[7,31.474]],[\"parent/771\",[387,4.382]],[\"name/772\",[89,48.25]],[\"parent/772\",[388,5.192]],[\"name/773\",[91,48.25]],[\"parent/773\",[388,5.192]],[\"name/774\",[92,48.25]],[\"parent/774\",[388,5.192]],[\"name/775\",[93,48.25]],[\"parent/775\",[388,5.192]],[\"name/776\",[94,48.25]],[\"parent/776\",[388,5.192]],[\"name/777\",[102,54.61]],[\"parent/777\",[381,2.984]],[\"name/778\",[98,50.933]],[\"parent/778\",[389,5.638]],[\"name/779\",[97,50.933]],[\"parent/779\",[389,5.638]],[\"name/780\",[99,50.933]],[\"parent/780\",[389,5.638]],[\"name/781\",[152,60.488]],[\"parent/781\",[381,2.984]],[\"name/782\",[153,60.488]],[\"parent/782\",[381,2.984]],[\"name/783\",[154,54.61]],[\"parent/783\",[381,2.984]],[\"name/784\",[155,60.488]],[\"parent/784\",[381,2.984]],[\"name/785\",[7,31.474]],[\"parent/785\",[390,6.474]],[\"name/786\",[222,60.488]],[\"parent/786\",[381,2.984]],[\"name/787\",[218,50.933]],[\"parent/787\",[391,6.474]],[\"name/788\",[220,60.488]],[\"parent/788\",[381,2.984]],[\"name/789\",[7,31.474]],[\"parent/789\",[392,6.474]],[\"name/790\",[217,60.488]],[\"parent/790\",[381,2.984]],[\"name/791\",[218,50.933]],[\"parent/791\",[393,6.474]],[\"name/792\",[224,60.488]],[\"parent/792\",[381,2.984]],[\"name/793\",[225,60.488]],[\"parent/793\",[394,5.97]],[\"name/794\",[46,57.123]],[\"parent/794\",[394,5.97]],[\"name/795\",[227,60.488]],[\"parent/795\",[381,2.984]],[\"name/796\",[142,60.488]],[\"parent/796\",[381,2.984]],[\"name/797\",[143,54.61]],[\"parent/797\",[395,5.192]],[\"name/798\",[145,54.61]],[\"parent/798\",[395,5.192]],[\"name/799\",[146,60.488]],[\"parent/799\",[395,5.192]],[\"name/800\",[147,54.61]],[\"parent/800\",[395,5.192]],[\"name/801\",[148,54.61]],[\"parent/801\",[395,5.192]],[\"name/802\",[149,60.488]],[\"parent/802\",[381,2.984]],[\"name/803\",[143,54.61]],[\"parent/803\",[396,5.39]],[\"name/804\",[145,54.61]],[\"parent/804\",[396,5.39]],[\"name/805\",[147,54.61]],[\"parent/805\",[396,5.39]],[\"name/806\",[148,54.61]],[\"parent/806\",[396,5.39]],[\"name/807\",[151,60.488]],[\"parent/807\",[381,2.984]],[\"name/808\",[228,60.488]],[\"parent/808\",[381,2.984]],[\"name/809\",[229,50.933]],[\"parent/809\",[397,5.97]],[\"name/810\",[218,50.933]],[\"parent/810\",[397,5.97]],[\"name/811\",[398,65.596]],[\"parent/811\",[381,2.984]],[\"name/812\",[197,57.123]],[\"parent/812\",[399,5.39]],[\"name/813\",[198,57.123]],[\"parent/813\",[399,5.39]],[\"name/814\",[199,57.123]],[\"parent/814\",[399,5.39]],[\"name/815\",[400,65.596]],[\"parent/815\",[399,5.39]],[\"name/816\",[191,60.488]],[\"parent/816\",[381,2.984]],[\"name/817\",[192,60.488]],[\"parent/817\",[401,3.943]],[\"name/818\",[177,54.61]],[\"parent/818\",[401,3.943]],[\"name/819\",[175,54.61]],[\"parent/819\",[401,3.943]],[\"name/820\",[178,50.933]],[\"parent/820\",[401,3.943]],[\"name/821\",[160,50.933]],[\"parent/821\",[401,3.943]],[\"name/822\",[182,54.61]],[\"parent/822\",[401,3.943]],[\"name/823\",[181,54.61]],[\"parent/823\",[401,3.943]],[\"name/824\",[194,54.61]],[\"parent/824\",[401,3.943]],[\"name/825\",[195,60.488]],[\"parent/825\",[401,3.943]],[\"name/826\",[196,60.488]],[\"parent/826\",[401,3.943]],[\"name/827\",[197,57.123]],[\"parent/827\",[401,3.943]],[\"name/828\",[198,57.123]],[\"parent/828\",[401,3.943]],[\"name/829\",[199,57.123]],[\"parent/829\",[401,3.943]],[\"name/830\",[200,57.123]],[\"parent/830\",[401,3.943]],[\"name/831\",[187,54.61]],[\"parent/831\",[401,3.943]],[\"name/832\",[201,60.488]],[\"parent/832\",[401,3.943]],[\"name/833\",[202,60.488]],[\"parent/833\",[401,3.943]],[\"name/834\",[203,60.488]],[\"parent/834\",[401,3.943]],[\"name/835\",[188,54.61]],[\"parent/835\",[401,3.943]],[\"name/836\",[169,60.488]],[\"parent/836\",[381,2.984]],[\"name/837\",[170,54.61]],[\"parent/837\",[402,3.893]],[\"name/838\",[172,60.488]],[\"parent/838\",[402,3.893]],[\"name/839\",[173,60.488]],[\"parent/839\",[402,3.893]],[\"name/840\",[174,60.488]],[\"parent/840\",[402,3.893]],[\"name/841\",[175,54.61]],[\"parent/841\",[402,3.893]],[\"name/842\",[176,60.488]],[\"parent/842\",[402,3.893]],[\"name/843\",[177,54.61]],[\"parent/843\",[402,3.893]],[\"name/844\",[178,50.933]],[\"parent/844\",[402,3.893]],[\"name/845\",[179,60.488]],[\"parent/845\",[402,3.893]],[\"name/846\",[180,60.488]],[\"parent/846\",[402,3.893]],[\"name/847\",[181,54.61]],[\"parent/847\",[402,3.893]],[\"name/848\",[160,50.933]],[\"parent/848\",[402,3.893]],[\"name/849\",[182,54.61]],[\"parent/849\",[402,3.893]],[\"name/850\",[183,60.488]],[\"parent/850\",[402,3.893]],[\"name/851\",[184,60.488]],[\"parent/851\",[402,3.893]],[\"name/852\",[185,60.488]],[\"parent/852\",[402,3.893]],[\"name/853\",[186,60.488]],[\"parent/853\",[402,3.893]],[\"name/854\",[187,54.61]],[\"parent/854\",[402,3.893]],[\"name/855\",[154,54.61]],[\"parent/855\",[402,3.893]],[\"name/856\",[188,54.61]],[\"parent/856\",[402,3.893]],[\"name/857\",[157,60.488]],[\"parent/857\",[381,2.984]],[\"name/858\",[158,60.488]],[\"parent/858\",[403,5.97]],[\"name/859\",[160,50.933]],[\"parent/859\",[403,5.97]],[\"name/860\",[161,60.488]],[\"parent/860\",[381,2.984]],[\"name/861\",[162,60.488]],[\"parent/861\",[404,5.027]],[\"name/862\",[164,60.488]],[\"parent/862\",[404,5.027]],[\"name/863\",[165,60.488]],[\"parent/863\",[404,5.027]],[\"name/864\",[166,60.488]],[\"parent/864\",[404,5.027]],[\"name/865\",[167,60.488]],[\"parent/865\",[404,5.027]],[\"name/866\",[168,60.488]],[\"parent/866\",[404,5.027]],[\"name/867\",[194,54.61]],[\"parent/867\",[381,2.984]],[\"name/868\",[204,60.488]],[\"parent/868\",[405,4.464]],[\"name/869\",[206,60.488]],[\"parent/869\",[405,4.464]],[\"name/870\",[6,49.502]],[\"parent/870\",[405,4.464]],[\"name/871\",[12,49.502]],[\"parent/871\",[405,4.464]],[\"name/872\",[207,60.488]],[\"parent/872\",[405,4.464]],[\"name/873\",[208,60.488]],[\"parent/873\",[405,4.464]],[\"name/874\",[178,50.933]],[\"parent/874\",[405,4.464]],[\"name/875\",[209,60.488]],[\"parent/875\",[405,4.464]],[\"name/876\",[210,60.488]],[\"parent/876\",[405,4.464]],[\"name/877\",[211,60.488]],[\"parent/877\",[405,4.464]],[\"name/878\",[212,60.488]],[\"parent/878\",[405,4.464]],[\"name/879\",[231,60.488]],[\"parent/879\",[381,2.984]],[\"name/880\",[232,60.488]],[\"parent/880\",[406,5.027]],[\"name/881\",[234,60.488]],[\"parent/881\",[406,5.027]],[\"name/882\",[235,60.488]],[\"parent/882\",[406,5.027]],[\"name/883\",[170,54.61]],[\"parent/883\",[406,5.027]],[\"name/884\",[236,60.488]],[\"parent/884\",[406,5.027]],[\"name/885\",[237,60.488]],[\"parent/885\",[406,5.027]],[\"name/886\",[120,60.488]],[\"parent/886\",[381,2.984]],[\"name/887\",[121,60.488]],[\"parent/887\",[381,2.984]],[\"name/888\",[122,60.488]],[\"parent/888\",[381,2.984]],[\"name/889\",[123,60.488]],[\"parent/889\",[381,2.984]],[\"name/890\",[124,60.488]],[\"parent/890\",[381,2.984]],[\"name/891\",[125,44.394]],[\"parent/891\",[407,5.638]],[\"name/892\",[127,44.394]],[\"parent/892\",[407,5.638]],[\"name/893\",[128,47.138]],[\"parent/893\",[407,5.638]],[\"name/894\",[129,60.488]],[\"parent/894\",[381,2.984]],[\"name/895\",[125,44.394]],[\"parent/895\",[408,5.638]],[\"name/896\",[127,44.394]],[\"parent/896\",[408,5.638]],[\"name/897\",[128,47.138]],[\"parent/897\",[408,5.638]],[\"name/898\",[131,60.488]],[\"parent/898\",[381,2.984]],[\"name/899\",[125,44.394]],[\"parent/899\",[409,5.638]],[\"name/900\",[127,44.394]],[\"parent/900\",[409,5.638]],[\"name/901\",[128,47.138]],[\"parent/901\",[409,5.638]],[\"name/902\",[133,60.488]],[\"parent/902\",[381,2.984]],[\"name/903\",[125,44.394]],[\"parent/903\",[410,5.638]],[\"name/904\",[127,44.394]],[\"parent/904\",[410,5.638]],[\"name/905\",[135,54.61]],[\"parent/905\",[410,5.638]],[\"name/906\",[136,60.488]],[\"parent/906\",[381,2.984]],[\"name/907\",[125,44.394]],[\"parent/907\",[411,5.638]],[\"name/908\",[127,44.394]],[\"parent/908\",[411,5.638]],[\"name/909\",[135,54.61]],[\"parent/909\",[411,5.638]],[\"name/910\",[138,60.488]],[\"parent/910\",[381,2.984]],[\"name/911\",[125,44.394]],[\"parent/911\",[412,5.97]],[\"name/912\",[127,44.394]],[\"parent/912\",[412,5.97]],[\"name/913\",[140,60.488]],[\"parent/913\",[381,2.984]],[\"name/914\",[141,60.488]],[\"parent/914\",[381,2.984]],[\"name/915\",[413,65.596]],[\"parent/915\",[381,2.984]],[\"name/916\",[414,65.596]],[\"parent/916\",[381,2.984]],[\"name/917\",[415,65.596]],[\"parent/917\",[381,2.984]],[\"name/918\",[416,65.596]],[\"parent/918\",[381,2.984]],[\"name/919\",[417,65.596]],[\"parent/919\",[381,2.984]],[\"name/920\",[418,65.596]],[\"parent/920\",[381,2.984]],[\"name/921\",[419,65.596]],[\"parent/921\",[381,2.984]],[\"name/922\",[420,65.596]],[\"parent/922\",[381,2.984]],[\"name/923\",[421,65.596]],[\"parent/923\",[381,2.984]],[\"name/924\",[422,65.596]],[\"parent/924\",[381,2.984]],[\"name/925\",[423,65.596]],[\"parent/925\",[424,4.464]],[\"name/926\",[425,65.596]],[\"parent/926\",[424,4.464]],[\"name/927\",[426,65.596]],[\"parent/927\",[424,4.464]],[\"name/928\",[427,65.596]],[\"parent/928\",[424,4.464]],[\"name/929\",[428,65.596]],[\"parent/929\",[424,4.464]],[\"name/930\",[429,65.596]],[\"parent/930\",[424,4.464]],[\"name/931\",[430,65.596]],[\"parent/931\",[424,4.464]],[\"name/932\",[431,65.596]],[\"parent/932\",[424,4.464]],[\"name/933\",[432,65.596]],[\"parent/933\",[424,4.464]],[\"name/934\",[433,65.596]],[\"parent/934\",[424,4.464]],[\"name/935\",[434,65.596]],[\"parent/935\",[424,4.464]],[\"name/936\",[238,60.488]],[\"parent/936\",[381,2.984]],[\"name/937\",[8,31.044]],[\"parent/937\",[435,3.64]],[\"name/938\",[240,60.488]],[\"parent/938\",[435,3.64]],[\"name/939\",[241,52.603]],[\"parent/939\",[435,3.64]],[\"name/940\",[242,60.488]],[\"parent/940\",[435,3.64]],[\"name/941\",[243,60.488]],[\"parent/941\",[435,3.64]],[\"name/942\",[244,60.488]],[\"parent/942\",[435,3.64]],[\"name/943\",[245,60.488]],[\"parent/943\",[435,3.64]],[\"name/944\",[246,60.488]],[\"parent/944\",[435,3.64]],[\"name/945\",[8,31.044]],[\"parent/945\",[436,5.97]],[\"name/946\",[248,37.664]],[\"parent/946\",[436,5.97]],[\"name/947\",[248,37.664]],[\"parent/947\",[435,3.64]],[\"name/948\",[229,50.933]],[\"parent/948\",[437,5.638]],[\"name/949\",[8,31.044]],[\"parent/949\",[437,5.638]],[\"name/950\",[248,37.664]],[\"parent/950\",[437,5.638]],[\"name/951\",[250,60.488]],[\"parent/951\",[435,3.64]],[\"name/952\",[15,39.947]],[\"parent/952\",[438,5.638]],[\"name/953\",[252,60.488]],[\"parent/953\",[438,5.638]],[\"name/954\",[253,60.488]],[\"parent/954\",[438,5.638]],[\"name/955\",[254,54.61]],[\"parent/955\",[435,3.64]],[\"name/956\",[8,31.044]],[\"parent/956\",[439,5.192]],[\"name/957\",[15,39.947]],[\"parent/957\",[439,5.192]],[\"name/958\",[256,41.617]],[\"parent/958\",[439,5.192]],[\"name/959\",[257,42.909]],[\"parent/959\",[439,5.192]],[\"name/960\",[258,42.909]],[\"parent/960\",[439,5.192]],[\"name/961\",[256,41.617]],[\"parent/961\",[435,3.64]],[\"name/962\",[259,60.488]],[\"parent/962\",[440,5.638]],[\"name/963\",[8,31.044]],[\"parent/963\",[440,5.638]],[\"name/964\",[248,37.664]],[\"parent/964\",[440,5.638]],[\"name/965\",[261,60.488]],[\"parent/965\",[435,3.64]],[\"name/966\",[15,39.947]],[\"parent/966\",[441,5.192]],[\"name/967\",[8,31.044]],[\"parent/967\",[441,5.192]],[\"name/968\",[256,41.617]],[\"parent/968\",[441,5.192]],[\"name/969\",[257,42.909]],[\"parent/969\",[441,5.192]],[\"name/970\",[258,42.909]],[\"parent/970\",[441,5.192]],[\"name/971\",[6,49.502]],[\"parent/971\",[435,3.64]],[\"name/972\",[15,39.947]],[\"parent/972\",[442,5.192]],[\"name/973\",[8,31.044]],[\"parent/973\",[442,5.192]],[\"name/974\",[256,41.617]],[\"parent/974\",[442,5.192]],[\"name/975\",[257,42.909]],[\"parent/975\",[442,5.192]],[\"name/976\",[258,42.909]],[\"parent/976\",[442,5.192]],[\"name/977\",[264,60.488]],[\"parent/977\",[435,3.64]],[\"name/978\",[15,39.947]],[\"parent/978\",[443,5.192]],[\"name/979\",[8,31.044]],[\"parent/979\",[443,5.192]],[\"name/980\",[256,41.617]],[\"parent/980\",[443,5.192]],[\"name/981\",[257,42.909]],[\"parent/981\",[443,5.192]],[\"name/982\",[258,42.909]],[\"parent/982\",[443,5.192]],[\"name/983\",[266,60.488]],[\"parent/983\",[435,3.64]],[\"name/984\",[15,39.947]],[\"parent/984\",[444,5.192]],[\"name/985\",[8,31.044]],[\"parent/985\",[444,5.192]],[\"name/986\",[256,41.617]],[\"parent/986\",[444,5.192]],[\"name/987\",[257,42.909]],[\"parent/987\",[444,5.192]],[\"name/988\",[258,42.909]],[\"parent/988\",[444,5.192]],[\"name/989\",[12,49.502]],[\"parent/989\",[435,3.64]],[\"name/990\",[15,39.947]],[\"parent/990\",[445,5.192]],[\"name/991\",[8,31.044]],[\"parent/991\",[445,5.192]],[\"name/992\",[256,41.617]],[\"parent/992\",[445,5.192]],[\"name/993\",[257,42.909]],[\"parent/993\",[445,5.192]],[\"name/994\",[258,42.909]],[\"parent/994\",[445,5.192]],[\"name/995\",[269,54.61]],[\"parent/995\",[435,3.64]],[\"name/996\",[270,60.488]],[\"parent/996\",[446,5.39]],[\"name/997\",[272,60.488]],[\"parent/997\",[446,5.39]],[\"name/998\",[8,31.044]],[\"parent/998\",[446,5.39]],[\"name/999\",[248,37.664]],[\"parent/999\",[446,5.39]],[\"name/1000\",[273,60.488]],[\"parent/1000\",[435,3.64]],[\"name/1001\",[274,50.933]],[\"parent/1001\",[447,5.638]],[\"name/1002\",[8,31.044]],[\"parent/1002\",[447,5.638]],[\"name/1003\",[248,37.664]],[\"parent/1003\",[447,5.638]],[\"name/1004\",[276,60.488]],[\"parent/1004\",[435,3.64]],[\"name/1005\",[277,54.61]],[\"parent/1005\",[448,5.39]],[\"name/1006\",[279,60.488]],[\"parent/1006\",[448,5.39]],[\"name/1007\",[8,31.044]],[\"parent/1007\",[448,5.39]],[\"name/1008\",[248,37.664]],[\"parent/1008\",[448,5.39]],[\"name/1009\",[277,54.61]],[\"parent/1009\",[435,3.64]],[\"name/1010\",[280,54.61]],[\"parent/1010\",[449,4.886]],[\"name/1011\",[282,60.488]],[\"parent/1011\",[449,4.886]],[\"name/1012\",[241,52.603]],[\"parent/1012\",[449,4.886]],[\"name/1013\",[283,54.61]],[\"parent/1013\",[449,4.886]],[\"name/1014\",[284,60.488]],[\"parent/1014\",[449,4.886]],[\"name/1015\",[8,31.044]],[\"parent/1015\",[449,4.886]],[\"name/1016\",[248,37.664]],[\"parent/1016\",[449,4.886]],[\"name/1017\",[285,50.933]],[\"parent/1017\",[435,3.64]],[\"name/1018\",[286,60.488]],[\"parent/1018\",[450,4.762]],[\"name/1019\",[288,54.61]],[\"parent/1019\",[450,4.762]],[\"name/1020\",[280,54.61]],[\"parent/1020\",[450,4.762]],[\"name/1021\",[128,47.138]],[\"parent/1021\",[450,4.762]],[\"name/1022\",[269,54.61]],[\"parent/1022\",[450,4.762]],[\"name/1023\",[289,60.488]],[\"parent/1023\",[450,4.762]],[\"name/1024\",[8,31.044]],[\"parent/1024\",[450,4.762]],[\"name/1025\",[248,37.664]],[\"parent/1025\",[450,4.762]],[\"name/1026\",[290,54.61]],[\"parent/1026\",[435,3.64]],[\"name/1027\",[290,54.61]],[\"parent/1027\",[451,5.192]],[\"name/1028\",[285,50.933]],[\"parent/1028\",[451,5.192]],[\"name/1029\",[283,54.61]],[\"parent/1029\",[451,5.192]],[\"name/1030\",[8,31.044]],[\"parent/1030\",[451,5.192]],[\"name/1031\",[248,37.664]],[\"parent/1031\",[451,5.192]],[\"name/1032\",[292,60.488]],[\"parent/1032\",[435,3.64]],[\"name/1033\",[293,60.488]],[\"parent/1033\",[452,5.192]],[\"name/1034\",[229,50.933]],[\"parent/1034\",[452,5.192]],[\"name/1035\",[274,50.933]],[\"parent/1035\",[452,5.192]],[\"name/1036\",[8,31.044]],[\"parent/1036\",[452,5.192]],[\"name/1037\",[248,37.664]],[\"parent/1037\",[452,5.192]],[\"name/1038\",[295,60.488]],[\"parent/1038\",[435,3.64]],[\"name/1039\",[296,60.488]],[\"parent/1039\",[453,5.192]],[\"name/1040\",[254,54.61]],[\"parent/1040\",[453,5.192]],[\"name/1041\",[274,50.933]],[\"parent/1041\",[453,5.192]],[\"name/1042\",[8,31.044]],[\"parent/1042\",[453,5.192]],[\"name/1043\",[248,37.664]],[\"parent/1043\",[453,5.192]],[\"name/1044\",[298,60.488]],[\"parent/1044\",[435,3.64]],[\"name/1045\",[285,50.933]],[\"parent/1045\",[454,4.554]],[\"name/1046\",[288,54.61]],[\"parent/1046\",[454,4.554]],[\"name/1047\",[300,60.488]],[\"parent/1047\",[454,4.554]],[\"name/1048\",[301,60.488]],[\"parent/1048\",[454,4.554]],[\"name/1049\",[302,60.488]],[\"parent/1049\",[454,4.554]],[\"name/1050\",[8,31.044]],[\"parent/1050\",[454,4.554]],[\"name/1051\",[15,39.947]],[\"parent/1051\",[454,4.554]],[\"name/1052\",[256,41.617]],[\"parent/1052\",[454,4.554]],[\"name/1053\",[257,42.909]],[\"parent/1053\",[454,4.554]],[\"name/1054\",[258,42.909]],[\"parent/1054\",[454,4.554]],[\"name/1055\",[89,48.25]],[\"parent/1055\",[333,4.762]],[\"name/1056\",[89,48.25]],[\"parent/1056\",[370,5.027]],[\"name/1057\",[200,57.123]],[\"parent/1057\",[65,4.306]]],\"invertedIndex\":[[\"0.4.0\",{\"_index\":339,\"name\":{\"625\":{},\"696\":{}},\"parent\":{}}],[\"0.5.0\",{\"_index\":341,\"name\":{\"626\":{},\"697\":{}},\"parent\":{}}],[\"1.0.0\",{\"_index\":342,\"name\":{\"627\":{},\"698\":{}},\"parent\":{}}],[\"1.0.1\",{\"_index\":343,\"name\":{\"628\":{},\"699\":{}},\"parent\":{}}],[\"1.0.2\",{\"_index\":344,\"name\":{\"629\":{},\"700\":{}},\"parent\":{}}],[\"1.1.0\",{\"_index\":345,\"name\":{\"630\":{},\"701\":{}},\"parent\":{}}],[\"1.4.0\",{\"_index\":346,\"name\":{\"631\":{},\"702\":{}},\"parent\":{}}],[\"1.6.0\",{\"_index\":347,\"name\":{\"632\":{},\"703\":{}},\"parent\":{}}],[\"1.8.0\",{\"_index\":348,\"name\":{\"633\":{},\"704\":{}},\"parent\":{}}],[\"3.0.0\",{\"_index\":349,\"name\":{\"634\":{},\"705\":{}},\"parent\":{}}],[\"3.0.1\",{\"_index\":350,\"name\":{\"635\":{},\"706\":{}},\"parent\":{}}],[\"3.3.0\",{\"_index\":351,\"name\":{\"636\":{},\"707\":{}},\"parent\":{}}],[\"3.5.0\",{\"_index\":352,\"name\":{\"637\":{},\"708\":{}},\"parent\":{}}],[\"4.0.0\",{\"_index\":353,\"name\":{\"638\":{},\"709\":{}},\"parent\":{}}],[\"4.0.1\",{\"_index\":354,\"name\":{\"639\":{},\"710\":{}},\"parent\":{}}],[\"__type\",{\"_index\":7,\"name\":{\"6\":{},\"11\":{},\"15\":{},\"39\":{},\"49\":{},\"116\":{},\"118\":{},\"121\":{},\"124\":{},\"126\":{},\"128\":{},\"140\":{},\"142\":{},\"144\":{},\"146\":{},\"148\":{},\"150\":{},\"170\":{},\"175\":{},\"179\":{},\"210\":{},\"212\":{},\"214\":{},\"216\":{},\"218\":{},\"220\":{},\"255\":{},\"257\":{},\"259\":{},\"261\":{},\"311\":{},\"389\":{},\"394\":{},\"398\":{},\"424\":{},\"572\":{},\"608\":{},\"624\":{},\"649\":{},\"676\":{},\"695\":{},\"738\":{},\"771\":{},\"785\":{},\"789\":{}},\"parent\":{}}],[\"_clearstate\",{\"_index\":24,\"name\":{\"28\":{},\"192\":{}},\"parent\":{}}],[\"_refreshtask\",{\"_index\":16,\"name\":{\"20\":{},\"184\":{}},\"parent\":{}}],[\"_request\",{\"_index\":68,\"name\":{\"78\":{}},\"parent\":{}}],[\"_responsetoolkit\",{\"_index\":67,\"name\":{\"77\":{}},\"parent\":{}}],[\"_storage\",{\"_index\":52,\"name\":{\"61\":{},\"79\":{},\"95\":{},\"137\":{},\"207\":{}},\"parent\":{}}],[\"_url\",{\"_index\":51,\"name\":{\"60\":{},\"136\":{}},\"parent\":{}}],[\"absolute\",{\"_index\":318,\"name\":{\"589\":{},\"664\":{}},\"parent\":{}}],[\"access_token\",{\"_index\":210,\"name\":{\"378\":{},\"876\":{}},\"parent\":{}}],[\"adapter\",{\"_index\":306,\"name\":{\"562\":{},\"759\":{}},\"parent\":{}}],[\"adapters/browseradapter\",{\"_index\":49,\"name\":{\"57\":{}},\"parent\":{\"58\":{}}}],[\"adapters/browseradapter.default\",{\"_index\":50,\"name\":{},\"parent\":{\"59\":{},\"60\":{},\"61\":{},\"62\":{},\"63\":{},\"64\":{},\"65\":{},\"66\":{},\"67\":{},\"68\":{},\"69\":{},\"70\":{},\"71\":{},\"72\":{}}}],[\"adapters/hapiadapter\",{\"_index\":64,\"name\":{\"73\":{}},\"parent\":{\"74\":{}}}],[\"adapters/hapiadapter.default\",{\"_index\":66,\"name\":{},\"parent\":{\"75\":{},\"76\":{},\"77\":{},\"78\":{},\"79\":{},\"80\":{},\"81\":{},\"82\":{},\"83\":{},\"84\":{},\"85\":{},\"86\":{},\"87\":{},\"88\":{},\"89\":{},\"90\":{},\"91\":{}}}],[\"adapters/nodeadapter\",{\"_index\":70,\"name\":{\"92\":{}},\"parent\":{\"93\":{}}}],[\"adapters/nodeadapter.default\",{\"_index\":71,\"name\":{},\"parent\":{\"94\":{},\"95\":{},\"96\":{},\"97\":{},\"98\":{},\"99\":{},\"100\":{},\"101\":{},\"102\":{},\"103\":{},\"104\":{},\"105\":{},\"106\":{},\"107\":{}}}],[\"alg\",{\"_index\":143,\"name\":{\"296\":{},\"302\":{},\"797\":{},\"803\":{}},\"parent\":{}}],[\"any\",{\"_index\":36,\"name\":{\"42\":{},\"611\":{},\"679\":{}},\"parent\":{}}],[\"assert\",{\"_index\":322,\"name\":{\"595\":{},\"673\":{}},\"parent\":{}}],[\"assertjsonpatch\",{\"_index\":323,\"name\":{\"596\":{},\"674\":{}},\"parent\":{}}],[\"assigner\",{\"_index\":289,\"name\":{\"528\":{},\"1023\":{}},\"parent\":{}}],[\"aud\",{\"_index\":234,\"name\":{\"436\":{},\"881\":{}},\"parent\":{}}],[\"authorization_endpoint\",{\"_index\":423,\"name\":{\"925\":{}},\"parent\":{}}],[\"authorize\",{\"_index\":83,\"name\":{\"125\":{},\"254\":{},\"346\":{},\"643\":{},\"716\":{},\"751\":{}},\"parent\":{}}],[\"authorizeparams\",{\"_index\":169,\"name\":{\"322\":{},\"836\":{}},\"parent\":{}}],[\"authorizeuri\",{\"_index\":198,\"name\":{\"361\":{},\"813\":{},\"828\":{}},\"parent\":{}}],[\"backboneelement\",{\"_index\":273,\"name\":{\"505\":{},\"1000\":{}},\"parent\":{}}],[\"base64/browser\",{\"_index\":72,\"name\":{\"108\":{}},\"parent\":{\"109\":{},\"110\":{},\"111\":{}}}],[\"base64decode\",{\"_index\":60,\"name\":{\"69\":{},\"88\":{},\"104\":{},\"602\":{},\"765\":{}},\"parent\":{}}],[\"base64encode\",{\"_index\":59,\"name\":{\"68\":{},\"87\":{},\"103\":{},\"601\":{},\"766\":{}},\"parent\":{}}],[\"base64urldecode\",{\"_index\":62,\"name\":{\"71\":{},\"90\":{},\"106\":{},\"110\":{},\"156\":{},\"227\":{},\"242\":{},\"569\":{},\"618\":{},\"768\":{}},\"parent\":{}}],[\"base64urlencode\",{\"_index\":61,\"name\":{\"70\":{},\"89\":{},\"105\":{},\"109\":{},\"155\":{},\"226\":{},\"241\":{},\"568\":{},\"617\":{},\"767\":{}},\"parent\":{}}],[\"body\",{\"_index\":225,\"name\":{\"428\":{},\"793\":{}},\"parent\":{}}],[\"browserfhirsettings\",{\"_index\":309,\"name\":{\"578\":{},\"754\":{}},\"parent\":{}}],[\"buildtokenrequest\",{\"_index\":358,\"name\":{\"645\":{},\"721\":{}},\"parent\":{}}],[\"bundle\",{\"_index\":298,\"name\":{\"549\":{},\"1044\":{}},\"parent\":{}}],[\"bundleentry\",{\"_index\":295,\"name\":{\"543\":{},\"1038\":{}},\"parent\":{}}],[\"bundlelink\",{\"_index\":292,\"name\":{\"537\":{},\"1032\":{}},\"parent\":{}}],[\"bycode\",{\"_index\":31,\"name\":{\"36\":{},\"592\":{},\"669\":{}},\"parent\":{}}],[\"bycodes\",{\"_index\":32,\"name\":{\"37\":{},\"593\":{},\"670\":{}},\"parent\":{}}],[\"capabilities\",{\"_index\":434,\"name\":{\"935\":{}},\"parent\":{}}],[\"capabilitystatement\",{\"_index\":250,\"name\":{\"456\":{},\"951\":{}},\"parent\":{}}],[\"checkresponse\",{\"_index\":311,\"name\":{\"580\":{},\"655\":{}},\"parent\":{}}],[\"client\",{\"_index\":0,\"name\":{\"0\":{},\"117\":{},\"260\":{},\"348\":{},\"753\":{}},\"parent\":{\"1\":{}}}],[\"client.default\",{\"_index\":3,\"name\":{},\"parent\":{\"2\":{},\"3\":{},\"4\":{},\"5\":{},\"6\":{},\"10\":{},\"11\":{},\"14\":{},\"15\":{},\"20\":{},\"21\":{},\"22\":{},\"23\":{},\"24\":{},\"25\":{},\"26\":{},\"27\":{},\"28\":{},\"29\":{},\"30\":{},\"31\":{},\"32\":{},\"33\":{},\"34\":{},\"35\":{},\"36\":{},\"37\":{},\"38\":{},\"39\":{},\"43\":{},\"44\":{},\"45\":{},\"46\":{}}}],[\"client.default.__type\",{\"_index\":9,\"name\":{},\"parent\":{\"7\":{},\"8\":{},\"9\":{},\"12\":{},\"13\":{},\"16\":{},\"17\":{},\"18\":{},\"19\":{},\"40\":{},\"41\":{},\"42\":{}}}],[\"client_id\",{\"_index\":207,\"name\":{\"374\":{},\"872\":{}},\"parent\":{}}],[\"clientid\",{\"_index\":177,\"name\":{\"329\":{},\"351\":{},\"818\":{},\"843\":{}},\"parent\":{}}],[\"clientinterface\",{\"_index\":214,\"name\":{\"385\":{}},\"parent\":{}}],[\"clientprivatejwk\",{\"_index\":182,\"name\":{\"335\":{},\"355\":{},\"822\":{},\"849\":{}},\"parent\":{}}],[\"clientpublickeyseturl\",{\"_index\":160,\"name\":{\"314\":{},\"334\":{},\"354\":{},\"821\":{},\"848\":{},\"859\":{}},\"parent\":{}}],[\"clientsecret\",{\"_index\":181,\"name\":{\"333\":{},\"356\":{},\"823\":{},\"847\":{}},\"parent\":{}}],[\"clientstate\",{\"_index\":191,\"name\":{\"349\":{},\"816\":{}},\"parent\":{}}],[\"clienttype\",{\"_index\":416,\"name\":{\"918\":{}},\"parent\":{}}],[\"cm\",{\"_index\":34,\"name\":{\"40\":{},\"609\":{},\"677\":{}},\"parent\":{}}],[\"code\",{\"_index\":241,\"name\":{\"444\":{},\"517\":{},\"756\":{},\"939\":{},\"1012\":{}},\"parent\":{}}],[\"code_challenge_methods_supported\",{\"_index\":430,\"name\":{\"931\":{}},\"parent\":{}}],[\"codeableconcept\",{\"_index\":276,\"name\":{\"509\":{},\"1004\":{}},\"parent\":{}}],[\"codechallenge\",{\"_index\":202,\"name\":{\"366\":{},\"833\":{}},\"parent\":{}}],[\"codechallengemethod\",{\"_index\":413,\"name\":{\"915\":{}},\"parent\":{}}],[\"codechallengemethods\",{\"_index\":400,\"name\":{\"815\":{}},\"parent\":{}}],[\"codevalue\",{\"_index\":384,\"name\":{\"755\":{}},\"parent\":{}}],[\"codeverifier\",{\"_index\":203,\"name\":{\"367\":{},\"834\":{}},\"parent\":{}}],[\"coding\",{\"_index\":277,\"name\":{\"510\":{},\"514\":{},\"1005\":{},\"1009\":{}},\"parent\":{}}],[\"combinedfetchresult\",{\"_index\":224,\"name\":{\"427\":{},\"792\":{}},\"parent\":{}}],[\"completeintarget\",{\"_index\":187,\"name\":{\"340\":{},\"364\":{},\"831\":{},\"854\":{}},\"parent\":{}}],[\"constructor\",{\"_index\":2,\"name\":{\"2\":{},\"50\":{},\"59\":{},\"76\":{},\"94\":{},\"135\":{},\"160\":{},\"166\":{},\"206\":{},\"231\":{},\"725\":{},\"731\":{}},\"parent\":{}}],[\"create\",{\"_index\":25,\"name\":{\"29\":{},\"193\":{},\"410\":{}},\"parent\":{}}],[\"crv\",{\"_index\":146,\"name\":{\"298\":{},\"799\":{}},\"parent\":{}}],[\"datetime\",{\"_index\":243,\"name\":{\"446\":{},\"941\":{}},\"parent\":{}}],[\"debug\",{\"_index\":74,\"name\":{\"112\":{},\"113\":{},\"606\":{}},\"parent\":{\"113\":{}}}],[\"default\",{\"_index\":1,\"name\":{\"1\":{},\"48\":{},\"58\":{},\"74\":{},\"93\":{},\"115\":{},\"130\":{},\"132\":{},\"134\":{},\"159\":{},\"165\":{},\"205\":{},\"230\":{},\"252\":{},\"253\":{},\"620\":{},\"648\":{},\"724\":{},\"730\":{},\"737\":{}},\"parent\":{}}],[\"delete\",{\"_index\":27,\"name\":{\"31\":{},\"195\":{},\"412\":{}},\"parent\":{}}],[\"digestsha256\",{\"_index\":91,\"name\":{\"143\":{},\"213\":{},\"238\":{},\"574\":{},\"613\":{},\"682\":{},\"688\":{},\"773\":{}},\"parent\":{}}],[\"display\",{\"_index\":283,\"name\":{\"518\":{},\"534\":{},\"1013\":{},\"1029\":{}},\"parent\":{}}],[\"element\",{\"_index\":246,\"name\":{\"449\":{},\"944\":{}},\"parent\":{}}],[\"encounter\",{\"_index\":12,\"name\":{\"10\":{},\"174\":{},\"373\":{},\"393\":{},\"494\":{},\"871\":{},\"989\":{}},\"parent\":{}}],[\"encounterid\",{\"_index\":180,\"name\":{\"332\":{},\"846\":{}},\"parent\":{}}],[\"end\",{\"_index\":272,\"name\":{\"502\":{},\"997\":{}},\"parent\":{}}],[\"entry\",{\"_index\":302,\"name\":{\"554\":{},\"1049\":{}},\"parent\":{}}],[\"entry/browser\",{\"_index\":75,\"name\":{\"114\":{}},\"parent\":{\"115\":{}}}],[\"entry/browser.default\",{\"_index\":76,\"name\":{},\"parent\":{\"116\":{}}}],[\"entry/browser.default.__type\",{\"_index\":77,\"name\":{},\"parent\":{\"117\":{},\"118\":{},\"119\":{},\"120\":{},\"121\":{}}}],[\"entry/browser.default.__type.__type\",{\"_index\":81,\"name\":{},\"parent\":{\"122\":{},\"123\":{},\"124\":{},\"125\":{},\"126\":{},\"127\":{},\"128\":{}}}],[\"entry/hapi\",{\"_index\":85,\"name\":{\"129\":{}},\"parent\":{\"130\":{}}}],[\"entry/node\",{\"_index\":86,\"name\":{\"131\":{}},\"parent\":{\"132\":{}}}],[\"environment\",{\"_index\":5,\"name\":{\"4\":{}},\"parent\":{}}],[\"es384jwk\",{\"_index\":142,\"name\":{\"295\":{},\"796\":{}},\"parent\":{}}],[\"exp\",{\"_index\":237,\"name\":{\"440\":{},\"885\":{}},\"parent\":{}}],[\"expired\",{\"_index\":361,\"name\":{\"650\":{},\"739\":{}},\"parent\":{}}],[\"expires_in\",{\"_index\":209,\"name\":{\"377\":{},\"875\":{}},\"parent\":{}}],[\"expiresat\",{\"_index\":201,\"name\":{\"365\":{},\"832\":{}},\"parent\":{}}],[\"extension\",{\"_index\":248,\"name\":{\"451\":{},\"452\":{},\"455\":{},\"469\":{},\"504\":{},\"508\":{},\"513\":{},\"521\":{},\"530\":{},\"536\":{},\"542\":{},\"548\":{},\"946\":{},\"947\":{},\"950\":{},\"964\":{},\"999\":{},\"1003\":{},\"1008\":{},\"1016\":{},\"1025\":{},\"1031\":{},\"1037\":{},\"1043\":{}},\"parent\":{}}],[\"faketokenresponse\",{\"_index\":183,\"name\":{\"336\":{},\"850\":{}},\"parent\":{}}],[\"fetchconformancestatement\",{\"_index\":315,\"name\":{\"585\":{},\"660\":{}},\"parent\":{}}],[\"fetchoptions\",{\"_index\":217,\"name\":{\"421\":{},\"790\":{}},\"parent\":{}}],[\"fetchresult\",{\"_index\":227,\"name\":{\"430\":{},\"795\":{}},\"parent\":{}}],[\"fetchwellknownjson\",{\"_index\":324,\"name\":{\"597\":{},\"714\":{}},\"parent\":{}}],[\"fhir\",{\"_index\":238,\"name\":{\"441\":{},\"936\":{}},\"parent\":{}}],[\"fhirclient\",{\"_index\":117,\"name\":{\"264\":{},\"744\":{}},\"parent\":{}}],[\"fhiroptions\",{\"_index\":161,\"name\":{\"315\":{},\"860\":{}},\"parent\":{}}],[\"fhirserviceurl\",{\"_index\":174,\"name\":{\"326\":{},\"840\":{}},\"parent\":{}}],[\"fhiruser\",{\"_index\":14,\"name\":{\"18\":{},\"182\":{},\"401\":{}},\"parent\":{}}],[\"fhirversion\",{\"_index\":252,\"name\":{\"458\":{},\"953\":{}},\"parent\":{}}],[\"fhirversions\",{\"_index\":337,\"name\":{\"623\":{},\"694\":{}},\"parent\":{}}],[\"flat\",{\"_index\":165,\"name\":{\"318\":{},\"863\":{}},\"parent\":{}}],[\"from\",{\"_index\":135,\"name\":{\"285\":{},\"289\":{},\"905\":{},\"909\":{}},\"parent\":{}}],[\"fullurl\",{\"_index\":296,\"name\":{\"544\":{},\"1039\":{}},\"parent\":{}}],[\"generatepkcechallenge\",{\"_index\":92,\"name\":{\"145\":{},\"215\":{},\"250\":{},\"575\":{},\"614\":{},\"686\":{},\"689\":{},\"774\":{}},\"parent\":{}}],[\"get\",{\"_index\":97,\"name\":{\"161\":{},\"233\":{},\"383\":{},\"726\":{},\"733\":{},\"779\":{}},\"parent\":{}}],[\"getaccesstokenexpiration\",{\"_index\":330,\"name\":{\"605\":{},\"668\":{}},\"parent\":{}}],[\"getandcache\",{\"_index\":314,\"name\":{\"584\":{},\"659\":{}},\"parent\":{}}],[\"getauthorizationheader\",{\"_index\":23,\"name\":{\"27\":{},\"191\":{},\"409\":{}},\"parent\":{}}],[\"getencounterid\",{\"_index\":18,\"name\":{\"22\":{},\"186\":{},\"404\":{}},\"parent\":{}}],[\"getfhirrelease\",{\"_index\":40,\"name\":{\"46\":{},\"203\":{},\"420\":{}},\"parent\":{}}],[\"getfhiruser\",{\"_index\":20,\"name\":{\"24\":{},\"188\":{},\"406\":{}},\"parent\":{}}],[\"getfhirversion\",{\"_index\":39,\"name\":{\"45\":{},\"202\":{},\"419\":{}},\"parent\":{}}],[\"getidtoken\",{\"_index\":19,\"name\":{\"23\":{},\"187\":{},\"405\":{}},\"parent\":{}}],[\"getpath\",{\"_index\":37,\"name\":{\"43\":{},\"200\":{},\"417\":{},\"586\":{},\"661\":{}},\"parent\":{}}],[\"getpatientid\",{\"_index\":17,\"name\":{\"21\":{},\"185\":{},\"403\":{}},\"parent\":{}}],[\"getpatientparam\",{\"_index\":321,\"name\":{\"594\":{},\"671\":{}},\"parent\":{}}],[\"getprotocol\",{\"_index\":69,\"name\":{\"85\":{},\"99\":{},\"222\":{}},\"parent\":{}}],[\"getsecurityextensions\",{\"_index\":327,\"name\":{\"600\":{},\"715\":{}},\"parent\":{}}],[\"getsecurityextensionsfromconformancestatement\",{\"_index\":326,\"name\":{\"599\":{}},\"parent\":{}}],[\"getsecurityextensionsfromwellknownjson\",{\"_index\":325,\"name\":{\"598\":{}},\"parent\":{}}],[\"getsmartapi\",{\"_index\":63,\"name\":{\"72\":{},\"91\":{},\"107\":{},\"157\":{},\"228\":{},\"570\":{},\"769\":{}},\"parent\":{}}],[\"getstate\",{\"_index\":38,\"name\":{\"44\":{},\"201\":{},\"418\":{}},\"parent\":{}}],[\"getstorage\",{\"_index\":58,\"name\":{\"67\":{},\"80\":{},\"102\":{},\"154\":{},\"225\":{},\"566\":{},\"763\":{}},\"parent\":{}}],[\"gettargetwindow\",{\"_index\":110,\"name\":{\"244\":{},\"672\":{}},\"parent\":{}}],[\"gettimeinfuture\",{\"_index\":320,\"name\":{\"591\":{},\"667\":{}},\"parent\":{}}],[\"geturl\",{\"_index\":56,\"name\":{\"65\":{},\"86\":{},\"100\":{},\"152\":{},\"223\":{},\"564\":{},\"761\":{}},\"parent\":{}}],[\"getuserid\",{\"_index\":21,\"name\":{\"25\":{},\"189\":{},\"407\":{}},\"parent\":{}}],[\"getusertype\",{\"_index\":22,\"name\":{\"26\":{},\"190\":{},\"408\":{}},\"parent\":{}}],[\"graph\",{\"_index\":166,\"name\":{\"319\":{},\"864\":{}},\"parent\":{}}],[\"height\",{\"_index\":186,\"name\":{\"339\":{},\"853\":{}},\"parent\":{}}],[\"httperror\",{\"_index\":41,\"name\":{\"47\":{}},\"parent\":{\"48\":{}}}],[\"httperror.default\",{\"_index\":42,\"name\":{},\"parent\":{\"49\":{},\"50\":{},\"51\":{},\"52\":{},\"53\":{},\"54\":{},\"55\":{},\"56\":{}}}],[\"iat\",{\"_index\":236,\"name\":{\"439\":{},\"884\":{}},\"parent\":{}}],[\"id\",{\"_index\":8,\"name\":{\"7\":{},\"12\":{},\"16\":{},\"171\":{},\"176\":{},\"180\":{},\"390\":{},\"395\":{},\"399\":{},\"442\":{},\"450\":{},\"454\":{},\"461\":{},\"468\":{},\"472\":{},\"478\":{},\"484\":{},\"490\":{},\"496\":{},\"503\":{},\"507\":{},\"512\":{},\"520\":{},\"529\":{},\"535\":{},\"541\":{},\"547\":{},\"555\":{},\"937\":{},\"945\":{},\"949\":{},\"956\":{},\"963\":{},\"967\":{},\"973\":{},\"979\":{},\"985\":{},\"991\":{},\"998\":{},\"1002\":{},\"1007\":{},\"1015\":{},\"1024\":{},\"1030\":{},\"1036\":{},\"1042\":{},\"1050\":{}},\"parent\":{}}],[\"id_token\",{\"_index\":211,\"name\":{\"379\":{},\"877\":{}},\"parent\":{}}],[\"identifier\",{\"_index\":285,\"name\":{\"522\":{},\"533\":{},\"550\":{},\"1017\":{},\"1028\":{},\"1045\":{}},\"parent\":{}}],[\"idtoken\",{\"_index\":231,\"name\":{\"434\":{},\"879\":{}},\"parent\":{}}],[\"implicitrules\",{\"_index\":257,\"name\":{\"464\":{},\"474\":{},\"480\":{},\"486\":{},\"492\":{},\"498\":{},\"558\":{},\"959\":{},\"969\":{},\"975\":{},\"981\":{},\"987\":{},\"993\":{},\"1053\":{}},\"parent\":{}}],[\"importjwk\",{\"_index\":93,\"name\":{\"147\":{},\"217\":{},\"239\":{},\"576\":{},\"615\":{},\"683\":{},\"690\":{},\"775\":{}},\"parent\":{}}],[\"includeresponse\",{\"_index\":218,\"name\":{\"422\":{},\"426\":{},\"433\":{},\"787\":{},\"791\":{},\"810\":{}},\"parent\":{}}],[\"includeresponsehint\",{\"_index\":222,\"name\":{\"425\":{},\"786\":{}},\"parent\":{}}],[\"init\",{\"_index\":84,\"name\":{\"127\":{},\"258\":{},\"347\":{},\"646\":{},\"722\":{},\"752\":{}},\"parent\":{}}],[\"instant\",{\"_index\":242,\"name\":{\"445\":{},\"940\":{}},\"parent\":{}}],[\"introspection_endpoint\",{\"_index\":428,\"name\":{\"929\":{}},\"parent\":{}}],[\"isinframe\",{\"_index\":111,\"name\":{\"245\":{},\"717\":{}},\"parent\":{}}],[\"isinpopup\",{\"_index\":112,\"name\":{\"246\":{},\"718\":{}},\"parent\":{}}],[\"iss\",{\"_index\":170,\"name\":{\"323\":{},\"438\":{},\"837\":{},\"883\":{}},\"parent\":{}}],[\"issmatch\",{\"_index\":172,\"name\":{\"324\":{},\"838\":{}},\"parent\":{}}],[\"jsonarray\",{\"_index\":123,\"name\":{\"269\":{},\"889\":{}},\"parent\":{}}],[\"jsonobject\",{\"_index\":120,\"name\":{\"266\":{},\"886\":{}},\"parent\":{}}],[\"jsonpatch\",{\"_index\":141,\"name\":{\"294\":{},\"914\":{}},\"parent\":{}}],[\"jsonpatchadd\",{\"_index\":124,\"name\":{\"270\":{},\"890\":{}},\"parent\":{}}],[\"jsonpatchcopy\",{\"_index\":136,\"name\":{\"286\":{},\"906\":{}},\"parent\":{}}],[\"jsonpatchmove\",{\"_index\":133,\"name\":{\"282\":{},\"902\":{}},\"parent\":{}}],[\"jsonpatchoperation\",{\"_index\":140,\"name\":{\"293\":{},\"913\":{}},\"parent\":{}}],[\"jsonpatchremove\",{\"_index\":138,\"name\":{\"290\":{},\"910\":{}},\"parent\":{}}],[\"jsonpatchreplace\",{\"_index\":129,\"name\":{\"274\":{},\"894\":{}},\"parent\":{}}],[\"jsonpatchtest\",{\"_index\":131,\"name\":{\"278\":{},\"898\":{}},\"parent\":{}}],[\"jsonprimitive\",{\"_index\":121,\"name\":{\"267\":{},\"887\":{}},\"parent\":{}}],[\"jsonvalue\",{\"_index\":122,\"name\":{\"268\":{},\"888\":{}},\"parent\":{}}],[\"jwk\",{\"_index\":151,\"name\":{\"306\":{},\"807\":{}},\"parent\":{}}],[\"jwtdecode\",{\"_index\":329,\"name\":{\"604\":{},\"666\":{}},\"parent\":{}}],[\"key\",{\"_index\":200,\"name\":{\"363\":{},\"830\":{},\"1057\":{}},\"parent\":{}}],[\"key_ops\",{\"_index\":148,\"name\":{\"300\":{},\"305\":{},\"801\":{},\"806\":{}},\"parent\":{}}],[\"kg\",{\"_index\":35,\"name\":{\"41\":{},\"610\":{},\"678\":{}},\"parent\":{}}],[\"kid\",{\"_index\":147,\"name\":{\"299\":{},\"304\":{},\"800\":{},\"805\":{}},\"parent\":{}}],[\"kty\",{\"_index\":145,\"name\":{\"297\":{},\"303\":{},\"798\":{},\"804\":{}},\"parent\":{}}],[\"language\",{\"_index\":258,\"name\":{\"465\":{},\"475\":{},\"481\":{},\"487\":{},\"493\":{},\"499\":{},\"559\":{},\"960\":{},\"970\":{},\"976\":{},\"982\":{},\"988\":{},\"994\":{},\"1054\":{}},\"parent\":{}}],[\"lastupdated\",{\"_index\":259,\"name\":{\"467\":{},\"962\":{}},\"parent\":{}}],[\"launch\",{\"_index\":173,\"name\":{\"325\":{},\"839\":{}},\"parent\":{}}],[\"launchcontext\",{\"_index\":418,\"name\":{\"920\":{}},\"parent\":{}}],[\"launchcontextehr\",{\"_index\":419,\"name\":{\"921\":{}},\"parent\":{}}],[\"launchcontextstandalone\",{\"_index\":420,\"name\":{\"922\":{}},\"parent\":{}}],[\"launchmode\",{\"_index\":415,\"name\":{\"917\":{}},\"parent\":{}}],[\"lib\",{\"_index\":116,\"name\":{\"263\":{},\"654\":{}},\"parent\":{\"264\":{},\"655\":{},\"656\":{},\"657\":{},\"658\":{},\"659\":{},\"660\":{},\"661\":{},\"662\":{},\"663\":{},\"664\":{},\"665\":{},\"666\":{},\"667\":{},\"668\":{},\"669\":{},\"670\":{},\"671\":{},\"672\":{},\"673\":{},\"674\":{},\"675\":{}}}],[\"lib.fhirclient\",{\"_index\":119,\"name\":{},\"parent\":{\"265\":{},\"266\":{},\"267\":{},\"268\":{},\"269\":{},\"270\":{},\"274\":{},\"278\":{},\"282\":{},\"286\":{},\"290\":{},\"293\":{},\"294\":{},\"295\":{},\"301\":{},\"306\":{},\"307\":{},\"308\":{},\"309\":{},\"310\":{},\"312\":{},\"315\":{},\"322\":{},\"343\":{},\"349\":{},\"369\":{},\"381\":{},\"385\":{},\"421\":{},\"423\":{},\"425\":{},\"427\":{},\"430\":{},\"431\":{},\"434\":{},\"441\":{},\"560\":{},\"562\":{},\"578\":{}}}],[\"lib.fhirclient.adapter\",{\"_index\":307,\"name\":{},\"parent\":{\"563\":{},\"564\":{},\"565\":{},\"566\":{},\"567\":{},\"568\":{},\"569\":{},\"570\":{},\"571\":{},\"572\":{}}}],[\"lib.fhirclient.adapter.__type\",{\"_index\":308,\"name\":{},\"parent\":{\"573\":{},\"574\":{},\"575\":{},\"576\":{},\"577\":{}}}],[\"lib.fhirclient.authorizeparams\",{\"_index\":171,\"name\":{},\"parent\":{\"323\":{},\"324\":{},\"325\":{},\"326\":{},\"327\":{},\"328\":{},\"329\":{},\"330\":{},\"331\":{},\"332\":{},\"333\":{},\"334\":{},\"335\":{},\"336\":{},\"337\":{},\"338\":{},\"339\":{},\"340\":{},\"341\":{},\"342\":{}}}],[\"lib.fhirclient.clientinterface\",{\"_index\":215,\"name\":{},\"parent\":{\"386\":{},\"387\":{},\"388\":{},\"389\":{},\"393\":{},\"394\":{},\"397\":{},\"398\":{},\"403\":{},\"404\":{},\"405\":{},\"406\":{},\"407\":{},\"408\":{},\"409\":{},\"410\":{},\"411\":{},\"412\":{},\"413\":{},\"414\":{},\"415\":{},\"416\":{},\"417\":{},\"418\":{},\"419\":{},\"420\":{}}}],[\"lib.fhirclient.clientinterface.__type\",{\"_index\":216,\"name\":{},\"parent\":{\"390\":{},\"391\":{},\"392\":{},\"395\":{},\"396\":{},\"399\":{},\"400\":{},\"401\":{},\"402\":{}}}],[\"lib.fhirclient.clientstate\",{\"_index\":193,\"name\":{},\"parent\":{\"350\":{},\"351\":{},\"352\":{},\"353\":{},\"354\":{},\"355\":{},\"356\":{},\"357\":{},\"358\":{},\"359\":{},\"360\":{},\"361\":{},\"362\":{},\"363\":{},\"364\":{},\"365\":{},\"366\":{},\"367\":{},\"368\":{}}}],[\"lib.fhirclient.combinedfetchresult\",{\"_index\":226,\"name\":{},\"parent\":{\"428\":{},\"429\":{}}}],[\"lib.fhirclient.es384jwk\",{\"_index\":144,\"name\":{},\"parent\":{\"296\":{},\"297\":{},\"298\":{},\"299\":{},\"300\":{}}}],[\"lib.fhirclient.fetchoptions\",{\"_index\":219,\"name\":{},\"parent\":{\"422\":{}}}],[\"lib.fhirclient.fhir\",{\"_index\":239,\"name\":{},\"parent\":{\"442\":{},\"443\":{},\"444\":{},\"445\":{},\"446\":{},\"447\":{},\"448\":{},\"449\":{},\"452\":{},\"456\":{},\"460\":{},\"466\":{},\"470\":{},\"476\":{},\"482\":{},\"488\":{},\"494\":{},\"500\":{},\"505\":{},\"509\":{},\"514\":{},\"522\":{},\"531\":{},\"537\":{},\"543\":{},\"549\":{}}}],[\"lib.fhirclient.fhir.backboneelement\",{\"_index\":275,\"name\":{},\"parent\":{\"506\":{},\"507\":{},\"508\":{}}}],[\"lib.fhirclient.fhir.bundle\",{\"_index\":299,\"name\":{},\"parent\":{\"550\":{},\"551\":{},\"552\":{},\"553\":{},\"554\":{},\"555\":{},\"556\":{},\"557\":{},\"558\":{},\"559\":{}}}],[\"lib.fhirclient.fhir.bundleentry\",{\"_index\":297,\"name\":{},\"parent\":{\"544\":{},\"545\":{},\"546\":{},\"547\":{},\"548\":{}}}],[\"lib.fhirclient.fhir.bundlelink\",{\"_index\":294,\"name\":{},\"parent\":{\"538\":{},\"539\":{},\"540\":{},\"541\":{},\"542\":{}}}],[\"lib.fhirclient.fhir.capabilitystatement\",{\"_index\":251,\"name\":{},\"parent\":{\"457\":{},\"458\":{},\"459\":{}}}],[\"lib.fhirclient.fhir.codeableconcept\",{\"_index\":278,\"name\":{},\"parent\":{\"510\":{},\"511\":{},\"512\":{},\"513\":{}}}],[\"lib.fhirclient.fhir.coding\",{\"_index\":281,\"name\":{},\"parent\":{\"515\":{},\"516\":{},\"517\":{},\"518\":{},\"519\":{},\"520\":{},\"521\":{}}}],[\"lib.fhirclient.fhir.element\",{\"_index\":247,\"name\":{},\"parent\":{\"450\":{},\"451\":{}}}],[\"lib.fhirclient.fhir.encounter\",{\"_index\":268,\"name\":{},\"parent\":{\"495\":{},\"496\":{},\"497\":{},\"498\":{},\"499\":{}}}],[\"lib.fhirclient.fhir.extension\",{\"_index\":249,\"name\":{},\"parent\":{\"453\":{},\"454\":{},\"455\":{}}}],[\"lib.fhirclient.fhir.identifier\",{\"_index\":287,\"name\":{},\"parent\":{\"523\":{},\"524\":{},\"525\":{},\"526\":{},\"527\":{},\"528\":{},\"529\":{},\"530\":{}}}],[\"lib.fhirclient.fhir.meta\",{\"_index\":260,\"name\":{},\"parent\":{\"467\":{},\"468\":{},\"469\":{}}}],[\"lib.fhirclient.fhir.observation\",{\"_index\":262,\"name\":{},\"parent\":{\"471\":{},\"472\":{},\"473\":{},\"474\":{},\"475\":{}}}],[\"lib.fhirclient.fhir.patient\",{\"_index\":263,\"name\":{},\"parent\":{\"477\":{},\"478\":{},\"479\":{},\"480\":{},\"481\":{}}}],[\"lib.fhirclient.fhir.period\",{\"_index\":271,\"name\":{},\"parent\":{\"501\":{},\"502\":{},\"503\":{},\"504\":{}}}],[\"lib.fhirclient.fhir.practitioner\",{\"_index\":265,\"name\":{},\"parent\":{\"483\":{},\"484\":{},\"485\":{},\"486\":{},\"487\":{}}}],[\"lib.fhirclient.fhir.reference\",{\"_index\":291,\"name\":{},\"parent\":{\"532\":{},\"533\":{},\"534\":{},\"535\":{},\"536\":{}}}],[\"lib.fhirclient.fhir.relatedperson\",{\"_index\":267,\"name\":{},\"parent\":{\"489\":{},\"490\":{},\"491\":{},\"492\":{},\"493\":{}}}],[\"lib.fhirclient.fhir.resource\",{\"_index\":255,\"name\":{},\"parent\":{\"461\":{},\"462\":{},\"463\":{},\"464\":{},\"465\":{}}}],[\"lib.fhirclient.fhiroptions\",{\"_index\":163,\"name\":{},\"parent\":{\"316\":{},\"317\":{},\"318\":{},\"319\":{},\"320\":{},\"321\":{}}}],[\"lib.fhirclient.idtoken\",{\"_index\":233,\"name\":{},\"parent\":{\"435\":{},\"436\":{},\"437\":{},\"438\":{},\"439\":{},\"440\":{}}}],[\"lib.fhirclient.includeresponsehint\",{\"_index\":223,\"name\":{},\"parent\":{\"426\":{}}}],[\"lib.fhirclient.jsonpatchadd\",{\"_index\":126,\"name\":{},\"parent\":{\"271\":{},\"272\":{},\"273\":{}}}],[\"lib.fhirclient.jsonpatchcopy\",{\"_index\":137,\"name\":{},\"parent\":{\"287\":{},\"288\":{},\"289\":{}}}],[\"lib.fhirclient.jsonpatchmove\",{\"_index\":134,\"name\":{},\"parent\":{\"283\":{},\"284\":{},\"285\":{}}}],[\"lib.fhirclient.jsonpatchremove\",{\"_index\":139,\"name\":{},\"parent\":{\"291\":{},\"292\":{}}}],[\"lib.fhirclient.jsonpatchreplace\",{\"_index\":130,\"name\":{},\"parent\":{\"275\":{},\"276\":{},\"277\":{}}}],[\"lib.fhirclient.jsonpatchtest\",{\"_index\":132,\"name\":{},\"parent\":{\"279\":{},\"280\":{},\"281\":{}}}],[\"lib.fhirclient.readyoptions\",{\"_index\":159,\"name\":{},\"parent\":{\"313\":{},\"314\":{}}}],[\"lib.fhirclient.requestfunction\",{\"_index\":221,\"name\":{},\"parent\":{\"424\":{}}}],[\"lib.fhirclient.requestoptions\",{\"_index\":230,\"name\":{},\"parent\":{\"432\":{},\"433\":{}}}],[\"lib.fhirclient.requestwithsession\",{\"_index\":305,\"name\":{},\"parent\":{\"561\":{}}}],[\"lib.fhirclient.rs384jwk\",{\"_index\":150,\"name\":{},\"parent\":{\"302\":{},\"303\":{},\"304\":{},\"305\":{}}}],[\"lib.fhirclient.smart_api\",{\"_index\":190,\"name\":{},\"parent\":{\"344\":{},\"345\":{},\"346\":{},\"347\":{},\"348\":{}}}],[\"lib.fhirclient.storage\",{\"_index\":213,\"name\":{},\"parent\":{\"382\":{},\"383\":{},\"384\":{}}}],[\"lib.fhirclient.storagefactory\",{\"_index\":156,\"name\":{},\"parent\":{\"311\":{}}}],[\"lib.fhirclient.tokenresponse\",{\"_index\":205,\"name\":{},\"parent\":{\"370\":{},\"371\":{},\"372\":{},\"373\":{},\"374\":{},\"375\":{},\"376\":{},\"377\":{},\"378\":{},\"379\":{},\"380\":{}}}],[\"lib.units\",{\"_index\":366,\"name\":{},\"parent\":{\"676\":{}}}],[\"lib.units.__type\",{\"_index\":367,\"name\":{},\"parent\":{\"677\":{},\"678\":{},\"679\":{}}}],[\"lib/browser\",{\"_index\":109,\"name\":{\"236\":{}},\"parent\":{\"237\":{},\"238\":{},\"239\":{},\"240\":{},\"241\":{},\"242\":{},\"243\":{},\"244\":{},\"245\":{},\"246\":{},\"247\":{},\"248\":{},\"249\":{},\"250\":{}}}],[\"lib/browser_entry\",{\"_index\":114,\"name\":{\"251\":{}},\"parent\":{\"252\":{},\"253\":{}}}],[\"lib/browser_entry.default\",{\"_index\":115,\"name\":{},\"parent\":{\"254\":{},\"255\":{},\"256\":{},\"257\":{},\"258\":{},\"259\":{},\"260\":{},\"261\":{},\"262\":{}}}],[\"lib/browseradapter\",{\"_index\":87,\"name\":{\"133\":{}},\"parent\":{\"134\":{}}}],[\"lib/browseradapter.default\",{\"_index\":88,\"name\":{},\"parent\":{\"135\":{},\"136\":{},\"137\":{},\"138\":{},\"139\":{},\"140\":{},\"151\":{},\"152\":{},\"153\":{},\"154\":{},\"155\":{},\"156\":{},\"157\":{}}}],[\"lib/browseradapter.default.__type\",{\"_index\":90,\"name\":{},\"parent\":{\"141\":{},\"142\":{},\"143\":{},\"144\":{},\"145\":{},\"146\":{},\"147\":{},\"148\":{},\"149\":{},\"150\":{}}}],[\"lib/browserstorage\",{\"_index\":95,\"name\":{\"158\":{}},\"parent\":{\"159\":{}}}],[\"lib/browserstorage.default\",{\"_index\":96,\"name\":{},\"parent\":{\"160\":{},\"161\":{},\"162\":{},\"163\":{}}}],[\"lib/client\",{\"_index\":100,\"name\":{\"164\":{}},\"parent\":{\"165\":{}}}],[\"lib/client.default\",{\"_index\":101,\"name\":{},\"parent\":{\"166\":{},\"167\":{},\"168\":{},\"169\":{},\"170\":{},\"174\":{},\"175\":{},\"178\":{},\"179\":{},\"184\":{},\"185\":{},\"186\":{},\"187\":{},\"188\":{},\"189\":{},\"190\":{},\"191\":{},\"192\":{},\"193\":{},\"194\":{},\"195\":{},\"196\":{},\"197\":{},\"198\":{},\"199\":{},\"200\":{},\"201\":{},\"202\":{},\"203\":{}}}],[\"lib/client.default.__type\",{\"_index\":103,\"name\":{},\"parent\":{\"171\":{},\"172\":{},\"173\":{},\"176\":{},\"177\":{},\"180\":{},\"181\":{},\"182\":{},\"183\":{}}}],[\"lib/isomorphic\",{\"_index\":310,\"name\":{\"579\":{}},\"parent\":{\"580\":{},\"581\":{},\"582\":{},\"583\":{},\"584\":{},\"585\":{},\"586\":{},\"587\":{},\"588\":{},\"589\":{},\"590\":{},\"591\":{},\"592\":{},\"593\":{},\"594\":{},\"595\":{},\"596\":{},\"597\":{},\"598\":{},\"599\":{},\"600\":{},\"601\":{},\"602\":{},\"603\":{},\"604\":{},\"605\":{},\"606\":{},\"607\":{}}}],[\"lib/isomorphic.units\",{\"_index\":331,\"name\":{},\"parent\":{\"608\":{}}}],[\"lib/isomorphic.units.__type\",{\"_index\":332,\"name\":{},\"parent\":{\"609\":{},\"610\":{},\"611\":{}}}],[\"lib/nodeadapter\",{\"_index\":104,\"name\":{\"204\":{}},\"parent\":{\"205\":{}}}],[\"lib/nodeadapter.default\",{\"_index\":105,\"name\":{},\"parent\":{\"206\":{},\"207\":{},\"208\":{},\"209\":{},\"210\":{},\"221\":{},\"222\":{},\"223\":{},\"224\":{},\"225\":{},\"226\":{},\"227\":{},\"228\":{}}}],[\"lib/nodeadapter.default.__type\",{\"_index\":106,\"name\":{},\"parent\":{\"211\":{},\"212\":{},\"213\":{},\"214\":{},\"215\":{},\"216\":{},\"217\":{},\"218\":{},\"219\":{},\"220\":{}}}],[\"lib/server\",{\"_index\":333,\"name\":{\"612\":{}},\"parent\":{\"613\":{},\"614\":{},\"615\":{},\"616\":{},\"617\":{},\"618\":{},\"1055\":{}}}],[\"lib/server_entry\",{\"_index\":334,\"name\":{\"619\":{}},\"parent\":{\"620\":{}}}],[\"lib/serverstorage\",{\"_index\":107,\"name\":{\"229\":{}},\"parent\":{\"230\":{}}}],[\"lib/serverstorage.default\",{\"_index\":108,\"name\":{},\"parent\":{\"231\":{},\"232\":{},\"233\":{},\"234\":{},\"235\":{}}}],[\"lib/settings\",{\"_index\":335,\"name\":{\"621\":{}},\"parent\":{\"622\":{},\"623\":{},\"640\":{},\"641\":{}}}],[\"lib/settings.fhirversions\",{\"_index\":338,\"name\":{},\"parent\":{\"624\":{}}}],[\"lib/settings.fhirversions.__type\",{\"_index\":340,\"name\":{},\"parent\":{\"625\":{},\"626\":{},\"627\":{},\"628\":{},\"629\":{},\"630\":{},\"631\":{},\"632\":{},\"633\":{},\"634\":{},\"635\":{},\"636\":{},\"637\":{},\"638\":{},\"639\":{}}}],[\"lib/smart\",{\"_index\":357,\"name\":{\"642\":{}},\"parent\":{\"643\":{},\"644\":{},\"645\":{},\"646\":{}}}],[\"lib/strings\",{\"_index\":359,\"name\":{\"647\":{}},\"parent\":{\"648\":{}}}],[\"lib/strings.default\",{\"_index\":360,\"name\":{},\"parent\":{\"649\":{}}}],[\"lib/strings.default.__type\",{\"_index\":362,\"name\":{},\"parent\":{\"650\":{},\"651\":{},\"652\":{},\"653\":{}}}],[\"link\",{\"_index\":301,\"name\":{\"553\":{},\"1048\":{}},\"parent\":{}}],[\"lowecasekeys\",{\"_index\":313,\"name\":{\"582\":{},\"657\":{}},\"parent\":{}}],[\"makearray\",{\"_index\":317,\"name\":{\"588\":{},\"663\":{}},\"parent\":{}}],[\"management_endpoint\",{\"_index\":427,\"name\":{\"928\":{}},\"parent\":{}}],[\"meta\",{\"_index\":256,\"name\":{\"463\":{},\"466\":{},\"473\":{},\"479\":{},\"485\":{},\"491\":{},\"497\":{},\"557\":{},\"958\":{},\"961\":{},\"968\":{},\"974\":{},\"980\":{},\"986\":{},\"992\":{},\"1052\":{}},\"parent\":{}}],[\"modifierextension\",{\"_index\":274,\"name\":{\"506\":{},\"540\":{},\"546\":{},\"1001\":{},\"1035\":{},\"1041\":{}},\"parent\":{}}],[\"need_patient_banner\",{\"_index\":204,\"name\":{\"370\":{},\"868\":{}},\"parent\":{}}],[\"nofreecontext\",{\"_index\":365,\"name\":{\"653\":{},\"742\":{}},\"parent\":{}}],[\"noifnoauth\",{\"_index\":364,\"name\":{\"652\":{},\"741\":{}},\"parent\":{}}],[\"noredirect\",{\"_index\":176,\"name\":{\"328\":{},\"842\":{}},\"parent\":{}}],[\"noscopeforid\",{\"_index\":363,\"name\":{\"651\":{},\"740\":{}},\"parent\":{}}],[\"oauth2\",{\"_index\":79,\"name\":{\"120\":{}},\"parent\":{}}],[\"oauthsecurityextensions\",{\"_index\":398,\"name\":{\"811\":{}},\"parent\":{}}],[\"observation\",{\"_index\":261,\"name\":{\"470\":{},\"965\":{}},\"parent\":{}}],[\"observationmap\",{\"_index\":386,\"name\":{\"758\":{}},\"parent\":{}}],[\"onmessage\",{\"_index\":113,\"name\":{\"249\":{},\"719\":{}},\"parent\":{}}],[\"onpage\",{\"_index\":164,\"name\":{\"317\":{},\"862\":{}},\"parent\":{}}],[\"op\",{\"_index\":125,\"name\":{\"271\":{},\"275\":{},\"279\":{},\"283\":{},\"287\":{},\"291\":{},\"891\":{},\"895\":{},\"899\":{},\"903\":{},\"907\":{},\"911\":{}},\"parent\":{}}],[\"options\",{\"_index\":53,\"name\":{\"62\":{},\"82\":{},\"96\":{},\"138\":{},\"208\":{},\"344\":{},\"563\":{},\"749\":{},\"760\":{}},\"parent\":{}}],[\"pagelimit\",{\"_index\":162,\"name\":{\"316\":{},\"861\":{}},\"parent\":{}}],[\"parse\",{\"_index\":47,\"name\":{\"55\":{}},\"parent\":{}}],[\"password\",{\"_index\":196,\"name\":{\"359\":{},\"826\":{}},\"parent\":{}}],[\"patch\",{\"_index\":28,\"name\":{\"32\":{},\"196\":{},\"413\":{}},\"parent\":{}}],[\"path\",{\"_index\":127,\"name\":{\"272\":{},\"276\":{},\"280\":{},\"284\":{},\"288\":{},\"292\":{},\"892\":{},\"896\":{},\"900\":{},\"904\":{},\"908\":{},\"912\":{}},\"parent\":{}}],[\"patient\",{\"_index\":6,\"name\":{\"5\":{},\"169\":{},\"372\":{},\"388\":{},\"476\":{},\"870\":{},\"971\":{}},\"parent\":{}}],[\"patientcompartment\",{\"_index\":336,\"name\":{\"622\":{},\"693\":{}},\"parent\":{}}],[\"patientid\",{\"_index\":179,\"name\":{\"331\":{},\"845\":{}},\"parent\":{}}],[\"patientparams\",{\"_index\":355,\"name\":{\"640\":{},\"711\":{}},\"parent\":{}}],[\"period\",{\"_index\":269,\"name\":{\"500\":{},\"527\":{},\"995\":{},\"1022\":{}},\"parent\":{}}],[\"permissions\",{\"_index\":421,\"name\":{\"923\":{}},\"parent\":{}}],[\"pkcemode\",{\"_index\":154,\"name\":{\"309\":{},\"341\":{},\"783\":{},\"855\":{}},\"parent\":{}}],[\"practitioner\",{\"_index\":264,\"name\":{\"482\":{},\"977\":{}},\"parent\":{}}],[\"privatekey\",{\"_index\":158,\"name\":{\"313\":{},\"858\":{}},\"parent\":{}}],[\"profile\",{\"_index\":232,\"name\":{\"435\":{},\"880\":{}},\"parent\":{}}],[\"randombytes\",{\"_index\":89,\"name\":{\"141\":{},\"211\":{},\"237\":{},\"573\":{},\"681\":{},\"772\":{},\"1055\":{},\"1056\":{}},\"parent\":{}}],[\"randomstring\",{\"_index\":319,\"name\":{\"590\":{},\"665\":{}},\"parent\":{}}],[\"read\",{\"_index\":10,\"name\":{\"8\":{},\"13\":{},\"17\":{},\"172\":{},\"177\":{},\"181\":{},\"391\":{},\"396\":{},\"400\":{}},\"parent\":{}}],[\"ready\",{\"_index\":82,\"name\":{\"123\":{},\"256\":{},\"345\":{},\"644\":{},\"720\":{},\"750\":{}},\"parent\":{}}],[\"readyoptions\",{\"_index\":157,\"name\":{\"312\":{},\"857\":{}},\"parent\":{}}],[\"redirect\",{\"_index\":57,\"name\":{\"66\":{},\"81\":{},\"101\":{},\"153\":{},\"224\":{},\"248\":{},\"565\":{},\"762\":{}},\"parent\":{}}],[\"redirecturi\",{\"_index\":175,\"name\":{\"327\":{},\"352\":{},\"819\":{},\"841\":{}},\"parent\":{}}],[\"reference\",{\"_index\":290,\"name\":{\"531\":{},\"532\":{},\"1026\":{},\"1027\":{}},\"parent\":{}}],[\"refresh\",{\"_index\":30,\"name\":{\"35\":{},\"199\":{},\"416\":{}},\"parent\":{}}],[\"refresh_token\",{\"_index\":212,\"name\":{\"380\":{},\"878\":{}},\"parent\":{}}],[\"refreshifneeded\",{\"_index\":29,\"name\":{\"34\":{},\"198\":{},\"415\":{}},\"parent\":{}}],[\"refreshtokenwithcredentials\",{\"_index\":188,\"name\":{\"342\":{},\"368\":{},\"835\":{},\"856\":{}},\"parent\":{}}],[\"registration_endpoint\",{\"_index\":426,\"name\":{\"927\":{}},\"parent\":{}}],[\"registrationuri\",{\"_index\":197,\"name\":{\"360\":{},\"812\":{},\"827\":{}},\"parent\":{}}],[\"relatedperson\",{\"_index\":266,\"name\":{\"488\":{},\"983\":{}},\"parent\":{}}],[\"relation\",{\"_index\":293,\"name\":{\"538\":{},\"1033\":{}},\"parent\":{}}],[\"relative\",{\"_index\":55,\"name\":{\"64\":{},\"84\":{},\"98\":{},\"151\":{},\"221\":{},\"247\":{},\"567\":{},\"764\":{}},\"parent\":{}}],[\"request\",{\"_index\":11,\"name\":{\"9\":{},\"33\":{},\"173\":{},\"197\":{},\"232\":{},\"392\":{},\"414\":{},\"583\":{},\"658\":{},\"732\":{}},\"parent\":{}}],[\"requestfunction\",{\"_index\":220,\"name\":{\"423\":{},\"788\":{}},\"parent\":{}}],[\"requestoptions\",{\"_index\":228,\"name\":{\"431\":{},\"808\":{}},\"parent\":{}}],[\"requestwithsession\",{\"_index\":303,\"name\":{\"560\":{},\"746\":{}},\"parent\":{}}],[\"resolvereferences\",{\"_index\":167,\"name\":{\"320\":{},\"865\":{}},\"parent\":{}}],[\"resource\",{\"_index\":254,\"name\":{\"460\":{},\"545\":{},\"955\":{},\"1040\":{}},\"parent\":{}}],[\"resourcetype\",{\"_index\":15,\"name\":{\"19\":{},\"183\":{},\"402\":{},\"457\":{},\"462\":{},\"471\":{},\"477\":{},\"483\":{},\"489\":{},\"495\":{},\"556\":{},\"952\":{},\"957\":{},\"966\":{},\"972\":{},\"978\":{},\"984\":{},\"990\":{},\"1051\":{}},\"parent\":{}}],[\"response\",{\"_index\":46,\"name\":{\"54\":{},\"429\":{},\"794\":{}},\"parent\":{}}],[\"response_types_supported\",{\"_index\":433,\"name\":{\"934\":{}},\"parent\":{}}],[\"responsetojson\",{\"_index\":312,\"name\":{\"581\":{},\"656\":{}},\"parent\":{}}],[\"rest\",{\"_index\":253,\"name\":{\"459\":{},\"954\":{}},\"parent\":{}}],[\"revocation_endpoint\",{\"_index\":429,\"name\":{\"930\":{}},\"parent\":{}}],[\"rs384jwk\",{\"_index\":149,\"name\":{\"301\":{},\"802\":{}},\"parent\":{}}],[\"scope\",{\"_index\":178,\"name\":{\"330\":{},\"353\":{},\"376\":{},\"820\":{},\"844\":{},\"874\":{}},\"parent\":{}}],[\"scopes_supported\",{\"_index\":432,\"name\":{\"933\":{}},\"parent\":{}}],[\"security\",{\"_index\":54,\"name\":{\"63\":{},\"83\":{},\"97\":{},\"139\":{},\"209\":{},\"571\":{},\"770\":{}},\"parent\":{}}],[\"security/browser\",{\"_index\":368,\"name\":{\"680\":{}},\"parent\":{\"681\":{},\"682\":{},\"683\":{},\"684\":{},\"685\":{},\"686\":{}}}],[\"security/server\",{\"_index\":370,\"name\":{\"687\":{}},\"parent\":{\"688\":{},\"689\":{},\"690\":{},\"691\":{},\"1056\":{}}}],[\"serverurl\",{\"_index\":192,\"name\":{\"350\":{},\"817\":{}},\"parent\":{}}],[\"session\",{\"_index\":304,\"name\":{\"561\":{},\"747\":{}},\"parent\":{}}],[\"set\",{\"_index\":98,\"name\":{\"162\":{},\"234\":{},\"382\":{},\"727\":{},\"734\":{},\"778\":{}},\"parent\":{}}],[\"setpath\",{\"_index\":316,\"name\":{\"587\":{},\"662\":{}},\"parent\":{}}],[\"settings\",{\"_index\":80,\"name\":{\"122\":{},\"692\":{}},\"parent\":{\"693\":{},\"694\":{},\"711\":{},\"712\":{}}}],[\"settings.fhirversions\",{\"_index\":371,\"name\":{},\"parent\":{\"695\":{}}}],[\"settings.fhirversions.__type\",{\"_index\":372,\"name\":{},\"parent\":{\"696\":{},\"697\":{},\"698\":{},\"699\":{},\"700\":{},\"701\":{},\"702\":{},\"703\":{},\"704\":{},\"705\":{},\"706\":{},\"707\":{},\"708\":{},\"709\":{},\"710\":{}}}],[\"shouldincludechallenge\",{\"_index\":328,\"name\":{\"603\":{}},\"parent\":{}}],[\"signcompactjws\",{\"_index\":94,\"name\":{\"149\":{},\"219\":{},\"240\":{},\"577\":{},\"616\":{},\"684\":{},\"691\":{},\"776\":{}},\"parent\":{}}],[\"singlesignon\",{\"_index\":417,\"name\":{\"919\":{}},\"parent\":{}}],[\"smart\",{\"_index\":65,\"name\":{\"75\":{},\"713\":{},\"748\":{}},\"parent\":{\"714\":{},\"715\":{},\"716\":{},\"717\":{},\"718\":{},\"719\":{},\"720\":{},\"721\":{},\"722\":{},\"1057\":{}}}],[\"smart_api\",{\"_index\":189,\"name\":{\"343\":{}},\"parent\":{}}],[\"smart_key\",{\"_index\":356,\"name\":{\"641\":{},\"712\":{}},\"parent\":{}}],[\"smart_style_url\",{\"_index\":206,\"name\":{\"371\":{},\"869\":{}},\"parent\":{}}],[\"smartauthenticationmethod\",{\"_index\":414,\"name\":{\"916\":{}},\"parent\":{}}],[\"start\",{\"_index\":270,\"name\":{\"501\":{},\"996\":{}},\"parent\":{}}],[\"state\",{\"_index\":4,\"name\":{\"3\":{},\"167\":{},\"386\":{}},\"parent\":{}}],[\"status\",{\"_index\":44,\"name\":{\"52\":{}},\"parent\":{}}],[\"statuscode\",{\"_index\":43,\"name\":{\"51\":{}},\"parent\":{}}],[\"statustext\",{\"_index\":45,\"name\":{\"53\":{}},\"parent\":{}}],[\"storage\",{\"_index\":102,\"name\":{\"168\":{},\"381\":{},\"387\":{},\"777\":{}},\"parent\":{}}],[\"storage/browserstorage\",{\"_index\":373,\"name\":{\"723\":{}},\"parent\":{\"724\":{}}}],[\"storage/browserstorage.default\",{\"_index\":374,\"name\":{},\"parent\":{\"725\":{},\"726\":{},\"727\":{},\"728\":{}}}],[\"storage/serverstorage\",{\"_index\":375,\"name\":{\"729\":{}},\"parent\":{\"730\":{}}}],[\"storage/serverstorage.default\",{\"_index\":376,\"name\":{},\"parent\":{\"731\":{},\"732\":{},\"733\":{},\"734\":{},\"735\":{}}}],[\"storagefactory\",{\"_index\":155,\"name\":{\"310\":{},\"784\":{}},\"parent\":{}}],[\"strings\",{\"_index\":377,\"name\":{\"736\":{}},\"parent\":{\"737\":{}}}],[\"strings.default\",{\"_index\":378,\"name\":{},\"parent\":{\"738\":{}}}],[\"strings.default.__type\",{\"_index\":379,\"name\":{},\"parent\":{\"739\":{},\"740\":{},\"741\":{},\"742\":{}}}],[\"sub\",{\"_index\":235,\"name\":{\"437\":{},\"882\":{}},\"parent\":{}}],[\"subtle\",{\"_index\":369,\"name\":{\"685\":{}},\"parent\":{}}],[\"system\",{\"_index\":280,\"name\":{\"515\":{},\"525\":{},\"1010\":{},\"1020\":{}},\"parent\":{}}],[\"target\",{\"_index\":184,\"name\":{\"337\":{},\"851\":{}},\"parent\":{}}],[\"text\",{\"_index\":279,\"name\":{\"511\":{},\"1006\":{}},\"parent\":{}}],[\"tojson\",{\"_index\":48,\"name\":{\"56\":{}},\"parent\":{}}],[\"token_endpoint\",{\"_index\":425,\"name\":{\"926\":{}},\"parent\":{}}],[\"token_endpoint_auth_methods\",{\"_index\":431,\"name\":{\"932\":{}},\"parent\":{}}],[\"token_type\",{\"_index\":208,\"name\":{\"375\":{},\"873\":{}},\"parent\":{}}],[\"tokenresponse\",{\"_index\":194,\"name\":{\"357\":{},\"369\":{},\"824\":{},\"867\":{}},\"parent\":{}}],[\"tokenuri\",{\"_index\":199,\"name\":{\"362\":{},\"814\":{},\"829\":{}},\"parent\":{}}],[\"total\",{\"_index\":300,\"name\":{\"552\":{},\"1047\":{}},\"parent\":{}}],[\"type\",{\"_index\":288,\"name\":{\"524\":{},\"551\":{},\"1019\":{},\"1046\":{}},\"parent\":{}}],[\"types\",{\"_index\":380,\"name\":{\"743\":{}},\"parent\":{\"744\":{}}}],[\"types.fhirclient\",{\"_index\":381,\"name\":{},\"parent\":{\"745\":{},\"746\":{},\"748\":{},\"754\":{},\"755\":{},\"758\":{},\"759\":{},\"777\":{},\"781\":{},\"782\":{},\"783\":{},\"784\":{},\"786\":{},\"788\":{},\"790\":{},\"792\":{},\"795\":{},\"796\":{},\"802\":{},\"807\":{},\"808\":{},\"811\":{},\"816\":{},\"836\":{},\"857\":{},\"860\":{},\"867\":{},\"879\":{},\"886\":{},\"887\":{},\"888\":{},\"889\":{},\"890\":{},\"894\":{},\"898\":{},\"902\":{},\"906\":{},\"910\":{},\"913\":{},\"914\":{},\"915\":{},\"916\":{},\"917\":{},\"918\":{},\"919\":{},\"920\":{},\"921\":{},\"922\":{},\"923\":{},\"924\":{},\"936\":{}}}],[\"types.fhirclient.adapter\",{\"_index\":387,\"name\":{},\"parent\":{\"760\":{},\"761\":{},\"762\":{},\"763\":{},\"764\":{},\"765\":{},\"766\":{},\"767\":{},\"768\":{},\"769\":{},\"770\":{},\"771\":{}}}],[\"types.fhirclient.adapter.__type\",{\"_index\":388,\"name\":{},\"parent\":{\"772\":{},\"773\":{},\"774\":{},\"775\":{},\"776\":{}}}],[\"types.fhirclient.authorizeparams\",{\"_index\":402,\"name\":{},\"parent\":{\"837\":{},\"838\":{},\"839\":{},\"840\":{},\"841\":{},\"842\":{},\"843\":{},\"844\":{},\"845\":{},\"846\":{},\"847\":{},\"848\":{},\"849\":{},\"850\":{},\"851\":{},\"852\":{},\"853\":{},\"854\":{},\"855\":{},\"856\":{}}}],[\"types.fhirclient.clientstate\",{\"_index\":401,\"name\":{},\"parent\":{\"817\":{},\"818\":{},\"819\":{},\"820\":{},\"821\":{},\"822\":{},\"823\":{},\"824\":{},\"825\":{},\"826\":{},\"827\":{},\"828\":{},\"829\":{},\"830\":{},\"831\":{},\"832\":{},\"833\":{},\"834\":{},\"835\":{}}}],[\"types.fhirclient.codevalue\",{\"_index\":385,\"name\":{},\"parent\":{\"756\":{},\"757\":{}}}],[\"types.fhirclient.combinedfetchresult\",{\"_index\":394,\"name\":{},\"parent\":{\"793\":{},\"794\":{}}}],[\"types.fhirclient.es384jwk\",{\"_index\":395,\"name\":{},\"parent\":{\"797\":{},\"798\":{},\"799\":{},\"800\":{},\"801\":{}}}],[\"types.fhirclient.fetchoptions\",{\"_index\":393,\"name\":{},\"parent\":{\"791\":{}}}],[\"types.fhirclient.fhir\",{\"_index\":435,\"name\":{},\"parent\":{\"937\":{},\"938\":{},\"939\":{},\"940\":{},\"941\":{},\"942\":{},\"943\":{},\"944\":{},\"947\":{},\"951\":{},\"955\":{},\"961\":{},\"965\":{},\"971\":{},\"977\":{},\"983\":{},\"989\":{},\"995\":{},\"1000\":{},\"1004\":{},\"1009\":{},\"1017\":{},\"1026\":{},\"1032\":{},\"1038\":{},\"1044\":{}}}],[\"types.fhirclient.fhir.backboneelement\",{\"_index\":447,\"name\":{},\"parent\":{\"1001\":{},\"1002\":{},\"1003\":{}}}],[\"types.fhirclient.fhir.bundle\",{\"_index\":454,\"name\":{},\"parent\":{\"1045\":{},\"1046\":{},\"1047\":{},\"1048\":{},\"1049\":{},\"1050\":{},\"1051\":{},\"1052\":{},\"1053\":{},\"1054\":{}}}],[\"types.fhirclient.fhir.bundleentry\",{\"_index\":453,\"name\":{},\"parent\":{\"1039\":{},\"1040\":{},\"1041\":{},\"1042\":{},\"1043\":{}}}],[\"types.fhirclient.fhir.bundlelink\",{\"_index\":452,\"name\":{},\"parent\":{\"1033\":{},\"1034\":{},\"1035\":{},\"1036\":{},\"1037\":{}}}],[\"types.fhirclient.fhir.capabilitystatement\",{\"_index\":438,\"name\":{},\"parent\":{\"952\":{},\"953\":{},\"954\":{}}}],[\"types.fhirclient.fhir.codeableconcept\",{\"_index\":448,\"name\":{},\"parent\":{\"1005\":{},\"1006\":{},\"1007\":{},\"1008\":{}}}],[\"types.fhirclient.fhir.coding\",{\"_index\":449,\"name\":{},\"parent\":{\"1010\":{},\"1011\":{},\"1012\":{},\"1013\":{},\"1014\":{},\"1015\":{},\"1016\":{}}}],[\"types.fhirclient.fhir.element\",{\"_index\":436,\"name\":{},\"parent\":{\"945\":{},\"946\":{}}}],[\"types.fhirclient.fhir.encounter\",{\"_index\":445,\"name\":{},\"parent\":{\"990\":{},\"991\":{},\"992\":{},\"993\":{},\"994\":{}}}],[\"types.fhirclient.fhir.extension\",{\"_index\":437,\"name\":{},\"parent\":{\"948\":{},\"949\":{},\"950\":{}}}],[\"types.fhirclient.fhir.identifier\",{\"_index\":450,\"name\":{},\"parent\":{\"1018\":{},\"1019\":{},\"1020\":{},\"1021\":{},\"1022\":{},\"1023\":{},\"1024\":{},\"1025\":{}}}],[\"types.fhirclient.fhir.meta\",{\"_index\":440,\"name\":{},\"parent\":{\"962\":{},\"963\":{},\"964\":{}}}],[\"types.fhirclient.fhir.observation\",{\"_index\":441,\"name\":{},\"parent\":{\"966\":{},\"967\":{},\"968\":{},\"969\":{},\"970\":{}}}],[\"types.fhirclient.fhir.patient\",{\"_index\":442,\"name\":{},\"parent\":{\"972\":{},\"973\":{},\"974\":{},\"975\":{},\"976\":{}}}],[\"types.fhirclient.fhir.period\",{\"_index\":446,\"name\":{},\"parent\":{\"996\":{},\"997\":{},\"998\":{},\"999\":{}}}],[\"types.fhirclient.fhir.practitioner\",{\"_index\":443,\"name\":{},\"parent\":{\"978\":{},\"979\":{},\"980\":{},\"981\":{},\"982\":{}}}],[\"types.fhirclient.fhir.reference\",{\"_index\":451,\"name\":{},\"parent\":{\"1027\":{},\"1028\":{},\"1029\":{},\"1030\":{},\"1031\":{}}}],[\"types.fhirclient.fhir.relatedperson\",{\"_index\":444,\"name\":{},\"parent\":{\"984\":{},\"985\":{},\"986\":{},\"987\":{},\"988\":{}}}],[\"types.fhirclient.fhir.resource\",{\"_index\":439,\"name\":{},\"parent\":{\"956\":{},\"957\":{},\"958\":{},\"959\":{},\"960\":{}}}],[\"types.fhirclient.fhiroptions\",{\"_index\":404,\"name\":{},\"parent\":{\"861\":{},\"862\":{},\"863\":{},\"864\":{},\"865\":{},\"866\":{}}}],[\"types.fhirclient.idtoken\",{\"_index\":406,\"name\":{},\"parent\":{\"880\":{},\"881\":{},\"882\":{},\"883\":{},\"884\":{},\"885\":{}}}],[\"types.fhirclient.includeresponsehint\",{\"_index\":391,\"name\":{},\"parent\":{\"787\":{}}}],[\"types.fhirclient.jsonpatchadd\",{\"_index\":407,\"name\":{},\"parent\":{\"891\":{},\"892\":{},\"893\":{}}}],[\"types.fhirclient.jsonpatchcopy\",{\"_index\":411,\"name\":{},\"parent\":{\"907\":{},\"908\":{},\"909\":{}}}],[\"types.fhirclient.jsonpatchmove\",{\"_index\":410,\"name\":{},\"parent\":{\"903\":{},\"904\":{},\"905\":{}}}],[\"types.fhirclient.jsonpatchremove\",{\"_index\":412,\"name\":{},\"parent\":{\"911\":{},\"912\":{}}}],[\"types.fhirclient.jsonpatchreplace\",{\"_index\":408,\"name\":{},\"parent\":{\"895\":{},\"896\":{},\"897\":{}}}],[\"types.fhirclient.jsonpatchtest\",{\"_index\":409,\"name\":{},\"parent\":{\"899\":{},\"900\":{},\"901\":{}}}],[\"types.fhirclient.oauthsecurityextensions\",{\"_index\":399,\"name\":{},\"parent\":{\"812\":{},\"813\":{},\"814\":{},\"815\":{}}}],[\"types.fhirclient.readyoptions\",{\"_index\":403,\"name\":{},\"parent\":{\"858\":{},\"859\":{}}}],[\"types.fhirclient.requestfunction\",{\"_index\":392,\"name\":{},\"parent\":{\"789\":{}}}],[\"types.fhirclient.requestoptions\",{\"_index\":397,\"name\":{},\"parent\":{\"809\":{},\"810\":{}}}],[\"types.fhirclient.requestwithsession\",{\"_index\":382,\"name\":{},\"parent\":{\"747\":{}}}],[\"types.fhirclient.rs384jwk\",{\"_index\":396,\"name\":{},\"parent\":{\"803\":{},\"804\":{},\"805\":{},\"806\":{}}}],[\"types.fhirclient.smart\",{\"_index\":383,\"name\":{},\"parent\":{\"749\":{},\"750\":{},\"751\":{},\"752\":{},\"753\":{}}}],[\"types.fhirclient.storage\",{\"_index\":389,\"name\":{},\"parent\":{\"778\":{},\"779\":{},\"780\":{}}}],[\"types.fhirclient.storagefactory\",{\"_index\":390,\"name\":{},\"parent\":{\"785\":{}}}],[\"types.fhirclient.tokenresponse\",{\"_index\":405,\"name\":{},\"parent\":{\"868\":{},\"869\":{},\"870\":{},\"871\":{},\"872\":{},\"873\":{},\"874\":{},\"875\":{},\"876\":{},\"877\":{},\"878\":{}}}],[\"types.fhirclient.wellknownsmartconfiguration\",{\"_index\":424,\"name\":{},\"parent\":{\"925\":{},\"926\":{},\"927\":{},\"928\":{},\"929\":{},\"930\":{},\"931\":{},\"932\":{},\"933\":{},\"934\":{},\"935\":{}}}],[\"uint8arraytobinarystring\",{\"_index\":73,\"name\":{\"111\":{},\"243\":{}},\"parent\":{}}],[\"units\",{\"_index\":33,\"name\":{\"38\":{},\"607\":{},\"675\":{}},\"parent\":{}}],[\"unset\",{\"_index\":99,\"name\":{\"163\":{},\"235\":{},\"384\":{},\"728\":{},\"735\":{},\"780\":{}},\"parent\":{}}],[\"unsignedint\",{\"_index\":244,\"name\":{\"447\":{},\"942\":{}},\"parent\":{}}],[\"update\",{\"_index\":26,\"name\":{\"30\":{},\"194\":{},\"411\":{}},\"parent\":{}}],[\"uri\",{\"_index\":240,\"name\":{\"443\":{},\"938\":{}},\"parent\":{}}],[\"url\",{\"_index\":229,\"name\":{\"432\":{},\"453\":{},\"539\":{},\"809\":{},\"948\":{},\"1034\":{}},\"parent\":{}}],[\"use\",{\"_index\":286,\"name\":{\"523\":{},\"1018\":{}},\"parent\":{}}],[\"user\",{\"_index\":13,\"name\":{\"14\":{},\"178\":{},\"397\":{}},\"parent\":{}}],[\"userefreshtoken\",{\"_index\":168,\"name\":{\"321\":{},\"866\":{}},\"parent\":{}}],[\"username\",{\"_index\":195,\"name\":{\"358\":{},\"825\":{}},\"parent\":{}}],[\"userselected\",{\"_index\":284,\"name\":{\"519\":{},\"1014\":{}},\"parent\":{}}],[\"utils\",{\"_index\":78,\"name\":{\"119\":{},\"262\":{}},\"parent\":{}}],[\"value\",{\"_index\":128,\"name\":{\"273\":{},\"277\":{},\"281\":{},\"526\":{},\"757\":{},\"893\":{},\"897\":{},\"901\":{},\"1021\":{}},\"parent\":{}}],[\"valuex\",{\"_index\":245,\"name\":{\"448\":{},\"943\":{}},\"parent\":{}}],[\"version\",{\"_index\":282,\"name\":{\"516\":{},\"1011\":{}},\"parent\":{}}],[\"wellknownsmartconfiguration\",{\"_index\":422,\"name\":{\"924\":{}},\"parent\":{}}],[\"width\",{\"_index\":185,\"name\":{\"338\":{},\"852\":{}},\"parent\":{}}],[\"windowtarget\",{\"_index\":153,\"name\":{\"308\":{},\"782\":{}},\"parent\":{}}],[\"windowtargetfunction\",{\"_index\":118,\"name\":{\"265\":{},\"745\":{}},\"parent\":{}}],[\"windowtargetvariable\",{\"_index\":152,\"name\":{\"307\":{},\"781\":{}},\"parent\":{}}]],\"pipeline\":[]}}"); \ No newline at end of file +window.searchData = JSON.parse("{\"kinds\":{\"2\":\"Module\",\"4\":\"Namespace\",\"32\":\"Variable\",\"64\":\"Function\",\"128\":\"Class\",\"256\":\"Interface\",\"512\":\"Constructor\",\"1024\":\"Property\",\"2048\":\"Method\",\"65536\":\"Type literal\",\"4194304\":\"Type alias\",\"16777216\":\"Reference\"},\"rows\":[{\"id\":0,\"kind\":2,\"name\":\"Client\",\"url\":\"modules/Client.html\",\"classes\":\"tsd-kind-module\"},{\"id\":1,\"kind\":128,\"name\":\"default\",\"url\":\"classes/Client.default.html\",\"classes\":\"tsd-kind-class tsd-parent-kind-module\",\"parent\":\"Client\"},{\"id\":2,\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/Client.default.html#constructor\",\"classes\":\"tsd-kind-constructor tsd-parent-kind-class\",\"parent\":\"Client.default\"},{\"id\":3,\"kind\":1024,\"name\":\"state\",\"url\":\"classes/Client.default.html#state\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Client.default\"},{\"id\":4,\"kind\":1024,\"name\":\"environment\",\"url\":\"classes/Client.default.html#environment\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Client.default\"},{\"id\":5,\"kind\":1024,\"name\":\"patient\",\"url\":\"classes/Client.default.html#patient\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Client.default\"},{\"id\":6,\"kind\":65536,\"name\":\"__type\",\"url\":\"classes/Client.default.html#__type-1\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-class\",\"parent\":\"Client.default\"},{\"id\":7,\"kind\":1024,\"name\":\"id\",\"url\":\"classes/Client.default.html#__type-1.id-1\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"Client.default.__type\"},{\"id\":8,\"kind\":1024,\"name\":\"read\",\"url\":\"classes/Client.default.html#__type-1.read-1\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"Client.default.__type\"},{\"id\":9,\"kind\":2048,\"name\":\"request\",\"url\":\"classes/Client.default.html#__type-1.request\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal tsd-has-type-parameter\",\"parent\":\"Client.default.__type\"},{\"id\":10,\"kind\":1024,\"name\":\"encounter\",\"url\":\"classes/Client.default.html#encounter\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Client.default\"},{\"id\":11,\"kind\":65536,\"name\":\"__type\",\"url\":\"classes/Client.default.html#__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-class\",\"parent\":\"Client.default\"},{\"id\":12,\"kind\":1024,\"name\":\"id\",\"url\":\"classes/Client.default.html#__type.id\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"Client.default.__type\"},{\"id\":13,\"kind\":1024,\"name\":\"read\",\"url\":\"classes/Client.default.html#__type.read\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"Client.default.__type\"},{\"id\":14,\"kind\":1024,\"name\":\"user\",\"url\":\"classes/Client.default.html#user\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Client.default\"},{\"id\":15,\"kind\":65536,\"name\":\"__type\",\"url\":\"classes/Client.default.html#__type-3\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-class\",\"parent\":\"Client.default\"},{\"id\":16,\"kind\":1024,\"name\":\"id\",\"url\":\"classes/Client.default.html#__type-3.id-2\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"Client.default.__type\"},{\"id\":17,\"kind\":1024,\"name\":\"read\",\"url\":\"classes/Client.default.html#__type-3.read-2\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"Client.default.__type\"},{\"id\":18,\"kind\":1024,\"name\":\"fhirUser\",\"url\":\"classes/Client.default.html#__type-3.fhirUser\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"Client.default.__type\"},{\"id\":19,\"kind\":1024,\"name\":\"resourceType\",\"url\":\"classes/Client.default.html#__type-3.resourceType\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"Client.default.__type\"},{\"id\":20,\"kind\":1024,\"name\":\"_refreshTask\",\"url\":\"classes/Client.default.html#_refreshTask\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-private\",\"parent\":\"Client.default\"},{\"id\":21,\"kind\":2048,\"name\":\"getPatientId\",\"url\":\"classes/Client.default.html#getPatientId\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Client.default\"},{\"id\":22,\"kind\":2048,\"name\":\"getEncounterId\",\"url\":\"classes/Client.default.html#getEncounterId\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Client.default\"},{\"id\":23,\"kind\":2048,\"name\":\"getIdToken\",\"url\":\"classes/Client.default.html#getIdToken\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Client.default\"},{\"id\":24,\"kind\":2048,\"name\":\"getFhirUser\",\"url\":\"classes/Client.default.html#getFhirUser\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Client.default\"},{\"id\":25,\"kind\":2048,\"name\":\"getUserId\",\"url\":\"classes/Client.default.html#getUserId\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Client.default\"},{\"id\":26,\"kind\":2048,\"name\":\"getUserType\",\"url\":\"classes/Client.default.html#getUserType\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Client.default\"},{\"id\":27,\"kind\":2048,\"name\":\"getAuthorizationHeader\",\"url\":\"classes/Client.default.html#getAuthorizationHeader\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Client.default\"},{\"id\":28,\"kind\":2048,\"name\":\"_clearState\",\"url\":\"classes/Client.default.html#_clearState\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-private\",\"parent\":\"Client.default\"},{\"id\":29,\"kind\":2048,\"name\":\"create\",\"url\":\"classes/Client.default.html#create\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-has-type-parameter\",\"parent\":\"Client.default\"},{\"id\":30,\"kind\":2048,\"name\":\"update\",\"url\":\"classes/Client.default.html#update\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-has-type-parameter\",\"parent\":\"Client.default\"},{\"id\":31,\"kind\":2048,\"name\":\"delete\",\"url\":\"classes/Client.default.html#delete\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-has-type-parameter\",\"parent\":\"Client.default\"},{\"id\":32,\"kind\":2048,\"name\":\"patch\",\"url\":\"classes/Client.default.html#patch\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-has-type-parameter\",\"parent\":\"Client.default\"},{\"id\":33,\"kind\":2048,\"name\":\"request\",\"url\":\"classes/Client.default.html#request-1\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-has-type-parameter\",\"parent\":\"Client.default\"},{\"id\":34,\"kind\":2048,\"name\":\"refreshIfNeeded\",\"url\":\"classes/Client.default.html#refreshIfNeeded\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Client.default\"},{\"id\":35,\"kind\":2048,\"name\":\"refresh\",\"url\":\"classes/Client.default.html#refresh\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Client.default\"},{\"id\":36,\"kind\":2048,\"name\":\"byCode\",\"url\":\"classes/Client.default.html#byCode\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Client.default\"},{\"id\":37,\"kind\":2048,\"name\":\"byCodes\",\"url\":\"classes/Client.default.html#byCodes\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Client.default\"},{\"id\":38,\"kind\":1024,\"name\":\"units\",\"url\":\"classes/Client.default.html#units\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"Client.default\"},{\"id\":39,\"kind\":65536,\"name\":\"__type\",\"url\":\"classes/Client.default.html#__type-2\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-class\",\"parent\":\"Client.default\"},{\"id\":40,\"kind\":2048,\"name\":\"cm\",\"url\":\"classes/Client.default.html#__type-2.cm\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"Client.default.__type\"},{\"id\":41,\"kind\":2048,\"name\":\"kg\",\"url\":\"classes/Client.default.html#__type-2.kg\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"Client.default.__type\"},{\"id\":42,\"kind\":2048,\"name\":\"any\",\"url\":\"classes/Client.default.html#__type-2.any\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"Client.default.__type\"},{\"id\":43,\"kind\":2048,\"name\":\"getPath\",\"url\":\"classes/Client.default.html#getPath\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Client.default\"},{\"id\":44,\"kind\":2048,\"name\":\"getState\",\"url\":\"classes/Client.default.html#getState\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Client.default\"},{\"id\":45,\"kind\":2048,\"name\":\"getFhirVersion\",\"url\":\"classes/Client.default.html#getFhirVersion\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Client.default\"},{\"id\":46,\"kind\":2048,\"name\":\"getFhirRelease\",\"url\":\"classes/Client.default.html#getFhirRelease\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"Client.default\"},{\"id\":47,\"kind\":2,\"name\":\"HttpError\",\"url\":\"modules/HttpError.html\",\"classes\":\"tsd-kind-module\"},{\"id\":48,\"kind\":128,\"name\":\"default\",\"url\":\"classes/HttpError.default.html\",\"classes\":\"tsd-kind-class tsd-parent-kind-module\",\"parent\":\"HttpError\"},{\"id\":49,\"kind\":65536,\"name\":\"__type\",\"url\":\"classes/HttpError.default.html#__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-class\",\"parent\":\"HttpError.default\"},{\"id\":50,\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/HttpError.default.html#constructor\",\"classes\":\"tsd-kind-constructor tsd-parent-kind-class tsd-is-overwrite\",\"parent\":\"HttpError.default\"},{\"id\":51,\"kind\":1024,\"name\":\"statusCode\",\"url\":\"classes/HttpError.default.html#statusCode\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"HttpError.default\"},{\"id\":52,\"kind\":1024,\"name\":\"status\",\"url\":\"classes/HttpError.default.html#status\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"HttpError.default\"},{\"id\":53,\"kind\":1024,\"name\":\"statusText\",\"url\":\"classes/HttpError.default.html#statusText\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"HttpError.default\"},{\"id\":54,\"kind\":1024,\"name\":\"response\",\"url\":\"classes/HttpError.default.html#response\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"HttpError.default\"},{\"id\":55,\"kind\":2048,\"name\":\"parse\",\"url\":\"classes/HttpError.default.html#parse\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"HttpError.default\"},{\"id\":56,\"kind\":2048,\"name\":\"toJSON\",\"url\":\"classes/HttpError.default.html#toJSON\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"HttpError.default\"},{\"id\":57,\"kind\":2,\"name\":\"adapters/BrowserAdapter\",\"url\":\"modules/adapters_BrowserAdapter.html\",\"classes\":\"tsd-kind-module\"},{\"id\":58,\"kind\":128,\"name\":\"default\",\"url\":\"classes/adapters_BrowserAdapter.default.html\",\"classes\":\"tsd-kind-class tsd-parent-kind-module\",\"parent\":\"adapters/BrowserAdapter\"},{\"id\":59,\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/adapters_BrowserAdapter.default.html#constructor\",\"classes\":\"tsd-kind-constructor tsd-parent-kind-class\",\"parent\":\"adapters/BrowserAdapter.default\"},{\"id\":60,\"kind\":1024,\"name\":\"_url\",\"url\":\"classes/adapters_BrowserAdapter.default.html#_url\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-private\",\"parent\":\"adapters/BrowserAdapter.default\"},{\"id\":61,\"kind\":1024,\"name\":\"_storage\",\"url\":\"classes/adapters_BrowserAdapter.default.html#_storage\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-private\",\"parent\":\"adapters/BrowserAdapter.default\"},{\"id\":62,\"kind\":1024,\"name\":\"options\",\"url\":\"classes/adapters_BrowserAdapter.default.html#options\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"adapters/BrowserAdapter.default\"},{\"id\":63,\"kind\":1024,\"name\":\"security\",\"url\":\"classes/adapters_BrowserAdapter.default.html#security\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"adapters/BrowserAdapter.default\"},{\"id\":64,\"kind\":2048,\"name\":\"relative\",\"url\":\"classes/adapters_BrowserAdapter.default.html#relative\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"adapters/BrowserAdapter.default\"},{\"id\":65,\"kind\":2048,\"name\":\"getUrl\",\"url\":\"classes/adapters_BrowserAdapter.default.html#getUrl\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"adapters/BrowserAdapter.default\"},{\"id\":66,\"kind\":2048,\"name\":\"redirect\",\"url\":\"classes/adapters_BrowserAdapter.default.html#redirect\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"adapters/BrowserAdapter.default\"},{\"id\":67,\"kind\":2048,\"name\":\"getStorage\",\"url\":\"classes/adapters_BrowserAdapter.default.html#getStorage\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"adapters/BrowserAdapter.default\"},{\"id\":68,\"kind\":2048,\"name\":\"base64encode\",\"url\":\"classes/adapters_BrowserAdapter.default.html#base64encode\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"adapters/BrowserAdapter.default\"},{\"id\":69,\"kind\":2048,\"name\":\"base64decode\",\"url\":\"classes/adapters_BrowserAdapter.default.html#base64decode\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"adapters/BrowserAdapter.default\"},{\"id\":70,\"kind\":2048,\"name\":\"base64urlencode\",\"url\":\"classes/adapters_BrowserAdapter.default.html#base64urlencode\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"adapters/BrowserAdapter.default\"},{\"id\":71,\"kind\":2048,\"name\":\"base64urldecode\",\"url\":\"classes/adapters_BrowserAdapter.default.html#base64urldecode\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"adapters/BrowserAdapter.default\"},{\"id\":72,\"kind\":2048,\"name\":\"getSmartApi\",\"url\":\"classes/adapters_BrowserAdapter.default.html#getSmartApi\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"adapters/BrowserAdapter.default\"},{\"id\":73,\"kind\":2,\"name\":\"adapters/HapiAdapter\",\"url\":\"modules/adapters_HapiAdapter.html\",\"classes\":\"tsd-kind-module\"},{\"id\":74,\"kind\":128,\"name\":\"default\",\"url\":\"classes/adapters_HapiAdapter.default.html\",\"classes\":\"tsd-kind-class tsd-parent-kind-module\",\"parent\":\"adapters/HapiAdapter\"},{\"id\":75,\"kind\":2048,\"name\":\"smart\",\"url\":\"classes/adapters_HapiAdapter.default.html#smart\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-static\",\"parent\":\"adapters/HapiAdapter.default\"},{\"id\":76,\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/adapters_HapiAdapter.default.html#constructor\",\"classes\":\"tsd-kind-constructor tsd-parent-kind-class tsd-is-overwrite\",\"parent\":\"adapters/HapiAdapter.default\"},{\"id\":77,\"kind\":1024,\"name\":\"_responseToolkit\",\"url\":\"classes/adapters_HapiAdapter.default.html#_responseToolkit\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-private\",\"parent\":\"adapters/HapiAdapter.default\"},{\"id\":78,\"kind\":1024,\"name\":\"_request\",\"url\":\"classes/adapters_HapiAdapter.default.html#_request\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-private\",\"parent\":\"adapters/HapiAdapter.default\"},{\"id\":79,\"kind\":1024,\"name\":\"_storage\",\"url\":\"classes/adapters_HapiAdapter.default.html#_storage\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-overwrite tsd-is-protected\",\"parent\":\"adapters/HapiAdapter.default\"},{\"id\":80,\"kind\":2048,\"name\":\"getStorage\",\"url\":\"classes/adapters_HapiAdapter.default.html#getStorage\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-overwrite\",\"parent\":\"adapters/HapiAdapter.default\"},{\"id\":81,\"kind\":2048,\"name\":\"redirect\",\"url\":\"classes/adapters_HapiAdapter.default.html#redirect\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-overwrite\",\"parent\":\"adapters/HapiAdapter.default\"},{\"id\":82,\"kind\":1024,\"name\":\"options\",\"url\":\"classes/adapters_HapiAdapter.default.html#options\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-inherited\",\"parent\":\"adapters/HapiAdapter.default\"},{\"id\":83,\"kind\":1024,\"name\":\"security\",\"url\":\"classes/adapters_HapiAdapter.default.html#security\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-inherited\",\"parent\":\"adapters/HapiAdapter.default\"},{\"id\":84,\"kind\":2048,\"name\":\"relative\",\"url\":\"classes/adapters_HapiAdapter.default.html#relative\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-inherited\",\"parent\":\"adapters/HapiAdapter.default\"},{\"id\":85,\"kind\":2048,\"name\":\"getProtocol\",\"url\":\"classes/adapters_HapiAdapter.default.html#getProtocol\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-inherited\",\"parent\":\"adapters/HapiAdapter.default\"},{\"id\":86,\"kind\":2048,\"name\":\"getUrl\",\"url\":\"classes/adapters_HapiAdapter.default.html#getUrl\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-inherited\",\"parent\":\"adapters/HapiAdapter.default\"},{\"id\":87,\"kind\":2048,\"name\":\"base64encode\",\"url\":\"classes/adapters_HapiAdapter.default.html#base64encode\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-inherited\",\"parent\":\"adapters/HapiAdapter.default\"},{\"id\":88,\"kind\":2048,\"name\":\"base64decode\",\"url\":\"classes/adapters_HapiAdapter.default.html#base64decode\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-inherited\",\"parent\":\"adapters/HapiAdapter.default\"},{\"id\":89,\"kind\":2048,\"name\":\"base64urlencode\",\"url\":\"classes/adapters_HapiAdapter.default.html#base64urlencode\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-inherited\",\"parent\":\"adapters/HapiAdapter.default\"},{\"id\":90,\"kind\":2048,\"name\":\"base64urldecode\",\"url\":\"classes/adapters_HapiAdapter.default.html#base64urldecode\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-inherited\",\"parent\":\"adapters/HapiAdapter.default\"},{\"id\":91,\"kind\":2048,\"name\":\"getSmartApi\",\"url\":\"classes/adapters_HapiAdapter.default.html#getSmartApi\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-inherited\",\"parent\":\"adapters/HapiAdapter.default\"},{\"id\":92,\"kind\":2,\"name\":\"adapters/NodeAdapter\",\"url\":\"modules/adapters_NodeAdapter.html\",\"classes\":\"tsd-kind-module\"},{\"id\":93,\"kind\":128,\"name\":\"default\",\"url\":\"classes/adapters_NodeAdapter.default.html\",\"classes\":\"tsd-kind-class tsd-parent-kind-module\",\"parent\":\"adapters/NodeAdapter\"},{\"id\":94,\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/adapters_NodeAdapter.default.html#constructor\",\"classes\":\"tsd-kind-constructor tsd-parent-kind-class\",\"parent\":\"adapters/NodeAdapter.default\"},{\"id\":95,\"kind\":1024,\"name\":\"_storage\",\"url\":\"classes/adapters_NodeAdapter.default.html#_storage\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-protected\",\"parent\":\"adapters/NodeAdapter.default\"},{\"id\":96,\"kind\":1024,\"name\":\"options\",\"url\":\"classes/adapters_NodeAdapter.default.html#options\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"adapters/NodeAdapter.default\"},{\"id\":97,\"kind\":1024,\"name\":\"security\",\"url\":\"classes/adapters_NodeAdapter.default.html#security\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"adapters/NodeAdapter.default\"},{\"id\":98,\"kind\":2048,\"name\":\"relative\",\"url\":\"classes/adapters_NodeAdapter.default.html#relative\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"adapters/NodeAdapter.default\"},{\"id\":99,\"kind\":2048,\"name\":\"getProtocol\",\"url\":\"classes/adapters_NodeAdapter.default.html#getProtocol\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"adapters/NodeAdapter.default\"},{\"id\":100,\"kind\":2048,\"name\":\"getUrl\",\"url\":\"classes/adapters_NodeAdapter.default.html#getUrl\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"adapters/NodeAdapter.default\"},{\"id\":101,\"kind\":2048,\"name\":\"redirect\",\"url\":\"classes/adapters_NodeAdapter.default.html#redirect\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"adapters/NodeAdapter.default\"},{\"id\":102,\"kind\":2048,\"name\":\"getStorage\",\"url\":\"classes/adapters_NodeAdapter.default.html#getStorage\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"adapters/NodeAdapter.default\"},{\"id\":103,\"kind\":2048,\"name\":\"base64encode\",\"url\":\"classes/adapters_NodeAdapter.default.html#base64encode\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"adapters/NodeAdapter.default\"},{\"id\":104,\"kind\":2048,\"name\":\"base64decode\",\"url\":\"classes/adapters_NodeAdapter.default.html#base64decode\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"adapters/NodeAdapter.default\"},{\"id\":105,\"kind\":2048,\"name\":\"base64urlencode\",\"url\":\"classes/adapters_NodeAdapter.default.html#base64urlencode\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"adapters/NodeAdapter.default\"},{\"id\":106,\"kind\":2048,\"name\":\"base64urldecode\",\"url\":\"classes/adapters_NodeAdapter.default.html#base64urldecode\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"adapters/NodeAdapter.default\"},{\"id\":107,\"kind\":2048,\"name\":\"getSmartApi\",\"url\":\"classes/adapters_NodeAdapter.default.html#getSmartApi\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"adapters/NodeAdapter.default\"},{\"id\":108,\"kind\":2,\"name\":\"base64/browser\",\"url\":\"modules/base64_browser.html\",\"classes\":\"tsd-kind-module\"},{\"id\":109,\"kind\":64,\"name\":\"base64urlencode\",\"url\":\"modules/base64_browser.html#base64urlencode\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"base64/browser\"},{\"id\":110,\"kind\":64,\"name\":\"base64urldecode\",\"url\":\"modules/base64_browser.html#base64urldecode\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"base64/browser\"},{\"id\":111,\"kind\":64,\"name\":\"uint8ArrayToBinaryString\",\"url\":\"modules/base64_browser.html#uint8ArrayToBinaryString\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"base64/browser\"},{\"id\":112,\"kind\":2,\"name\":\"debug\",\"url\":\"modules/debug.html\",\"classes\":\"tsd-kind-module\"},{\"id\":113,\"kind\":32,\"name\":\"debug\",\"url\":\"modules/debug.html#debug-1\",\"classes\":\"tsd-kind-variable tsd-parent-kind-module\",\"parent\":\"debug\"},{\"id\":114,\"kind\":2,\"name\":\"entry/browser\",\"url\":\"modules/entry_browser.html\",\"classes\":\"tsd-kind-module\"},{\"id\":115,\"kind\":32,\"name\":\"default\",\"url\":\"modules/entry_browser.html#default\",\"classes\":\"tsd-kind-variable tsd-parent-kind-module\",\"parent\":\"entry/browser\"},{\"id\":116,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/entry_browser.html#default.__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-variable\",\"parent\":\"entry/browser.default\"},{\"id\":117,\"kind\":1024,\"name\":\"client\",\"url\":\"modules/entry_browser.html#default.__type.client\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"entry/browser.default.__type\"},{\"id\":118,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/entry_browser.html#default.__type.__type-1\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-literal\",\"parent\":\"entry/browser.default.__type\"},{\"id\":119,\"kind\":1024,\"name\":\"utils\",\"url\":\"modules/entry_browser.html#default.__type.utils\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"entry/browser.default.__type\"},{\"id\":120,\"kind\":1024,\"name\":\"oauth2\",\"url\":\"modules/entry_browser.html#default.__type.oauth2\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"entry/browser.default.__type\"},{\"id\":121,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/entry_browser.html#default.__type.__type-2\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-literal\",\"parent\":\"entry/browser.default.__type\"},{\"id\":122,\"kind\":1024,\"name\":\"settings\",\"url\":\"modules/entry_browser.html#default.__type.__type-2.settings\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"entry/browser.default.__type.__type\"},{\"id\":123,\"kind\":1024,\"name\":\"ready\",\"url\":\"modules/entry_browser.html#default.__type.__type-2.ready\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"entry/browser.default.__type.__type\"},{\"id\":124,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/entry_browser.html#default.__type.__type-2.__type-5\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-literal\",\"parent\":\"entry/browser.default.__type.__type\"},{\"id\":125,\"kind\":1024,\"name\":\"authorize\",\"url\":\"modules/entry_browser.html#default.__type.__type-2.authorize\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"entry/browser.default.__type.__type\"},{\"id\":126,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/entry_browser.html#default.__type.__type-2.__type-3\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-literal\",\"parent\":\"entry/browser.default.__type.__type\"},{\"id\":127,\"kind\":1024,\"name\":\"init\",\"url\":\"modules/entry_browser.html#default.__type.__type-2.init\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"entry/browser.default.__type.__type\"},{\"id\":128,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/entry_browser.html#default.__type.__type-2.__type-4\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-literal\",\"parent\":\"entry/browser.default.__type.__type\"},{\"id\":129,\"kind\":2,\"name\":\"entry/hapi\",\"url\":\"modules/entry_hapi.html\",\"classes\":\"tsd-kind-module\"},{\"id\":130,\"kind\":64,\"name\":\"default\",\"url\":\"modules/entry_hapi.html#default\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"entry/hapi\"},{\"id\":131,\"kind\":2,\"name\":\"entry/node\",\"url\":\"modules/entry_node.html\",\"classes\":\"tsd-kind-module\"},{\"id\":132,\"kind\":64,\"name\":\"default\",\"url\":\"modules/entry_node.html#default\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"entry/node\"},{\"id\":133,\"kind\":2,\"name\":\"lib\",\"url\":\"modules/lib.html\",\"classes\":\"tsd-kind-module\"},{\"id\":134,\"kind\":64,\"name\":\"checkResponse\",\"url\":\"modules/lib.html#checkResponse\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"lib\"},{\"id\":135,\"kind\":64,\"name\":\"responseToJSON\",\"url\":\"modules/lib.html#responseToJSON\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"lib\"},{\"id\":136,\"kind\":64,\"name\":\"loweCaseKeys\",\"url\":\"modules/lib.html#loweCaseKeys\",\"classes\":\"tsd-kind-function tsd-parent-kind-module tsd-has-type-parameter\",\"parent\":\"lib\"},{\"id\":137,\"kind\":64,\"name\":\"request\",\"url\":\"modules/lib.html#request\",\"classes\":\"tsd-kind-function tsd-parent-kind-module tsd-has-type-parameter\",\"parent\":\"lib\"},{\"id\":138,\"kind\":64,\"name\":\"getAndCache\",\"url\":\"modules/lib.html#getAndCache\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"lib\"},{\"id\":139,\"kind\":64,\"name\":\"fetchConformanceStatement\",\"url\":\"modules/lib.html#fetchConformanceStatement\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"lib\"},{\"id\":140,\"kind\":64,\"name\":\"getPath\",\"url\":\"modules/lib.html#getPath\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"lib\"},{\"id\":141,\"kind\":64,\"name\":\"setPath\",\"url\":\"modules/lib.html#setPath\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"lib\"},{\"id\":142,\"kind\":64,\"name\":\"makeArray\",\"url\":\"modules/lib.html#makeArray\",\"classes\":\"tsd-kind-function tsd-parent-kind-module tsd-has-type-parameter\",\"parent\":\"lib\"},{\"id\":143,\"kind\":64,\"name\":\"absolute\",\"url\":\"modules/lib.html#absolute\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"lib\"},{\"id\":144,\"kind\":64,\"name\":\"randomString\",\"url\":\"modules/lib.html#randomString\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"lib\"},{\"id\":145,\"kind\":64,\"name\":\"jwtDecode\",\"url\":\"modules/lib.html#jwtDecode\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"lib\"},{\"id\":146,\"kind\":64,\"name\":\"getTimeInFuture\",\"url\":\"modules/lib.html#getTimeInFuture\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"lib\"},{\"id\":147,\"kind\":64,\"name\":\"getAccessTokenExpiration\",\"url\":\"modules/lib.html#getAccessTokenExpiration\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"lib\"},{\"id\":148,\"kind\":64,\"name\":\"byCode\",\"url\":\"modules/lib.html#byCode\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"lib\"},{\"id\":149,\"kind\":64,\"name\":\"byCodes\",\"url\":\"modules/lib.html#byCodes\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"lib\"},{\"id\":150,\"kind\":64,\"name\":\"getPatientParam\",\"url\":\"modules/lib.html#getPatientParam\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"lib\"},{\"id\":151,\"kind\":64,\"name\":\"getTargetWindow\",\"url\":\"modules/lib.html#getTargetWindow\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"lib\"},{\"id\":152,\"kind\":64,\"name\":\"assert\",\"url\":\"modules/lib.html#assert\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"lib\"},{\"id\":153,\"kind\":64,\"name\":\"assertJsonPatch\",\"url\":\"modules/lib.html#assertJsonPatch\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"lib\"},{\"id\":154,\"kind\":32,\"name\":\"units\",\"url\":\"modules/lib.html#units\",\"classes\":\"tsd-kind-variable tsd-parent-kind-module\",\"parent\":\"lib\"},{\"id\":155,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/lib.html#units.__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-variable\",\"parent\":\"lib.units\"},{\"id\":156,\"kind\":2048,\"name\":\"cm\",\"url\":\"modules/lib.html#units.__type.cm\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"lib.units.__type\"},{\"id\":157,\"kind\":2048,\"name\":\"kg\",\"url\":\"modules/lib.html#units.__type.kg\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"lib.units.__type\"},{\"id\":158,\"kind\":2048,\"name\":\"any\",\"url\":\"modules/lib.html#units.__type.any\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"lib.units.__type\"},{\"id\":159,\"kind\":2,\"name\":\"security/browser\",\"url\":\"modules/security_browser.html\",\"classes\":\"tsd-kind-module\"},{\"id\":160,\"kind\":64,\"name\":\"randomBytes\",\"url\":\"modules/security_browser.html#randomBytes\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"security/browser\"},{\"id\":161,\"kind\":64,\"name\":\"digestSha256\",\"url\":\"modules/security_browser.html#digestSha256\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"security/browser\"},{\"id\":162,\"kind\":64,\"name\":\"importJWK\",\"url\":\"modules/security_browser.html#importJWK\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"security/browser\"},{\"id\":163,\"kind\":64,\"name\":\"signCompactJws\",\"url\":\"modules/security_browser.html#signCompactJws\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"security/browser\"},{\"id\":164,\"kind\":64,\"name\":\"subtle\",\"url\":\"modules/security_browser.html#subtle\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"security/browser\"},{\"id\":165,\"kind\":64,\"name\":\"generatePKCEChallenge\",\"url\":\"modules/security_browser.html#generatePKCEChallenge\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"security/browser\"},{\"id\":166,\"kind\":2,\"name\":\"security/server\",\"url\":\"modules/security_server.html\",\"classes\":\"tsd-kind-module\"},{\"id\":167,\"kind\":64,\"name\":\"digestSha256\",\"url\":\"modules/security_server.html#digestSha256\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"security/server\"},{\"id\":168,\"kind\":64,\"name\":\"generatePKCEChallenge\",\"url\":\"modules/security_server.html#generatePKCEChallenge\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"security/server\"},{\"id\":169,\"kind\":64,\"name\":\"importJWK\",\"url\":\"modules/security_server.html#importJWK\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"security/server\"},{\"id\":170,\"kind\":64,\"name\":\"signCompactJws\",\"url\":\"modules/security_server.html#signCompactJws\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"security/server\"},{\"id\":171,\"kind\":2,\"name\":\"settings\",\"url\":\"modules/settings.html\",\"classes\":\"tsd-kind-module\"},{\"id\":172,\"kind\":32,\"name\":\"patientCompartment\",\"url\":\"modules/settings.html#patientCompartment\",\"classes\":\"tsd-kind-variable tsd-parent-kind-module\",\"parent\":\"settings\"},{\"id\":173,\"kind\":32,\"name\":\"fhirVersions\",\"url\":\"modules/settings.html#fhirVersions\",\"classes\":\"tsd-kind-variable tsd-parent-kind-module\",\"parent\":\"settings\"},{\"id\":174,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/settings.html#fhirVersions.__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-variable\",\"parent\":\"settings.fhirVersions\"},{\"id\":175,\"kind\":1024,\"name\":\"0.4.0\",\"url\":\"modules/settings.html#fhirVersions.__type.0_4_0\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"settings.fhirVersions.__type\"},{\"id\":176,\"kind\":1024,\"name\":\"0.5.0\",\"url\":\"modules/settings.html#fhirVersions.__type.0_5_0\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"settings.fhirVersions.__type\"},{\"id\":177,\"kind\":1024,\"name\":\"1.0.0\",\"url\":\"modules/settings.html#fhirVersions.__type.1_0_0\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"settings.fhirVersions.__type\"},{\"id\":178,\"kind\":1024,\"name\":\"1.0.1\",\"url\":\"modules/settings.html#fhirVersions.__type.1_0_1\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"settings.fhirVersions.__type\"},{\"id\":179,\"kind\":1024,\"name\":\"1.0.2\",\"url\":\"modules/settings.html#fhirVersions.__type.1_0_2\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"settings.fhirVersions.__type\"},{\"id\":180,\"kind\":1024,\"name\":\"1.1.0\",\"url\":\"modules/settings.html#fhirVersions.__type.1_1_0\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"settings.fhirVersions.__type\"},{\"id\":181,\"kind\":1024,\"name\":\"1.4.0\",\"url\":\"modules/settings.html#fhirVersions.__type.1_4_0\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"settings.fhirVersions.__type\"},{\"id\":182,\"kind\":1024,\"name\":\"1.6.0\",\"url\":\"modules/settings.html#fhirVersions.__type.1_6_0\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"settings.fhirVersions.__type\"},{\"id\":183,\"kind\":1024,\"name\":\"1.8.0\",\"url\":\"modules/settings.html#fhirVersions.__type.1_8_0\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"settings.fhirVersions.__type\"},{\"id\":184,\"kind\":1024,\"name\":\"3.0.0\",\"url\":\"modules/settings.html#fhirVersions.__type.3_0_0\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"settings.fhirVersions.__type\"},{\"id\":185,\"kind\":1024,\"name\":\"3.0.1\",\"url\":\"modules/settings.html#fhirVersions.__type.3_0_1\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"settings.fhirVersions.__type\"},{\"id\":186,\"kind\":1024,\"name\":\"3.3.0\",\"url\":\"modules/settings.html#fhirVersions.__type.3_3_0\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"settings.fhirVersions.__type\"},{\"id\":187,\"kind\":1024,\"name\":\"3.5.0\",\"url\":\"modules/settings.html#fhirVersions.__type.3_5_0\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"settings.fhirVersions.__type\"},{\"id\":188,\"kind\":1024,\"name\":\"4.0.0\",\"url\":\"modules/settings.html#fhirVersions.__type.4_0_0\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"settings.fhirVersions.__type\"},{\"id\":189,\"kind\":1024,\"name\":\"4.0.1\",\"url\":\"modules/settings.html#fhirVersions.__type.4_0_1\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"settings.fhirVersions.__type\"},{\"id\":190,\"kind\":32,\"name\":\"patientParams\",\"url\":\"modules/settings.html#patientParams\",\"classes\":\"tsd-kind-variable tsd-parent-kind-module\",\"parent\":\"settings\"},{\"id\":191,\"kind\":32,\"name\":\"SMART_KEY\",\"url\":\"modules/settings.html#SMART_KEY\",\"classes\":\"tsd-kind-variable tsd-parent-kind-module\",\"parent\":\"settings\"},{\"id\":192,\"kind\":2,\"name\":\"smart\",\"url\":\"modules/smart.html\",\"classes\":\"tsd-kind-module\"},{\"id\":193,\"kind\":64,\"name\":\"fetchWellKnownJson\",\"url\":\"modules/smart.html#fetchWellKnownJson\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"smart\"},{\"id\":194,\"kind\":64,\"name\":\"getSecurityExtensions\",\"url\":\"modules/smart.html#getSecurityExtensions\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"smart\"},{\"id\":195,\"kind\":64,\"name\":\"authorize\",\"url\":\"modules/smart.html#authorize\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"smart\"},{\"id\":196,\"kind\":64,\"name\":\"isInFrame\",\"url\":\"modules/smart.html#isInFrame\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"smart\"},{\"id\":197,\"kind\":64,\"name\":\"isInPopUp\",\"url\":\"modules/smart.html#isInPopUp\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"smart\"},{\"id\":198,\"kind\":64,\"name\":\"onMessage\",\"url\":\"modules/smart.html#onMessage\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"smart\"},{\"id\":199,\"kind\":64,\"name\":\"ready\",\"url\":\"modules/smart.html#ready\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"smart\"},{\"id\":200,\"kind\":64,\"name\":\"buildTokenRequest\",\"url\":\"modules/smart.html#buildTokenRequest\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"smart\"},{\"id\":201,\"kind\":64,\"name\":\"init\",\"url\":\"modules/smart.html#init\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"smart\"},{\"id\":202,\"kind\":2,\"name\":\"storage/BrowserStorage\",\"url\":\"modules/storage_BrowserStorage.html\",\"classes\":\"tsd-kind-module\"},{\"id\":203,\"kind\":128,\"name\":\"default\",\"url\":\"classes/storage_BrowserStorage.default.html\",\"classes\":\"tsd-kind-class tsd-parent-kind-module\",\"parent\":\"storage/BrowserStorage\"},{\"id\":204,\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/storage_BrowserStorage.default.html#constructor\",\"classes\":\"tsd-kind-constructor tsd-parent-kind-class\",\"parent\":\"storage/BrowserStorage.default\"},{\"id\":205,\"kind\":2048,\"name\":\"get\",\"url\":\"classes/storage_BrowserStorage.default.html#get\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"storage/BrowserStorage.default\"},{\"id\":206,\"kind\":2048,\"name\":\"set\",\"url\":\"classes/storage_BrowserStorage.default.html#set\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"storage/BrowserStorage.default\"},{\"id\":207,\"kind\":2048,\"name\":\"unset\",\"url\":\"classes/storage_BrowserStorage.default.html#unset\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"storage/BrowserStorage.default\"},{\"id\":208,\"kind\":2,\"name\":\"storage/ServerStorage\",\"url\":\"modules/storage_ServerStorage.html\",\"classes\":\"tsd-kind-module\"},{\"id\":209,\"kind\":128,\"name\":\"default\",\"url\":\"classes/storage_ServerStorage.default.html\",\"classes\":\"tsd-kind-class tsd-parent-kind-module\",\"parent\":\"storage/ServerStorage\"},{\"id\":210,\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/storage_ServerStorage.default.html#constructor\",\"classes\":\"tsd-kind-constructor tsd-parent-kind-class\",\"parent\":\"storage/ServerStorage.default\"},{\"id\":211,\"kind\":1024,\"name\":\"request\",\"url\":\"classes/storage_ServerStorage.default.html#request\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"storage/ServerStorage.default\"},{\"id\":212,\"kind\":2048,\"name\":\"get\",\"url\":\"classes/storage_ServerStorage.default.html#get\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"storage/ServerStorage.default\"},{\"id\":213,\"kind\":2048,\"name\":\"set\",\"url\":\"classes/storage_ServerStorage.default.html#set\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"storage/ServerStorage.default\"},{\"id\":214,\"kind\":2048,\"name\":\"unset\",\"url\":\"classes/storage_ServerStorage.default.html#unset\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"storage/ServerStorage.default\"},{\"id\":215,\"kind\":2,\"name\":\"strings\",\"url\":\"modules/strings.html\",\"classes\":\"tsd-kind-module\"},{\"id\":216,\"kind\":32,\"name\":\"default\",\"url\":\"modules/strings.html#default\",\"classes\":\"tsd-kind-variable tsd-parent-kind-module\",\"parent\":\"strings\"},{\"id\":217,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/strings.html#default.__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-variable\",\"parent\":\"strings.default\"},{\"id\":218,\"kind\":1024,\"name\":\"expired\",\"url\":\"modules/strings.html#default.__type.expired\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"strings.default.__type\"},{\"id\":219,\"kind\":1024,\"name\":\"noScopeForId\",\"url\":\"modules/strings.html#default.__type.noScopeForId\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"strings.default.__type\"},{\"id\":220,\"kind\":1024,\"name\":\"noIfNoAuth\",\"url\":\"modules/strings.html#default.__type.noIfNoAuth\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"strings.default.__type\"},{\"id\":221,\"kind\":1024,\"name\":\"noFreeContext\",\"url\":\"modules/strings.html#default.__type.noFreeContext\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"strings.default.__type\"},{\"id\":222,\"kind\":2,\"name\":\"types\",\"url\":\"modules/types.html\",\"classes\":\"tsd-kind-module\"},{\"id\":223,\"kind\":4,\"name\":\"fhirclient\",\"url\":\"modules/types.fhirclient.html\",\"classes\":\"tsd-kind-namespace tsd-parent-kind-module\",\"parent\":\"types\"},{\"id\":224,\"kind\":64,\"name\":\"WindowTargetFunction\",\"url\":\"modules/types.fhirclient.html#WindowTargetFunction\",\"classes\":\"tsd-kind-function tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient\"},{\"id\":225,\"kind\":256,\"name\":\"RequestWithSession\",\"url\":\"interfaces/types.fhirclient.RequestWithSession.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient\"},{\"id\":226,\"kind\":1024,\"name\":\"session\",\"url\":\"interfaces/types.fhirclient.RequestWithSession.html#session\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.RequestWithSession\"},{\"id\":227,\"kind\":256,\"name\":\"SMART\",\"url\":\"interfaces/types.fhirclient.SMART.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient\"},{\"id\":228,\"kind\":1024,\"name\":\"options\",\"url\":\"interfaces/types.fhirclient.SMART.html#options\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.SMART\"},{\"id\":229,\"kind\":2048,\"name\":\"ready\",\"url\":\"interfaces/types.fhirclient.SMART.html#ready\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.SMART\"},{\"id\":230,\"kind\":2048,\"name\":\"authorize\",\"url\":\"interfaces/types.fhirclient.SMART.html#authorize\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.SMART\"},{\"id\":231,\"kind\":2048,\"name\":\"init\",\"url\":\"interfaces/types.fhirclient.SMART.html#init\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.SMART\"},{\"id\":232,\"kind\":2048,\"name\":\"client\",\"url\":\"interfaces/types.fhirclient.SMART.html#client\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.SMART\"},{\"id\":233,\"kind\":256,\"name\":\"BrowserFHIRSettings\",\"url\":\"interfaces/types.fhirclient.BrowserFHIRSettings.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient\"},{\"id\":234,\"kind\":256,\"name\":\"CodeValue\",\"url\":\"interfaces/types.fhirclient.CodeValue.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient\"},{\"id\":235,\"kind\":1024,\"name\":\"code\",\"url\":\"interfaces/types.fhirclient.CodeValue.html#code\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.CodeValue\"},{\"id\":236,\"kind\":1024,\"name\":\"value\",\"url\":\"interfaces/types.fhirclient.CodeValue.html#value\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.CodeValue\"},{\"id\":237,\"kind\":256,\"name\":\"ObservationMap\",\"url\":\"interfaces/types.fhirclient.ObservationMap.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient\"},{\"id\":238,\"kind\":256,\"name\":\"Adapter\",\"url\":\"interfaces/types.fhirclient.Adapter.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient\"},{\"id\":239,\"kind\":1024,\"name\":\"options\",\"url\":\"interfaces/types.fhirclient.Adapter.html#options\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.Adapter\"},{\"id\":240,\"kind\":2048,\"name\":\"getUrl\",\"url\":\"interfaces/types.fhirclient.Adapter.html#getUrl\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.Adapter\"},{\"id\":241,\"kind\":2048,\"name\":\"redirect\",\"url\":\"interfaces/types.fhirclient.Adapter.html#redirect\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.Adapter\"},{\"id\":242,\"kind\":2048,\"name\":\"getStorage\",\"url\":\"interfaces/types.fhirclient.Adapter.html#getStorage\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.Adapter\"},{\"id\":243,\"kind\":2048,\"name\":\"relative\",\"url\":\"interfaces/types.fhirclient.Adapter.html#relative\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.Adapter\"},{\"id\":244,\"kind\":2048,\"name\":\"base64decode\",\"url\":\"interfaces/types.fhirclient.Adapter.html#base64decode\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.Adapter\"},{\"id\":245,\"kind\":2048,\"name\":\"base64encode\",\"url\":\"interfaces/types.fhirclient.Adapter.html#base64encode\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.Adapter\"},{\"id\":246,\"kind\":2048,\"name\":\"base64urlencode\",\"url\":\"interfaces/types.fhirclient.Adapter.html#base64urlencode\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.Adapter\"},{\"id\":247,\"kind\":2048,\"name\":\"base64urldecode\",\"url\":\"interfaces/types.fhirclient.Adapter.html#base64urldecode\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.Adapter\"},{\"id\":248,\"kind\":2048,\"name\":\"getSmartApi\",\"url\":\"interfaces/types.fhirclient.Adapter.html#getSmartApi\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.Adapter\"},{\"id\":249,\"kind\":1024,\"name\":\"security\",\"url\":\"interfaces/types.fhirclient.Adapter.html#security\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.Adapter\"},{\"id\":250,\"kind\":65536,\"name\":\"__type\",\"url\":\"interfaces/types.fhirclient.Adapter.html#__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.Adapter\"},{\"id\":251,\"kind\":2048,\"name\":\"randomBytes\",\"url\":\"interfaces/types.fhirclient.Adapter.html#__type.randomBytes\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"types.fhirclient.Adapter.__type\"},{\"id\":252,\"kind\":2048,\"name\":\"digestSha256\",\"url\":\"interfaces/types.fhirclient.Adapter.html#__type.digestSha256\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"types.fhirclient.Adapter.__type\"},{\"id\":253,\"kind\":2048,\"name\":\"generatePKCEChallenge\",\"url\":\"interfaces/types.fhirclient.Adapter.html#__type.generatePKCEChallenge\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"types.fhirclient.Adapter.__type\"},{\"id\":254,\"kind\":2048,\"name\":\"importJWK\",\"url\":\"interfaces/types.fhirclient.Adapter.html#__type.importJWK\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"types.fhirclient.Adapter.__type\"},{\"id\":255,\"kind\":2048,\"name\":\"signCompactJws\",\"url\":\"interfaces/types.fhirclient.Adapter.html#__type.signCompactJws\",\"classes\":\"tsd-kind-method tsd-parent-kind-type-literal\",\"parent\":\"types.fhirclient.Adapter.__type\"},{\"id\":256,\"kind\":256,\"name\":\"Storage\",\"url\":\"interfaces/types.fhirclient.Storage.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient\"},{\"id\":257,\"kind\":2048,\"name\":\"set\",\"url\":\"interfaces/types.fhirclient.Storage.html#set\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.Storage\"},{\"id\":258,\"kind\":2048,\"name\":\"get\",\"url\":\"interfaces/types.fhirclient.Storage.html#get\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.Storage\"},{\"id\":259,\"kind\":2048,\"name\":\"unset\",\"url\":\"interfaces/types.fhirclient.Storage.html#unset\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.Storage\"},{\"id\":260,\"kind\":4194304,\"name\":\"WindowTargetVariable\",\"url\":\"modules/types.fhirclient.html#WindowTargetVariable\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient\"},{\"id\":261,\"kind\":4194304,\"name\":\"WindowTarget\",\"url\":\"modules/types.fhirclient.html#WindowTarget\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient\"},{\"id\":262,\"kind\":4194304,\"name\":\"PkceMode\",\"url\":\"modules/types.fhirclient.html#PkceMode\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient\"},{\"id\":263,\"kind\":4194304,\"name\":\"storageFactory\",\"url\":\"modules/types.fhirclient.html#storageFactory\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient\"},{\"id\":264,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/types.fhirclient.html#storageFactory.__type-1\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-alias\",\"parent\":\"types.fhirclient.storageFactory\"},{\"id\":265,\"kind\":256,\"name\":\"IncludeResponseHint\",\"url\":\"interfaces/types.fhirclient.IncludeResponseHint.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient\"},{\"id\":266,\"kind\":1024,\"name\":\"includeResponse\",\"url\":\"interfaces/types.fhirclient.IncludeResponseHint.html#includeResponse\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.IncludeResponseHint\"},{\"id\":267,\"kind\":4194304,\"name\":\"RequestFunction\",\"url\":\"modules/types.fhirclient.html#RequestFunction\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-namespace tsd-has-type-parameter\",\"parent\":\"types.fhirclient\"},{\"id\":268,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/types.fhirclient.html#RequestFunction.__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-alias tsd-has-type-parameter\",\"parent\":\"types.fhirclient.RequestFunction\"},{\"id\":269,\"kind\":256,\"name\":\"FetchOptions\",\"url\":\"interfaces/types.fhirclient.FetchOptions.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient\"},{\"id\":270,\"kind\":1024,\"name\":\"includeResponse\",\"url\":\"interfaces/types.fhirclient.FetchOptions.html#includeResponse\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.FetchOptions\"},{\"id\":271,\"kind\":256,\"name\":\"CombinedFetchResult\",\"url\":\"interfaces/types.fhirclient.CombinedFetchResult.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace tsd-has-type-parameter\",\"parent\":\"types.fhirclient\"},{\"id\":272,\"kind\":1024,\"name\":\"body\",\"url\":\"interfaces/types.fhirclient.CombinedFetchResult.html#body\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.CombinedFetchResult\"},{\"id\":273,\"kind\":1024,\"name\":\"response\",\"url\":\"interfaces/types.fhirclient.CombinedFetchResult.html#response\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.CombinedFetchResult\"},{\"id\":274,\"kind\":4194304,\"name\":\"FetchResult\",\"url\":\"modules/types.fhirclient.html#FetchResult\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient\"},{\"id\":275,\"kind\":256,\"name\":\"ES384JWK\",\"url\":\"interfaces/types.fhirclient.ES384JWK.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient\"},{\"id\":276,\"kind\":1024,\"name\":\"alg\",\"url\":\"interfaces/types.fhirclient.ES384JWK.html#alg\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-overwrite\",\"parent\":\"types.fhirclient.ES384JWK\"},{\"id\":277,\"kind\":1024,\"name\":\"kty\",\"url\":\"interfaces/types.fhirclient.ES384JWK.html#kty\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-overwrite\",\"parent\":\"types.fhirclient.ES384JWK\"},{\"id\":278,\"kind\":1024,\"name\":\"crv\",\"url\":\"interfaces/types.fhirclient.ES384JWK.html#crv\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-overwrite\",\"parent\":\"types.fhirclient.ES384JWK\"},{\"id\":279,\"kind\":1024,\"name\":\"kid\",\"url\":\"interfaces/types.fhirclient.ES384JWK.html#kid\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.ES384JWK\"},{\"id\":280,\"kind\":1024,\"name\":\"key_ops\",\"url\":\"interfaces/types.fhirclient.ES384JWK.html#key_ops\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-overwrite\",\"parent\":\"types.fhirclient.ES384JWK\"},{\"id\":281,\"kind\":256,\"name\":\"RS384JWK\",\"url\":\"interfaces/types.fhirclient.RS384JWK.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient\"},{\"id\":282,\"kind\":1024,\"name\":\"alg\",\"url\":\"interfaces/types.fhirclient.RS384JWK.html#alg\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-overwrite\",\"parent\":\"types.fhirclient.RS384JWK\"},{\"id\":283,\"kind\":1024,\"name\":\"kty\",\"url\":\"interfaces/types.fhirclient.RS384JWK.html#kty\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-overwrite\",\"parent\":\"types.fhirclient.RS384JWK\"},{\"id\":284,\"kind\":1024,\"name\":\"kid\",\"url\":\"interfaces/types.fhirclient.RS384JWK.html#kid\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.RS384JWK\"},{\"id\":285,\"kind\":1024,\"name\":\"key_ops\",\"url\":\"interfaces/types.fhirclient.RS384JWK.html#key_ops\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-overwrite\",\"parent\":\"types.fhirclient.RS384JWK\"},{\"id\":286,\"kind\":4194304,\"name\":\"JWK\",\"url\":\"modules/types.fhirclient.html#JWK\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient\"},{\"id\":287,\"kind\":256,\"name\":\"RequestOptions\",\"url\":\"interfaces/types.fhirclient.RequestOptions.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient\"},{\"id\":288,\"kind\":1024,\"name\":\"url\",\"url\":\"interfaces/types.fhirclient.RequestOptions.html#url\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.RequestOptions\"},{\"id\":289,\"kind\":1024,\"name\":\"includeResponse\",\"url\":\"interfaces/types.fhirclient.RequestOptions.html#includeResponse\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.RequestOptions\"},{\"id\":290,\"kind\":256,\"name\":\"OAuthSecurityExtensions\",\"url\":\"interfaces/types.fhirclient.OAuthSecurityExtensions.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient\"},{\"id\":291,\"kind\":1024,\"name\":\"registrationUri\",\"url\":\"interfaces/types.fhirclient.OAuthSecurityExtensions.html#registrationUri\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.OAuthSecurityExtensions\"},{\"id\":292,\"kind\":1024,\"name\":\"authorizeUri\",\"url\":\"interfaces/types.fhirclient.OAuthSecurityExtensions.html#authorizeUri\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.OAuthSecurityExtensions\"},{\"id\":293,\"kind\":1024,\"name\":\"tokenUri\",\"url\":\"interfaces/types.fhirclient.OAuthSecurityExtensions.html#tokenUri\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.OAuthSecurityExtensions\"},{\"id\":294,\"kind\":1024,\"name\":\"codeChallengeMethods\",\"url\":\"interfaces/types.fhirclient.OAuthSecurityExtensions.html#codeChallengeMethods\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.OAuthSecurityExtensions\"},{\"id\":295,\"kind\":256,\"name\":\"ClientState\",\"url\":\"interfaces/types.fhirclient.ClientState.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient\"},{\"id\":296,\"kind\":1024,\"name\":\"serverUrl\",\"url\":\"interfaces/types.fhirclient.ClientState.html#serverUrl\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.ClientState\"},{\"id\":297,\"kind\":1024,\"name\":\"clientId\",\"url\":\"interfaces/types.fhirclient.ClientState.html#clientId\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.ClientState\"},{\"id\":298,\"kind\":1024,\"name\":\"redirectUri\",\"url\":\"interfaces/types.fhirclient.ClientState.html#redirectUri\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.ClientState\"},{\"id\":299,\"kind\":1024,\"name\":\"scope\",\"url\":\"interfaces/types.fhirclient.ClientState.html#scope\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.ClientState\"},{\"id\":300,\"kind\":1024,\"name\":\"clientPublicKeySetUrl\",\"url\":\"interfaces/types.fhirclient.ClientState.html#clientPublicKeySetUrl\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.ClientState\"},{\"id\":301,\"kind\":1024,\"name\":\"clientPrivateJwk\",\"url\":\"interfaces/types.fhirclient.ClientState.html#clientPrivateJwk\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.ClientState\"},{\"id\":302,\"kind\":1024,\"name\":\"clientSecret\",\"url\":\"interfaces/types.fhirclient.ClientState.html#clientSecret\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.ClientState\"},{\"id\":303,\"kind\":1024,\"name\":\"tokenResponse\",\"url\":\"interfaces/types.fhirclient.ClientState.html#tokenResponse\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.ClientState\"},{\"id\":304,\"kind\":1024,\"name\":\"username\",\"url\":\"interfaces/types.fhirclient.ClientState.html#username\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.ClientState\"},{\"id\":305,\"kind\":1024,\"name\":\"password\",\"url\":\"interfaces/types.fhirclient.ClientState.html#password\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.ClientState\"},{\"id\":306,\"kind\":1024,\"name\":\"registrationUri\",\"url\":\"interfaces/types.fhirclient.ClientState.html#registrationUri\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.ClientState\"},{\"id\":307,\"kind\":1024,\"name\":\"authorizeUri\",\"url\":\"interfaces/types.fhirclient.ClientState.html#authorizeUri\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.ClientState\"},{\"id\":308,\"kind\":1024,\"name\":\"tokenUri\",\"url\":\"interfaces/types.fhirclient.ClientState.html#tokenUri\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.ClientState\"},{\"id\":309,\"kind\":1024,\"name\":\"key\",\"url\":\"interfaces/types.fhirclient.ClientState.html#key\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.ClientState\"},{\"id\":310,\"kind\":1024,\"name\":\"completeInTarget\",\"url\":\"interfaces/types.fhirclient.ClientState.html#completeInTarget\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.ClientState\"},{\"id\":311,\"kind\":1024,\"name\":\"expiresAt\",\"url\":\"interfaces/types.fhirclient.ClientState.html#expiresAt\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.ClientState\"},{\"id\":312,\"kind\":1024,\"name\":\"codeChallenge\",\"url\":\"interfaces/types.fhirclient.ClientState.html#codeChallenge\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.ClientState\"},{\"id\":313,\"kind\":1024,\"name\":\"codeVerifier\",\"url\":\"interfaces/types.fhirclient.ClientState.html#codeVerifier\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.ClientState\"},{\"id\":314,\"kind\":1024,\"name\":\"refreshTokenWithCredentials\",\"url\":\"interfaces/types.fhirclient.ClientState.html#refreshTokenWithCredentials\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.ClientState\"},{\"id\":315,\"kind\":256,\"name\":\"AuthorizeParams\",\"url\":\"interfaces/types.fhirclient.AuthorizeParams.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient\"},{\"id\":316,\"kind\":1024,\"name\":\"iss\",\"url\":\"interfaces/types.fhirclient.AuthorizeParams.html#iss\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.AuthorizeParams\"},{\"id\":317,\"kind\":1024,\"name\":\"issMatch\",\"url\":\"interfaces/types.fhirclient.AuthorizeParams.html#issMatch\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.AuthorizeParams\"},{\"id\":318,\"kind\":1024,\"name\":\"launch\",\"url\":\"interfaces/types.fhirclient.AuthorizeParams.html#launch\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.AuthorizeParams\"},{\"id\":319,\"kind\":1024,\"name\":\"fhirServiceUrl\",\"url\":\"interfaces/types.fhirclient.AuthorizeParams.html#fhirServiceUrl\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.AuthorizeParams\"},{\"id\":320,\"kind\":1024,\"name\":\"redirectUri\",\"url\":\"interfaces/types.fhirclient.AuthorizeParams.html#redirectUri\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.AuthorizeParams\"},{\"id\":321,\"kind\":1024,\"name\":\"noRedirect\",\"url\":\"interfaces/types.fhirclient.AuthorizeParams.html#noRedirect\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.AuthorizeParams\"},{\"id\":322,\"kind\":1024,\"name\":\"clientId\",\"url\":\"interfaces/types.fhirclient.AuthorizeParams.html#clientId\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.AuthorizeParams\"},{\"id\":323,\"kind\":1024,\"name\":\"scope\",\"url\":\"interfaces/types.fhirclient.AuthorizeParams.html#scope\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.AuthorizeParams\"},{\"id\":324,\"kind\":1024,\"name\":\"patientId\",\"url\":\"interfaces/types.fhirclient.AuthorizeParams.html#patientId\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.AuthorizeParams\"},{\"id\":325,\"kind\":1024,\"name\":\"encounterId\",\"url\":\"interfaces/types.fhirclient.AuthorizeParams.html#encounterId\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.AuthorizeParams\"},{\"id\":326,\"kind\":1024,\"name\":\"clientSecret\",\"url\":\"interfaces/types.fhirclient.AuthorizeParams.html#clientSecret\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.AuthorizeParams\"},{\"id\":327,\"kind\":1024,\"name\":\"clientPublicKeySetUrl\",\"url\":\"interfaces/types.fhirclient.AuthorizeParams.html#clientPublicKeySetUrl\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.AuthorizeParams\"},{\"id\":328,\"kind\":1024,\"name\":\"clientPrivateJwk\",\"url\":\"interfaces/types.fhirclient.AuthorizeParams.html#clientPrivateJwk\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.AuthorizeParams\"},{\"id\":329,\"kind\":1024,\"name\":\"fakeTokenResponse\",\"url\":\"interfaces/types.fhirclient.AuthorizeParams.html#fakeTokenResponse\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.AuthorizeParams\"},{\"id\":330,\"kind\":1024,\"name\":\"target\",\"url\":\"interfaces/types.fhirclient.AuthorizeParams.html#target\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.AuthorizeParams\"},{\"id\":331,\"kind\":1024,\"name\":\"width\",\"url\":\"interfaces/types.fhirclient.AuthorizeParams.html#width\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.AuthorizeParams\"},{\"id\":332,\"kind\":1024,\"name\":\"height\",\"url\":\"interfaces/types.fhirclient.AuthorizeParams.html#height\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.AuthorizeParams\"},{\"id\":333,\"kind\":1024,\"name\":\"completeInTarget\",\"url\":\"interfaces/types.fhirclient.AuthorizeParams.html#completeInTarget\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.AuthorizeParams\"},{\"id\":334,\"kind\":1024,\"name\":\"pkceMode\",\"url\":\"interfaces/types.fhirclient.AuthorizeParams.html#pkceMode\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.AuthorizeParams\"},{\"id\":335,\"kind\":1024,\"name\":\"refreshTokenWithCredentials\",\"url\":\"interfaces/types.fhirclient.AuthorizeParams.html#refreshTokenWithCredentials\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.AuthorizeParams\"},{\"id\":336,\"kind\":256,\"name\":\"ReadyOptions\",\"url\":\"interfaces/types.fhirclient.ReadyOptions.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient\"},{\"id\":337,\"kind\":1024,\"name\":\"privateKey\",\"url\":\"interfaces/types.fhirclient.ReadyOptions.html#privateKey\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.ReadyOptions\"},{\"id\":338,\"kind\":1024,\"name\":\"clientPublicKeySetUrl\",\"url\":\"interfaces/types.fhirclient.ReadyOptions.html#clientPublicKeySetUrl\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.ReadyOptions\"},{\"id\":339,\"kind\":256,\"name\":\"FhirOptions\",\"url\":\"interfaces/types.fhirclient.FhirOptions.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient\"},{\"id\":340,\"kind\":1024,\"name\":\"pageLimit\",\"url\":\"interfaces/types.fhirclient.FhirOptions.html#pageLimit\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.FhirOptions\"},{\"id\":341,\"kind\":2048,\"name\":\"onPage\",\"url\":\"interfaces/types.fhirclient.FhirOptions.html#onPage\",\"classes\":\"tsd-kind-method tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.FhirOptions\"},{\"id\":342,\"kind\":1024,\"name\":\"flat\",\"url\":\"interfaces/types.fhirclient.FhirOptions.html#flat\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.FhirOptions\"},{\"id\":343,\"kind\":1024,\"name\":\"graph\",\"url\":\"interfaces/types.fhirclient.FhirOptions.html#graph\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.FhirOptions\"},{\"id\":344,\"kind\":1024,\"name\":\"resolveReferences\",\"url\":\"interfaces/types.fhirclient.FhirOptions.html#resolveReferences\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.FhirOptions\"},{\"id\":345,\"kind\":1024,\"name\":\"useRefreshToken\",\"url\":\"interfaces/types.fhirclient.FhirOptions.html#useRefreshToken\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.FhirOptions\"},{\"id\":346,\"kind\":256,\"name\":\"TokenResponse\",\"url\":\"interfaces/types.fhirclient.TokenResponse.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient\"},{\"id\":347,\"kind\":1024,\"name\":\"need_patient_banner\",\"url\":\"interfaces/types.fhirclient.TokenResponse.html#need_patient_banner\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.TokenResponse\"},{\"id\":348,\"kind\":1024,\"name\":\"smart_style_url\",\"url\":\"interfaces/types.fhirclient.TokenResponse.html#smart_style_url\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.TokenResponse\"},{\"id\":349,\"kind\":1024,\"name\":\"patient\",\"url\":\"interfaces/types.fhirclient.TokenResponse.html#patient\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.TokenResponse\"},{\"id\":350,\"kind\":1024,\"name\":\"encounter\",\"url\":\"interfaces/types.fhirclient.TokenResponse.html#encounter\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.TokenResponse\"},{\"id\":351,\"kind\":1024,\"name\":\"client_id\",\"url\":\"interfaces/types.fhirclient.TokenResponse.html#client_id\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.TokenResponse\"},{\"id\":352,\"kind\":1024,\"name\":\"token_type\",\"url\":\"interfaces/types.fhirclient.TokenResponse.html#token_type\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.TokenResponse\"},{\"id\":353,\"kind\":1024,\"name\":\"scope\",\"url\":\"interfaces/types.fhirclient.TokenResponse.html#scope\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.TokenResponse\"},{\"id\":354,\"kind\":1024,\"name\":\"expires_in\",\"url\":\"interfaces/types.fhirclient.TokenResponse.html#expires_in\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.TokenResponse\"},{\"id\":355,\"kind\":1024,\"name\":\"access_token\",\"url\":\"interfaces/types.fhirclient.TokenResponse.html#access_token\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.TokenResponse\"},{\"id\":356,\"kind\":1024,\"name\":\"id_token\",\"url\":\"interfaces/types.fhirclient.TokenResponse.html#id_token\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.TokenResponse\"},{\"id\":357,\"kind\":1024,\"name\":\"refresh_token\",\"url\":\"interfaces/types.fhirclient.TokenResponse.html#refresh_token\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.TokenResponse\"},{\"id\":358,\"kind\":256,\"name\":\"IDToken\",\"url\":\"interfaces/types.fhirclient.IDToken.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient\"},{\"id\":359,\"kind\":1024,\"name\":\"profile\",\"url\":\"interfaces/types.fhirclient.IDToken.html#profile\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.IDToken\"},{\"id\":360,\"kind\":1024,\"name\":\"aud\",\"url\":\"interfaces/types.fhirclient.IDToken.html#aud\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.IDToken\"},{\"id\":361,\"kind\":1024,\"name\":\"sub\",\"url\":\"interfaces/types.fhirclient.IDToken.html#sub\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.IDToken\"},{\"id\":362,\"kind\":1024,\"name\":\"iss\",\"url\":\"interfaces/types.fhirclient.IDToken.html#iss\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.IDToken\"},{\"id\":363,\"kind\":1024,\"name\":\"iat\",\"url\":\"interfaces/types.fhirclient.IDToken.html#iat\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.IDToken\"},{\"id\":364,\"kind\":1024,\"name\":\"exp\",\"url\":\"interfaces/types.fhirclient.IDToken.html#exp\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.IDToken\"},{\"id\":365,\"kind\":256,\"name\":\"JsonObject\",\"url\":\"interfaces/types.fhirclient.JsonObject.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient\"},{\"id\":366,\"kind\":4194304,\"name\":\"JsonPrimitive\",\"url\":\"modules/types.fhirclient.html#JsonPrimitive\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient\"},{\"id\":367,\"kind\":4194304,\"name\":\"JsonValue\",\"url\":\"modules/types.fhirclient.html#JsonValue\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient\"},{\"id\":368,\"kind\":4194304,\"name\":\"JsonArray\",\"url\":\"modules/types.fhirclient.html#JsonArray\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient\"},{\"id\":369,\"kind\":256,\"name\":\"JsonPatchAdd\",\"url\":\"interfaces/types.fhirclient.JsonPatchAdd.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient\"},{\"id\":370,\"kind\":1024,\"name\":\"op\",\"url\":\"interfaces/types.fhirclient.JsonPatchAdd.html#op\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.JsonPatchAdd\"},{\"id\":371,\"kind\":1024,\"name\":\"path\",\"url\":\"interfaces/types.fhirclient.JsonPatchAdd.html#path\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.JsonPatchAdd\"},{\"id\":372,\"kind\":1024,\"name\":\"value\",\"url\":\"interfaces/types.fhirclient.JsonPatchAdd.html#value\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.JsonPatchAdd\"},{\"id\":373,\"kind\":256,\"name\":\"JsonPatchReplace\",\"url\":\"interfaces/types.fhirclient.JsonPatchReplace.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient\"},{\"id\":374,\"kind\":1024,\"name\":\"op\",\"url\":\"interfaces/types.fhirclient.JsonPatchReplace.html#op\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.JsonPatchReplace\"},{\"id\":375,\"kind\":1024,\"name\":\"path\",\"url\":\"interfaces/types.fhirclient.JsonPatchReplace.html#path\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.JsonPatchReplace\"},{\"id\":376,\"kind\":1024,\"name\":\"value\",\"url\":\"interfaces/types.fhirclient.JsonPatchReplace.html#value\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.JsonPatchReplace\"},{\"id\":377,\"kind\":256,\"name\":\"JsonPatchTest\",\"url\":\"interfaces/types.fhirclient.JsonPatchTest.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient\"},{\"id\":378,\"kind\":1024,\"name\":\"op\",\"url\":\"interfaces/types.fhirclient.JsonPatchTest.html#op\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.JsonPatchTest\"},{\"id\":379,\"kind\":1024,\"name\":\"path\",\"url\":\"interfaces/types.fhirclient.JsonPatchTest.html#path\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.JsonPatchTest\"},{\"id\":380,\"kind\":1024,\"name\":\"value\",\"url\":\"interfaces/types.fhirclient.JsonPatchTest.html#value\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.JsonPatchTest\"},{\"id\":381,\"kind\":256,\"name\":\"JsonPatchMove\",\"url\":\"interfaces/types.fhirclient.JsonPatchMove.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient\"},{\"id\":382,\"kind\":1024,\"name\":\"op\",\"url\":\"interfaces/types.fhirclient.JsonPatchMove.html#op\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.JsonPatchMove\"},{\"id\":383,\"kind\":1024,\"name\":\"path\",\"url\":\"interfaces/types.fhirclient.JsonPatchMove.html#path\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.JsonPatchMove\"},{\"id\":384,\"kind\":1024,\"name\":\"from\",\"url\":\"interfaces/types.fhirclient.JsonPatchMove.html#from\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.JsonPatchMove\"},{\"id\":385,\"kind\":256,\"name\":\"JsonPatchCopy\",\"url\":\"interfaces/types.fhirclient.JsonPatchCopy.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient\"},{\"id\":386,\"kind\":1024,\"name\":\"op\",\"url\":\"interfaces/types.fhirclient.JsonPatchCopy.html#op\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.JsonPatchCopy\"},{\"id\":387,\"kind\":1024,\"name\":\"path\",\"url\":\"interfaces/types.fhirclient.JsonPatchCopy.html#path\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.JsonPatchCopy\"},{\"id\":388,\"kind\":1024,\"name\":\"from\",\"url\":\"interfaces/types.fhirclient.JsonPatchCopy.html#from\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.JsonPatchCopy\"},{\"id\":389,\"kind\":256,\"name\":\"JsonPatchRemove\",\"url\":\"interfaces/types.fhirclient.JsonPatchRemove.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient\"},{\"id\":390,\"kind\":1024,\"name\":\"op\",\"url\":\"interfaces/types.fhirclient.JsonPatchRemove.html#op\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.JsonPatchRemove\"},{\"id\":391,\"kind\":1024,\"name\":\"path\",\"url\":\"interfaces/types.fhirclient.JsonPatchRemove.html#path\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.JsonPatchRemove\"},{\"id\":392,\"kind\":4194304,\"name\":\"JsonPatchOperation\",\"url\":\"modules/types.fhirclient.html#JsonPatchOperation\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient\"},{\"id\":393,\"kind\":4194304,\"name\":\"JsonPatch\",\"url\":\"modules/types.fhirclient.html#JsonPatch\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient\"},{\"id\":394,\"kind\":4194304,\"name\":\"codeChallengeMethod\",\"url\":\"modules/types.fhirclient.html#codeChallengeMethod\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient\"},{\"id\":395,\"kind\":4194304,\"name\":\"SMARTAuthenticationMethod\",\"url\":\"modules/types.fhirclient.html#SMARTAuthenticationMethod\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient\"},{\"id\":396,\"kind\":4194304,\"name\":\"launchMode\",\"url\":\"modules/types.fhirclient.html#launchMode\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient\"},{\"id\":397,\"kind\":4194304,\"name\":\"clientType\",\"url\":\"modules/types.fhirclient.html#clientType\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient\"},{\"id\":398,\"kind\":4194304,\"name\":\"singleSignOn\",\"url\":\"modules/types.fhirclient.html#singleSignOn\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient\"},{\"id\":399,\"kind\":4194304,\"name\":\"launchContext\",\"url\":\"modules/types.fhirclient.html#launchContext\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient\"},{\"id\":400,\"kind\":4194304,\"name\":\"launchContextEHR\",\"url\":\"modules/types.fhirclient.html#launchContextEHR\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient\"},{\"id\":401,\"kind\":4194304,\"name\":\"launchContextStandalone\",\"url\":\"modules/types.fhirclient.html#launchContextStandalone\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient\"},{\"id\":402,\"kind\":4194304,\"name\":\"permissions\",\"url\":\"modules/types.fhirclient.html#permissions\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient\"},{\"id\":403,\"kind\":256,\"name\":\"WellKnownSmartConfiguration\",\"url\":\"interfaces/types.fhirclient.WellKnownSmartConfiguration.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient\"},{\"id\":404,\"kind\":1024,\"name\":\"authorization_endpoint\",\"url\":\"interfaces/types.fhirclient.WellKnownSmartConfiguration.html#authorization_endpoint\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.WellKnownSmartConfiguration\"},{\"id\":405,\"kind\":1024,\"name\":\"token_endpoint\",\"url\":\"interfaces/types.fhirclient.WellKnownSmartConfiguration.html#token_endpoint\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.WellKnownSmartConfiguration\"},{\"id\":406,\"kind\":1024,\"name\":\"registration_endpoint\",\"url\":\"interfaces/types.fhirclient.WellKnownSmartConfiguration.html#registration_endpoint\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.WellKnownSmartConfiguration\"},{\"id\":407,\"kind\":1024,\"name\":\"management_endpoint\",\"url\":\"interfaces/types.fhirclient.WellKnownSmartConfiguration.html#management_endpoint\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.WellKnownSmartConfiguration\"},{\"id\":408,\"kind\":1024,\"name\":\"introspection_endpoint\",\"url\":\"interfaces/types.fhirclient.WellKnownSmartConfiguration.html#introspection_endpoint\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.WellKnownSmartConfiguration\"},{\"id\":409,\"kind\":1024,\"name\":\"revocation_endpoint\",\"url\":\"interfaces/types.fhirclient.WellKnownSmartConfiguration.html#revocation_endpoint\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.WellKnownSmartConfiguration\"},{\"id\":410,\"kind\":1024,\"name\":\"code_challenge_methods_supported\",\"url\":\"interfaces/types.fhirclient.WellKnownSmartConfiguration.html#code_challenge_methods_supported\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.WellKnownSmartConfiguration\"},{\"id\":411,\"kind\":1024,\"name\":\"token_endpoint_auth_methods\",\"url\":\"interfaces/types.fhirclient.WellKnownSmartConfiguration.html#token_endpoint_auth_methods\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.WellKnownSmartConfiguration\"},{\"id\":412,\"kind\":1024,\"name\":\"scopes_supported\",\"url\":\"interfaces/types.fhirclient.WellKnownSmartConfiguration.html#scopes_supported\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.WellKnownSmartConfiguration\"},{\"id\":413,\"kind\":1024,\"name\":\"response_types_supported\",\"url\":\"interfaces/types.fhirclient.WellKnownSmartConfiguration.html#response_types_supported\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.WellKnownSmartConfiguration\"},{\"id\":414,\"kind\":1024,\"name\":\"capabilities\",\"url\":\"interfaces/types.fhirclient.WellKnownSmartConfiguration.html#capabilities\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.WellKnownSmartConfiguration\"},{\"id\":415,\"kind\":4,\"name\":\"FHIR\",\"url\":\"modules/types.fhirclient.FHIR.html\",\"classes\":\"tsd-kind-namespace tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient\"},{\"id\":416,\"kind\":4194304,\"name\":\"id\",\"url\":\"modules/types.fhirclient.FHIR.html#id\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient.FHIR\"},{\"id\":417,\"kind\":4194304,\"name\":\"uri\",\"url\":\"modules/types.fhirclient.FHIR.html#uri\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient.FHIR\"},{\"id\":418,\"kind\":4194304,\"name\":\"code\",\"url\":\"modules/types.fhirclient.FHIR.html#code\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient.FHIR\"},{\"id\":419,\"kind\":4194304,\"name\":\"instant\",\"url\":\"modules/types.fhirclient.FHIR.html#instant\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient.FHIR\"},{\"id\":420,\"kind\":4194304,\"name\":\"dateTime\",\"url\":\"modules/types.fhirclient.FHIR.html#dateTime\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient.FHIR\"},{\"id\":421,\"kind\":4194304,\"name\":\"unsignedInt\",\"url\":\"modules/types.fhirclient.FHIR.html#unsignedInt\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient.FHIR\"},{\"id\":422,\"kind\":4194304,\"name\":\"valueX\",\"url\":\"modules/types.fhirclient.FHIR.html#valueX\",\"classes\":\"tsd-kind-type-alias tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient.FHIR\"},{\"id\":423,\"kind\":256,\"name\":\"Element\",\"url\":\"interfaces/types.fhirclient.FHIR.Element.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient.FHIR\"},{\"id\":424,\"kind\":1024,\"name\":\"id\",\"url\":\"interfaces/types.fhirclient.FHIR.Element.html#id\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.FHIR.Element\"},{\"id\":425,\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/types.fhirclient.FHIR.Element.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.FHIR.Element\"},{\"id\":426,\"kind\":256,\"name\":\"Extension\",\"url\":\"interfaces/types.fhirclient.FHIR.Extension.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace tsd-has-type-parameter\",\"parent\":\"types.fhirclient.FHIR\"},{\"id\":427,\"kind\":1024,\"name\":\"url\",\"url\":\"interfaces/types.fhirclient.FHIR.Extension.html#url\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.FHIR.Extension\"},{\"id\":428,\"kind\":1024,\"name\":\"id\",\"url\":\"interfaces/types.fhirclient.FHIR.Extension.html#id\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"types.fhirclient.FHIR.Extension\"},{\"id\":429,\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/types.fhirclient.FHIR.Extension.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"types.fhirclient.FHIR.Extension\"},{\"id\":430,\"kind\":256,\"name\":\"CapabilityStatement\",\"url\":\"interfaces/types.fhirclient.FHIR.CapabilityStatement.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient.FHIR\"},{\"id\":431,\"kind\":1024,\"name\":\"resourceType\",\"url\":\"interfaces/types.fhirclient.FHIR.CapabilityStatement.html#resourceType\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.FHIR.CapabilityStatement\"},{\"id\":432,\"kind\":1024,\"name\":\"fhirVersion\",\"url\":\"interfaces/types.fhirclient.FHIR.CapabilityStatement.html#fhirVersion\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.FHIR.CapabilityStatement\"},{\"id\":433,\"kind\":1024,\"name\":\"rest\",\"url\":\"interfaces/types.fhirclient.FHIR.CapabilityStatement.html#rest\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.FHIR.CapabilityStatement\"},{\"id\":434,\"kind\":256,\"name\":\"Resource\",\"url\":\"interfaces/types.fhirclient.FHIR.Resource.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient.FHIR\"},{\"id\":435,\"kind\":1024,\"name\":\"id\",\"url\":\"interfaces/types.fhirclient.FHIR.Resource.html#id\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.FHIR.Resource\"},{\"id\":436,\"kind\":1024,\"name\":\"resourceType\",\"url\":\"interfaces/types.fhirclient.FHIR.Resource.html#resourceType\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.FHIR.Resource\"},{\"id\":437,\"kind\":1024,\"name\":\"meta\",\"url\":\"interfaces/types.fhirclient.FHIR.Resource.html#meta\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.FHIR.Resource\"},{\"id\":438,\"kind\":1024,\"name\":\"implicitRules\",\"url\":\"interfaces/types.fhirclient.FHIR.Resource.html#implicitRules\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.FHIR.Resource\"},{\"id\":439,\"kind\":1024,\"name\":\"language\",\"url\":\"interfaces/types.fhirclient.FHIR.Resource.html#language\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.FHIR.Resource\"},{\"id\":440,\"kind\":256,\"name\":\"Meta\",\"url\":\"interfaces/types.fhirclient.FHIR.Meta.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient.FHIR\"},{\"id\":441,\"kind\":1024,\"name\":\"lastUpdated\",\"url\":\"interfaces/types.fhirclient.FHIR.Meta.html#lastUpdated\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.FHIR.Meta\"},{\"id\":442,\"kind\":1024,\"name\":\"id\",\"url\":\"interfaces/types.fhirclient.FHIR.Meta.html#id\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"types.fhirclient.FHIR.Meta\"},{\"id\":443,\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/types.fhirclient.FHIR.Meta.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"types.fhirclient.FHIR.Meta\"},{\"id\":444,\"kind\":256,\"name\":\"Observation\",\"url\":\"interfaces/types.fhirclient.FHIR.Observation.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient.FHIR\"},{\"id\":445,\"kind\":1024,\"name\":\"resourceType\",\"url\":\"interfaces/types.fhirclient.FHIR.Observation.html#resourceType\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-overwrite\",\"parent\":\"types.fhirclient.FHIR.Observation\"},{\"id\":446,\"kind\":1024,\"name\":\"id\",\"url\":\"interfaces/types.fhirclient.FHIR.Observation.html#id\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"types.fhirclient.FHIR.Observation\"},{\"id\":447,\"kind\":1024,\"name\":\"meta\",\"url\":\"interfaces/types.fhirclient.FHIR.Observation.html#meta\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"types.fhirclient.FHIR.Observation\"},{\"id\":448,\"kind\":1024,\"name\":\"implicitRules\",\"url\":\"interfaces/types.fhirclient.FHIR.Observation.html#implicitRules\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"types.fhirclient.FHIR.Observation\"},{\"id\":449,\"kind\":1024,\"name\":\"language\",\"url\":\"interfaces/types.fhirclient.FHIR.Observation.html#language\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"types.fhirclient.FHIR.Observation\"},{\"id\":450,\"kind\":256,\"name\":\"Patient\",\"url\":\"interfaces/types.fhirclient.FHIR.Patient.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient.FHIR\"},{\"id\":451,\"kind\":1024,\"name\":\"resourceType\",\"url\":\"interfaces/types.fhirclient.FHIR.Patient.html#resourceType\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-overwrite\",\"parent\":\"types.fhirclient.FHIR.Patient\"},{\"id\":452,\"kind\":1024,\"name\":\"id\",\"url\":\"interfaces/types.fhirclient.FHIR.Patient.html#id\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"types.fhirclient.FHIR.Patient\"},{\"id\":453,\"kind\":1024,\"name\":\"meta\",\"url\":\"interfaces/types.fhirclient.FHIR.Patient.html#meta\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"types.fhirclient.FHIR.Patient\"},{\"id\":454,\"kind\":1024,\"name\":\"implicitRules\",\"url\":\"interfaces/types.fhirclient.FHIR.Patient.html#implicitRules\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"types.fhirclient.FHIR.Patient\"},{\"id\":455,\"kind\":1024,\"name\":\"language\",\"url\":\"interfaces/types.fhirclient.FHIR.Patient.html#language\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"types.fhirclient.FHIR.Patient\"},{\"id\":456,\"kind\":256,\"name\":\"Practitioner\",\"url\":\"interfaces/types.fhirclient.FHIR.Practitioner.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient.FHIR\"},{\"id\":457,\"kind\":1024,\"name\":\"resourceType\",\"url\":\"interfaces/types.fhirclient.FHIR.Practitioner.html#resourceType\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-overwrite\",\"parent\":\"types.fhirclient.FHIR.Practitioner\"},{\"id\":458,\"kind\":1024,\"name\":\"id\",\"url\":\"interfaces/types.fhirclient.FHIR.Practitioner.html#id\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"types.fhirclient.FHIR.Practitioner\"},{\"id\":459,\"kind\":1024,\"name\":\"meta\",\"url\":\"interfaces/types.fhirclient.FHIR.Practitioner.html#meta\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"types.fhirclient.FHIR.Practitioner\"},{\"id\":460,\"kind\":1024,\"name\":\"implicitRules\",\"url\":\"interfaces/types.fhirclient.FHIR.Practitioner.html#implicitRules\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"types.fhirclient.FHIR.Practitioner\"},{\"id\":461,\"kind\":1024,\"name\":\"language\",\"url\":\"interfaces/types.fhirclient.FHIR.Practitioner.html#language\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"types.fhirclient.FHIR.Practitioner\"},{\"id\":462,\"kind\":256,\"name\":\"RelatedPerson\",\"url\":\"interfaces/types.fhirclient.FHIR.RelatedPerson.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient.FHIR\"},{\"id\":463,\"kind\":1024,\"name\":\"resourceType\",\"url\":\"interfaces/types.fhirclient.FHIR.RelatedPerson.html#resourceType\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-overwrite\",\"parent\":\"types.fhirclient.FHIR.RelatedPerson\"},{\"id\":464,\"kind\":1024,\"name\":\"id\",\"url\":\"interfaces/types.fhirclient.FHIR.RelatedPerson.html#id\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"types.fhirclient.FHIR.RelatedPerson\"},{\"id\":465,\"kind\":1024,\"name\":\"meta\",\"url\":\"interfaces/types.fhirclient.FHIR.RelatedPerson.html#meta\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"types.fhirclient.FHIR.RelatedPerson\"},{\"id\":466,\"kind\":1024,\"name\":\"implicitRules\",\"url\":\"interfaces/types.fhirclient.FHIR.RelatedPerson.html#implicitRules\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"types.fhirclient.FHIR.RelatedPerson\"},{\"id\":467,\"kind\":1024,\"name\":\"language\",\"url\":\"interfaces/types.fhirclient.FHIR.RelatedPerson.html#language\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"types.fhirclient.FHIR.RelatedPerson\"},{\"id\":468,\"kind\":256,\"name\":\"Encounter\",\"url\":\"interfaces/types.fhirclient.FHIR.Encounter.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient.FHIR\"},{\"id\":469,\"kind\":1024,\"name\":\"resourceType\",\"url\":\"interfaces/types.fhirclient.FHIR.Encounter.html#resourceType\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-overwrite\",\"parent\":\"types.fhirclient.FHIR.Encounter\"},{\"id\":470,\"kind\":1024,\"name\":\"id\",\"url\":\"interfaces/types.fhirclient.FHIR.Encounter.html#id\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"types.fhirclient.FHIR.Encounter\"},{\"id\":471,\"kind\":1024,\"name\":\"meta\",\"url\":\"interfaces/types.fhirclient.FHIR.Encounter.html#meta\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"types.fhirclient.FHIR.Encounter\"},{\"id\":472,\"kind\":1024,\"name\":\"implicitRules\",\"url\":\"interfaces/types.fhirclient.FHIR.Encounter.html#implicitRules\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"types.fhirclient.FHIR.Encounter\"},{\"id\":473,\"kind\":1024,\"name\":\"language\",\"url\":\"interfaces/types.fhirclient.FHIR.Encounter.html#language\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"types.fhirclient.FHIR.Encounter\"},{\"id\":474,\"kind\":256,\"name\":\"Period\",\"url\":\"interfaces/types.fhirclient.FHIR.Period.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient.FHIR\"},{\"id\":475,\"kind\":1024,\"name\":\"start\",\"url\":\"interfaces/types.fhirclient.FHIR.Period.html#start\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.FHIR.Period\"},{\"id\":476,\"kind\":1024,\"name\":\"end\",\"url\":\"interfaces/types.fhirclient.FHIR.Period.html#end\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.FHIR.Period\"},{\"id\":477,\"kind\":1024,\"name\":\"id\",\"url\":\"interfaces/types.fhirclient.FHIR.Period.html#id\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"types.fhirclient.FHIR.Period\"},{\"id\":478,\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/types.fhirclient.FHIR.Period.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"types.fhirclient.FHIR.Period\"},{\"id\":479,\"kind\":256,\"name\":\"BackboneElement\",\"url\":\"interfaces/types.fhirclient.FHIR.BackboneElement.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient.FHIR\"},{\"id\":480,\"kind\":1024,\"name\":\"modifierExtension\",\"url\":\"interfaces/types.fhirclient.FHIR.BackboneElement.html#modifierExtension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.FHIR.BackboneElement\"},{\"id\":481,\"kind\":1024,\"name\":\"id\",\"url\":\"interfaces/types.fhirclient.FHIR.BackboneElement.html#id\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"types.fhirclient.FHIR.BackboneElement\"},{\"id\":482,\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/types.fhirclient.FHIR.BackboneElement.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"types.fhirclient.FHIR.BackboneElement\"},{\"id\":483,\"kind\":256,\"name\":\"CodeableConcept\",\"url\":\"interfaces/types.fhirclient.FHIR.CodeableConcept.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient.FHIR\"},{\"id\":484,\"kind\":1024,\"name\":\"coding\",\"url\":\"interfaces/types.fhirclient.FHIR.CodeableConcept.html#coding\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.FHIR.CodeableConcept\"},{\"id\":485,\"kind\":1024,\"name\":\"text\",\"url\":\"interfaces/types.fhirclient.FHIR.CodeableConcept.html#text\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.FHIR.CodeableConcept\"},{\"id\":486,\"kind\":1024,\"name\":\"id\",\"url\":\"interfaces/types.fhirclient.FHIR.CodeableConcept.html#id\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"types.fhirclient.FHIR.CodeableConcept\"},{\"id\":487,\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/types.fhirclient.FHIR.CodeableConcept.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"types.fhirclient.FHIR.CodeableConcept\"},{\"id\":488,\"kind\":256,\"name\":\"Coding\",\"url\":\"interfaces/types.fhirclient.FHIR.Coding.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient.FHIR\"},{\"id\":489,\"kind\":1024,\"name\":\"system\",\"url\":\"interfaces/types.fhirclient.FHIR.Coding.html#system\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.FHIR.Coding\"},{\"id\":490,\"kind\":1024,\"name\":\"version\",\"url\":\"interfaces/types.fhirclient.FHIR.Coding.html#version\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.FHIR.Coding\"},{\"id\":491,\"kind\":1024,\"name\":\"code\",\"url\":\"interfaces/types.fhirclient.FHIR.Coding.html#code\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.FHIR.Coding\"},{\"id\":492,\"kind\":1024,\"name\":\"display\",\"url\":\"interfaces/types.fhirclient.FHIR.Coding.html#display\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.FHIR.Coding\"},{\"id\":493,\"kind\":1024,\"name\":\"userSelected\",\"url\":\"interfaces/types.fhirclient.FHIR.Coding.html#userSelected\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.FHIR.Coding\"},{\"id\":494,\"kind\":1024,\"name\":\"id\",\"url\":\"interfaces/types.fhirclient.FHIR.Coding.html#id\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"types.fhirclient.FHIR.Coding\"},{\"id\":495,\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/types.fhirclient.FHIR.Coding.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"types.fhirclient.FHIR.Coding\"},{\"id\":496,\"kind\":256,\"name\":\"Identifier\",\"url\":\"interfaces/types.fhirclient.FHIR.Identifier.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient.FHIR\"},{\"id\":497,\"kind\":1024,\"name\":\"use\",\"url\":\"interfaces/types.fhirclient.FHIR.Identifier.html#use\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.FHIR.Identifier\"},{\"id\":498,\"kind\":1024,\"name\":\"type\",\"url\":\"interfaces/types.fhirclient.FHIR.Identifier.html#type\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.FHIR.Identifier\"},{\"id\":499,\"kind\":1024,\"name\":\"system\",\"url\":\"interfaces/types.fhirclient.FHIR.Identifier.html#system\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.FHIR.Identifier\"},{\"id\":500,\"kind\":1024,\"name\":\"value\",\"url\":\"interfaces/types.fhirclient.FHIR.Identifier.html#value\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.FHIR.Identifier\"},{\"id\":501,\"kind\":1024,\"name\":\"period\",\"url\":\"interfaces/types.fhirclient.FHIR.Identifier.html#period\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.FHIR.Identifier\"},{\"id\":502,\"kind\":1024,\"name\":\"assigner\",\"url\":\"interfaces/types.fhirclient.FHIR.Identifier.html#assigner\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.FHIR.Identifier\"},{\"id\":503,\"kind\":1024,\"name\":\"id\",\"url\":\"interfaces/types.fhirclient.FHIR.Identifier.html#id\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"types.fhirclient.FHIR.Identifier\"},{\"id\":504,\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/types.fhirclient.FHIR.Identifier.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"types.fhirclient.FHIR.Identifier\"},{\"id\":505,\"kind\":256,\"name\":\"Reference\",\"url\":\"interfaces/types.fhirclient.FHIR.Reference.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient.FHIR\"},{\"id\":506,\"kind\":1024,\"name\":\"reference\",\"url\":\"interfaces/types.fhirclient.FHIR.Reference.html#reference\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.FHIR.Reference\"},{\"id\":507,\"kind\":1024,\"name\":\"identifier\",\"url\":\"interfaces/types.fhirclient.FHIR.Reference.html#identifier\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.FHIR.Reference\"},{\"id\":508,\"kind\":1024,\"name\":\"display\",\"url\":\"interfaces/types.fhirclient.FHIR.Reference.html#display\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.FHIR.Reference\"},{\"id\":509,\"kind\":1024,\"name\":\"id\",\"url\":\"interfaces/types.fhirclient.FHIR.Reference.html#id\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"types.fhirclient.FHIR.Reference\"},{\"id\":510,\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/types.fhirclient.FHIR.Reference.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"types.fhirclient.FHIR.Reference\"},{\"id\":511,\"kind\":256,\"name\":\"BundleLink\",\"url\":\"interfaces/types.fhirclient.FHIR.BundleLink.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient.FHIR\"},{\"id\":512,\"kind\":1024,\"name\":\"relation\",\"url\":\"interfaces/types.fhirclient.FHIR.BundleLink.html#relation\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.FHIR.BundleLink\"},{\"id\":513,\"kind\":1024,\"name\":\"url\",\"url\":\"interfaces/types.fhirclient.FHIR.BundleLink.html#url\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.FHIR.BundleLink\"},{\"id\":514,\"kind\":1024,\"name\":\"modifierExtension\",\"url\":\"interfaces/types.fhirclient.FHIR.BundleLink.html#modifierExtension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"types.fhirclient.FHIR.BundleLink\"},{\"id\":515,\"kind\":1024,\"name\":\"id\",\"url\":\"interfaces/types.fhirclient.FHIR.BundleLink.html#id\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"types.fhirclient.FHIR.BundleLink\"},{\"id\":516,\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/types.fhirclient.FHIR.BundleLink.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"types.fhirclient.FHIR.BundleLink\"},{\"id\":517,\"kind\":256,\"name\":\"BundleEntry\",\"url\":\"interfaces/types.fhirclient.FHIR.BundleEntry.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient.FHIR\"},{\"id\":518,\"kind\":1024,\"name\":\"fullUrl\",\"url\":\"interfaces/types.fhirclient.FHIR.BundleEntry.html#fullUrl\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.FHIR.BundleEntry\"},{\"id\":519,\"kind\":1024,\"name\":\"resource\",\"url\":\"interfaces/types.fhirclient.FHIR.BundleEntry.html#resource\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.FHIR.BundleEntry\"},{\"id\":520,\"kind\":1024,\"name\":\"modifierExtension\",\"url\":\"interfaces/types.fhirclient.FHIR.BundleEntry.html#modifierExtension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"types.fhirclient.FHIR.BundleEntry\"},{\"id\":521,\"kind\":1024,\"name\":\"id\",\"url\":\"interfaces/types.fhirclient.FHIR.BundleEntry.html#id\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"types.fhirclient.FHIR.BundleEntry\"},{\"id\":522,\"kind\":1024,\"name\":\"extension\",\"url\":\"interfaces/types.fhirclient.FHIR.BundleEntry.html#extension\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"types.fhirclient.FHIR.BundleEntry\"},{\"id\":523,\"kind\":256,\"name\":\"Bundle\",\"url\":\"interfaces/types.fhirclient.FHIR.Bundle.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-namespace\",\"parent\":\"types.fhirclient.FHIR\"},{\"id\":524,\"kind\":1024,\"name\":\"identifier\",\"url\":\"interfaces/types.fhirclient.FHIR.Bundle.html#identifier\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.FHIR.Bundle\"},{\"id\":525,\"kind\":1024,\"name\":\"type\",\"url\":\"interfaces/types.fhirclient.FHIR.Bundle.html#type\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.FHIR.Bundle\"},{\"id\":526,\"kind\":1024,\"name\":\"total\",\"url\":\"interfaces/types.fhirclient.FHIR.Bundle.html#total\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.FHIR.Bundle\"},{\"id\":527,\"kind\":1024,\"name\":\"link\",\"url\":\"interfaces/types.fhirclient.FHIR.Bundle.html#link\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.FHIR.Bundle\"},{\"id\":528,\"kind\":1024,\"name\":\"entry\",\"url\":\"interfaces/types.fhirclient.FHIR.Bundle.html#entry\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"types.fhirclient.FHIR.Bundle\"},{\"id\":529,\"kind\":1024,\"name\":\"id\",\"url\":\"interfaces/types.fhirclient.FHIR.Bundle.html#id\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"types.fhirclient.FHIR.Bundle\"},{\"id\":530,\"kind\":1024,\"name\":\"resourceType\",\"url\":\"interfaces/types.fhirclient.FHIR.Bundle.html#resourceType\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"types.fhirclient.FHIR.Bundle\"},{\"id\":531,\"kind\":1024,\"name\":\"meta\",\"url\":\"interfaces/types.fhirclient.FHIR.Bundle.html#meta\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"types.fhirclient.FHIR.Bundle\"},{\"id\":532,\"kind\":1024,\"name\":\"implicitRules\",\"url\":\"interfaces/types.fhirclient.FHIR.Bundle.html#implicitRules\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"types.fhirclient.FHIR.Bundle\"},{\"id\":533,\"kind\":1024,\"name\":\"language\",\"url\":\"interfaces/types.fhirclient.FHIR.Bundle.html#language\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited\",\"parent\":\"types.fhirclient.FHIR.Bundle\"},{\"id\":534,\"kind\":16777216,\"name\":\"KEY\",\"url\":\"modules/smart.html#KEY\",\"classes\":\"tsd-kind-reference tsd-parent-kind-module\",\"parent\":\"smart\"}],\"index\":{\"version\":\"2.3.9\",\"fields\":[\"name\",\"parent\"],\"fieldVectors\":[[\"name/0\",[0,47.801]],[\"parent/0\",[]],[\"name/1\",[1,38.418]],[\"parent/1\",[0,4.709]],[\"name/2\",[2,42.692]],[\"parent/2\",[3,2.731]],[\"name/3\",[4,58.787]],[\"parent/3\",[3,2.731]],[\"name/4\",[5,58.787]],[\"parent/4\",[3,2.731]],[\"name/5\",[6,50.314]],[\"parent/5\",[3,2.731]],[\"name/6\",[7,34.219]],[\"parent/6\",[3,2.731]],[\"name/7\",[8,31.706]],[\"parent/7\",[9,3.703]],[\"name/8\",[10,50.314]],[\"parent/8\",[9,3.703]],[\"name/9\",[11,47.801]],[\"parent/9\",[9,3.703]],[\"name/10\",[12,50.314]],[\"parent/10\",[3,2.731]],[\"name/11\",[7,34.219]],[\"parent/11\",[3,2.731]],[\"name/12\",[8,31.706]],[\"parent/12\",[9,3.703]],[\"name/13\",[10,50.314]],[\"parent/13\",[9,3.703]],[\"name/14\",[13,58.787]],[\"parent/14\",[3,2.731]],[\"name/15\",[7,34.219]],[\"parent/15\",[3,2.731]],[\"name/16\",[8,31.706]],[\"parent/16\",[9,3.703]],[\"name/17\",[10,50.314]],[\"parent/17\",[9,3.703]],[\"name/18\",[14,58.787]],[\"parent/18\",[9,3.703]],[\"name/19\",[15,40.328]],[\"parent/19\",[9,3.703]],[\"name/20\",[16,58.787]],[\"parent/20\",[3,2.731]],[\"name/21\",[17,58.787]],[\"parent/21\",[3,2.731]],[\"name/22\",[18,58.787]],[\"parent/22\",[3,2.731]],[\"name/23\",[19,58.787]],[\"parent/23\",[3,2.731]],[\"name/24\",[20,58.787]],[\"parent/24\",[3,2.731]],[\"name/25\",[21,58.787]],[\"parent/25\",[3,2.731]],[\"name/26\",[22,58.787]],[\"parent/26\",[3,2.731]],[\"name/27\",[23,58.787]],[\"parent/27\",[3,2.731]],[\"name/28\",[24,58.787]],[\"parent/28\",[3,2.731]],[\"name/29\",[25,58.787]],[\"parent/29\",[3,2.731]],[\"name/30\",[26,58.787]],[\"parent/30\",[3,2.731]],[\"name/31\",[27,58.787]],[\"parent/31\",[3,2.731]],[\"name/32\",[28,58.787]],[\"parent/32\",[3,2.731]],[\"name/33\",[11,47.801]],[\"parent/33\",[3,2.731]],[\"name/34\",[29,58.787]],[\"parent/34\",[3,2.731]],[\"name/35\",[30,58.787]],[\"parent/35\",[3,2.731]],[\"name/36\",[31,53.678]],[\"parent/36\",[3,2.731]],[\"name/37\",[32,53.678]],[\"parent/37\",[3,2.731]],[\"name/38\",[33,53.678]],[\"parent/38\",[3,2.731]],[\"name/39\",[7,34.219]],[\"parent/39\",[3,2.731]],[\"name/40\",[34,53.678]],[\"parent/40\",[9,3.703]],[\"name/41\",[35,53.678]],[\"parent/41\",[9,3.703]],[\"name/42\",[36,53.678]],[\"parent/42\",[9,3.703]],[\"name/43\",[37,53.678]],[\"parent/43\",[3,2.731]],[\"name/44\",[38,58.787]],[\"parent/44\",[3,2.731]],[\"name/45\",[39,58.787]],[\"parent/45\",[3,2.731]],[\"name/46\",[40,58.787]],[\"parent/46\",[3,2.731]],[\"name/47\",[41,53.678]],[\"parent/47\",[]],[\"name/48\",[1,38.418]],[\"parent/48\",[41,5.288]],[\"name/49\",[7,34.219]],[\"parent/49\",[42,4.083]],[\"name/50\",[2,42.692]],[\"parent/50\",[42,4.083]],[\"name/51\",[43,58.787]],[\"parent/51\",[42,4.083]],[\"name/52\",[44,58.787]],[\"parent/52\",[42,4.083]],[\"name/53\",[45,58.787]],[\"parent/53\",[42,4.083]],[\"name/54\",[46,53.678]],[\"parent/54\",[42,4.083]],[\"name/55\",[47,58.787]],[\"parent/55\",[42,4.083]],[\"name/56\",[48,58.787]],[\"parent/56\",[42,4.083]],[\"name/57\",[49,53.678]],[\"parent/57\",[]],[\"name/58\",[1,38.418]],[\"parent/58\",[49,5.288]],[\"name/59\",[2,42.692]],[\"parent/59\",[50,3.556]],[\"name/60\",[51,58.787]],[\"parent/60\",[50,3.556]],[\"name/61\",[52,50.314]],[\"parent/61\",[50,3.556]],[\"name/62\",[53,45.794]],[\"parent/62\",[50,3.556]],[\"name/63\",[54,47.801]],[\"parent/63\",[50,3.556]],[\"name/64\",[55,47.801]],[\"parent/64\",[50,3.556]],[\"name/65\",[56,47.801]],[\"parent/65\",[50,3.556]],[\"name/66\",[57,47.801]],[\"parent/66\",[50,3.556]],[\"name/67\",[58,47.801]],[\"parent/67\",[50,3.556]],[\"name/68\",[59,47.801]],[\"parent/68\",[50,3.556]],[\"name/69\",[60,47.801]],[\"parent/69\",[50,3.556]],[\"name/70\",[61,45.794]],[\"parent/70\",[50,3.556]],[\"name/71\",[62,45.794]],[\"parent/71\",[50,3.556]],[\"name/72\",[63,47.801]],[\"parent/72\",[50,3.556]],[\"name/73\",[64,53.678]],[\"parent/73\",[]],[\"name/74\",[1,38.418]],[\"parent/74\",[64,5.288]],[\"name/75\",[65,36.814]],[\"parent/75\",[66,3.371]],[\"name/76\",[2,42.692]],[\"parent/76\",[66,3.371]],[\"name/77\",[67,58.787]],[\"parent/77\",[66,3.371]],[\"name/78\",[68,58.787]],[\"parent/78\",[66,3.371]],[\"name/79\",[52,50.314]],[\"parent/79\",[66,3.371]],[\"name/80\",[58,47.801]],[\"parent/80\",[66,3.371]],[\"name/81\",[57,47.801]],[\"parent/81\",[66,3.371]],[\"name/82\",[53,45.794]],[\"parent/82\",[66,3.371]],[\"name/83\",[54,47.801]],[\"parent/83\",[66,3.371]],[\"name/84\",[55,47.801]],[\"parent/84\",[66,3.371]],[\"name/85\",[69,53.678]],[\"parent/85\",[66,3.371]],[\"name/86\",[56,47.801]],[\"parent/86\",[66,3.371]],[\"name/87\",[59,47.801]],[\"parent/87\",[66,3.371]],[\"name/88\",[60,47.801]],[\"parent/88\",[66,3.371]],[\"name/89\",[61,45.794]],[\"parent/89\",[66,3.371]],[\"name/90\",[62,45.794]],[\"parent/90\",[66,3.371]],[\"name/91\",[63,47.801]],[\"parent/91\",[66,3.371]],[\"name/92\",[70,53.678]],[\"parent/92\",[]],[\"name/93\",[1,38.418]],[\"parent/93\",[70,5.288]],[\"name/94\",[2,42.692]],[\"parent/94\",[71,3.556]],[\"name/95\",[52,50.314]],[\"parent/95\",[71,3.556]],[\"name/96\",[53,45.794]],[\"parent/96\",[71,3.556]],[\"name/97\",[54,47.801]],[\"parent/97\",[71,3.556]],[\"name/98\",[55,47.801]],[\"parent/98\",[71,3.556]],[\"name/99\",[69,53.678]],[\"parent/99\",[71,3.556]],[\"name/100\",[56,47.801]],[\"parent/100\",[71,3.556]],[\"name/101\",[57,47.801]],[\"parent/101\",[71,3.556]],[\"name/102\",[58,47.801]],[\"parent/102\",[71,3.556]],[\"name/103\",[59,47.801]],[\"parent/103\",[71,3.556]],[\"name/104\",[60,47.801]],[\"parent/104\",[71,3.556]],[\"name/105\",[61,45.794]],[\"parent/105\",[71,3.556]],[\"name/106\",[62,45.794]],[\"parent/106\",[71,3.556]],[\"name/107\",[63,47.801]],[\"parent/107\",[71,3.556]],[\"name/108\",[72,47.801]],[\"parent/108\",[]],[\"name/109\",[61,45.794]],[\"parent/109\",[72,4.709]],[\"name/110\",[62,45.794]],[\"parent/110\",[72,4.709]],[\"name/111\",[73,58.787]],[\"parent/111\",[72,4.709]],[\"name/112\",[74,50.314]],[\"parent/112\",[]],[\"name/113\",[74,50.314]],[\"parent/113\",[74,4.957]],[\"name/114\",[75,53.678]],[\"parent/114\",[]],[\"name/115\",[1,38.418]],[\"parent/115\",[75,5.288]],[\"name/116\",[7,34.219]],[\"parent/116\",[76,5.791]],[\"name/117\",[0,47.801]],[\"parent/117\",[77,4.511]],[\"name/118\",[7,34.219]],[\"parent/118\",[77,4.511]],[\"name/119\",[78,58.787]],[\"parent/119\",[77,4.511]],[\"name/120\",[79,58.787]],[\"parent/120\",[77,4.511]],[\"name/121\",[7,34.219]],[\"parent/121\",[77,4.511]],[\"name/122\",[80,44.123]],[\"parent/122\",[81,4.206]],[\"name/123\",[82,50.314]],[\"parent/123\",[81,4.206]],[\"name/124\",[7,34.219]],[\"parent/124\",[81,4.206]],[\"name/125\",[83,50.314]],[\"parent/125\",[81,4.206]],[\"name/126\",[7,34.219]],[\"parent/126\",[81,4.206]],[\"name/127\",[84,50.314]],[\"parent/127\",[81,4.206]],[\"name/128\",[7,34.219]],[\"parent/128\",[81,4.206]],[\"name/129\",[85,53.678]],[\"parent/129\",[]],[\"name/130\",[1,38.418]],[\"parent/130\",[85,5.288]],[\"name/131\",[86,53.678]],[\"parent/131\",[]],[\"name/132\",[1,38.418]],[\"parent/132\",[86,5.288]],[\"name/133\",[87,31.706]],[\"parent/133\",[]],[\"name/134\",[88,58.787]],[\"parent/134\",[87,3.124]],[\"name/135\",[89,58.787]],[\"parent/135\",[87,3.124]],[\"name/136\",[90,58.787]],[\"parent/136\",[87,3.124]],[\"name/137\",[11,47.801]],[\"parent/137\",[87,3.124]],[\"name/138\",[91,58.787]],[\"parent/138\",[87,3.124]],[\"name/139\",[92,58.787]],[\"parent/139\",[87,3.124]],[\"name/140\",[37,53.678]],[\"parent/140\",[87,3.124]],[\"name/141\",[93,58.787]],[\"parent/141\",[87,3.124]],[\"name/142\",[94,58.787]],[\"parent/142\",[87,3.124]],[\"name/143\",[95,58.787]],[\"parent/143\",[87,3.124]],[\"name/144\",[96,58.787]],[\"parent/144\",[87,3.124]],[\"name/145\",[97,58.787]],[\"parent/145\",[87,3.124]],[\"name/146\",[98,58.787]],[\"parent/146\",[87,3.124]],[\"name/147\",[99,58.787]],[\"parent/147\",[87,3.124]],[\"name/148\",[31,53.678]],[\"parent/148\",[87,3.124]],[\"name/149\",[32,53.678]],[\"parent/149\",[87,3.124]],[\"name/150\",[100,58.787]],[\"parent/150\",[87,3.124]],[\"name/151\",[101,58.787]],[\"parent/151\",[87,3.124]],[\"name/152\",[102,58.787]],[\"parent/152\",[87,3.124]],[\"name/153\",[103,58.787]],[\"parent/153\",[87,3.124]],[\"name/154\",[33,53.678]],[\"parent/154\",[87,3.124]],[\"name/155\",[7,34.219]],[\"parent/155\",[104,5.791]],[\"name/156\",[34,53.678]],[\"parent/156\",[105,4.957]],[\"name/157\",[35,53.678]],[\"parent/157\",[105,4.957]],[\"name/158\",[36,53.678]],[\"parent/158\",[105,4.957]],[\"name/159\",[106,42.692]],[\"parent/159\",[]],[\"name/160\",[107,53.678]],[\"parent/160\",[106,4.206]],[\"name/161\",[108,50.314]],[\"parent/161\",[106,4.206]],[\"name/162\",[109,50.314]],[\"parent/162\",[106,4.206]],[\"name/163\",[110,50.314]],[\"parent/163\",[106,4.206]],[\"name/164\",[111,58.787]],[\"parent/164\",[106,4.206]],[\"name/165\",[112,50.314]],[\"parent/165\",[106,4.206]],[\"name/166\",[113,45.794]],[\"parent/166\",[]],[\"name/167\",[108,50.314]],[\"parent/167\",[113,4.511]],[\"name/168\",[112,50.314]],[\"parent/168\",[113,4.511]],[\"name/169\",[109,50.314]],[\"parent/169\",[113,4.511]],[\"name/170\",[110,50.314]],[\"parent/170\",[113,4.511]],[\"name/171\",[80,44.123]],[\"parent/171\",[]],[\"name/172\",[114,58.787]],[\"parent/172\",[80,4.347]],[\"name/173\",[115,58.787]],[\"parent/173\",[80,4.347]],[\"name/174\",[7,34.219]],[\"parent/174\",[116,5.791]],[\"name/175\",[117,58.787]],[\"parent/175\",[118,3.491]],[\"name/176\",[119,58.787]],[\"parent/176\",[118,3.491]],[\"name/177\",[120,58.787]],[\"parent/177\",[118,3.491]],[\"name/178\",[121,58.787]],[\"parent/178\",[118,3.491]],[\"name/179\",[122,58.787]],[\"parent/179\",[118,3.491]],[\"name/180\",[123,58.787]],[\"parent/180\",[118,3.491]],[\"name/181\",[124,58.787]],[\"parent/181\",[118,3.491]],[\"name/182\",[125,58.787]],[\"parent/182\",[118,3.491]],[\"name/183\",[126,58.787]],[\"parent/183\",[118,3.491]],[\"name/184\",[127,58.787]],[\"parent/184\",[118,3.491]],[\"name/185\",[128,58.787]],[\"parent/185\",[118,3.491]],[\"name/186\",[129,58.787]],[\"parent/186\",[118,3.491]],[\"name/187\",[130,58.787]],[\"parent/187\",[118,3.491]],[\"name/188\",[131,58.787]],[\"parent/188\",[118,3.491]],[\"name/189\",[132,58.787]],[\"parent/189\",[118,3.491]],[\"name/190\",[133,58.787]],[\"parent/190\",[80,4.347]],[\"name/191\",[134,58.787]],[\"parent/191\",[80,4.347]],[\"name/192\",[65,36.814]],[\"parent/192\",[]],[\"name/193\",[135,58.787]],[\"parent/193\",[65,3.627]],[\"name/194\",[136,58.787]],[\"parent/194\",[65,3.627]],[\"name/195\",[83,50.314]],[\"parent/195\",[65,3.627]],[\"name/196\",[137,58.787]],[\"parent/196\",[65,3.627]],[\"name/197\",[138,58.787]],[\"parent/197\",[65,3.627]],[\"name/198\",[139,58.787]],[\"parent/198\",[65,3.627]],[\"name/199\",[82,50.314]],[\"parent/199\",[65,3.627]],[\"name/200\",[140,58.787]],[\"parent/200\",[65,3.627]],[\"name/201\",[84,50.314]],[\"parent/201\",[65,3.627]],[\"name/202\",[141,53.678]],[\"parent/202\",[]],[\"name/203\",[1,38.418]],[\"parent/203\",[141,5.288]],[\"name/204\",[2,42.692]],[\"parent/204\",[142,4.709]],[\"name/205\",[143,50.314]],[\"parent/205\",[142,4.709]],[\"name/206\",[144,50.314]],[\"parent/206\",[142,4.709]],[\"name/207\",[145,50.314]],[\"parent/207\",[142,4.709]],[\"name/208\",[146,53.678]],[\"parent/208\",[]],[\"name/209\",[1,38.418]],[\"parent/209\",[146,5.288]],[\"name/210\",[2,42.692]],[\"parent/210\",[147,4.511]],[\"name/211\",[11,47.801]],[\"parent/211\",[147,4.511]],[\"name/212\",[143,50.314]],[\"parent/212\",[147,4.511]],[\"name/213\",[144,50.314]],[\"parent/213\",[147,4.511]],[\"name/214\",[145,50.314]],[\"parent/214\",[147,4.511]],[\"name/215\",[148,53.678]],[\"parent/215\",[]],[\"name/216\",[1,38.418]],[\"parent/216\",[148,5.288]],[\"name/217\",[7,34.219]],[\"parent/217\",[149,5.791]],[\"name/218\",[150,58.787]],[\"parent/218\",[151,4.709]],[\"name/219\",[152,58.787]],[\"parent/219\",[151,4.709]],[\"name/220\",[153,58.787]],[\"parent/220\",[151,4.709]],[\"name/221\",[154,58.787]],[\"parent/221\",[151,4.709]],[\"name/222\",[155,53.678]],[\"parent/222\",[]],[\"name/223\",[156,58.787]],[\"parent/223\",[155,5.288]],[\"name/224\",[157,58.787]],[\"parent/224\",[158,2.308]],[\"name/225\",[159,58.787]],[\"parent/225\",[158,2.308]],[\"name/226\",[160,58.787]],[\"parent/226\",[161,5.791]],[\"name/227\",[65,36.814]],[\"parent/227\",[158,2.308]],[\"name/228\",[53,45.794]],[\"parent/228\",[162,4.511]],[\"name/229\",[82,50.314]],[\"parent/229\",[162,4.511]],[\"name/230\",[83,50.314]],[\"parent/230\",[162,4.511]],[\"name/231\",[84,50.314]],[\"parent/231\",[162,4.511]],[\"name/232\",[0,47.801]],[\"parent/232\",[162,4.511]],[\"name/233\",[163,58.787]],[\"parent/233\",[158,2.308]],[\"name/234\",[164,58.787]],[\"parent/234\",[158,2.308]],[\"name/235\",[165,50.314]],[\"parent/235\",[166,5.288]],[\"name/236\",[167,45.794]],[\"parent/236\",[166,5.288]],[\"name/237\",[168,58.787]],[\"parent/237\",[158,2.308]],[\"name/238\",[169,58.787]],[\"parent/238\",[158,2.308]],[\"name/239\",[53,45.794]],[\"parent/239\",[170,3.703]],[\"name/240\",[56,47.801]],[\"parent/240\",[170,3.703]],[\"name/241\",[57,47.801]],[\"parent/241\",[170,3.703]],[\"name/242\",[58,47.801]],[\"parent/242\",[170,3.703]],[\"name/243\",[55,47.801]],[\"parent/243\",[170,3.703]],[\"name/244\",[60,47.801]],[\"parent/244\",[170,3.703]],[\"name/245\",[59,47.801]],[\"parent/245\",[170,3.703]],[\"name/246\",[61,45.794]],[\"parent/246\",[170,3.703]],[\"name/247\",[62,45.794]],[\"parent/247\",[170,3.703]],[\"name/248\",[63,47.801]],[\"parent/248\",[170,3.703]],[\"name/249\",[54,47.801]],[\"parent/249\",[170,3.703]],[\"name/250\",[7,34.219]],[\"parent/250\",[170,3.703]],[\"name/251\",[107,53.678]],[\"parent/251\",[171,4.511]],[\"name/252\",[108,50.314]],[\"parent/252\",[171,4.511]],[\"name/253\",[112,50.314]],[\"parent/253\",[171,4.511]],[\"name/254\",[109,50.314]],[\"parent/254\",[171,4.511]],[\"name/255\",[110,50.314]],[\"parent/255\",[171,4.511]],[\"name/256\",[172,58.787]],[\"parent/256\",[158,2.308]],[\"name/257\",[144,50.314]],[\"parent/257\",[173,4.957]],[\"name/258\",[143,50.314]],[\"parent/258\",[173,4.957]],[\"name/259\",[145,50.314]],[\"parent/259\",[173,4.957]],[\"name/260\",[174,58.787]],[\"parent/260\",[158,2.308]],[\"name/261\",[175,58.787]],[\"parent/261\",[158,2.308]],[\"name/262\",[176,53.678]],[\"parent/262\",[158,2.308]],[\"name/263\",[177,58.787]],[\"parent/263\",[158,2.308]],[\"name/264\",[7,34.219]],[\"parent/264\",[178,5.791]],[\"name/265\",[179,58.787]],[\"parent/265\",[158,2.308]],[\"name/266\",[180,50.314]],[\"parent/266\",[181,5.791]],[\"name/267\",[182,58.787]],[\"parent/267\",[158,2.308]],[\"name/268\",[7,34.219]],[\"parent/268\",[183,5.791]],[\"name/269\",[184,58.787]],[\"parent/269\",[158,2.308]],[\"name/270\",[180,50.314]],[\"parent/270\",[185,5.791]],[\"name/271\",[186,58.787]],[\"parent/271\",[158,2.308]],[\"name/272\",[187,58.787]],[\"parent/272\",[188,5.288]],[\"name/273\",[46,53.678]],[\"parent/273\",[188,5.288]],[\"name/274\",[189,58.787]],[\"parent/274\",[158,2.308]],[\"name/275\",[190,58.787]],[\"parent/275\",[158,2.308]],[\"name/276\",[191,53.678]],[\"parent/276\",[192,4.511]],[\"name/277\",[193,53.678]],[\"parent/277\",[192,4.511]],[\"name/278\",[194,58.787]],[\"parent/278\",[192,4.511]],[\"name/279\",[195,53.678]],[\"parent/279\",[192,4.511]],[\"name/280\",[196,53.678]],[\"parent/280\",[192,4.511]],[\"name/281\",[197,58.787]],[\"parent/281\",[158,2.308]],[\"name/282\",[191,53.678]],[\"parent/282\",[198,4.709]],[\"name/283\",[193,53.678]],[\"parent/283\",[198,4.709]],[\"name/284\",[195,53.678]],[\"parent/284\",[198,4.709]],[\"name/285\",[196,53.678]],[\"parent/285\",[198,4.709]],[\"name/286\",[199,58.787]],[\"parent/286\",[158,2.308]],[\"name/287\",[200,58.787]],[\"parent/287\",[158,2.308]],[\"name/288\",[201,50.314]],[\"parent/288\",[202,5.288]],[\"name/289\",[180,50.314]],[\"parent/289\",[202,5.288]],[\"name/290\",[203,58.787]],[\"parent/290\",[158,2.308]],[\"name/291\",[204,53.678]],[\"parent/291\",[205,4.709]],[\"name/292\",[206,53.678]],[\"parent/292\",[205,4.709]],[\"name/293\",[207,53.678]],[\"parent/293\",[205,4.709]],[\"name/294\",[208,58.787]],[\"parent/294\",[205,4.709]],[\"name/295\",[209,58.787]],[\"parent/295\",[158,2.308]],[\"name/296\",[210,58.787]],[\"parent/296\",[211,3.265]],[\"name/297\",[212,53.678]],[\"parent/297\",[211,3.265]],[\"name/298\",[213,53.678]],[\"parent/298\",[211,3.265]],[\"name/299\",[214,50.314]],[\"parent/299\",[211,3.265]],[\"name/300\",[215,50.314]],[\"parent/300\",[211,3.265]],[\"name/301\",[216,53.678]],[\"parent/301\",[211,3.265]],[\"name/302\",[217,53.678]],[\"parent/302\",[211,3.265]],[\"name/303\",[218,53.678]],[\"parent/303\",[211,3.265]],[\"name/304\",[219,58.787]],[\"parent/304\",[211,3.265]],[\"name/305\",[220,58.787]],[\"parent/305\",[211,3.265]],[\"name/306\",[204,53.678]],[\"parent/306\",[211,3.265]],[\"name/307\",[206,53.678]],[\"parent/307\",[211,3.265]],[\"name/308\",[207,53.678]],[\"parent/308\",[211,3.265]],[\"name/309\",[221,53.678]],[\"parent/309\",[211,3.265]],[\"name/310\",[222,53.678]],[\"parent/310\",[211,3.265]],[\"name/311\",[223,58.787]],[\"parent/311\",[211,3.265]],[\"name/312\",[224,58.787]],[\"parent/312\",[211,3.265]],[\"name/313\",[225,58.787]],[\"parent/313\",[211,3.265]],[\"name/314\",[226,53.678]],[\"parent/314\",[211,3.265]],[\"name/315\",[227,58.787]],[\"parent/315\",[158,2.308]],[\"name/316\",[228,53.678]],[\"parent/316\",[229,3.215]],[\"name/317\",[230,58.787]],[\"parent/317\",[229,3.215]],[\"name/318\",[231,58.787]],[\"parent/318\",[229,3.215]],[\"name/319\",[232,58.787]],[\"parent/319\",[229,3.215]],[\"name/320\",[213,53.678]],[\"parent/320\",[229,3.215]],[\"name/321\",[233,58.787]],[\"parent/321\",[229,3.215]],[\"name/322\",[212,53.678]],[\"parent/322\",[229,3.215]],[\"name/323\",[214,50.314]],[\"parent/323\",[229,3.215]],[\"name/324\",[234,58.787]],[\"parent/324\",[229,3.215]],[\"name/325\",[235,58.787]],[\"parent/325\",[229,3.215]],[\"name/326\",[217,53.678]],[\"parent/326\",[229,3.215]],[\"name/327\",[215,50.314]],[\"parent/327\",[229,3.215]],[\"name/328\",[216,53.678]],[\"parent/328\",[229,3.215]],[\"name/329\",[236,58.787]],[\"parent/329\",[229,3.215]],[\"name/330\",[237,58.787]],[\"parent/330\",[229,3.215]],[\"name/331\",[238,58.787]],[\"parent/331\",[229,3.215]],[\"name/332\",[239,58.787]],[\"parent/332\",[229,3.215]],[\"name/333\",[222,53.678]],[\"parent/333\",[229,3.215]],[\"name/334\",[176,53.678]],[\"parent/334\",[229,3.215]],[\"name/335\",[226,53.678]],[\"parent/335\",[229,3.215]],[\"name/336\",[240,58.787]],[\"parent/336\",[158,2.308]],[\"name/337\",[241,58.787]],[\"parent/337\",[242,5.288]],[\"name/338\",[215,50.314]],[\"parent/338\",[242,5.288]],[\"name/339\",[243,58.787]],[\"parent/339\",[158,2.308]],[\"name/340\",[244,58.787]],[\"parent/340\",[245,4.347]],[\"name/341\",[246,58.787]],[\"parent/341\",[245,4.347]],[\"name/342\",[247,58.787]],[\"parent/342\",[245,4.347]],[\"name/343\",[248,58.787]],[\"parent/343\",[245,4.347]],[\"name/344\",[249,58.787]],[\"parent/344\",[245,4.347]],[\"name/345\",[250,58.787]],[\"parent/345\",[245,4.347]],[\"name/346\",[218,53.678]],[\"parent/346\",[158,2.308]],[\"name/347\",[251,58.787]],[\"parent/347\",[252,3.785]],[\"name/348\",[253,58.787]],[\"parent/348\",[252,3.785]],[\"name/349\",[6,50.314]],[\"parent/349\",[252,3.785]],[\"name/350\",[12,50.314]],[\"parent/350\",[252,3.785]],[\"name/351\",[254,58.787]],[\"parent/351\",[252,3.785]],[\"name/352\",[255,58.787]],[\"parent/352\",[252,3.785]],[\"name/353\",[214,50.314]],[\"parent/353\",[252,3.785]],[\"name/354\",[256,58.787]],[\"parent/354\",[252,3.785]],[\"name/355\",[257,58.787]],[\"parent/355\",[252,3.785]],[\"name/356\",[258,58.787]],[\"parent/356\",[252,3.785]],[\"name/357\",[259,58.787]],[\"parent/357\",[252,3.785]],[\"name/358\",[260,58.787]],[\"parent/358\",[158,2.308]],[\"name/359\",[261,58.787]],[\"parent/359\",[262,4.347]],[\"name/360\",[263,58.787]],[\"parent/360\",[262,4.347]],[\"name/361\",[264,58.787]],[\"parent/361\",[262,4.347]],[\"name/362\",[228,53.678]],[\"parent/362\",[262,4.347]],[\"name/363\",[265,58.787]],[\"parent/363\",[262,4.347]],[\"name/364\",[266,58.787]],[\"parent/364\",[262,4.347]],[\"name/365\",[267,58.787]],[\"parent/365\",[158,2.308]],[\"name/366\",[268,58.787]],[\"parent/366\",[158,2.308]],[\"name/367\",[269,58.787]],[\"parent/367\",[158,2.308]],[\"name/368\",[270,58.787]],[\"parent/368\",[158,2.308]],[\"name/369\",[271,58.787]],[\"parent/369\",[158,2.308]],[\"name/370\",[272,44.123]],[\"parent/370\",[273,4.957]],[\"name/371\",[274,44.123]],[\"parent/371\",[273,4.957]],[\"name/372\",[167,45.794]],[\"parent/372\",[273,4.957]],[\"name/373\",[275,58.787]],[\"parent/373\",[158,2.308]],[\"name/374\",[272,44.123]],[\"parent/374\",[276,4.957]],[\"name/375\",[274,44.123]],[\"parent/375\",[276,4.957]],[\"name/376\",[167,45.794]],[\"parent/376\",[276,4.957]],[\"name/377\",[277,58.787]],[\"parent/377\",[158,2.308]],[\"name/378\",[272,44.123]],[\"parent/378\",[278,4.957]],[\"name/379\",[274,44.123]],[\"parent/379\",[278,4.957]],[\"name/380\",[167,45.794]],[\"parent/380\",[278,4.957]],[\"name/381\",[279,58.787]],[\"parent/381\",[158,2.308]],[\"name/382\",[272,44.123]],[\"parent/382\",[280,4.957]],[\"name/383\",[274,44.123]],[\"parent/383\",[280,4.957]],[\"name/384\",[281,53.678]],[\"parent/384\",[280,4.957]],[\"name/385\",[282,58.787]],[\"parent/385\",[158,2.308]],[\"name/386\",[272,44.123]],[\"parent/386\",[283,4.957]],[\"name/387\",[274,44.123]],[\"parent/387\",[283,4.957]],[\"name/388\",[281,53.678]],[\"parent/388\",[283,4.957]],[\"name/389\",[284,58.787]],[\"parent/389\",[158,2.308]],[\"name/390\",[272,44.123]],[\"parent/390\",[285,5.288]],[\"name/391\",[274,44.123]],[\"parent/391\",[285,5.288]],[\"name/392\",[286,58.787]],[\"parent/392\",[158,2.308]],[\"name/393\",[287,58.787]],[\"parent/393\",[158,2.308]],[\"name/394\",[288,58.787]],[\"parent/394\",[158,2.308]],[\"name/395\",[289,58.787]],[\"parent/395\",[158,2.308]],[\"name/396\",[290,58.787]],[\"parent/396\",[158,2.308]],[\"name/397\",[291,58.787]],[\"parent/397\",[158,2.308]],[\"name/398\",[292,58.787]],[\"parent/398\",[158,2.308]],[\"name/399\",[293,58.787]],[\"parent/399\",[158,2.308]],[\"name/400\",[294,58.787]],[\"parent/400\",[158,2.308]],[\"name/401\",[295,58.787]],[\"parent/401\",[158,2.308]],[\"name/402\",[296,58.787]],[\"parent/402\",[158,2.308]],[\"name/403\",[297,58.787]],[\"parent/403\",[158,2.308]],[\"name/404\",[298,58.787]],[\"parent/404\",[299,3.785]],[\"name/405\",[300,58.787]],[\"parent/405\",[299,3.785]],[\"name/406\",[301,58.787]],[\"parent/406\",[299,3.785]],[\"name/407\",[302,58.787]],[\"parent/407\",[299,3.785]],[\"name/408\",[303,58.787]],[\"parent/408\",[299,3.785]],[\"name/409\",[304,58.787]],[\"parent/409\",[299,3.785]],[\"name/410\",[305,58.787]],[\"parent/410\",[299,3.785]],[\"name/411\",[306,58.787]],[\"parent/411\",[299,3.785]],[\"name/412\",[307,58.787]],[\"parent/412\",[299,3.785]],[\"name/413\",[308,58.787]],[\"parent/413\",[299,3.785]],[\"name/414\",[309,58.787]],[\"parent/414\",[299,3.785]],[\"name/415\",[310,58.787]],[\"parent/415\",[158,2.308]],[\"name/416\",[8,31.706]],[\"parent/416\",[311,2.962]],[\"name/417\",[312,58.787]],[\"parent/417\",[311,2.962]],[\"name/418\",[165,50.314]],[\"parent/418\",[311,2.962]],[\"name/419\",[313,58.787]],[\"parent/419\",[311,2.962]],[\"name/420\",[314,58.787]],[\"parent/420\",[311,2.962]],[\"name/421\",[315,58.787]],[\"parent/421\",[311,2.962]],[\"name/422\",[316,58.787]],[\"parent/422\",[311,2.962]],[\"name/423\",[317,58.787]],[\"parent/423\",[311,2.962]],[\"name/424\",[8,31.706]],[\"parent/424\",[318,5.288]],[\"name/425\",[319,37.584]],[\"parent/425\",[318,5.288]],[\"name/426\",[319,37.584]],[\"parent/426\",[311,2.962]],[\"name/427\",[201,50.314]],[\"parent/427\",[320,4.957]],[\"name/428\",[8,31.706]],[\"parent/428\",[320,4.957]],[\"name/429\",[319,37.584]],[\"parent/429\",[320,4.957]],[\"name/430\",[321,58.787]],[\"parent/430\",[311,2.962]],[\"name/431\",[15,40.328]],[\"parent/431\",[322,4.957]],[\"name/432\",[323,58.787]],[\"parent/432\",[322,4.957]],[\"name/433\",[324,58.787]],[\"parent/433\",[322,4.957]],[\"name/434\",[325,53.678]],[\"parent/434\",[311,2.962]],[\"name/435\",[8,31.706]],[\"parent/435\",[326,4.511]],[\"name/436\",[15,40.328]],[\"parent/436\",[326,4.511]],[\"name/437\",[327,41.441]],[\"parent/437\",[326,4.511]],[\"name/438\",[328,42.692]],[\"parent/438\",[326,4.511]],[\"name/439\",[329,42.692]],[\"parent/439\",[326,4.511]],[\"name/440\",[327,41.441]],[\"parent/440\",[311,2.962]],[\"name/441\",[330,58.787]],[\"parent/441\",[331,4.957]],[\"name/442\",[8,31.706]],[\"parent/442\",[331,4.957]],[\"name/443\",[319,37.584]],[\"parent/443\",[331,4.957]],[\"name/444\",[332,58.787]],[\"parent/444\",[311,2.962]],[\"name/445\",[15,40.328]],[\"parent/445\",[333,4.511]],[\"name/446\",[8,31.706]],[\"parent/446\",[333,4.511]],[\"name/447\",[327,41.441]],[\"parent/447\",[333,4.511]],[\"name/448\",[328,42.692]],[\"parent/448\",[333,4.511]],[\"name/449\",[329,42.692]],[\"parent/449\",[333,4.511]],[\"name/450\",[6,50.314]],[\"parent/450\",[311,2.962]],[\"name/451\",[15,40.328]],[\"parent/451\",[334,4.511]],[\"name/452\",[8,31.706]],[\"parent/452\",[334,4.511]],[\"name/453\",[327,41.441]],[\"parent/453\",[334,4.511]],[\"name/454\",[328,42.692]],[\"parent/454\",[334,4.511]],[\"name/455\",[329,42.692]],[\"parent/455\",[334,4.511]],[\"name/456\",[335,58.787]],[\"parent/456\",[311,2.962]],[\"name/457\",[15,40.328]],[\"parent/457\",[336,4.511]],[\"name/458\",[8,31.706]],[\"parent/458\",[336,4.511]],[\"name/459\",[327,41.441]],[\"parent/459\",[336,4.511]],[\"name/460\",[328,42.692]],[\"parent/460\",[336,4.511]],[\"name/461\",[329,42.692]],[\"parent/461\",[336,4.511]],[\"name/462\",[337,58.787]],[\"parent/462\",[311,2.962]],[\"name/463\",[15,40.328]],[\"parent/463\",[338,4.511]],[\"name/464\",[8,31.706]],[\"parent/464\",[338,4.511]],[\"name/465\",[327,41.441]],[\"parent/465\",[338,4.511]],[\"name/466\",[328,42.692]],[\"parent/466\",[338,4.511]],[\"name/467\",[329,42.692]],[\"parent/467\",[338,4.511]],[\"name/468\",[12,50.314]],[\"parent/468\",[311,2.962]],[\"name/469\",[15,40.328]],[\"parent/469\",[339,4.511]],[\"name/470\",[8,31.706]],[\"parent/470\",[339,4.511]],[\"name/471\",[327,41.441]],[\"parent/471\",[339,4.511]],[\"name/472\",[328,42.692]],[\"parent/472\",[339,4.511]],[\"name/473\",[329,42.692]],[\"parent/473\",[339,4.511]],[\"name/474\",[340,53.678]],[\"parent/474\",[311,2.962]],[\"name/475\",[341,58.787]],[\"parent/475\",[342,4.709]],[\"name/476\",[343,58.787]],[\"parent/476\",[342,4.709]],[\"name/477\",[8,31.706]],[\"parent/477\",[342,4.709]],[\"name/478\",[319,37.584]],[\"parent/478\",[342,4.709]],[\"name/479\",[344,58.787]],[\"parent/479\",[311,2.962]],[\"name/480\",[345,50.314]],[\"parent/480\",[346,4.957]],[\"name/481\",[8,31.706]],[\"parent/481\",[346,4.957]],[\"name/482\",[319,37.584]],[\"parent/482\",[346,4.957]],[\"name/483\",[347,58.787]],[\"parent/483\",[311,2.962]],[\"name/484\",[348,53.678]],[\"parent/484\",[349,4.709]],[\"name/485\",[350,58.787]],[\"parent/485\",[349,4.709]],[\"name/486\",[8,31.706]],[\"parent/486\",[349,4.709]],[\"name/487\",[319,37.584]],[\"parent/487\",[349,4.709]],[\"name/488\",[348,53.678]],[\"parent/488\",[311,2.962]],[\"name/489\",[351,53.678]],[\"parent/489\",[352,4.206]],[\"name/490\",[353,58.787]],[\"parent/490\",[352,4.206]],[\"name/491\",[165,50.314]],[\"parent/491\",[352,4.206]],[\"name/492\",[354,53.678]],[\"parent/492\",[352,4.206]],[\"name/493\",[355,58.787]],[\"parent/493\",[352,4.206]],[\"name/494\",[8,31.706]],[\"parent/494\",[352,4.206]],[\"name/495\",[319,37.584]],[\"parent/495\",[352,4.206]],[\"name/496\",[356,50.314]],[\"parent/496\",[311,2.962]],[\"name/497\",[357,58.787]],[\"parent/497\",[358,4.083]],[\"name/498\",[359,53.678]],[\"parent/498\",[358,4.083]],[\"name/499\",[351,53.678]],[\"parent/499\",[358,4.083]],[\"name/500\",[167,45.794]],[\"parent/500\",[358,4.083]],[\"name/501\",[340,53.678]],[\"parent/501\",[358,4.083]],[\"name/502\",[360,58.787]],[\"parent/502\",[358,4.083]],[\"name/503\",[8,31.706]],[\"parent/503\",[358,4.083]],[\"name/504\",[319,37.584]],[\"parent/504\",[358,4.083]],[\"name/505\",[361,53.678]],[\"parent/505\",[311,2.962]],[\"name/506\",[361,53.678]],[\"parent/506\",[362,4.511]],[\"name/507\",[356,50.314]],[\"parent/507\",[362,4.511]],[\"name/508\",[354,53.678]],[\"parent/508\",[362,4.511]],[\"name/509\",[8,31.706]],[\"parent/509\",[362,4.511]],[\"name/510\",[319,37.584]],[\"parent/510\",[362,4.511]],[\"name/511\",[363,58.787]],[\"parent/511\",[311,2.962]],[\"name/512\",[364,58.787]],[\"parent/512\",[365,4.511]],[\"name/513\",[201,50.314]],[\"parent/513\",[365,4.511]],[\"name/514\",[345,50.314]],[\"parent/514\",[365,4.511]],[\"name/515\",[8,31.706]],[\"parent/515\",[365,4.511]],[\"name/516\",[319,37.584]],[\"parent/516\",[365,4.511]],[\"name/517\",[366,58.787]],[\"parent/517\",[311,2.962]],[\"name/518\",[367,58.787]],[\"parent/518\",[368,4.511]],[\"name/519\",[325,53.678]],[\"parent/519\",[368,4.511]],[\"name/520\",[345,50.314]],[\"parent/520\",[368,4.511]],[\"name/521\",[8,31.706]],[\"parent/521\",[368,4.511]],[\"name/522\",[319,37.584]],[\"parent/522\",[368,4.511]],[\"name/523\",[369,58.787]],[\"parent/523\",[311,2.962]],[\"name/524\",[356,50.314]],[\"parent/524\",[370,3.874]],[\"name/525\",[359,53.678]],[\"parent/525\",[370,3.874]],[\"name/526\",[371,58.787]],[\"parent/526\",[370,3.874]],[\"name/527\",[372,58.787]],[\"parent/527\",[370,3.874]],[\"name/528\",[373,58.787]],[\"parent/528\",[370,3.874]],[\"name/529\",[8,31.706]],[\"parent/529\",[370,3.874]],[\"name/530\",[15,40.328]],[\"parent/530\",[370,3.874]],[\"name/531\",[327,41.441]],[\"parent/531\",[370,3.874]],[\"name/532\",[328,42.692]],[\"parent/532\",[370,3.874]],[\"name/533\",[329,42.692]],[\"parent/533\",[370,3.874]],[\"name/534\",[221,53.678]],[\"parent/534\",[65,3.627]]],\"invertedIndex\":[[\"0.4.0\",{\"_index\":117,\"name\":{\"175\":{}},\"parent\":{}}],[\"0.5.0\",{\"_index\":119,\"name\":{\"176\":{}},\"parent\":{}}],[\"1.0.0\",{\"_index\":120,\"name\":{\"177\":{}},\"parent\":{}}],[\"1.0.1\",{\"_index\":121,\"name\":{\"178\":{}},\"parent\":{}}],[\"1.0.2\",{\"_index\":122,\"name\":{\"179\":{}},\"parent\":{}}],[\"1.1.0\",{\"_index\":123,\"name\":{\"180\":{}},\"parent\":{}}],[\"1.4.0\",{\"_index\":124,\"name\":{\"181\":{}},\"parent\":{}}],[\"1.6.0\",{\"_index\":125,\"name\":{\"182\":{}},\"parent\":{}}],[\"1.8.0\",{\"_index\":126,\"name\":{\"183\":{}},\"parent\":{}}],[\"3.0.0\",{\"_index\":127,\"name\":{\"184\":{}},\"parent\":{}}],[\"3.0.1\",{\"_index\":128,\"name\":{\"185\":{}},\"parent\":{}}],[\"3.3.0\",{\"_index\":129,\"name\":{\"186\":{}},\"parent\":{}}],[\"3.5.0\",{\"_index\":130,\"name\":{\"187\":{}},\"parent\":{}}],[\"4.0.0\",{\"_index\":131,\"name\":{\"188\":{}},\"parent\":{}}],[\"4.0.1\",{\"_index\":132,\"name\":{\"189\":{}},\"parent\":{}}],[\"__type\",{\"_index\":7,\"name\":{\"6\":{},\"11\":{},\"15\":{},\"39\":{},\"49\":{},\"116\":{},\"118\":{},\"121\":{},\"124\":{},\"126\":{},\"128\":{},\"155\":{},\"174\":{},\"217\":{},\"250\":{},\"264\":{},\"268\":{}},\"parent\":{}}],[\"_clearstate\",{\"_index\":24,\"name\":{\"28\":{}},\"parent\":{}}],[\"_refreshtask\",{\"_index\":16,\"name\":{\"20\":{}},\"parent\":{}}],[\"_request\",{\"_index\":68,\"name\":{\"78\":{}},\"parent\":{}}],[\"_responsetoolkit\",{\"_index\":67,\"name\":{\"77\":{}},\"parent\":{}}],[\"_storage\",{\"_index\":52,\"name\":{\"61\":{},\"79\":{},\"95\":{}},\"parent\":{}}],[\"_url\",{\"_index\":51,\"name\":{\"60\":{}},\"parent\":{}}],[\"absolute\",{\"_index\":95,\"name\":{\"143\":{}},\"parent\":{}}],[\"access_token\",{\"_index\":257,\"name\":{\"355\":{}},\"parent\":{}}],[\"adapter\",{\"_index\":169,\"name\":{\"238\":{}},\"parent\":{}}],[\"adapters/browseradapter\",{\"_index\":49,\"name\":{\"57\":{}},\"parent\":{\"58\":{}}}],[\"adapters/browseradapter.default\",{\"_index\":50,\"name\":{},\"parent\":{\"59\":{},\"60\":{},\"61\":{},\"62\":{},\"63\":{},\"64\":{},\"65\":{},\"66\":{},\"67\":{},\"68\":{},\"69\":{},\"70\":{},\"71\":{},\"72\":{}}}],[\"adapters/hapiadapter\",{\"_index\":64,\"name\":{\"73\":{}},\"parent\":{\"74\":{}}}],[\"adapters/hapiadapter.default\",{\"_index\":66,\"name\":{},\"parent\":{\"75\":{},\"76\":{},\"77\":{},\"78\":{},\"79\":{},\"80\":{},\"81\":{},\"82\":{},\"83\":{},\"84\":{},\"85\":{},\"86\":{},\"87\":{},\"88\":{},\"89\":{},\"90\":{},\"91\":{}}}],[\"adapters/nodeadapter\",{\"_index\":70,\"name\":{\"92\":{}},\"parent\":{\"93\":{}}}],[\"adapters/nodeadapter.default\",{\"_index\":71,\"name\":{},\"parent\":{\"94\":{},\"95\":{},\"96\":{},\"97\":{},\"98\":{},\"99\":{},\"100\":{},\"101\":{},\"102\":{},\"103\":{},\"104\":{},\"105\":{},\"106\":{},\"107\":{}}}],[\"alg\",{\"_index\":191,\"name\":{\"276\":{},\"282\":{}},\"parent\":{}}],[\"any\",{\"_index\":36,\"name\":{\"42\":{},\"158\":{}},\"parent\":{}}],[\"assert\",{\"_index\":102,\"name\":{\"152\":{}},\"parent\":{}}],[\"assertjsonpatch\",{\"_index\":103,\"name\":{\"153\":{}},\"parent\":{}}],[\"assigner\",{\"_index\":360,\"name\":{\"502\":{}},\"parent\":{}}],[\"aud\",{\"_index\":263,\"name\":{\"360\":{}},\"parent\":{}}],[\"authorization_endpoint\",{\"_index\":298,\"name\":{\"404\":{}},\"parent\":{}}],[\"authorize\",{\"_index\":83,\"name\":{\"125\":{},\"195\":{},\"230\":{}},\"parent\":{}}],[\"authorizeparams\",{\"_index\":227,\"name\":{\"315\":{}},\"parent\":{}}],[\"authorizeuri\",{\"_index\":206,\"name\":{\"292\":{},\"307\":{}},\"parent\":{}}],[\"backboneelement\",{\"_index\":344,\"name\":{\"479\":{}},\"parent\":{}}],[\"base64/browser\",{\"_index\":72,\"name\":{\"108\":{}},\"parent\":{\"109\":{},\"110\":{},\"111\":{}}}],[\"base64decode\",{\"_index\":60,\"name\":{\"69\":{},\"88\":{},\"104\":{},\"244\":{}},\"parent\":{}}],[\"base64encode\",{\"_index\":59,\"name\":{\"68\":{},\"87\":{},\"103\":{},\"245\":{}},\"parent\":{}}],[\"base64urldecode\",{\"_index\":62,\"name\":{\"71\":{},\"90\":{},\"106\":{},\"110\":{},\"247\":{}},\"parent\":{}}],[\"base64urlencode\",{\"_index\":61,\"name\":{\"70\":{},\"89\":{},\"105\":{},\"109\":{},\"246\":{}},\"parent\":{}}],[\"body\",{\"_index\":187,\"name\":{\"272\":{}},\"parent\":{}}],[\"browserfhirsettings\",{\"_index\":163,\"name\":{\"233\":{}},\"parent\":{}}],[\"buildtokenrequest\",{\"_index\":140,\"name\":{\"200\":{}},\"parent\":{}}],[\"bundle\",{\"_index\":369,\"name\":{\"523\":{}},\"parent\":{}}],[\"bundleentry\",{\"_index\":366,\"name\":{\"517\":{}},\"parent\":{}}],[\"bundlelink\",{\"_index\":363,\"name\":{\"511\":{}},\"parent\":{}}],[\"bycode\",{\"_index\":31,\"name\":{\"36\":{},\"148\":{}},\"parent\":{}}],[\"bycodes\",{\"_index\":32,\"name\":{\"37\":{},\"149\":{}},\"parent\":{}}],[\"capabilities\",{\"_index\":309,\"name\":{\"414\":{}},\"parent\":{}}],[\"capabilitystatement\",{\"_index\":321,\"name\":{\"430\":{}},\"parent\":{}}],[\"checkresponse\",{\"_index\":88,\"name\":{\"134\":{}},\"parent\":{}}],[\"client\",{\"_index\":0,\"name\":{\"0\":{},\"117\":{},\"232\":{}},\"parent\":{\"1\":{}}}],[\"client.default\",{\"_index\":3,\"name\":{},\"parent\":{\"2\":{},\"3\":{},\"4\":{},\"5\":{},\"6\":{},\"10\":{},\"11\":{},\"14\":{},\"15\":{},\"20\":{},\"21\":{},\"22\":{},\"23\":{},\"24\":{},\"25\":{},\"26\":{},\"27\":{},\"28\":{},\"29\":{},\"30\":{},\"31\":{},\"32\":{},\"33\":{},\"34\":{},\"35\":{},\"36\":{},\"37\":{},\"38\":{},\"39\":{},\"43\":{},\"44\":{},\"45\":{},\"46\":{}}}],[\"client.default.__type\",{\"_index\":9,\"name\":{},\"parent\":{\"7\":{},\"8\":{},\"9\":{},\"12\":{},\"13\":{},\"16\":{},\"17\":{},\"18\":{},\"19\":{},\"40\":{},\"41\":{},\"42\":{}}}],[\"client_id\",{\"_index\":254,\"name\":{\"351\":{}},\"parent\":{}}],[\"clientid\",{\"_index\":212,\"name\":{\"297\":{},\"322\":{}},\"parent\":{}}],[\"clientprivatejwk\",{\"_index\":216,\"name\":{\"301\":{},\"328\":{}},\"parent\":{}}],[\"clientpublickeyseturl\",{\"_index\":215,\"name\":{\"300\":{},\"327\":{},\"338\":{}},\"parent\":{}}],[\"clientsecret\",{\"_index\":217,\"name\":{\"302\":{},\"326\":{}},\"parent\":{}}],[\"clientstate\",{\"_index\":209,\"name\":{\"295\":{}},\"parent\":{}}],[\"clienttype\",{\"_index\":291,\"name\":{\"397\":{}},\"parent\":{}}],[\"cm\",{\"_index\":34,\"name\":{\"40\":{},\"156\":{}},\"parent\":{}}],[\"code\",{\"_index\":165,\"name\":{\"235\":{},\"418\":{},\"491\":{}},\"parent\":{}}],[\"code_challenge_methods_supported\",{\"_index\":305,\"name\":{\"410\":{}},\"parent\":{}}],[\"codeableconcept\",{\"_index\":347,\"name\":{\"483\":{}},\"parent\":{}}],[\"codechallenge\",{\"_index\":224,\"name\":{\"312\":{}},\"parent\":{}}],[\"codechallengemethod\",{\"_index\":288,\"name\":{\"394\":{}},\"parent\":{}}],[\"codechallengemethods\",{\"_index\":208,\"name\":{\"294\":{}},\"parent\":{}}],[\"codevalue\",{\"_index\":164,\"name\":{\"234\":{}},\"parent\":{}}],[\"codeverifier\",{\"_index\":225,\"name\":{\"313\":{}},\"parent\":{}}],[\"coding\",{\"_index\":348,\"name\":{\"484\":{},\"488\":{}},\"parent\":{}}],[\"combinedfetchresult\",{\"_index\":186,\"name\":{\"271\":{}},\"parent\":{}}],[\"completeintarget\",{\"_index\":222,\"name\":{\"310\":{},\"333\":{}},\"parent\":{}}],[\"constructor\",{\"_index\":2,\"name\":{\"2\":{},\"50\":{},\"59\":{},\"76\":{},\"94\":{},\"204\":{},\"210\":{}},\"parent\":{}}],[\"create\",{\"_index\":25,\"name\":{\"29\":{}},\"parent\":{}}],[\"crv\",{\"_index\":194,\"name\":{\"278\":{}},\"parent\":{}}],[\"datetime\",{\"_index\":314,\"name\":{\"420\":{}},\"parent\":{}}],[\"debug\",{\"_index\":74,\"name\":{\"112\":{},\"113\":{}},\"parent\":{\"113\":{}}}],[\"default\",{\"_index\":1,\"name\":{\"1\":{},\"48\":{},\"58\":{},\"74\":{},\"93\":{},\"115\":{},\"130\":{},\"132\":{},\"203\":{},\"209\":{},\"216\":{}},\"parent\":{}}],[\"delete\",{\"_index\":27,\"name\":{\"31\":{}},\"parent\":{}}],[\"digestsha256\",{\"_index\":108,\"name\":{\"161\":{},\"167\":{},\"252\":{}},\"parent\":{}}],[\"display\",{\"_index\":354,\"name\":{\"492\":{},\"508\":{}},\"parent\":{}}],[\"element\",{\"_index\":317,\"name\":{\"423\":{}},\"parent\":{}}],[\"encounter\",{\"_index\":12,\"name\":{\"10\":{},\"350\":{},\"468\":{}},\"parent\":{}}],[\"encounterid\",{\"_index\":235,\"name\":{\"325\":{}},\"parent\":{}}],[\"end\",{\"_index\":343,\"name\":{\"476\":{}},\"parent\":{}}],[\"entry\",{\"_index\":373,\"name\":{\"528\":{}},\"parent\":{}}],[\"entry/browser\",{\"_index\":75,\"name\":{\"114\":{}},\"parent\":{\"115\":{}}}],[\"entry/browser.default\",{\"_index\":76,\"name\":{},\"parent\":{\"116\":{}}}],[\"entry/browser.default.__type\",{\"_index\":77,\"name\":{},\"parent\":{\"117\":{},\"118\":{},\"119\":{},\"120\":{},\"121\":{}}}],[\"entry/browser.default.__type.__type\",{\"_index\":81,\"name\":{},\"parent\":{\"122\":{},\"123\":{},\"124\":{},\"125\":{},\"126\":{},\"127\":{},\"128\":{}}}],[\"entry/hapi\",{\"_index\":85,\"name\":{\"129\":{}},\"parent\":{\"130\":{}}}],[\"entry/node\",{\"_index\":86,\"name\":{\"131\":{}},\"parent\":{\"132\":{}}}],[\"environment\",{\"_index\":5,\"name\":{\"4\":{}},\"parent\":{}}],[\"es384jwk\",{\"_index\":190,\"name\":{\"275\":{}},\"parent\":{}}],[\"exp\",{\"_index\":266,\"name\":{\"364\":{}},\"parent\":{}}],[\"expired\",{\"_index\":150,\"name\":{\"218\":{}},\"parent\":{}}],[\"expires_in\",{\"_index\":256,\"name\":{\"354\":{}},\"parent\":{}}],[\"expiresat\",{\"_index\":223,\"name\":{\"311\":{}},\"parent\":{}}],[\"extension\",{\"_index\":319,\"name\":{\"425\":{},\"426\":{},\"429\":{},\"443\":{},\"478\":{},\"482\":{},\"487\":{},\"495\":{},\"504\":{},\"510\":{},\"516\":{},\"522\":{}},\"parent\":{}}],[\"faketokenresponse\",{\"_index\":236,\"name\":{\"329\":{}},\"parent\":{}}],[\"fetchconformancestatement\",{\"_index\":92,\"name\":{\"139\":{}},\"parent\":{}}],[\"fetchoptions\",{\"_index\":184,\"name\":{\"269\":{}},\"parent\":{}}],[\"fetchresult\",{\"_index\":189,\"name\":{\"274\":{}},\"parent\":{}}],[\"fetchwellknownjson\",{\"_index\":135,\"name\":{\"193\":{}},\"parent\":{}}],[\"fhir\",{\"_index\":310,\"name\":{\"415\":{}},\"parent\":{}}],[\"fhirclient\",{\"_index\":156,\"name\":{\"223\":{}},\"parent\":{}}],[\"fhiroptions\",{\"_index\":243,\"name\":{\"339\":{}},\"parent\":{}}],[\"fhirserviceurl\",{\"_index\":232,\"name\":{\"319\":{}},\"parent\":{}}],[\"fhiruser\",{\"_index\":14,\"name\":{\"18\":{}},\"parent\":{}}],[\"fhirversion\",{\"_index\":323,\"name\":{\"432\":{}},\"parent\":{}}],[\"fhirversions\",{\"_index\":115,\"name\":{\"173\":{}},\"parent\":{}}],[\"flat\",{\"_index\":247,\"name\":{\"342\":{}},\"parent\":{}}],[\"from\",{\"_index\":281,\"name\":{\"384\":{},\"388\":{}},\"parent\":{}}],[\"fullurl\",{\"_index\":367,\"name\":{\"518\":{}},\"parent\":{}}],[\"generatepkcechallenge\",{\"_index\":112,\"name\":{\"165\":{},\"168\":{},\"253\":{}},\"parent\":{}}],[\"get\",{\"_index\":143,\"name\":{\"205\":{},\"212\":{},\"258\":{}},\"parent\":{}}],[\"getaccesstokenexpiration\",{\"_index\":99,\"name\":{\"147\":{}},\"parent\":{}}],[\"getandcache\",{\"_index\":91,\"name\":{\"138\":{}},\"parent\":{}}],[\"getauthorizationheader\",{\"_index\":23,\"name\":{\"27\":{}},\"parent\":{}}],[\"getencounterid\",{\"_index\":18,\"name\":{\"22\":{}},\"parent\":{}}],[\"getfhirrelease\",{\"_index\":40,\"name\":{\"46\":{}},\"parent\":{}}],[\"getfhiruser\",{\"_index\":20,\"name\":{\"24\":{}},\"parent\":{}}],[\"getfhirversion\",{\"_index\":39,\"name\":{\"45\":{}},\"parent\":{}}],[\"getidtoken\",{\"_index\":19,\"name\":{\"23\":{}},\"parent\":{}}],[\"getpath\",{\"_index\":37,\"name\":{\"43\":{},\"140\":{}},\"parent\":{}}],[\"getpatientid\",{\"_index\":17,\"name\":{\"21\":{}},\"parent\":{}}],[\"getpatientparam\",{\"_index\":100,\"name\":{\"150\":{}},\"parent\":{}}],[\"getprotocol\",{\"_index\":69,\"name\":{\"85\":{},\"99\":{}},\"parent\":{}}],[\"getsecurityextensions\",{\"_index\":136,\"name\":{\"194\":{}},\"parent\":{}}],[\"getsmartapi\",{\"_index\":63,\"name\":{\"72\":{},\"91\":{},\"107\":{},\"248\":{}},\"parent\":{}}],[\"getstate\",{\"_index\":38,\"name\":{\"44\":{}},\"parent\":{}}],[\"getstorage\",{\"_index\":58,\"name\":{\"67\":{},\"80\":{},\"102\":{},\"242\":{}},\"parent\":{}}],[\"gettargetwindow\",{\"_index\":101,\"name\":{\"151\":{}},\"parent\":{}}],[\"gettimeinfuture\",{\"_index\":98,\"name\":{\"146\":{}},\"parent\":{}}],[\"geturl\",{\"_index\":56,\"name\":{\"65\":{},\"86\":{},\"100\":{},\"240\":{}},\"parent\":{}}],[\"getuserid\",{\"_index\":21,\"name\":{\"25\":{}},\"parent\":{}}],[\"getusertype\",{\"_index\":22,\"name\":{\"26\":{}},\"parent\":{}}],[\"graph\",{\"_index\":248,\"name\":{\"343\":{}},\"parent\":{}}],[\"height\",{\"_index\":239,\"name\":{\"332\":{}},\"parent\":{}}],[\"httperror\",{\"_index\":41,\"name\":{\"47\":{}},\"parent\":{\"48\":{}}}],[\"httperror.default\",{\"_index\":42,\"name\":{},\"parent\":{\"49\":{},\"50\":{},\"51\":{},\"52\":{},\"53\":{},\"54\":{},\"55\":{},\"56\":{}}}],[\"iat\",{\"_index\":265,\"name\":{\"363\":{}},\"parent\":{}}],[\"id\",{\"_index\":8,\"name\":{\"7\":{},\"12\":{},\"16\":{},\"416\":{},\"424\":{},\"428\":{},\"435\":{},\"442\":{},\"446\":{},\"452\":{},\"458\":{},\"464\":{},\"470\":{},\"477\":{},\"481\":{},\"486\":{},\"494\":{},\"503\":{},\"509\":{},\"515\":{},\"521\":{},\"529\":{}},\"parent\":{}}],[\"id_token\",{\"_index\":258,\"name\":{\"356\":{}},\"parent\":{}}],[\"identifier\",{\"_index\":356,\"name\":{\"496\":{},\"507\":{},\"524\":{}},\"parent\":{}}],[\"idtoken\",{\"_index\":260,\"name\":{\"358\":{}},\"parent\":{}}],[\"implicitrules\",{\"_index\":328,\"name\":{\"438\":{},\"448\":{},\"454\":{},\"460\":{},\"466\":{},\"472\":{},\"532\":{}},\"parent\":{}}],[\"importjwk\",{\"_index\":109,\"name\":{\"162\":{},\"169\":{},\"254\":{}},\"parent\":{}}],[\"includeresponse\",{\"_index\":180,\"name\":{\"266\":{},\"270\":{},\"289\":{}},\"parent\":{}}],[\"includeresponsehint\",{\"_index\":179,\"name\":{\"265\":{}},\"parent\":{}}],[\"init\",{\"_index\":84,\"name\":{\"127\":{},\"201\":{},\"231\":{}},\"parent\":{}}],[\"instant\",{\"_index\":313,\"name\":{\"419\":{}},\"parent\":{}}],[\"introspection_endpoint\",{\"_index\":303,\"name\":{\"408\":{}},\"parent\":{}}],[\"isinframe\",{\"_index\":137,\"name\":{\"196\":{}},\"parent\":{}}],[\"isinpopup\",{\"_index\":138,\"name\":{\"197\":{}},\"parent\":{}}],[\"iss\",{\"_index\":228,\"name\":{\"316\":{},\"362\":{}},\"parent\":{}}],[\"issmatch\",{\"_index\":230,\"name\":{\"317\":{}},\"parent\":{}}],[\"jsonarray\",{\"_index\":270,\"name\":{\"368\":{}},\"parent\":{}}],[\"jsonobject\",{\"_index\":267,\"name\":{\"365\":{}},\"parent\":{}}],[\"jsonpatch\",{\"_index\":287,\"name\":{\"393\":{}},\"parent\":{}}],[\"jsonpatchadd\",{\"_index\":271,\"name\":{\"369\":{}},\"parent\":{}}],[\"jsonpatchcopy\",{\"_index\":282,\"name\":{\"385\":{}},\"parent\":{}}],[\"jsonpatchmove\",{\"_index\":279,\"name\":{\"381\":{}},\"parent\":{}}],[\"jsonpatchoperation\",{\"_index\":286,\"name\":{\"392\":{}},\"parent\":{}}],[\"jsonpatchremove\",{\"_index\":284,\"name\":{\"389\":{}},\"parent\":{}}],[\"jsonpatchreplace\",{\"_index\":275,\"name\":{\"373\":{}},\"parent\":{}}],[\"jsonpatchtest\",{\"_index\":277,\"name\":{\"377\":{}},\"parent\":{}}],[\"jsonprimitive\",{\"_index\":268,\"name\":{\"366\":{}},\"parent\":{}}],[\"jsonvalue\",{\"_index\":269,\"name\":{\"367\":{}},\"parent\":{}}],[\"jwk\",{\"_index\":199,\"name\":{\"286\":{}},\"parent\":{}}],[\"jwtdecode\",{\"_index\":97,\"name\":{\"145\":{}},\"parent\":{}}],[\"key\",{\"_index\":221,\"name\":{\"309\":{},\"534\":{}},\"parent\":{}}],[\"key_ops\",{\"_index\":196,\"name\":{\"280\":{},\"285\":{}},\"parent\":{}}],[\"kg\",{\"_index\":35,\"name\":{\"41\":{},\"157\":{}},\"parent\":{}}],[\"kid\",{\"_index\":195,\"name\":{\"279\":{},\"284\":{}},\"parent\":{}}],[\"kty\",{\"_index\":193,\"name\":{\"277\":{},\"283\":{}},\"parent\":{}}],[\"language\",{\"_index\":329,\"name\":{\"439\":{},\"449\":{},\"455\":{},\"461\":{},\"467\":{},\"473\":{},\"533\":{}},\"parent\":{}}],[\"lastupdated\",{\"_index\":330,\"name\":{\"441\":{}},\"parent\":{}}],[\"launch\",{\"_index\":231,\"name\":{\"318\":{}},\"parent\":{}}],[\"launchcontext\",{\"_index\":293,\"name\":{\"399\":{}},\"parent\":{}}],[\"launchcontextehr\",{\"_index\":294,\"name\":{\"400\":{}},\"parent\":{}}],[\"launchcontextstandalone\",{\"_index\":295,\"name\":{\"401\":{}},\"parent\":{}}],[\"launchmode\",{\"_index\":290,\"name\":{\"396\":{}},\"parent\":{}}],[\"lib\",{\"_index\":87,\"name\":{\"133\":{}},\"parent\":{\"134\":{},\"135\":{},\"136\":{},\"137\":{},\"138\":{},\"139\":{},\"140\":{},\"141\":{},\"142\":{},\"143\":{},\"144\":{},\"145\":{},\"146\":{},\"147\":{},\"148\":{},\"149\":{},\"150\":{},\"151\":{},\"152\":{},\"153\":{},\"154\":{}}}],[\"lib.units\",{\"_index\":104,\"name\":{},\"parent\":{\"155\":{}}}],[\"lib.units.__type\",{\"_index\":105,\"name\":{},\"parent\":{\"156\":{},\"157\":{},\"158\":{}}}],[\"link\",{\"_index\":372,\"name\":{\"527\":{}},\"parent\":{}}],[\"lowecasekeys\",{\"_index\":90,\"name\":{\"136\":{}},\"parent\":{}}],[\"makearray\",{\"_index\":94,\"name\":{\"142\":{}},\"parent\":{}}],[\"management_endpoint\",{\"_index\":302,\"name\":{\"407\":{}},\"parent\":{}}],[\"meta\",{\"_index\":327,\"name\":{\"437\":{},\"440\":{},\"447\":{},\"453\":{},\"459\":{},\"465\":{},\"471\":{},\"531\":{}},\"parent\":{}}],[\"modifierextension\",{\"_index\":345,\"name\":{\"480\":{},\"514\":{},\"520\":{}},\"parent\":{}}],[\"need_patient_banner\",{\"_index\":251,\"name\":{\"347\":{}},\"parent\":{}}],[\"nofreecontext\",{\"_index\":154,\"name\":{\"221\":{}},\"parent\":{}}],[\"noifnoauth\",{\"_index\":153,\"name\":{\"220\":{}},\"parent\":{}}],[\"noredirect\",{\"_index\":233,\"name\":{\"321\":{}},\"parent\":{}}],[\"noscopeforid\",{\"_index\":152,\"name\":{\"219\":{}},\"parent\":{}}],[\"oauth2\",{\"_index\":79,\"name\":{\"120\":{}},\"parent\":{}}],[\"oauthsecurityextensions\",{\"_index\":203,\"name\":{\"290\":{}},\"parent\":{}}],[\"observation\",{\"_index\":332,\"name\":{\"444\":{}},\"parent\":{}}],[\"observationmap\",{\"_index\":168,\"name\":{\"237\":{}},\"parent\":{}}],[\"onmessage\",{\"_index\":139,\"name\":{\"198\":{}},\"parent\":{}}],[\"onpage\",{\"_index\":246,\"name\":{\"341\":{}},\"parent\":{}}],[\"op\",{\"_index\":272,\"name\":{\"370\":{},\"374\":{},\"378\":{},\"382\":{},\"386\":{},\"390\":{}},\"parent\":{}}],[\"options\",{\"_index\":53,\"name\":{\"62\":{},\"82\":{},\"96\":{},\"228\":{},\"239\":{}},\"parent\":{}}],[\"pagelimit\",{\"_index\":244,\"name\":{\"340\":{}},\"parent\":{}}],[\"parse\",{\"_index\":47,\"name\":{\"55\":{}},\"parent\":{}}],[\"password\",{\"_index\":220,\"name\":{\"305\":{}},\"parent\":{}}],[\"patch\",{\"_index\":28,\"name\":{\"32\":{}},\"parent\":{}}],[\"path\",{\"_index\":274,\"name\":{\"371\":{},\"375\":{},\"379\":{},\"383\":{},\"387\":{},\"391\":{}},\"parent\":{}}],[\"patient\",{\"_index\":6,\"name\":{\"5\":{},\"349\":{},\"450\":{}},\"parent\":{}}],[\"patientcompartment\",{\"_index\":114,\"name\":{\"172\":{}},\"parent\":{}}],[\"patientid\",{\"_index\":234,\"name\":{\"324\":{}},\"parent\":{}}],[\"patientparams\",{\"_index\":133,\"name\":{\"190\":{}},\"parent\":{}}],[\"period\",{\"_index\":340,\"name\":{\"474\":{},\"501\":{}},\"parent\":{}}],[\"permissions\",{\"_index\":296,\"name\":{\"402\":{}},\"parent\":{}}],[\"pkcemode\",{\"_index\":176,\"name\":{\"262\":{},\"334\":{}},\"parent\":{}}],[\"practitioner\",{\"_index\":335,\"name\":{\"456\":{}},\"parent\":{}}],[\"privatekey\",{\"_index\":241,\"name\":{\"337\":{}},\"parent\":{}}],[\"profile\",{\"_index\":261,\"name\":{\"359\":{}},\"parent\":{}}],[\"randombytes\",{\"_index\":107,\"name\":{\"160\":{},\"251\":{}},\"parent\":{}}],[\"randomstring\",{\"_index\":96,\"name\":{\"144\":{}},\"parent\":{}}],[\"read\",{\"_index\":10,\"name\":{\"8\":{},\"13\":{},\"17\":{}},\"parent\":{}}],[\"ready\",{\"_index\":82,\"name\":{\"123\":{},\"199\":{},\"229\":{}},\"parent\":{}}],[\"readyoptions\",{\"_index\":240,\"name\":{\"336\":{}},\"parent\":{}}],[\"redirect\",{\"_index\":57,\"name\":{\"66\":{},\"81\":{},\"101\":{},\"241\":{}},\"parent\":{}}],[\"redirecturi\",{\"_index\":213,\"name\":{\"298\":{},\"320\":{}},\"parent\":{}}],[\"reference\",{\"_index\":361,\"name\":{\"505\":{},\"506\":{}},\"parent\":{}}],[\"refresh\",{\"_index\":30,\"name\":{\"35\":{}},\"parent\":{}}],[\"refresh_token\",{\"_index\":259,\"name\":{\"357\":{}},\"parent\":{}}],[\"refreshifneeded\",{\"_index\":29,\"name\":{\"34\":{}},\"parent\":{}}],[\"refreshtokenwithcredentials\",{\"_index\":226,\"name\":{\"314\":{},\"335\":{}},\"parent\":{}}],[\"registration_endpoint\",{\"_index\":301,\"name\":{\"406\":{}},\"parent\":{}}],[\"registrationuri\",{\"_index\":204,\"name\":{\"291\":{},\"306\":{}},\"parent\":{}}],[\"relatedperson\",{\"_index\":337,\"name\":{\"462\":{}},\"parent\":{}}],[\"relation\",{\"_index\":364,\"name\":{\"512\":{}},\"parent\":{}}],[\"relative\",{\"_index\":55,\"name\":{\"64\":{},\"84\":{},\"98\":{},\"243\":{}},\"parent\":{}}],[\"request\",{\"_index\":11,\"name\":{\"9\":{},\"33\":{},\"137\":{},\"211\":{}},\"parent\":{}}],[\"requestfunction\",{\"_index\":182,\"name\":{\"267\":{}},\"parent\":{}}],[\"requestoptions\",{\"_index\":200,\"name\":{\"287\":{}},\"parent\":{}}],[\"requestwithsession\",{\"_index\":159,\"name\":{\"225\":{}},\"parent\":{}}],[\"resolvereferences\",{\"_index\":249,\"name\":{\"344\":{}},\"parent\":{}}],[\"resource\",{\"_index\":325,\"name\":{\"434\":{},\"519\":{}},\"parent\":{}}],[\"resourcetype\",{\"_index\":15,\"name\":{\"19\":{},\"431\":{},\"436\":{},\"445\":{},\"451\":{},\"457\":{},\"463\":{},\"469\":{},\"530\":{}},\"parent\":{}}],[\"response\",{\"_index\":46,\"name\":{\"54\":{},\"273\":{}},\"parent\":{}}],[\"response_types_supported\",{\"_index\":308,\"name\":{\"413\":{}},\"parent\":{}}],[\"responsetojson\",{\"_index\":89,\"name\":{\"135\":{}},\"parent\":{}}],[\"rest\",{\"_index\":324,\"name\":{\"433\":{}},\"parent\":{}}],[\"revocation_endpoint\",{\"_index\":304,\"name\":{\"409\":{}},\"parent\":{}}],[\"rs384jwk\",{\"_index\":197,\"name\":{\"281\":{}},\"parent\":{}}],[\"scope\",{\"_index\":214,\"name\":{\"299\":{},\"323\":{},\"353\":{}},\"parent\":{}}],[\"scopes_supported\",{\"_index\":307,\"name\":{\"412\":{}},\"parent\":{}}],[\"security\",{\"_index\":54,\"name\":{\"63\":{},\"83\":{},\"97\":{},\"249\":{}},\"parent\":{}}],[\"security/browser\",{\"_index\":106,\"name\":{\"159\":{}},\"parent\":{\"160\":{},\"161\":{},\"162\":{},\"163\":{},\"164\":{},\"165\":{}}}],[\"security/server\",{\"_index\":113,\"name\":{\"166\":{}},\"parent\":{\"167\":{},\"168\":{},\"169\":{},\"170\":{}}}],[\"serverurl\",{\"_index\":210,\"name\":{\"296\":{}},\"parent\":{}}],[\"session\",{\"_index\":160,\"name\":{\"226\":{}},\"parent\":{}}],[\"set\",{\"_index\":144,\"name\":{\"206\":{},\"213\":{},\"257\":{}},\"parent\":{}}],[\"setpath\",{\"_index\":93,\"name\":{\"141\":{}},\"parent\":{}}],[\"settings\",{\"_index\":80,\"name\":{\"122\":{},\"171\":{}},\"parent\":{\"172\":{},\"173\":{},\"190\":{},\"191\":{}}}],[\"settings.fhirversions\",{\"_index\":116,\"name\":{},\"parent\":{\"174\":{}}}],[\"settings.fhirversions.__type\",{\"_index\":118,\"name\":{},\"parent\":{\"175\":{},\"176\":{},\"177\":{},\"178\":{},\"179\":{},\"180\":{},\"181\":{},\"182\":{},\"183\":{},\"184\":{},\"185\":{},\"186\":{},\"187\":{},\"188\":{},\"189\":{}}}],[\"signcompactjws\",{\"_index\":110,\"name\":{\"163\":{},\"170\":{},\"255\":{}},\"parent\":{}}],[\"singlesignon\",{\"_index\":292,\"name\":{\"398\":{}},\"parent\":{}}],[\"smart\",{\"_index\":65,\"name\":{\"75\":{},\"192\":{},\"227\":{}},\"parent\":{\"193\":{},\"194\":{},\"195\":{},\"196\":{},\"197\":{},\"198\":{},\"199\":{},\"200\":{},\"201\":{},\"534\":{}}}],[\"smart_key\",{\"_index\":134,\"name\":{\"191\":{}},\"parent\":{}}],[\"smart_style_url\",{\"_index\":253,\"name\":{\"348\":{}},\"parent\":{}}],[\"smartauthenticationmethod\",{\"_index\":289,\"name\":{\"395\":{}},\"parent\":{}}],[\"start\",{\"_index\":341,\"name\":{\"475\":{}},\"parent\":{}}],[\"state\",{\"_index\":4,\"name\":{\"3\":{}},\"parent\":{}}],[\"status\",{\"_index\":44,\"name\":{\"52\":{}},\"parent\":{}}],[\"statuscode\",{\"_index\":43,\"name\":{\"51\":{}},\"parent\":{}}],[\"statustext\",{\"_index\":45,\"name\":{\"53\":{}},\"parent\":{}}],[\"storage\",{\"_index\":172,\"name\":{\"256\":{}},\"parent\":{}}],[\"storage/browserstorage\",{\"_index\":141,\"name\":{\"202\":{}},\"parent\":{\"203\":{}}}],[\"storage/browserstorage.default\",{\"_index\":142,\"name\":{},\"parent\":{\"204\":{},\"205\":{},\"206\":{},\"207\":{}}}],[\"storage/serverstorage\",{\"_index\":146,\"name\":{\"208\":{}},\"parent\":{\"209\":{}}}],[\"storage/serverstorage.default\",{\"_index\":147,\"name\":{},\"parent\":{\"210\":{},\"211\":{},\"212\":{},\"213\":{},\"214\":{}}}],[\"storagefactory\",{\"_index\":177,\"name\":{\"263\":{}},\"parent\":{}}],[\"strings\",{\"_index\":148,\"name\":{\"215\":{}},\"parent\":{\"216\":{}}}],[\"strings.default\",{\"_index\":149,\"name\":{},\"parent\":{\"217\":{}}}],[\"strings.default.__type\",{\"_index\":151,\"name\":{},\"parent\":{\"218\":{},\"219\":{},\"220\":{},\"221\":{}}}],[\"sub\",{\"_index\":264,\"name\":{\"361\":{}},\"parent\":{}}],[\"subtle\",{\"_index\":111,\"name\":{\"164\":{}},\"parent\":{}}],[\"system\",{\"_index\":351,\"name\":{\"489\":{},\"499\":{}},\"parent\":{}}],[\"target\",{\"_index\":237,\"name\":{\"330\":{}},\"parent\":{}}],[\"text\",{\"_index\":350,\"name\":{\"485\":{}},\"parent\":{}}],[\"tojson\",{\"_index\":48,\"name\":{\"56\":{}},\"parent\":{}}],[\"token_endpoint\",{\"_index\":300,\"name\":{\"405\":{}},\"parent\":{}}],[\"token_endpoint_auth_methods\",{\"_index\":306,\"name\":{\"411\":{}},\"parent\":{}}],[\"token_type\",{\"_index\":255,\"name\":{\"352\":{}},\"parent\":{}}],[\"tokenresponse\",{\"_index\":218,\"name\":{\"303\":{},\"346\":{}},\"parent\":{}}],[\"tokenuri\",{\"_index\":207,\"name\":{\"293\":{},\"308\":{}},\"parent\":{}}],[\"total\",{\"_index\":371,\"name\":{\"526\":{}},\"parent\":{}}],[\"type\",{\"_index\":359,\"name\":{\"498\":{},\"525\":{}},\"parent\":{}}],[\"types\",{\"_index\":155,\"name\":{\"222\":{}},\"parent\":{\"223\":{}}}],[\"types.fhirclient\",{\"_index\":158,\"name\":{},\"parent\":{\"224\":{},\"225\":{},\"227\":{},\"233\":{},\"234\":{},\"237\":{},\"238\":{},\"256\":{},\"260\":{},\"261\":{},\"262\":{},\"263\":{},\"265\":{},\"267\":{},\"269\":{},\"271\":{},\"274\":{},\"275\":{},\"281\":{},\"286\":{},\"287\":{},\"290\":{},\"295\":{},\"315\":{},\"336\":{},\"339\":{},\"346\":{},\"358\":{},\"365\":{},\"366\":{},\"367\":{},\"368\":{},\"369\":{},\"373\":{},\"377\":{},\"381\":{},\"385\":{},\"389\":{},\"392\":{},\"393\":{},\"394\":{},\"395\":{},\"396\":{},\"397\":{},\"398\":{},\"399\":{},\"400\":{},\"401\":{},\"402\":{},\"403\":{},\"415\":{}}}],[\"types.fhirclient.adapter\",{\"_index\":170,\"name\":{},\"parent\":{\"239\":{},\"240\":{},\"241\":{},\"242\":{},\"243\":{},\"244\":{},\"245\":{},\"246\":{},\"247\":{},\"248\":{},\"249\":{},\"250\":{}}}],[\"types.fhirclient.adapter.__type\",{\"_index\":171,\"name\":{},\"parent\":{\"251\":{},\"252\":{},\"253\":{},\"254\":{},\"255\":{}}}],[\"types.fhirclient.authorizeparams\",{\"_index\":229,\"name\":{},\"parent\":{\"316\":{},\"317\":{},\"318\":{},\"319\":{},\"320\":{},\"321\":{},\"322\":{},\"323\":{},\"324\":{},\"325\":{},\"326\":{},\"327\":{},\"328\":{},\"329\":{},\"330\":{},\"331\":{},\"332\":{},\"333\":{},\"334\":{},\"335\":{}}}],[\"types.fhirclient.clientstate\",{\"_index\":211,\"name\":{},\"parent\":{\"296\":{},\"297\":{},\"298\":{},\"299\":{},\"300\":{},\"301\":{},\"302\":{},\"303\":{},\"304\":{},\"305\":{},\"306\":{},\"307\":{},\"308\":{},\"309\":{},\"310\":{},\"311\":{},\"312\":{},\"313\":{},\"314\":{}}}],[\"types.fhirclient.codevalue\",{\"_index\":166,\"name\":{},\"parent\":{\"235\":{},\"236\":{}}}],[\"types.fhirclient.combinedfetchresult\",{\"_index\":188,\"name\":{},\"parent\":{\"272\":{},\"273\":{}}}],[\"types.fhirclient.es384jwk\",{\"_index\":192,\"name\":{},\"parent\":{\"276\":{},\"277\":{},\"278\":{},\"279\":{},\"280\":{}}}],[\"types.fhirclient.fetchoptions\",{\"_index\":185,\"name\":{},\"parent\":{\"270\":{}}}],[\"types.fhirclient.fhir\",{\"_index\":311,\"name\":{},\"parent\":{\"416\":{},\"417\":{},\"418\":{},\"419\":{},\"420\":{},\"421\":{},\"422\":{},\"423\":{},\"426\":{},\"430\":{},\"434\":{},\"440\":{},\"444\":{},\"450\":{},\"456\":{},\"462\":{},\"468\":{},\"474\":{},\"479\":{},\"483\":{},\"488\":{},\"496\":{},\"505\":{},\"511\":{},\"517\":{},\"523\":{}}}],[\"types.fhirclient.fhir.backboneelement\",{\"_index\":346,\"name\":{},\"parent\":{\"480\":{},\"481\":{},\"482\":{}}}],[\"types.fhirclient.fhir.bundle\",{\"_index\":370,\"name\":{},\"parent\":{\"524\":{},\"525\":{},\"526\":{},\"527\":{},\"528\":{},\"529\":{},\"530\":{},\"531\":{},\"532\":{},\"533\":{}}}],[\"types.fhirclient.fhir.bundleentry\",{\"_index\":368,\"name\":{},\"parent\":{\"518\":{},\"519\":{},\"520\":{},\"521\":{},\"522\":{}}}],[\"types.fhirclient.fhir.bundlelink\",{\"_index\":365,\"name\":{},\"parent\":{\"512\":{},\"513\":{},\"514\":{},\"515\":{},\"516\":{}}}],[\"types.fhirclient.fhir.capabilitystatement\",{\"_index\":322,\"name\":{},\"parent\":{\"431\":{},\"432\":{},\"433\":{}}}],[\"types.fhirclient.fhir.codeableconcept\",{\"_index\":349,\"name\":{},\"parent\":{\"484\":{},\"485\":{},\"486\":{},\"487\":{}}}],[\"types.fhirclient.fhir.coding\",{\"_index\":352,\"name\":{},\"parent\":{\"489\":{},\"490\":{},\"491\":{},\"492\":{},\"493\":{},\"494\":{},\"495\":{}}}],[\"types.fhirclient.fhir.element\",{\"_index\":318,\"name\":{},\"parent\":{\"424\":{},\"425\":{}}}],[\"types.fhirclient.fhir.encounter\",{\"_index\":339,\"name\":{},\"parent\":{\"469\":{},\"470\":{},\"471\":{},\"472\":{},\"473\":{}}}],[\"types.fhirclient.fhir.extension\",{\"_index\":320,\"name\":{},\"parent\":{\"427\":{},\"428\":{},\"429\":{}}}],[\"types.fhirclient.fhir.identifier\",{\"_index\":358,\"name\":{},\"parent\":{\"497\":{},\"498\":{},\"499\":{},\"500\":{},\"501\":{},\"502\":{},\"503\":{},\"504\":{}}}],[\"types.fhirclient.fhir.meta\",{\"_index\":331,\"name\":{},\"parent\":{\"441\":{},\"442\":{},\"443\":{}}}],[\"types.fhirclient.fhir.observation\",{\"_index\":333,\"name\":{},\"parent\":{\"445\":{},\"446\":{},\"447\":{},\"448\":{},\"449\":{}}}],[\"types.fhirclient.fhir.patient\",{\"_index\":334,\"name\":{},\"parent\":{\"451\":{},\"452\":{},\"453\":{},\"454\":{},\"455\":{}}}],[\"types.fhirclient.fhir.period\",{\"_index\":342,\"name\":{},\"parent\":{\"475\":{},\"476\":{},\"477\":{},\"478\":{}}}],[\"types.fhirclient.fhir.practitioner\",{\"_index\":336,\"name\":{},\"parent\":{\"457\":{},\"458\":{},\"459\":{},\"460\":{},\"461\":{}}}],[\"types.fhirclient.fhir.reference\",{\"_index\":362,\"name\":{},\"parent\":{\"506\":{},\"507\":{},\"508\":{},\"509\":{},\"510\":{}}}],[\"types.fhirclient.fhir.relatedperson\",{\"_index\":338,\"name\":{},\"parent\":{\"463\":{},\"464\":{},\"465\":{},\"466\":{},\"467\":{}}}],[\"types.fhirclient.fhir.resource\",{\"_index\":326,\"name\":{},\"parent\":{\"435\":{},\"436\":{},\"437\":{},\"438\":{},\"439\":{}}}],[\"types.fhirclient.fhiroptions\",{\"_index\":245,\"name\":{},\"parent\":{\"340\":{},\"341\":{},\"342\":{},\"343\":{},\"344\":{},\"345\":{}}}],[\"types.fhirclient.idtoken\",{\"_index\":262,\"name\":{},\"parent\":{\"359\":{},\"360\":{},\"361\":{},\"362\":{},\"363\":{},\"364\":{}}}],[\"types.fhirclient.includeresponsehint\",{\"_index\":181,\"name\":{},\"parent\":{\"266\":{}}}],[\"types.fhirclient.jsonpatchadd\",{\"_index\":273,\"name\":{},\"parent\":{\"370\":{},\"371\":{},\"372\":{}}}],[\"types.fhirclient.jsonpatchcopy\",{\"_index\":283,\"name\":{},\"parent\":{\"386\":{},\"387\":{},\"388\":{}}}],[\"types.fhirclient.jsonpatchmove\",{\"_index\":280,\"name\":{},\"parent\":{\"382\":{},\"383\":{},\"384\":{}}}],[\"types.fhirclient.jsonpatchremove\",{\"_index\":285,\"name\":{},\"parent\":{\"390\":{},\"391\":{}}}],[\"types.fhirclient.jsonpatchreplace\",{\"_index\":276,\"name\":{},\"parent\":{\"374\":{},\"375\":{},\"376\":{}}}],[\"types.fhirclient.jsonpatchtest\",{\"_index\":278,\"name\":{},\"parent\":{\"378\":{},\"379\":{},\"380\":{}}}],[\"types.fhirclient.oauthsecurityextensions\",{\"_index\":205,\"name\":{},\"parent\":{\"291\":{},\"292\":{},\"293\":{},\"294\":{}}}],[\"types.fhirclient.readyoptions\",{\"_index\":242,\"name\":{},\"parent\":{\"337\":{},\"338\":{}}}],[\"types.fhirclient.requestfunction\",{\"_index\":183,\"name\":{},\"parent\":{\"268\":{}}}],[\"types.fhirclient.requestoptions\",{\"_index\":202,\"name\":{},\"parent\":{\"288\":{},\"289\":{}}}],[\"types.fhirclient.requestwithsession\",{\"_index\":161,\"name\":{},\"parent\":{\"226\":{}}}],[\"types.fhirclient.rs384jwk\",{\"_index\":198,\"name\":{},\"parent\":{\"282\":{},\"283\":{},\"284\":{},\"285\":{}}}],[\"types.fhirclient.smart\",{\"_index\":162,\"name\":{},\"parent\":{\"228\":{},\"229\":{},\"230\":{},\"231\":{},\"232\":{}}}],[\"types.fhirclient.storage\",{\"_index\":173,\"name\":{},\"parent\":{\"257\":{},\"258\":{},\"259\":{}}}],[\"types.fhirclient.storagefactory\",{\"_index\":178,\"name\":{},\"parent\":{\"264\":{}}}],[\"types.fhirclient.tokenresponse\",{\"_index\":252,\"name\":{},\"parent\":{\"347\":{},\"348\":{},\"349\":{},\"350\":{},\"351\":{},\"352\":{},\"353\":{},\"354\":{},\"355\":{},\"356\":{},\"357\":{}}}],[\"types.fhirclient.wellknownsmartconfiguration\",{\"_index\":299,\"name\":{},\"parent\":{\"404\":{},\"405\":{},\"406\":{},\"407\":{},\"408\":{},\"409\":{},\"410\":{},\"411\":{},\"412\":{},\"413\":{},\"414\":{}}}],[\"uint8arraytobinarystring\",{\"_index\":73,\"name\":{\"111\":{}},\"parent\":{}}],[\"units\",{\"_index\":33,\"name\":{\"38\":{},\"154\":{}},\"parent\":{}}],[\"unset\",{\"_index\":145,\"name\":{\"207\":{},\"214\":{},\"259\":{}},\"parent\":{}}],[\"unsignedint\",{\"_index\":315,\"name\":{\"421\":{}},\"parent\":{}}],[\"update\",{\"_index\":26,\"name\":{\"30\":{}},\"parent\":{}}],[\"uri\",{\"_index\":312,\"name\":{\"417\":{}},\"parent\":{}}],[\"url\",{\"_index\":201,\"name\":{\"288\":{},\"427\":{},\"513\":{}},\"parent\":{}}],[\"use\",{\"_index\":357,\"name\":{\"497\":{}},\"parent\":{}}],[\"user\",{\"_index\":13,\"name\":{\"14\":{}},\"parent\":{}}],[\"userefreshtoken\",{\"_index\":250,\"name\":{\"345\":{}},\"parent\":{}}],[\"username\",{\"_index\":219,\"name\":{\"304\":{}},\"parent\":{}}],[\"userselected\",{\"_index\":355,\"name\":{\"493\":{}},\"parent\":{}}],[\"utils\",{\"_index\":78,\"name\":{\"119\":{}},\"parent\":{}}],[\"value\",{\"_index\":167,\"name\":{\"236\":{},\"372\":{},\"376\":{},\"380\":{},\"500\":{}},\"parent\":{}}],[\"valuex\",{\"_index\":316,\"name\":{\"422\":{}},\"parent\":{}}],[\"version\",{\"_index\":353,\"name\":{\"490\":{}},\"parent\":{}}],[\"wellknownsmartconfiguration\",{\"_index\":297,\"name\":{\"403\":{}},\"parent\":{}}],[\"width\",{\"_index\":238,\"name\":{\"331\":{}},\"parent\":{}}],[\"windowtarget\",{\"_index\":175,\"name\":{\"261\":{}},\"parent\":{}}],[\"windowtargetfunction\",{\"_index\":157,\"name\":{\"224\":{}},\"parent\":{}}],[\"windowtargetvariable\",{\"_index\":174,\"name\":{\"260\":{}},\"parent\":{}}]],\"pipeline\":[]}}"); \ No newline at end of file diff --git a/docs/typedoc/classes/Client.default.html b/docs/typedoc/classes/Client.default.html index bdfe144a..c487ecdc 100644 --- a/docs/typedoc/classes/Client.default.html +++ b/docs/typedoc/classes/Client.default.html @@ -3,39 +3,39 @@ SMART API. You can also create it yourself if needed:

// BROWSER
const client = FHIR.client("https://r4.smarthealthit.org");

// SERVER
const client = smart(req, res).client("https://r4.smarthealthit.org");
-

Hierarchy

  • default

Index

Constructors

Hierarchy

  • default

Index

Constructors

Other Properties

_refreshTask: null | Promise<any>
+

Parameters

Returns default

Other Properties

_refreshTask: null | Promise<any>

Refers to the refresh task while it is being performed.

see

refresh

-
encounter: { id: null | string; read: fhirclient.RequestFunction<fhirclient.FHIR.Encounter> }
+
encounter: { id: null | string; read: RequestFunction<Encounter> }

The client may be associated with a specific encounter, if the scopes permit that and if the back-end server supports that. This is a namespace for encounter-related functionality.

Type declaration

  • id: null | string

    The ID of the current encounter or null if there is no current encounter

    -
  • read: fhirclient.RequestFunction<fhirclient.FHIR.Encounter>
    +
  • read: RequestFunction<Encounter>

    A method to fetch the current encounter resource from the FHIR server. If there is no encounter context, it will reject with an error.

    param Any

    options to pass to the fetch call.

    -
environment: fhirclient.Adapter
+
environment: Adapter

The adapter to use to connect to the current environment. Currently we have:

  • BrowserAdapter - for browsers
  • NodeAdapter - for Express or vanilla NodeJS servers
  • HapiAdapter - for HAPI NodeJS servers
-
patient: { id: null | string; read: fhirclient.RequestFunction<fhirclient.FHIR.Patient>; request: any }
+
patient: { id: null | string; read: RequestFunction<Patient>; request: any }

A SMART app is typically associated with a patient. This is a namespace for the patient-related functionality of the client.

Type declaration

  • id: null | string

    The ID of the current patient or null if there is no current patient

    -
  • read: fhirclient.RequestFunction<fhirclient.FHIR.Patient>
    +
  • read: RequestFunction<Patient>

    A method to fetch the current patient resource from the FHIR server. If there is no patient context, it will reject with an error.

    param [requestOptions]

    Any options to pass to the fetch call.

    -
  • request:function
    • +
    • request:function
      • This is similar to request but it makes requests in the context of the current patient. For example, instead of doing

        client.request("Observation?patient=" + client.patient.id)
        @@ -46,14 +46,14 @@
         

        The return type depends on the arguments. Typically it will be the response payload JSON object. Can also be a string or the Response object itself if we have received a non-json result, which allows us -to handle even binary responses. Can also be a CombinedFetchResult +to handle even binary responses. Can also be a CombinedFetchResult object if the requestOptions.includeResponses has been set to true.

        -

        Type Parameters

        Parameters

        Returns Promise<R>

+

Type Parameters

Parameters

Returns Promise<R>

The state of the client instance is an object with various properties. It contains some details about how the client has been authorized and determines the behavior of the client instance. This state is persisted in SessionStorage in browsers or in request session on the servers.

-
user: { fhirUser: null | string; id: null | string; read: fhirclient.RequestFunction<fhirclient.FHIR.Patient | fhirclient.FHIR.Practitioner | fhirclient.FHIR.RelatedPerson>; resourceType: null | string }
+
user: { fhirUser: null | string; id: null | string; read: RequestFunction<Patient | Practitioner | RelatedPerson>; resourceType: null | string }

The client may be associated with a specific user, if the scopes permit that. This is a namespace for user-related functionality.

Type declaration

Utility Properties

units: { any: any; cm: any; kg: any } = units

Type declaration

Other Methods

  • _clearState(): Promise<void>

Utility Properties

units: { any: any; cm: any; kg: any } = units

Type declaration

Other Methods

  • _clearState(): Promise<void>
  • Used internally to clear the state of the instance and the state in the associated storage.

    -

    Returns Promise<void>

  • getAuthorizationHeader(): null | string
  • getAuthorizationHeader(): null | string
  • Builds and returns the value of the Authorization header that can be sent to the FHIR server

    -

    Returns null | string

  • getEncounterId(): null | string
  • getEncounterId(): null | string
  • Returns the ID of the selected encounter or null. You should have requested "launch/encounter" scope. Otherwise this will return null. Note that not all servers support the "launch/encounter" scope so this will be null if they don't.

    -

    Returns null | string

  • getFhirRelease(): Promise<number>
  • getFhirRelease(): Promise<number>
  • Returns a promise that will be resolved with the numeric fhir version

    • 2 for DSTU2
    • @@ -91,21 +91,21 @@
    • 4 for R4
    • 0 if the version is not known
    -

    Returns Promise<number>

  • getFhirUser(): null | string
  • getFhirUser(): null | string
  • Returns the profile of the logged_in user (if any). This is a string having the following shape "{user type}/{user id}". For example: "Practitioner/abc" or "Patient/xyz".

    -

    Returns null | string

  • getFhirVersion(): Promise<string>
  • getFhirVersion(): Promise<string>
  • Returns a promise that will be resolved with the fhir version as defined in the CapabilityStatement.

    -

    Returns Promise<string>

  • Returns the (decoded) id_token if any. You need to request "openid" and "profile" scopes if you need to receive an id_token (if you need to know who the logged-in user is).

    -

    Returns null | fhirclient.IDToken

  • getPatientId(): null | string
  • getPatientId(): null | string
  • Returns the ID of the selected patient or null. You should have requested "launch/patient" scope. Otherwise this will return null.

    -

    Returns null | string

  • getState(path?: string): any
  • getState(path?: string): any
  • Returns a copy of the client state. Accepts a dot-separated path argument (same as for getPath) to allow for selecting specific properties. Examples:

    @@ -114,46 +114,46 @@

    Parameters

    • path: string = ""

      The path (eg. "a.b.4.c")

    Returns any

    Whatever is found in the path or undefined

    -
  • getUserId(): null | string
  • getUserId(): null | string
  • getUserType(): null | string
  • getUserType(): null | string
  • Returns the type of the logged-in user or null. The result can be "Practitioner", "Patient" or "RelatedPerson".

    -

    Returns null | string

Request Methods

Request Methods

Returns Promise<O["includeResponse"] extends true ? CombinedFetchResult<R> : R>

  • delete<R>(url: string, requestOptions?: FetchOptions): Promise<R>

Returns Promise<R>

Returns Promise<ResolveType>

  • refresh(requestOptions?: RequestInit): Promise<ClientState>
  • Use the refresh token to obtain new access token. If the refresh token is expired (or this fails for any other reason) it will be deleted from the state, so that we don't enter into loops trying to re-authorize.

    @@ -163,7 +163,7 @@

    Any options to pass to the fetch call. Most of them will be overridden, bit it might still be useful for passing additional request options or an abort signal.

    -

Returns Promise<fhirclient.ClientState>

Returns Promise<ClientState>

  • refreshIfNeeded(requestOptions?: RequestInit): Promise<ClientState>
  • Checks if access token and refresh token are present. If they are, and if the access token is expired or is about to expire in the next 10 seconds, calls this.refresh() to obtain new access token.

    @@ -171,33 +171,33 @@

    Any options to pass to the fetch call. Most of them will be overridden, bit it might still be useful for passing additional request options or an abort signal.

    -

Returns Promise<fhirclient.ClientState>

Returns Promise<T>

Utility Methods

Returns Promise<O["includeResponse"] extends true ? CombinedFetchResult<R> : R>

Utility Methods

  • Groups the observations by code. Returns a map that will look like:

    const map = client.byCodes(observations, "code");
    // map = {
    // "55284-4": [ observation1, observation2 ],
    // "6082-2": [ observation3 ]
    // }
    todo

    This should be deprecated and moved elsewhere. One should not have to obtain an instance of Client just to use utility functions like this.

    -
    deprecated

    Parameters

Returns ObservationMap

  • First groups the observations by code using byCode. Then returns a function that accepts codes as arguments and will return a flat array of observations having that codes. Example:

    @@ -205,7 +205,7 @@
    todo

    This should be deprecated and moved elsewhere. One should not have to obtain an instance of Client just to use utility functions like this.

    -
    deprecated

    Parameters

    • observations: fhirclient.FHIR.Observation | fhirclient.FHIR.Observation[]
      +
      deprecated

      Parameters

      • observations: Observation | Observation[]

        Array of observations

      • property: string

        The name of a CodeableConcept property to group by

        @@ -218,7 +218,7 @@
        todo

        This should be deprecated and moved elsewhere. One should not have to obtain an instance of Client just to use utility functions like this.

        deprecated
        category

        Utility

        -

        Parameters

        • Rest ...codes: string[]

        Returns any[]

  • getPath(obj: Record<string, any>, path?: string): any
  • getPath(obj: Record<string, any>, path?: string): any
  • Walks through an object (or array) and returns the value found at the provided path. This function is very simple so it intentionally does not support any argument polymorphism, meaning that the path can only be a @@ -230,4 +230,4 @@

  • path: string = ""

    The path (eg. "a.b.4.c")

Returns any

Whatever is found in the path or undefined

-

Legend

  • Namespace
  • Variable
  • Function
  • Function with type parameter
  • Class
  • Constructor
  • Property
  • Method
  • Private property
  • Private method

Settings

Theme

Generated using TypeDoc

\ No newline at end of file +

Legend

  • Namespace
  • Variable
  • Function
  • Function with type parameter
  • Class
  • Constructor
  • Property
  • Method
  • Private property
  • Private method

Settings

Theme

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/typedoc/classes/HttpError.default.html b/docs/typedoc/classes/HttpError.default.html index 12367d92..8e3f0589 100644 --- a/docs/typedoc/classes/HttpError.default.html +++ b/docs/typedoc/classes/HttpError.default.html @@ -1,16 +1,16 @@ -default | FHIRClient - v3.0.0-beta.1
Options
All
  • Public
  • Public/Protected
  • All
Menu

Hierarchy

  • Error
    • default

Index

Constructors

  • new default(response: Response): default

Properties

message: string
name: string
response: Response
+default | FHIRClient - v3.0.0-beta.1
Options
All
  • Public
  • Public/Protected
  • All
Menu

Hierarchy

  • Error
    • default

Index

Constructors

  • new default(response: Response): default

Properties

message: string
name: string
response: Response

Reference to the HTTP Response object

-
stack?: string
status: number
+
stack?: string
status: number

The HTTP status code for this error. Note that this is the same as status, i.e. the code is available through any of these.

-
statusCode: number
+
statusCode: number

The HTTP status code for this error

-
statusText: string
+
statusText: string

The HTTP status text corresponding to this error

prepareStackTrace?: ((err: Error, stackTraces: CallSite[]) => any)

Type declaration

stackTraceLimit: number

Methods

  • toJSON(): { message: string; name: string; status: number; statusCode: number; statusText: string }
  • Returns { message: string; name: string; status: number; statusCode: number; statusText: string }

    • message: string
    • name: string
    • status: number
    • statusCode: number
    • statusText: string
  • captureStackTrace(targetObject: object, constructorOpt?: Function): void
  • +

    Parameters

    • err: Error
    • stackTraces: CallSite[]

    Returns any

stackTraceLimit: number

Methods

  • toJSON(): { message: string; name: string; status: number; statusCode: number; statusText: string }
  • Returns { message: string; name: string; status: number; statusCode: number; statusText: string }

    • message: string
    • name: string
    • status: number
    • statusCode: number
    • statusText: string
  • captureStackTrace(targetObject: object, constructorOpt?: Function): void
  • Create .stack property on a target object

    -

    Parameters

    • targetObject: object
    • Optional constructorOpt: Function

    Returns void

Legend

  • Namespace
  • Variable
  • Function
  • Function with type parameter
  • Class
  • Constructor
  • Property
  • Method

Settings

Theme

Generated using TypeDoc

\ No newline at end of file +

Parameters

  • targetObject: object
  • Optional constructorOpt: Function

Returns void

Legend

  • Namespace
  • Variable
  • Function
  • Function with type parameter
  • Class
  • Constructor
  • Property
  • Method

Settings

Theme

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/typedoc/classes/adapters_BrowserAdapter.default.html b/docs/typedoc/classes/adapters_BrowserAdapter.default.html index 1882ed19..a6984fca 100644 --- a/docs/typedoc/classes/adapters_BrowserAdapter.default.html +++ b/docs/typedoc/classes/adapters_BrowserAdapter.default.html @@ -1,36 +1,36 @@ default | FHIRClient - v3.0.0-beta.1
Options
All
  • Public
  • Public/Protected
  • All
Menu

Browser Adapter

-

Hierarchy

  • default

Implements

Index

Constructors

Hierarchy

  • default

Implements

Index

Constructors

Properties

_storage: null | fhirclient.Storage = null
+

Returns default

Properties

_storage: null | Storage = null

Holds the Storage instance associated with this instance

-
_url: null | URL = null
+
_url: null | URL = null

Stores the URL instance associated with this adapter

-
+

Environment-specific options

-
security: security/browser = security

Methods

  • base64decode(str: string): string
security: security/browser = security

Methods

  • base64decode(str: string): string
  • base64encode(str: string): string
  • base64encode(str: string): string
  • base64urldecode(input: string): string
  • base64urldecode(input: string): string
  • base64urlencode(input: string | Uint8Array): string
  • base64urlencode(input: string | Uint8Array): string
  • Creates and returns adapter-aware SMART api. Not that while the shape of the returned object is well known, the arguments to this function are not. Those who override this method are free to require any environment-specific arguments. For example in node we will need a request, a response and optionally a storage or storage factory function.

    -

    Returns SMART

  • getUrl(): URL
  • getUrl(): URL
  • redirect(to: string): void
  • redirect(to: string): void
  • relative(path: string): string
  • relative(path: string): string

Legend

  • Namespace
  • Variable
  • Function
  • Function with type parameter
  • Class
  • Constructor
  • Property
  • Method
  • Private property

Settings

Theme

Generated using TypeDoc

\ No newline at end of file +

Parameters

  • path: string

Returns string

Legend

  • Namespace
  • Variable
  • Function
  • Function with type parameter
  • Class
  • Constructor
  • Property
  • Method
  • Private property

Settings

Theme

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/typedoc/classes/adapters_HapiAdapter.default.html b/docs/typedoc/classes/adapters_HapiAdapter.default.html index 765b0085..1897c187 100644 --- a/docs/typedoc/classes/adapters_HapiAdapter.default.html +++ b/docs/typedoc/classes/adapters_HapiAdapter.default.html @@ -1,43 +1,43 @@ -default | FHIRClient - v3.0.0-beta.1
Options
All
  • Public
  • Public/Protected
  • All
Menu

Hierarchy

Index

Constructors

  • new default(options: HapiAdapterOptions): default

Properties

_request: Request
_responseToolkit: ResponseToolkit
_storage: null | Storage = null

Holds the Storage instance associated with this instance

-
options: NodeAdapterOptions
+
options: NodeAdapterOptions

Environment-specific options

-
security: security/server = security

Methods

  • base64decode(str: string): string
security: security/server = security

Methods

  • base64decode(str: string): string
  • base64encode(str: string): string
  • base64encode(str: string): string
  • base64urldecode(input: string): string
  • base64urldecode(input: string): string
  • base64urlencode(input: string | Uint8Array): string
  • base64urlencode(input: string | Uint8Array): string
  • getProtocol(): string
  • getProtocol(): string
  • Creates and returns adapter-aware SMART api. Not that while the shape of the returned object is well known, the arguments to this function are not. Those who override this method are free to require any environment-specific arguments. For example in node we will need a request, a response and optionally a storage or storage factory function.

    -

    Returns SMART

  • getUrl(): URL
  • getUrl(): URL
  • redirect(location: string): ResponseObject
  • redirect(location: string): ResponseObject
  • relative(path: string): string

Returns ResponseObject

  • relative(path: string): string

Legend

  • Namespace
  • Variable
  • Function
  • Function with type parameter
  • Class
  • Constructor
  • Method
  • Inherited property
  • Inherited method
  • Protected property
  • Private property
  • Static method

Settings

Theme

Generated using TypeDoc

\ No newline at end of file +

Returns SMART

Legend

  • Namespace
  • Variable
  • Function
  • Function with type parameter
  • Class
  • Constructor
  • Method
  • Inherited property
  • Inherited method
  • Protected property
  • Private property
  • Static method

Settings

Theme

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/typedoc/classes/adapters_NodeAdapter.default.html b/docs/typedoc/classes/adapters_NodeAdapter.default.html index 9fdceca6..f671dae7 100644 --- a/docs/typedoc/classes/adapters_NodeAdapter.default.html +++ b/docs/typedoc/classes/adapters_NodeAdapter.default.html @@ -1,37 +1,37 @@ default | FHIRClient - v3.0.0-beta.1
Options
All
  • Public
  • Public/Protected
  • All
Menu

Node Adapter - works with native NodeJS and with Express

-

Hierarchy

Implements

Index

Constructors

  • new default(options: NodeAdapterOptions): default

Hierarchy

Implements

Index

Constructors

  • new default(options: NodeAdapterOptions): default

Properties

_storage: null | fhirclient.Storage = null
+

Returns default

Properties

_storage: null | Storage = null

Holds the Storage instance associated with this instance

-
options: NodeAdapterOptions
+
options: NodeAdapterOptions

Environment-specific options

-
security: security/server = security

Methods

  • base64decode(str: string): string
security: security/server = security

Methods

  • base64decode(str: string): string
  • base64encode(str: string): string
  • base64encode(str: string): string
  • base64urldecode(input: string): string
  • base64urldecode(input: string): string
  • base64urlencode(input: string | Uint8Array): string
  • base64urlencode(input: string | Uint8Array): string
  • getProtocol(): string
  • getProtocol(): string
  • Creates and returns adapter-aware SMART api. Not that while the shape of the returned object is well known, the arguments to this function are not. Those who override this method are free to require any environment-specific arguments. For example in node we will need a request, a response and optionally a storage or storage factory function.

    -

    Returns SMART

  • getUrl(): URL
  • getUrl(): URL
  • redirect(location: string): void
  • redirect(location: string): void
  • relative(path: string): string

Returns void

  • relative(path: string): string

Legend

  • Namespace
  • Variable
  • Function
  • Function with type parameter
  • Class
  • Constructor
  • Property
  • Method
  • Protected property

Settings

Theme

Generated using TypeDoc

\ No newline at end of file +

Parameters

  • path: string

Returns string

Legend

  • Namespace
  • Variable
  • Function
  • Function with type parameter
  • Class
  • Constructor
  • Property
  • Method
  • Protected property

Settings

Theme

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/typedoc/classes/lib_BrowserAdapter.default.html b/docs/typedoc/classes/lib_BrowserAdapter.default.html deleted file mode 100644 index 7458602e..00000000 --- a/docs/typedoc/classes/lib_BrowserAdapter.default.html +++ /dev/null @@ -1,32 +0,0 @@ -default | FHIRClient - v3.0.0-beta.1
Options
All
  • Public
  • Public/Protected
  • All
Menu
-

Browser Adapter

-

Hierarchy

  • default

Implements

Index

Constructors

Properties

_storage: null | fhirclient.Storage = null
-

Holds the Storage instance associated with this instance

-
_url: null | URL = null
-

Stores the URL instance associated with this adapter

-
-

Environment-specific options

-
security: { digestSha256: ((payload: string) => Promise<Uint8Array>); generatePKCEChallenge: ((entropy?: number) => Promise<PkcePair>); importJWK: ((jwk: fhirclient.JWK) => Promise<CryptoKey>); randomBytes: ((count: number) => Uint8Array); signCompactJws: ((alg: "ES384" | "RS384", privateKey: CryptoKey, header: any, payload: any) => Promise<string>) } = ...

Type declaration

  • digestSha256: ((payload: string) => Promise<Uint8Array>)
      • (payload: string): Promise<Uint8Array>
      • Parameters

        • payload: string

        Returns Promise<Uint8Array>

  • generatePKCEChallenge: ((entropy?: number) => Promise<PkcePair>)
      • (entropy?: number): Promise<PkcePair>
      • Parameters

        • entropy: number = 96

        Returns Promise<PkcePair>

  • importJWK: ((jwk: fhirclient.JWK) => Promise<CryptoKey>)
  • randomBytes: ((count: number) => Uint8Array)
      • (count: number): Uint8Array
      • Parameters

        • count: number

        Returns Uint8Array

  • signCompactJws: ((alg: "ES384" | "RS384", privateKey: CryptoKey, header: any, payload: any) => Promise<string>)
      • (alg: "ES384" | "RS384", privateKey: CryptoKey, header: any, payload: any): Promise<string>
      • Parameters

        • alg: "ES384" | "RS384"
        • privateKey: CryptoKey
        • header: any
        • payload: any

        Returns Promise<string>

Methods

  • base64urldecode(input: string): string
  • -

    Base64Url to ASCII string

    -

    Parameters

    • input: string

    Returns string

  • base64urlencode(input: string | Uint8Array): string
  • -

    ASCII string or Uint8Array to Base64URL

    -

    Parameters

    • input: string | Uint8Array

    Returns string

  • -

    Creates and returns adapter-aware SMART api. Not that while the shape of -the returned object is well known, the arguments to this function are not. -Those who override this method are free to require any environment-specific -arguments. For example in node we will need a request, a response and -optionally a storage or storage factory function.

    -

    Returns SMART_API

  • -

    Returns a BrowserStorage object which is just a wrapper around -sessionStorage

    -

    Returns default

  • getUrl(): URL
  • -

    Given the current environment, this method must return the current url -as URL instance

    -

    Returns URL

  • redirect(to: string): void
  • -

    Given the current environment, this method must redirect to the given -path

    -

    Parameters

    • to: string

    Returns void

  • relative(path: string): string
  • -

    Given a relative path, returns an absolute url using the instance base URL

    -

    Parameters

    • path: string

    Returns string

Legend

  • Namespace
  • Variable
  • Function
  • Function with type parameter
  • Class
  • Constructor
  • Property
  • Method
  • Private property

Settings

Theme

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/typedoc/classes/lib_BrowserStorage.default.html b/docs/typedoc/classes/lib_BrowserStorage.default.html deleted file mode 100644 index 702a1fd0..00000000 --- a/docs/typedoc/classes/lib_BrowserStorage.default.html +++ /dev/null @@ -1,11 +0,0 @@ -default | FHIRClient - v3.0.0-beta.1
Options
All
  • Public
  • Public/Protected
  • All
Menu

Hierarchy

  • default

Implements

Index

Constructors

Methods

Constructors

Methods

  • get(key: string): Promise<any>
  • -

    Gets the value at key. Returns a promise that will be resolved -with that value (or undefined for missing keys).

    -

    Parameters

    • key: string

    Returns Promise<any>

  • set(key: string, value: any): Promise<any>
  • -

    Sets the value on key and returns a promise that will be resolved -with the value that was set.

    -

    Parameters

    • key: string
    • value: any

    Returns Promise<any>

  • unset(key: string): Promise<boolean>
  • -

    Deletes the value at key. Returns a promise that will be resolved -with true if the key was deleted or with false if it was not (eg. if -did not exist).

    -

    Parameters

    • key: string

    Returns Promise<boolean>

Legend

  • Namespace
  • Variable
  • Function
  • Function with type parameter
  • Class
  • Constructor
  • Method

Settings

Theme

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/typedoc/classes/lib_Client.default.html b/docs/typedoc/classes/lib_Client.default.html deleted file mode 100644 index 47168ca4..00000000 --- a/docs/typedoc/classes/lib_Client.default.html +++ /dev/null @@ -1,148 +0,0 @@ -default | FHIRClient - v3.0.0-beta.1
Options
All
  • Public
  • Public/Protected
  • All
Menu
-

This is a FHIR client that is returned to you from the ready() call of the -SMART API. You can also create it yourself if needed:

-
// BROWSER
const client = FHIR.client("https://r4.smarthealthit.org");

// SERVER
const client = smart(req, res).client("https://r4.smarthealthit.org"); -
-

Hierarchy

  • default

Implements

Index

Constructors

Properties

_refreshTask: null | Promise<any>
-

Refers to the refresh task while it is being performed.

-
see

refresh

-
encounter: { id: null | string; read: fhirclient.RequestFunction<fhirclient.FHIR.Encounter> }
-

The client may be associated with a specific encounter, if the scopes -permit that and if the back-end server supports that. This is a namespace -for encounter-related functionality.

-

Type declaration

  • id: null | string
    -

    The ID of the current encounter or null if there is no current -encounter

    -
  • read: fhirclient.RequestFunction<fhirclient.FHIR.Encounter>
    -

    A method to fetch the current encounter resource from the FHIR server. -If there is no encounter context, it will reject with an error.

    -
    param Any

    options to pass to the fetch call.

    -
patient: { id: null | string; read: fhirclient.RequestFunction<fhirclient.FHIR.Patient>; request: any }
-

A SMART app is typically associated with a patient. This is a namespace -for the patient-related functionality of the client.

-

Type declaration

  • id: null | string
    -

    The ID of the current patient or null if there is no current patient

    -
  • read: fhirclient.RequestFunction<fhirclient.FHIR.Patient>
    -

    A method to fetch the current patient resource from the FHIR server. -If there is no patient context, it will reject with an error.

    -
    param [requestOptions]

    Any options to pass to the fetch call.

    -
  • request:function
    • -

      This is similar to request but it makes requests in the -context of the current patient. For example, instead of doing

      -
      client.request("Observation?patient=" + client.patient.id)
      -
      -

      you can do

      -
      client.patient.request("Observation")
      -
      -

      The return type depends on the arguments. Typically it will be the -response payload JSON object. Can also be a string or the Response -object itself if we have received a non-json result, which allows us -to handle even binary responses. Can also be a CombinedFetchResult -object if the requestOptions.includeResponses has been set to true.

      -

      Type Parameters

      Parameters

      Returns Promise<R>

-

The state of the client instance is an object with various properties. -It contains some details about how the client has been authorized and -determines the behavior of the client instance. This state is persisted -in SessionStorage in browsers or in request session on the servers.

-
-

The Storage to use

-
user: { fhirUser: null | string; id: null | string; read: fhirclient.RequestFunction<fhirclient.FHIR.Patient | fhirclient.FHIR.Practitioner | fhirclient.FHIR.RelatedPerson>; resourceType: null | string }
-

The client may be associated with a specific user, if the scopes -permit that. This is a namespace for user-related functionality.

-

Type declaration

  • fhirUser: null | string
    -

    Returns the profile of the logged_in user (if any), or null if the -user is not available. This is a string having the shape -{user type}/{user id}. For example Practitioner/abc or -Patient/xyz.

    -
    alias

    client.getFhirUser()

    -
  • id: null | string
    -

    The ID of the current user or null if there is no current user

    -
  • read: fhirclient.RequestFunction<fhirclient.FHIR.Patient | fhirclient.FHIR.Practitioner | fhirclient.FHIR.RelatedPerson>
    -

    A method to fetch the current user resource from the FHIR server. -If there is no user context, it will reject with an error.

    -
    param Any

    options to pass to the fetch call.

    -
  • resourceType: null | string
    -

    Returns the type of the logged-in user or null. The result can be -Practitioner, Patient or RelatedPerson.

    -
    alias

    client.getUserType()

    -

Other Methods

  • _clearState(): Promise<void>
  • -

    Used internally to clear the state of the instance and the state in the -associated storage.

    -

    Returns Promise<void>

  • getAuthorizationHeader(): null | string
  • -

    Builds and returns the value of the Authorization header that can be -sent to the FHIR server

    -

    Returns null | string

  • getEncounterId(): null | string
  • -

    Returns the ID of the selected encounter or null. You should have -requested "launch/encounter" scope. Otherwise this will return null. -Note that not all servers support the "launch/encounter" scope so this -will be null if they don't.

    -

    Returns null | string

  • getFhirRelease(): Promise<number>
  • -

    Returns a promise that will be resolved with the numeric fhir version

    -
      -
    • 2 for DSTU2
    • -
    • 3 for STU3
    • -
    • 4 for R4
    • -
    • 0 if the version is not known
    • -
    -

    Returns Promise<number>

  • getFhirUser(): any
  • -

    Returns the profile of the logged_in user (if any). This is a string -having the following shape "{user type}/{user id}". For example: -"Practitioner/abc" or "Patient/xyz".

    -

    Returns any

  • getFhirVersion(): Promise<string>
  • -

    Returns a promise that will be resolved with the fhir version as defined -in the CapabilityStatement.

    -

    Returns Promise<string>

  • -

    Returns the (decoded) id_token if any. You need to request "openid" and -"profile" scopes if you need to receive an id_token (if you need to know -who the logged-in user is).

    -

    Returns null | fhirclient.IDToken

  • getPatientId(): null | string
  • -

    Returns the ID of the selected patient or null. You should have requested -"launch/patient" scope. Otherwise this will return null.

    -

    Returns null | string

  • getState(path?: string): any
  • -

    Returns a copy of the client state. Accepts a dot-separated path argument -(same as for getPath) to allow for selecting specific properties. -Examples:

    -
    client.getState(); // -> the entire state object
    client.getState("serverUrl"); // -> the URL we are connected to
    client.getState("tokenResponse.patient"); // -> The selected patient ID (if any) -
    -

    Parameters

    • path: string = ""
      -

      The path (eg. "a.b.4.c")

      -

    Returns any

    Whatever is found in the path or undefined

    -
  • getUserId(): any
  • getUserType(): any
  • -

    Returns the type of the logged-in user or null. The result can be -Practitioner, Patient or RelatedPerson.

    -

    Returns any

  • refresh(requestOptions?: RequestInit): Promise<any>
  • -

    Use the refresh token to obtain new access token. If the refresh token is -expired (or this fails for any other reason) it will be deleted from the -state, so that we don't enter into loops trying to re-authorize.

    -

    This method is typically called internally from request if -certain request fails with 401.

    -

    Parameters

    • requestOptions: RequestInit = {}

    Returns Promise<any>

  • refreshIfNeeded(requestOptions?: RequestInit): Promise<any>
  • -

    Checks if access token and refresh token are present. If they are, and if -the access token is expired or is about to expire in the next 10 seconds, -calls this.refresh() to obtain new access token.

    -

    Parameters

    • requestOptions: RequestInit = {}

    Returns Promise<any>

Utility Methods

  • getPath(obj: Record<string, any>, path?: string): any
  • -

    Walks through an object (or array) and returns the value found at the -provided path. This function is very simple so it intentionally does not -support any argument polymorphism, meaning that the path can only be a -dot-separated string. If the path is invalid returns undefined.

    -
    todo

    This should be deprecated and moved elsewhere. One should not have -to obtain an instance of Client just to use utility functions like this.

    -
    deprecated

    Parameters

    • obj: Record<string, any>
      -

      The object (or Array) to walk through

      -
    • path: string = ""
      -

      The path (eg. "a.b.4.c")

      -

    Returns any

    Whatever is found in the path or undefined

    -

Legend

  • Namespace
  • Variable
  • Function
  • Function with type parameter
  • Class
  • Constructor
  • Property
  • Method
  • Private property
  • Private method

Settings

Theme

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/typedoc/classes/lib_NodeAdapter.default.html b/docs/typedoc/classes/lib_NodeAdapter.default.html deleted file mode 100644 index b2352970..00000000 --- a/docs/typedoc/classes/lib_NodeAdapter.default.html +++ /dev/null @@ -1,58 +0,0 @@ -default | FHIRClient - v3.0.0-beta.1
Options
All
  • Public
  • Public/Protected
  • All
Menu
-

Node Adapter - works with native NodeJS and with Express

-

Hierarchy

  • default

Implements

Index

Constructors

  • new default(options: NodeAdapterOptions): default
  • Parameters

    • options: NodeAdapterOptions
      -

      Environment-specific options

      -

    Returns default

Properties

_storage: null | fhirclient.Storage = null
-

Holds the Storage instance associated with this instance

-
options: NodeAdapterOptions
-

Environment-specific options

-
security: { digestSha256: ((payload: string) => Promise<Buffer>); generatePKCEChallenge: ((entropy?: number) => Promise<PkcePair>); importJWK: ((jwk: fhirclient.JWK) => Promise<CryptoKey>); randomBytes: { (size: number): Buffer; (size: number, callback: ((err: null | Error, buf: Buffer) => void)): void }; signCompactJws: ((alg: SupportedAlg, privateKey: KeyLike, header: any, payload: any) => Promise<string>) } = ...

Type declaration

  • digestSha256: ((payload: string) => Promise<Buffer>)
      • (payload: string): Promise<Buffer>
      • Parameters

        • payload: string

        Returns Promise<Buffer>

  • generatePKCEChallenge: ((entropy?: number) => Promise<PkcePair>)
      • (entropy?: number): Promise<PkcePair>
      • Parameters

        • entropy: number = 96

        Returns Promise<PkcePair>

  • importJWK: ((jwk: fhirclient.JWK) => Promise<CryptoKey>)
  • randomBytes: { (size: number): Buffer; (size: number, callback: ((err: null | Error, buf: Buffer) => void)): void }
      • (size: number): Buffer
      • (size: number, callback: ((err: null | Error, buf: Buffer) => void)): void
      • -

        Generates cryptographically strong pseudorandom data. The size argument -is a number indicating the number of bytes to generate.

        -

        If a callback function is provided, the bytes are generated asynchronously -and the callback function is invoked with two arguments: err and buf. -If an error occurs, err will be an Error object; otherwise it is null. The buf argument is a Buffer containing the generated bytes.

        -
        // Asynchronous
        const {
        randomBytes,
        } = await import('node:crypto');

        randomBytes(256, (err, buf) => {
        if (err) throw err;
        console.log(`${buf.length} bytes of random data: ${buf.toString('hex')}`);
        }); -
        -

        If the callback function is not provided, the random bytes are generated -synchronously and returned as a Buffer. An error will be thrown if -there is a problem generating the bytes.

        -
        // Synchronous
        const {
        randomBytes,
        } = await import('node:crypto');

        const buf = randomBytes(256);
        console.log(
        `${buf.length} bytes of random data: ${buf.toString('hex')}`); -
        -

        The crypto.randomBytes() method will not complete until there is -sufficient entropy available. -This should normally never take longer than a few milliseconds. The only time -when generating the random bytes may conceivably block for a longer period of -time is right after boot, when the whole system is still low on entropy.

        -

        This API uses libuv's threadpool, which can have surprising and -negative performance implications for some applications; see the UV_THREADPOOL_SIZE documentation for more information.

        -

        The asynchronous version of crypto.randomBytes() is carried out in a single -threadpool request. To minimize threadpool task length variation, partition -large randomBytes requests when doing so as part of fulfilling a client -request.

        -
        since

        v0.5.8

        -

        Parameters

        • size: number
          -

          The number of bytes to generate. The size must not be larger than 2**31 - 1.

          -

        Returns Buffer

        if the callback function is not provided.

        -
      • Parameters

        • size: number
        • callback: ((err: null | Error, buf: Buffer) => void)
            • (err: null | Error, buf: Buffer): void
            • Parameters

              • err: null | Error
              • buf: Buffer

              Returns void

        Returns void

  • signCompactJws: ((alg: SupportedAlg, privateKey: KeyLike, header: any, payload: any) => Promise<string>)
      • (alg: SupportedAlg, privateKey: KeyLike, header: any, payload: any): Promise<string>
      • Parameters

        • alg: SupportedAlg
        • privateKey: KeyLike
        • header: any
        • payload: any

        Returns Promise<string>

Methods

  • base64urldecode(input: string): string
  • -

    Base64Url to ASCII string

    -

    Parameters

    • input: string

    Returns string

  • base64urlencode(input: string | Uint8Array): string
  • -

    ASCII string or Uint8Array to Base64URL

    -

    Parameters

    • input: string | Uint8Array

    Returns string

  • getProtocol(): string
  • Returns string

  • -

    Creates and returns adapter-aware SMART api. Not that while the shape of -the returned object is well known, the arguments to this function are not. -Those who override this method are free to require any environment-specific -arguments. For example in node we will need a request, a response and -optionally a storage or storage factory function.

    -

    Returns SMART_API

  • getUrl(): URL
  • -

    Given the current environment, this method returns the current url -as URL instance

    -

    Returns URL

  • redirect(location: string): void
  • -

    Given the current environment, this method must redirect to the given -path

    -

    Parameters

    • location: string

    Returns void

  • relative(path: string): string
  • -

    Given a relative path, compute and return the full url, assuming that -it is relative to the current location

    -

    Parameters

    • path: string

    Returns string

Legend

  • Namespace
  • Variable
  • Function
  • Function with type parameter
  • Class
  • Constructor
  • Property
  • Method
  • Protected property

Settings

Theme

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/typedoc/classes/lib_ServerStorage.default.html b/docs/typedoc/classes/lib_ServerStorage.default.html deleted file mode 100644 index cb2a28f5..00000000 --- a/docs/typedoc/classes/lib_ServerStorage.default.html +++ /dev/null @@ -1,11 +0,0 @@ -default | FHIRClient - v3.0.0-beta.1
Options
All
  • Public
  • Public/Protected
  • All
Menu

Hierarchy

  • default

Implements

Index

Constructors

Properties

Methods

Constructors

Properties

Methods

  • get(key: string): Promise<any>
  • -

    Gets the value at key. Returns a promise that will be resolved -with that value (or undefined for missing keys).

    -

    Parameters

    • key: string

    Returns Promise<any>

  • set(key: string, value: any): Promise<any>
  • -

    Sets the value on key and returns a promise that will be resolved -with the value that was set.

    -

    Parameters

    • key: string
    • value: any

    Returns Promise<any>

  • unset(key: string): Promise<boolean>
  • -

    Deletes the value at key. Returns a promise that will be resolved -with true if the key was deleted or with false if it was not (eg. if -did not exist).

    -

    Parameters

    • key: string

    Returns Promise<boolean>

Legend

  • Namespace
  • Variable
  • Function
  • Function with type parameter
  • Class
  • Constructor
  • Property
  • Method

Settings

Theme

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/typedoc/classes/storage_BrowserStorage.default.html b/docs/typedoc/classes/storage_BrowserStorage.default.html index c9c6ea51..e5200aa6 100644 --- a/docs/typedoc/classes/storage_BrowserStorage.default.html +++ b/docs/typedoc/classes/storage_BrowserStorage.default.html @@ -1,11 +1,11 @@ -default | FHIRClient - v3.0.0-beta.1
Options
All
  • Public
  • Public/Protected
  • All
Menu

Hierarchy

  • default

Index

Constructors

Methods

Constructors

Methods

  • get(key: string): Promise<any>

Legend

  • Namespace
  • Variable
  • Function
  • Function with type parameter
  • Class
  • Constructor
  • Method

Settings

Theme

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/typedoc/classes/storage_ServerStorage.default.html b/docs/typedoc/classes/storage_ServerStorage.default.html index 62ee9770..e020dd0f 100644 --- a/docs/typedoc/classes/storage_ServerStorage.default.html +++ b/docs/typedoc/classes/storage_ServerStorage.default.html @@ -1,14 +1,14 @@ -default | FHIRClient - v3.0.0-beta.1
Options
All
  • Public
  • Public/Protected
  • All
Menu

Hierarchy

  • default

Index

Constructors

Properties

Methods

Constructors

Properties

Methods

  • get(key: string): Promise<any>
  • Gets the value at key. Returns a promise that will be resolved with that value (or undefined for missing keys).

    -

    Parameters

    • key: string

    Returns Promise<any>

  • set(key: string, value: any): Promise<any>
  • set(key: string, value: any): Promise<any>
  • Sets the value on key and returns a promise that will be resolved with the value that was set.

    -

    Parameters

    • key: string
    • value: any

    Returns Promise<any>

  • unset(key: string): Promise<boolean>
  • unset(key: string): Promise<boolean>
  • Deletes the value at key. Returns a promise that will be resolved with true if the key was deleted or with false if it was not (eg. if did not exist).

    -

    Parameters

    • key: string

    Returns Promise<boolean>

Legend

  • Namespace
  • Variable
  • Function
  • Function with type parameter
  • Class
  • Constructor
  • Property
  • Method

Settings

Theme

Generated using TypeDoc

\ No newline at end of file +

Parameters

  • key: string

Returns Promise<boolean>

Legend

  • Namespace
  • Variable
  • Function
  • Function with type parameter
  • Class
  • Constructor
  • Property
  • Method

Settings

Theme

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/typedoc/index.html b/docs/typedoc/index.html index d73372f1..994a61cb 100644 --- a/docs/typedoc/index.html +++ b/docs/typedoc/index.html @@ -37,4 +37,4 @@

NPM Scripts

License

Apache 2.0

-

Legend

  • Namespace
  • Variable
  • Function
  • Function with type parameter
  • Class

Settings

Theme

Generated using TypeDoc

\ No newline at end of file +

Legend

  • Namespace
  • Variable
  • Function
  • Function with type parameter
  • Class

Settings

Theme

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/typedoc/interfaces/lib.fhirclient.Adapter.html b/docs/typedoc/interfaces/lib.fhirclient.Adapter.html deleted file mode 100644 index fa03cb57..00000000 --- a/docs/typedoc/interfaces/lib.fhirclient.Adapter.html +++ /dev/null @@ -1,26 +0,0 @@ -Adapter | FHIRClient - v3.0.0-beta.1
Options
All
  • Public
  • Public/Protected
  • All
Menu

Hierarchy

  • Adapter

Implemented by

Index

Properties

-

Environment-specific options

-
security: { digestSha256: any; generatePKCEChallenge: any; importJWK: any; randomBytes: any; signCompactJws: any }

Type declaration

  • digestSha256:function
    • digestSha256(payload: string): Promise<Uint8Array>
    • Parameters

      • payload: string

      Returns Promise<Uint8Array>

  • generatePKCEChallenge:function
    • generatePKCEChallenge(entropy?: number): Promise<{ codeChallenge: string; codeVerifier: string }>
    • Parameters

      • Optional entropy: number

      Returns Promise<{ codeChallenge: string; codeVerifier: string }>

  • importJWK:function
    • Parameters

      Returns Promise<CryptoKey>

  • randomBytes:function
    • randomBytes(count: number): Uint8Array
    • Parameters

      • count: number

      Returns Uint8Array

  • signCompactJws:function
    • signCompactJws(alg: "ES384" | "RS384", privateKey: CryptoKey, header: any, payload: any): Promise<string>
    • Parameters

      • alg: "ES384" | "RS384"
      • privateKey: CryptoKey
      • header: any
      • payload: any

      Returns Promise<string>

Methods

  • base64urldecode(input: string): string
  • -

    Base64Url to ASCII string

    -

    Parameters

    • input: string

    Returns string

  • base64urlencode(input: string | Uint8Array): string
  • -

    ASCII string or Uint8Array to Base64URL

    -

    Parameters

    • input: string | Uint8Array

    Returns string

  • -

    Creates and returns adapter-aware SMART api. Not that while the shape of -the returned object is well known, the arguments to this function are not. -Those who override this method are free to require any environment-specific -arguments. For example in node we will need a request, a response and -optionally a storage or storage factory function.

    -

    Returns SMART_API

  • -

    This must return a Storage object

    -

    Returns fhirclient.Storage

  • getUrl(): URL
  • -

    Given the current environment, this method returns the current url -as URL instance

    -

    Returns URL

  • redirect(to: string): void | Promise<any>
  • -

    Given the current environment, this method must redirect to the given -path

    -

    Parameters

    • to: string

    Returns void | Promise<any>

  • relative(path: string): string
  • -

    Given a relative path, compute and return the full url, assuming that -it is relative to the current location

    -

    Parameters

    • path: string
      -

      The path to convert to absolute

      -

    Returns string

Legend

  • Namespace
  • Variable
  • Function
  • Function with type parameter
  • Property
  • Method
  • Class

Settings

Theme

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/typedoc/interfaces/lib.fhirclient.AuthorizeParams.html b/docs/typedoc/interfaces/lib.fhirclient.AuthorizeParams.html deleted file mode 100644 index 5db11043..00000000 --- a/docs/typedoc/interfaces/lib.fhirclient.AuthorizeParams.html +++ /dev/null @@ -1,110 +0,0 @@ -AuthorizeParams | FHIRClient - v3.0.0-beta.1
Options
All
  • Public
  • Public/Protected
  • All
Menu
-

Authorization parameters that can be passed to authorize or init

-

Hierarchy

  • AuthorizeParams

Index

Properties

clientId?: string
-

The clientId that you have obtained while registering your app in the -EHR. This is not required if you only intend to communicate with open -FHIR servers.

-
clientPrivateJwk?: fhirclient.JWK
-

If you have registered a confidential client, you should pass your -clientPrivateJwk here. Note: ONLY use this on the server, as -the browsers are considered incapable of keeping a secret.

-
clientPublicKeySetUrl?: string
-

If you have registered a confidential client and you host your public -key online, you can pass your JWKS URL here Note: ONLY use this on the server, as the -browsers are considered incapable of keeping a secret.

-
clientSecret?: string
-

If you have registered a confidential client, you should pass your -clientSecret here. Note: ONLY use this on the server, as the -browsers are considered incapable of keeping a secret.

-
completeInTarget?: boolean
-

If true, the app will be initialized in the specified AuthorizeParams.target. -Otherwise, the app will be initialized in the window in which -authorize was called.

-
encounterId?: string
-

The ID of the selected encounter. If you are launching against an open -FHIR server, there is no way to obtain the launch context that would -(in some EHRs) include the selected encounter ID. This way you can -"inject" that ID and make the client behave as if this is the currently -active encounter.

-
fakeTokenResponse?: object
-

Useful for testing. This object can contain any properties that are -typically contained in an access token response. -These properties will be stored into the client state, as if it has been -authorized.

-
fhirServiceUrl?: string
-

The base URL of the FHIR server to use. This is just like the iss -option, except that it is designed to bypass the authentication. If -fhirServiceUrl is passed, the authorize function will NOT actually -attempt to authorize. It will skip that and redirect you to your -redirectUri.

-
height?: number
-

The height of the authorization popup window. Only used in browsers -and if the AuthorizeParams.target option is set to "popup".

-
iss?: string
-

This is the URL of the service you are connecting to. -For EHR Launch -you MUST NOT provide this option. It will be passed by the EHR as -url parameter instead. Using iss as an option will "lock" your app to -that service provider. In other words, passing an iss option is how -you can do Standalone Launch.

-
issMatch?: string | RegExp | ((iss: string) => boolean)
-

Can be used to verify that the app is being launched against certain -servers. This is especially useful when working with multiple EHR -configurations. Can be a string (in which case it will be expected to -match the provided ISS exactly), a regular expression to test against -the current ISS, or a function that will be called with the current -ISS and should return true or false to signify if that ISS is acceptable.

-
launch?: string
-

Do not pass use this option, unless you want to test it. It should come -as url parameter from the SMART authorization server as part of the EHR -launch sequence

-
noRedirect?: boolean
patientId?: string
-

The ID of the selected patient. If you are launching against an open FHIR -server, there is no way to obtain the launch context that would include -the selected patient ID. This way you can "inject" that ID and make the -client behave as if that is the currently active patient.

-
pkceMode?: fhirclient.PkceMode
-

Client expectations for PKCE (Proof Key for Code Exchange). Can be -one of:

-
    -
  • ifSupported Use if a matching code challenge method is available (default)
  • -
  • required Do not attempt authorization to servers without support
  • -
  • disabled Do not use PKCE
  • -
  • unsafeV1 Use against Smart v1 servers. Smart v1 does not define - conformance, so validate your server supports PKCE before using - this setting
  • -
-
redirectUri?: string
-

Defaults to the current directory (it's index file)

-
refreshTokenWithCredentials?: RequestCredentials
-

Do we want to send cookies while making a request to the token -endpoint in order to obtain new access token using existing refresh -token. In rare cases the auth server might require the client to send -cookies along with those requests. Can be one of:

-
    -
  • "include" - always send cookies
  • -
  • "same-origin" - only send cookies if we are on the same domain (default)
  • -
  • "omit" - do not send cookies
  • -
-
scope?: string
-

One or more space-separated scopes that you would like to request from -the EHR. Learn more

-
-

Where to start the auth flow. This option is only applicable in -browsers and is ignored on the server. Can be one of:

-
    -
  • _self Authorize in the same window (default)
  • -
  • _top Authorize in the topmost window
  • -
  • _parent Authorize in the parent window
  • -
  • _blank Authorize in new tab or window
  • -
  • "popup" Open a popup, authorize in it and close it when done
  • -
  • String Frame name (string index in window.frames)
  • -
  • Number Numeric index in window.frames
  • -
  • Object Window reference (must have the same origin)
  • -
  • Function A function that returns one of the above values or a -promise that will resolve to such value.
  • -
-
width?: number
-

The width of the authorization popup window. Only used in browsers -and if the AuthorizeParams.target option is set to "popup".

-

Legend

  • Namespace
  • Variable
  • Function
  • Function with type parameter
  • Property
  • Class

Settings

Theme

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/typedoc/interfaces/lib.fhirclient.BrowserFHIRSettings.html b/docs/typedoc/interfaces/lib.fhirclient.BrowserFHIRSettings.html deleted file mode 100644 index f4de97ba..00000000 --- a/docs/typedoc/interfaces/lib.fhirclient.BrowserFHIRSettings.html +++ /dev/null @@ -1 +0,0 @@ -BrowserFHIRSettings | FHIRClient - v3.0.0-beta.1
Options
All
  • Public
  • Public/Protected
  • All
Menu

Legend

  • Namespace
  • Variable
  • Function
  • Function with type parameter
  • Class

Settings

Theme

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/typedoc/interfaces/lib.fhirclient.ClientInterface.html b/docs/typedoc/interfaces/lib.fhirclient.ClientInterface.html deleted file mode 100644 index 44f85b56..00000000 --- a/docs/typedoc/interfaces/lib.fhirclient.ClientInterface.html +++ /dev/null @@ -1,152 +0,0 @@ -ClientInterface | FHIRClient - v3.0.0-beta.1
Options
All
  • Public
  • Public/Protected
  • All
Menu

Hierarchy

  • ClientInterface

Implemented by

Index

Properties

encounter: { id: null | string; read: fhirclient.RequestFunction<fhirclient.FHIR.Encounter> }
-

The client may be associated with a specific encounter, if the scopes -permit that and if the back-end server supports that. This is a namespace -for encounter-related functionality.

-

Type declaration

  • id: null | string
    -

    The ID of the current encounter or null if there is no current -encounter

    -
  • read: fhirclient.RequestFunction<fhirclient.FHIR.Encounter>
    -

    A method to fetch the current encounter resource from the FHIR server. -If there is no encounter context, it will reject with an error.

    -
    param Any

    options to pass to the fetch call.

    -
getFhirRelease: any
getFhirVersion: any
getPath: any
getState: any
patient: { id: null | string; read: fhirclient.RequestFunction<fhirclient.FHIR.Patient>; request: any }
-

A SMART app is typically associated with a patient. This is a namespace -for the patient-related functionality of the client.

-

Type declaration

  • id: null | string
    -

    The ID of the current patient or null if there is no current patient

    -
  • read: fhirclient.RequestFunction<fhirclient.FHIR.Patient>
    -

    A method to fetch the current patient resource from the FHIR server. -If there is no patient context, it will reject with an error.

    -
    param [requestOptions]

    Any options to pass to the fetch call.

    -
  • request:function
    • -

      This is similar to request but it makes requests in the -context of the current patient. For example, instead of doing

      -
      client.request("Observation?patient=" + client.patient.id)
      -
      -

      you can do

      -
      client.patient.request("Observation")
      -
      -

      The return type depends on the arguments. Typically it will be the -response payload JSON object. Can also be a string or the Response -object itself if we have received a non-json result, which allows us -to handle even binary responses. Can also be a CombinedFetchResult -object if the requestOptions.includeResponses has been set to true.

      -

      Type Parameters

      Parameters

      Returns Promise<R>

-

The state of the client instance is an object with various properties. -It contains some details about how the client has been authorized and -determines the behavior of the client instance. This state is persisted -in SessionStorage in browsers or in request session on the servers.

-
-

The Storage to use

-
user: { fhirUser: null | string; id: null | string; read: fhirclient.RequestFunction<fhirclient.FHIR.Patient | fhirclient.FHIR.Practitioner | fhirclient.FHIR.RelatedPerson>; resourceType: null | string }
-

The client may be associated with a specific user, if the scopes -permit that. This is a namespace for user-related functionality.

-

Type declaration

  • fhirUser: null | string
    -

    Returns the profile of the logged_in user (if any), or null if the -user is not available. This is a string having the shape -{user type}/{user id}. For example Practitioner/abc or -Patient/xyz.

    -
    alias

    client.getFhirUser()

    -
  • id: null | string
    -

    The ID of the current user or null if there is no current user

    -
  • read: fhirclient.RequestFunction<fhirclient.FHIR.Patient | fhirclient.FHIR.Practitioner | fhirclient.FHIR.RelatedPerson>
    -

    A method to fetch the current user resource from the FHIR server. -If there is no user context, it will reject with an error.

    -
    param Any

    options to pass to the fetch call.

    -
  • resourceType: null | string
    -

    Returns the type of the logged-in user or null. The result can be -Practitioner, Patient or RelatedPerson.

    -
    alias

    client.getUserType()

    -

Other Methods

  • getAuthorizationHeader(): null | string
  • -

    Builds and returns the value of the Authorization header that can be -sent to the FHIR server

    -

    Returns null | string

  • getEncounterId(): null | string
  • -

    Returns the ID of the selected encounter or null. You should have -requested "launch/encounter" scope. Otherwise this will return null. -Note that not all servers support the "launch/encounter" scope so this -will be null if they don't.

    -

    Returns null | string

  • getFhirUser(): null | string
  • -

    Returns the profile of the logged_in user (if any). This is a string -having the following shape "{user type}/{user id}". For example: -"Practitioner/abc" or "Patient/xyz".

    -

    Returns null | string

  • -

    Returns the (decoded) id_token if any. You need to request "openid" and -"profile" scopes if you need to receive an id_token (if you need to know -who the logged-in user is).

    -

    Returns null | fhirclient.IDToken

  • getPatientId(): null | string
  • -

    Returns the ID of the selected patient or null. You should have requested -"launch/patient" scope. Otherwise this will return null.

    -

    Returns null | string

  • getUserId(): null | string
  • -

    Returns the user ID or null.

    -

    Returns null | string

  • getUserType(): null | string
  • -

    Returns the type of the logged-in user or null. The result can be -Practitioner, Patient or RelatedPerson.

    -

    Returns null | string

Request Methods

  • -

    Removes an existing resource.

    -
    see

    http://hl7.org/fhir/http.html#delete

    -

    Type Parameters

    • R = unknown

    Parameters

    • url: string
      -

      Relative URI of the FHIR resource to be deleted -(format: resourceType/id)

      -
    • Optional requestOptions: fhirclient.FetchOptions
      -

      Any options (except method which will be fixed -to DELETE) to be passed to the fetch call.

      -

    Returns Promise<R>

  • -

    Makes a JSON Patch to the given resource

    -
    see

    http://hl7.org/fhir/http.html#patch

    -
    since

    2.4.0

    -

    Type Parameters

    • ResolveType = fhirclient.FHIR.Resource

      -

      This method would typically resolve with the -patched resource or reject with an OperationOutcome. However, this may -depend on the server implementation or even on the request headers. -For that reason, if the default resolve type (which is -fhirclient.FHIR.Resource) does not work for you, you can pass -in your own resolve type parameter.

      -

    Parameters

    Returns Promise<ResolveType>

  • -

    Use the refresh token to obtain new access token. If the refresh token is -expired (or this fails for any other reason) it will be deleted from the -state, so that we don't enter into loops trying to re-authorize.

    -

    This method is typically called internally from request if -certain request fails with 401.

    -

    Parameters

    • Optional requestOptions: RequestInit
      -

      Any options to pass to the fetch call. Most of them -will be overridden, bit it might still be useful for passing additional -request options or an abort signal.

      -

    Returns Promise<fhirclient.ClientState>

  • -

    Checks if access token and refresh token are present. If they are, and if -the access token is expired or is about to expire in the next 10 seconds, -calls this.refresh() to obtain new access token.

    -

    Parameters

    • Optional requestOptions: RequestInit
      -

      Any options to pass to the fetch call. Most of them -will be overridden, bit it might still be useful for passing additional -request options or an abort signal.

      -

    Returns Promise<fhirclient.ClientState>

  • Type Parameters

    • T = any

    Parameters

    Returns Promise<T>

Legend

  • Namespace
  • Variable
  • Function
  • Function with type parameter
  • Property
  • Method
  • Class

Settings

Theme

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/typedoc/interfaces/lib.fhirclient.ClientState.html b/docs/typedoc/interfaces/lib.fhirclient.ClientState.html deleted file mode 100644 index d4ede64f..00000000 --- a/docs/typedoc/interfaces/lib.fhirclient.ClientState.html +++ /dev/null @@ -1,63 +0,0 @@ -ClientState | FHIRClient - v3.0.0-beta.1
Options
All
  • Public
  • Public/Protected
  • All
Menu
-

Describes the state that should be passed to the Client constructor. -Everything except serverUrl is optional

-

Hierarchy

  • ClientState

Index

Properties

authorizeUri?: string
-

You must call this endpoint to ask for authorization code

-
clientId?: string
-

The clientId that you should have obtained while registering your -app with the auth server or EHR (as set in the configuration options)

-
clientPrivateJwk?: fhirclient.JWK
-

Your client private JWK if you have one (for asymmetric confidential clients)

-
clientPublicKeySetUrl?: string
-

Your client public JWKS url if you have one -(for asymmetric confidential clients that have registered a JWKS URL)

-
clientSecret?: string
-

Your client secret if you have one (for symmetric confidential clients)

-
codeChallenge?: string
-

PKCE code challenge base value.

-
codeVerifier?: string
-

PKCE code verification, formatted with base64url-encode (RFC 4648 § 5) -without padding, which is NOT the same as regular base64 encoding.

-
completeInTarget?: boolean
-

If true, the app requested to be initialized in the specified AuthorizeParams.target. -Otherwise, the app requested to be initialized in the window in which -authorize was called.

-
expiresAt?: number
-

An Unix timestamp (JSON numeric value representing the number of -seconds since 1970). This updated every time an access token is -received from the server.

-
key?: string
-

The key under which this state is persisted in the storage

-
password?: string
-

The password for basic auth. If present, username must also be provided.

-
redirectUri?: string
-

The URI to redirect to after successful authorization, as set in the -configuration options.

-
refreshTokenWithCredentials?: RequestCredentials
-

Do we want to send cookies while making a request to the token -endpoint in order to obtain new access token using existing refresh -token. In rare cases the auth server might require the client to send -cookies along with those requests. Can be one of:

-
    -
  • "include" - always send cookies
  • -
  • "same-origin" - only send cookies if we are on the same domain (default)
  • -
  • "omit" - do not send cookies
  • -
-
registrationUri?: string
-

You could register new SMART client at this endpoint (if the server -supports dynamic client registration)

-
scope?: string
-

The access scopes that you requested in your options (or an empty string).

-
see

http://docs.smarthealthit.org/authorization/scopes-and-launch-context/

-
serverUrl: string
-

The base URL of the Fhir server. The library should have detected it -at authorization time from request query params of from config options.

-
tokenResponse?: fhirclient.TokenResponse
-

The response object received from the token endpoint while trying to -exchange the auth code for an access token (if you have reached that point).

-
tokenUri?: string
-

You must call this endpoint to exchange your authorization code -for an access token.

-
username?: string
-

The username for basic auth. If present, password must also be provided.

-

Legend

  • Namespace
  • Variable
  • Function
  • Function with type parameter
  • Property
  • Class

Settings

Theme

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/typedoc/interfaces/lib.fhirclient.CombinedFetchResult.html b/docs/typedoc/interfaces/lib.fhirclient.CombinedFetchResult.html deleted file mode 100644 index afd939eb..00000000 --- a/docs/typedoc/interfaces/lib.fhirclient.CombinedFetchResult.html +++ /dev/null @@ -1,5 +0,0 @@ -CombinedFetchResult | FHIRClient - v3.0.0-beta.1
Options
All
  • Public
  • Public/Protected
  • All
Menu
-

If an includeResponse is set to true when calling the lib.request -function the returned object will include the Response object and the -parsed body if available

-

Type Parameters

Hierarchy

  • CombinedFetchResult

Index

Properties

Properties

body?: T
response: Response

Legend

  • Namespace
  • Variable
  • Function
  • Function with type parameter
  • Property
  • Class

Settings

Theme

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/typedoc/interfaces/lib.fhirclient.ES384JWK.html b/docs/typedoc/interfaces/lib.fhirclient.ES384JWK.html deleted file mode 100644 index cdfca155..00000000 --- a/docs/typedoc/interfaces/lib.fhirclient.ES384JWK.html +++ /dev/null @@ -1 +0,0 @@ -ES384JWK | FHIRClient - v3.0.0-beta.1
Options
All
  • Public
  • Public/Protected
  • All
Menu

Hierarchy

  • JsonWebKey
    • ES384JWK

Indexable

[propName: string]: unknown

Index

Properties

alg: "ES384"
crv: "P-384"
d?: string
dp?: string
dq?: string
e?: string
ext?: boolean
k?: string
key_ops?: KeyUsage[]
kid: string
kty: "EC"
n?: string
oth?: RsaOtherPrimesInfo[]
p?: string
q?: string
qi?: string
use?: string
x?: string
y?: string

Legend

  • Namespace
  • Variable
  • Function
  • Function with type parameter
  • Property
  • Class

Settings

Theme

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/typedoc/interfaces/lib.fhirclient.FHIR.BackboneElement.html b/docs/typedoc/interfaces/lib.fhirclient.FHIR.BackboneElement.html deleted file mode 100644 index cfc487bd..00000000 --- a/docs/typedoc/interfaces/lib.fhirclient.FHIR.BackboneElement.html +++ /dev/null @@ -1 +0,0 @@ -BackboneElement | FHIRClient - v3.0.0-beta.1
Options
All
  • Public
  • Public/Protected
  • All
Menu

Legend

  • Namespace
  • Variable
  • Function
  • Function with type parameter
  • Property
  • Class

Settings

Theme

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/typedoc/interfaces/lib.fhirclient.FHIR.Bundle.html b/docs/typedoc/interfaces/lib.fhirclient.FHIR.Bundle.html deleted file mode 100644 index 58dd7ff1..00000000 --- a/docs/typedoc/interfaces/lib.fhirclient.FHIR.Bundle.html +++ /dev/null @@ -1,11 +0,0 @@ -Bundle | FHIRClient - v3.0.0-beta.1
Options
All
  • Public
  • Public/Protected
  • All
Menu

Hierarchy

Index

Properties

id?: string
-

Logical id of this artifact

-
-

Persistent identifier for the bundle

-
implicitRules?: string
-

A set of rules under which this content was created

-
language?: string
-

Language of the resource content

-
-

Metadata about the resource

-
resourceType?: string
total?: number
type: "message" | "document" | "history" | "transaction" | "transaction-response" | "batch" | "batch-response" | "searchset" | "collection"

Legend

  • Namespace
  • Variable
  • Function
  • Function with type parameter
  • Property
  • Class

Settings

Theme

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/typedoc/interfaces/lib.fhirclient.FHIR.BundleEntry.html b/docs/typedoc/interfaces/lib.fhirclient.FHIR.BundleEntry.html deleted file mode 100644 index c87d0db2..00000000 --- a/docs/typedoc/interfaces/lib.fhirclient.FHIR.BundleEntry.html +++ /dev/null @@ -1 +0,0 @@ -BundleEntry | FHIRClient - v3.0.0-beta.1
Options
All
  • Public
  • Public/Protected
  • All
Menu

Legend

  • Namespace
  • Variable
  • Function
  • Function with type parameter
  • Property
  • Class

Settings

Theme

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/typedoc/interfaces/lib.fhirclient.FHIR.BundleLink.html b/docs/typedoc/interfaces/lib.fhirclient.FHIR.BundleLink.html deleted file mode 100644 index 288c055e..00000000 --- a/docs/typedoc/interfaces/lib.fhirclient.FHIR.BundleLink.html +++ /dev/null @@ -1 +0,0 @@ -BundleLink | FHIRClient - v3.0.0-beta.1
Options
All
  • Public
  • Public/Protected
  • All
Menu

Legend

  • Namespace
  • Variable
  • Function
  • Function with type parameter
  • Property
  • Class

Settings

Theme

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/typedoc/interfaces/lib.fhirclient.FHIR.CapabilityStatement.html b/docs/typedoc/interfaces/lib.fhirclient.FHIR.CapabilityStatement.html deleted file mode 100644 index 0816d1d8..00000000 --- a/docs/typedoc/interfaces/lib.fhirclient.FHIR.CapabilityStatement.html +++ /dev/null @@ -1 +0,0 @@ -CapabilityStatement | FHIRClient - v3.0.0-beta.1
Options
All
  • Public
  • Public/Protected
  • All
Menu

Legend

  • Namespace
  • Variable
  • Function
  • Function with type parameter
  • Property
  • Class

Settings

Theme

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/typedoc/interfaces/lib.fhirclient.FHIR.CodeableConcept.html b/docs/typedoc/interfaces/lib.fhirclient.FHIR.CodeableConcept.html deleted file mode 100644 index 18b792f2..00000000 --- a/docs/typedoc/interfaces/lib.fhirclient.FHIR.CodeableConcept.html +++ /dev/null @@ -1,5 +0,0 @@ -CodeableConcept | FHIRClient - v3.0.0-beta.1
Options
All
  • Public
  • Public/Protected
  • All
Menu

Hierarchy

Index

Properties

-

Code defined by a terminology system

-
id?: string
text?: string
-

Plain text representation of the concept

-

Legend

  • Namespace
  • Variable
  • Function
  • Function with type parameter
  • Property
  • Class

Settings

Theme

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/typedoc/interfaces/lib.fhirclient.FHIR.Coding.html b/docs/typedoc/interfaces/lib.fhirclient.FHIR.Coding.html deleted file mode 100644 index b566fee3..00000000 --- a/docs/typedoc/interfaces/lib.fhirclient.FHIR.Coding.html +++ /dev/null @@ -1,11 +0,0 @@ -Coding | FHIRClient - v3.0.0-beta.1
Options
All
  • Public
  • Public/Protected
  • All
Menu

Hierarchy

Index

Properties

code?: string
-

Symbol in syntax defined by the system

-
display?: string
-

Representation defined by the system

-
id?: string
system?: string
-

Identity of the terminology system

-
userSelected?: boolean
-

If this coding was chosen directly by the user

-
version?: string
-

Version of the system - if relevant

-

Legend

  • Namespace
  • Variable
  • Function
  • Function with type parameter
  • Property
  • Class

Settings

Theme

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/typedoc/interfaces/lib.fhirclient.FHIR.Element.html b/docs/typedoc/interfaces/lib.fhirclient.FHIR.Element.html deleted file mode 100644 index 72586d9f..00000000 --- a/docs/typedoc/interfaces/lib.fhirclient.FHIR.Element.html +++ /dev/null @@ -1 +0,0 @@ -Element | FHIRClient - v3.0.0-beta.1
Options
All
  • Public
  • Public/Protected
  • All
Menu

Legend

  • Namespace
  • Variable
  • Function
  • Function with type parameter
  • Property
  • Class

Settings

Theme

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/typedoc/interfaces/lib.fhirclient.FHIR.Encounter.html b/docs/typedoc/interfaces/lib.fhirclient.FHIR.Encounter.html deleted file mode 100644 index 55e95114..00000000 --- a/docs/typedoc/interfaces/lib.fhirclient.FHIR.Encounter.html +++ /dev/null @@ -1,9 +0,0 @@ -Encounter | FHIRClient - v3.0.0-beta.1
Options
All
  • Public
  • Public/Protected
  • All
Menu

Hierarchy

Index

Properties

id?: string
-

Logical id of this artifact

-
implicitRules?: string
-

A set of rules under which this content was created

-
language?: string
-

Language of the resource content

-
-

Metadata about the resource

-
resourceType: "Encounter"

Legend

  • Namespace
  • Variable
  • Function
  • Function with type parameter
  • Property
  • Class

Settings

Theme

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/typedoc/interfaces/lib.fhirclient.FHIR.Extension.html b/docs/typedoc/interfaces/lib.fhirclient.FHIR.Extension.html deleted file mode 100644 index fdd74351..00000000 --- a/docs/typedoc/interfaces/lib.fhirclient.FHIR.Extension.html +++ /dev/null @@ -1,3 +0,0 @@ -Extension | FHIRClient - v3.0.0-beta.1
Options
All
  • Public
  • Public/Protected
  • All
Menu

Legend

  • Namespace
  • Variable
  • Function
  • Function with type parameter
  • Property
  • Class

Settings

Theme

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/typedoc/interfaces/lib.fhirclient.FHIR.Identifier.html b/docs/typedoc/interfaces/lib.fhirclient.FHIR.Identifier.html deleted file mode 100644 index 6db96b7a..00000000 --- a/docs/typedoc/interfaces/lib.fhirclient.FHIR.Identifier.html +++ /dev/null @@ -1,11 +0,0 @@ -Identifier | FHIRClient - v3.0.0-beta.1
Options
All
  • Public
  • Public/Protected
  • All
Menu

Hierarchy

Index

Properties

-

Organization that issued id (may be just text)

-
id?: string
-

Time period when id is/was valid for use

-
system?: string
-

The namespace for the identifier value

-
-

Description of identifier

-
use?: "usual" | "official" | "temp" | "secondary"
value?: string
-

The value that is unique

-

Legend

  • Namespace
  • Variable
  • Function
  • Function with type parameter
  • Property
  • Class

Settings

Theme

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/typedoc/interfaces/lib.fhirclient.FHIR.Meta.html b/docs/typedoc/interfaces/lib.fhirclient.FHIR.Meta.html deleted file mode 100644 index 211fc5db..00000000 --- a/docs/typedoc/interfaces/lib.fhirclient.FHIR.Meta.html +++ /dev/null @@ -1,3 +0,0 @@ -Meta | FHIRClient - v3.0.0-beta.1
Options
All
  • Public
  • Public/Protected
  • All
Menu

Legend

  • Namespace
  • Variable
  • Function
  • Function with type parameter
  • Property
  • Class

Settings

Theme

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/typedoc/interfaces/lib.fhirclient.FHIR.Observation.html b/docs/typedoc/interfaces/lib.fhirclient.FHIR.Observation.html deleted file mode 100644 index 40e17be8..00000000 --- a/docs/typedoc/interfaces/lib.fhirclient.FHIR.Observation.html +++ /dev/null @@ -1,9 +0,0 @@ -Observation | FHIRClient - v3.0.0-beta.1
Options
All
  • Public
  • Public/Protected
  • All
Menu

Hierarchy

Index

Properties

id?: string
-

Logical id of this artifact

-
implicitRules?: string
-

A set of rules under which this content was created

-
language?: string
-

Language of the resource content

-
-

Metadata about the resource

-
resourceType: "Observation"

Legend

  • Namespace
  • Variable
  • Function
  • Function with type parameter
  • Property
  • Class

Settings

Theme

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/typedoc/interfaces/lib.fhirclient.FHIR.Patient.html b/docs/typedoc/interfaces/lib.fhirclient.FHIR.Patient.html deleted file mode 100644 index 4ec060b4..00000000 --- a/docs/typedoc/interfaces/lib.fhirclient.FHIR.Patient.html +++ /dev/null @@ -1,9 +0,0 @@ -Patient | FHIRClient - v3.0.0-beta.1
Options
All
  • Public
  • Public/Protected
  • All
Menu

Hierarchy

Index

Properties

id?: string
-

Logical id of this artifact

-
implicitRules?: string
-

A set of rules under which this content was created

-
language?: string
-

Language of the resource content

-
-

Metadata about the resource

-
resourceType: "Patient"

Legend

  • Namespace
  • Variable
  • Function
  • Function with type parameter
  • Property
  • Class

Settings

Theme

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/typedoc/interfaces/lib.fhirclient.FHIR.Period.html b/docs/typedoc/interfaces/lib.fhirclient.FHIR.Period.html deleted file mode 100644 index e515c12e..00000000 --- a/docs/typedoc/interfaces/lib.fhirclient.FHIR.Period.html +++ /dev/null @@ -1,5 +0,0 @@ -Period | FHIRClient - v3.0.0-beta.1
Options
All
  • Public
  • Public/Protected
  • All
Menu

Hierarchy

Index

Properties

end?: string
-

End time with inclusive boundary, if not ongoing

-
id?: string
start?: string
-

Starting time with inclusive boundary

-

Legend

  • Namespace
  • Variable
  • Function
  • Function with type parameter
  • Property
  • Class

Settings

Theme

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/typedoc/interfaces/lib.fhirclient.FHIR.Practitioner.html b/docs/typedoc/interfaces/lib.fhirclient.FHIR.Practitioner.html deleted file mode 100644 index 34d777bd..00000000 --- a/docs/typedoc/interfaces/lib.fhirclient.FHIR.Practitioner.html +++ /dev/null @@ -1,9 +0,0 @@ -Practitioner | FHIRClient - v3.0.0-beta.1
Options
All
  • Public
  • Public/Protected
  • All
Menu

Hierarchy

Index

Properties

id?: string
-

Logical id of this artifact

-
implicitRules?: string
-

A set of rules under which this content was created

-
language?: string
-

Language of the resource content

-
-

Metadata about the resource

-
resourceType: "Practitioner"

Legend

  • Namespace
  • Variable
  • Function
  • Function with type parameter
  • Property
  • Class

Settings

Theme

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/typedoc/interfaces/lib.fhirclient.FHIR.Reference.html b/docs/typedoc/interfaces/lib.fhirclient.FHIR.Reference.html deleted file mode 100644 index 8f43de21..00000000 --- a/docs/typedoc/interfaces/lib.fhirclient.FHIR.Reference.html +++ /dev/null @@ -1,7 +0,0 @@ -Reference | FHIRClient - v3.0.0-beta.1
Options
All
  • Public
  • Public/Protected
  • All
Menu

Hierarchy

Index

Properties

display?: string
-

Text alternative for the resource

-
id?: string
-

Logical reference, when literal reference is not known

-
reference?: string
-

Literal reference, Relative, internal or absolute URL

-

Legend

  • Namespace
  • Variable
  • Function
  • Function with type parameter
  • Property
  • Class

Settings

Theme

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/typedoc/interfaces/lib.fhirclient.FHIR.RelatedPerson.html b/docs/typedoc/interfaces/lib.fhirclient.FHIR.RelatedPerson.html deleted file mode 100644 index dfdb13ce..00000000 --- a/docs/typedoc/interfaces/lib.fhirclient.FHIR.RelatedPerson.html +++ /dev/null @@ -1,9 +0,0 @@ -RelatedPerson | FHIRClient - v3.0.0-beta.1
Options
All
  • Public
  • Public/Protected
  • All
Menu

Hierarchy

Index

Properties

id?: string
-

Logical id of this artifact

-
implicitRules?: string
-

A set of rules under which this content was created

-
language?: string
-

Language of the resource content

-
-

Metadata about the resource

-
resourceType: "RelatedPerson"

Legend

  • Namespace
  • Variable
  • Function
  • Function with type parameter
  • Property
  • Class

Settings

Theme

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/typedoc/interfaces/lib.fhirclient.FHIR.Resource.html b/docs/typedoc/interfaces/lib.fhirclient.FHIR.Resource.html deleted file mode 100644 index 8689112e..00000000 --- a/docs/typedoc/interfaces/lib.fhirclient.FHIR.Resource.html +++ /dev/null @@ -1,9 +0,0 @@ -Resource | FHIRClient - v3.0.0-beta.1
Options
All
  • Public
  • Public/Protected
  • All
Menu

Hierarchy

Index

Properties

id?: string
-

Logical id of this artifact

-
implicitRules?: string
-

A set of rules under which this content was created

-
language?: string
-

Language of the resource content

-
-

Metadata about the resource

-
resourceType?: string

Legend

  • Namespace
  • Variable
  • Function
  • Function with type parameter
  • Property
  • Class

Settings

Theme

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/typedoc/interfaces/lib.fhirclient.FetchOptions.html b/docs/typedoc/interfaces/lib.fhirclient.FetchOptions.html deleted file mode 100644 index db04eb1c..00000000 --- a/docs/typedoc/interfaces/lib.fhirclient.FetchOptions.html +++ /dev/null @@ -1,33 +0,0 @@ -FetchOptions | FHIRClient - v3.0.0-beta.1
Options
All
  • Public
  • Public/Protected
  • All
Menu
-

Options passed to the lib.request function

-

Hierarchy

  • RequestInit
    • FetchOptions

Index

Properties

body?: null | BodyInit
-

A BodyInit object or null to set request's body.

-
cache?: RequestCache
-

A string indicating how the request will interact with the browser's cache to set request's cache.

-
credentials?: RequestCredentials
-

A string indicating whether credentials will be sent with the request always, never, or only when sent to a same-origin URL. Sets request's credentials.

-
headers?: HeadersInit
-

A Headers object, an object literal, or an array of two-item arrays to set request's headers.

-
includeResponse?: boolean
-

If true the request function will be instructed to resolve with a -CombinedFetchResult object that contains the Response object -abd the parsed body (if any)

-
integrity?: string
-

A cryptographic hash of the resource to be fetched by request. Sets request's integrity.

-
keepalive?: boolean
-

A boolean to set request's keepalive.

-
method?: string
-

A string to set request's method.

-
mode?: RequestMode
-

A string to indicate whether the request will use CORS, or will be restricted to same-origin URLs. Sets request's mode.

-
redirect?: RequestRedirect
-

A string indicating whether request follows redirects, results in an error upon encountering a redirect, or returns the redirect (in an opaque fashion). Sets request's redirect.

-
referrer?: string
-

A string whose value is a same-origin URL, "about:client", or the empty string, to set request's referrer.

-
referrerPolicy?: ReferrerPolicy
-

A referrer policy to set request's referrerPolicy.

-
signal?: null | AbortSignal
-

An AbortSignal to set request's signal.

-
window?: null
-

Can only be null. Used to disassociate request from any Window.

-

Legend

  • Namespace
  • Variable
  • Function
  • Function with type parameter
  • Property
  • Class

Settings

Theme

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/typedoc/interfaces/lib.fhirclient.FhirOptions.html b/docs/typedoc/interfaces/lib.fhirclient.FhirOptions.html deleted file mode 100644 index 71f5f3c9..00000000 --- a/docs/typedoc/interfaces/lib.fhirclient.FhirOptions.html +++ /dev/null @@ -1,96 +0,0 @@ -FhirOptions | FHIRClient - v3.0.0-beta.1
Options
All
  • Public
  • Public/Protected
  • All
Menu
-

Additional options that can be passed to client.request to control its -behavior

-

Hierarchy

  • FhirOptions

Index

Properties

flat?: boolean
-

When fetching a Bundle, you are typically only interested in the -included resources which are located at {response}.entry[N].resource. -If this option is set to true, the returned result will be an array of -resources instead of the whole bundle. This is especially useful when -multiple pages are fetched, because an array of page bundles is not that -useful and will often have to be converted to array of resources that is -easier to iterate.

-
    -
  • This option is ignored if the response is not a bundle.
  • -
  • If you use onPage callback with flat: true, it will receive that -array of resources instead of the page bundle.
  • -
  • Resources from multiple pages are flattened into single array (unless -you use onPage, which will be called with one array for each page).
  • -
  • Defaults to false.
  • -
  • Finally, Bundle.entry is optional in FHIR and that leads to bugs in -apps that assume that it is always present. With flat: true, you will -always get an array, even if it is empty, and even if no entry is -found in the response bundle.
  • -
-
graph?: boolean
-

Only applicable if you use resolveReferences. If false, the resolved -references will not be "mounted" in the result tree, but will be returned -as separate map object instead. Defaults to true.

-
pageLimit?: number
-

When you request a Bundle, the result will typically come back in pages -and you will only get the first page. You can use pageLimit greater -than 1 to request multiple pages. For example pageLimit: 3 will fetch -the first 3 pages as array. To fetch all the available pages you can set -this to 0.

-
    -
  • Defaults to 1.
  • -
  • Ignored if the response is not a Bundle.
  • -
-
resolveReferences?: string | string[]
-

One or more references to resolve. Single item can be specified as a -string or as an array of one string. Multiple items must be specified as -array.

-
    -
  • Each item is a dot-separated path to the desired reference within the -result object, excluding the "reference" property. For example -context.serviceProvider will look for {Response}.context.serviceProvider.reference.
  • -
  • If the target is an array of references (E.g. -Patient.generalPractitioner), you can request one or more of them by index (E.g. generalPractitioner.0). -If the index is not specified, all the references in the array will be -resolved.
  • -
  • The order in which the reference paths are specified does not matter. -For example, if you use ["subject", "encounter.serviceProvider", "encounter"], -the library should figure out that encounter.serviceProvider must be -fetched after encounter. In fact, in this case it will first fetch -subject and encounter in parallel, and then proceed to encounter.serviceProvider.
  • -
  • This option does not work with contained references (they are "already -resolved" anyway).
  • -
-
useRefreshToken?: boolean
-

If the client is authorized, it will possess an access token and pass it -with the requests it makes. When that token expires, you should get back -a 401 Unauthorized response. When that happens, if the client also has -a refresh token and if useRefreshToken is true (default), the client -will attempt to automatically re-authorize itself and then it will re-run -the failed request and eventually resolve it's promise with the final -result. This means that your requests should never fail with 401, -unless the refresh token is also expired. If you don't want this, you can -set useRefreshToken to false. There is a refresh method on the -client that can be called manually to renew the access token.

-
    -
  • Defaults to true.
  • -
-

Methods

  • -

    When you fetch multiple pages the resulting array may be very large, -requiring a lot of time and memory. It is often better if you specify a -page callback instead. The onPage callback will be called once for each -page with the page Bundle as it's argument. If you use resolveReferences -and graph: false, the references will be passed to onPage as second -argument.

    -
      -
    • If onPage returns a promise it will be awaited for, meaning that no -more pages will be fetched until the onPage promise is resolved.
    • -
    • If onPage returns a rejected promise or throws an error, the client -will not continue fetching more pages.
    • -
    • If you use onPage callback, the promise returned by request() will -be resolved with null. This is to avoid building that huge array in -memory. By using the onPage option you are stating that you will -handle the result one page at a time, instead of expecting to receive -the big combined result.
    • -
    -

    Parameters

    Returns any

Legend

  • Namespace
  • Variable
  • Function
  • Function with type parameter
  • Property
  • Method
  • Class

Settings

Theme

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/typedoc/interfaces/lib.fhirclient.IDToken.html b/docs/typedoc/interfaces/lib.fhirclient.IDToken.html deleted file mode 100644 index d970f9f4..00000000 --- a/docs/typedoc/interfaces/lib.fhirclient.IDToken.html +++ /dev/null @@ -1 +0,0 @@ -IDToken | FHIRClient - v3.0.0-beta.1
Options
All
  • Public
  • Public/Protected
  • All
Menu

Hierarchy

  • IDToken

Indexable

[key: string]: any

Index

Properties

aud: string
exp: number
iat: number
iss: string
profile: string
sub: string

Legend

  • Namespace
  • Variable
  • Function
  • Function with type parameter
  • Property
  • Class

Settings

Theme

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/typedoc/interfaces/lib.fhirclient.IncludeResponseHint.html b/docs/typedoc/interfaces/lib.fhirclient.IncludeResponseHint.html deleted file mode 100644 index e8493c92..00000000 --- a/docs/typedoc/interfaces/lib.fhirclient.IncludeResponseHint.html +++ /dev/null @@ -1 +0,0 @@ -IncludeResponseHint | FHIRClient - v3.0.0-beta.1
Options
All
  • Public
  • Public/Protected
  • All
Menu

Legend

  • Namespace
  • Variable
  • Function
  • Function with type parameter
  • Property
  • Class

Settings

Theme

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/typedoc/interfaces/lib.fhirclient.JsonObject.html b/docs/typedoc/interfaces/lib.fhirclient.JsonObject.html deleted file mode 100644 index 6bef1f57..00000000 --- a/docs/typedoc/interfaces/lib.fhirclient.JsonObject.html +++ /dev/null @@ -1 +0,0 @@ -JsonObject | FHIRClient - v3.0.0-beta.1
Options
All
  • Public
  • Public/Protected
  • All
Menu

Legend

  • Namespace
  • Variable
  • Function
  • Function with type parameter
  • Class

Settings

Theme

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/typedoc/interfaces/lib.fhirclient.JsonPatchAdd.html b/docs/typedoc/interfaces/lib.fhirclient.JsonPatchAdd.html deleted file mode 100644 index 897901fa..00000000 --- a/docs/typedoc/interfaces/lib.fhirclient.JsonPatchAdd.html +++ /dev/null @@ -1 +0,0 @@ -JsonPatchAdd | FHIRClient - v3.0.0-beta.1
Options
All
  • Public
  • Public/Protected
  • All
Menu

Legend

  • Namespace
  • Variable
  • Function
  • Function with type parameter
  • Property
  • Class

Settings

Theme

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/typedoc/interfaces/lib.fhirclient.JsonPatchCopy.html b/docs/typedoc/interfaces/lib.fhirclient.JsonPatchCopy.html deleted file mode 100644 index 3f5be6da..00000000 --- a/docs/typedoc/interfaces/lib.fhirclient.JsonPatchCopy.html +++ /dev/null @@ -1 +0,0 @@ -JsonPatchCopy | FHIRClient - v3.0.0-beta.1
Options
All
  • Public
  • Public/Protected
  • All
Menu

Legend

  • Namespace
  • Variable
  • Function
  • Function with type parameter
  • Property
  • Class

Settings

Theme

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/typedoc/interfaces/lib.fhirclient.JsonPatchMove.html b/docs/typedoc/interfaces/lib.fhirclient.JsonPatchMove.html deleted file mode 100644 index a98d03c1..00000000 --- a/docs/typedoc/interfaces/lib.fhirclient.JsonPatchMove.html +++ /dev/null @@ -1 +0,0 @@ -JsonPatchMove | FHIRClient - v3.0.0-beta.1
Options
All
  • Public
  • Public/Protected
  • All
Menu

Legend

  • Namespace
  • Variable
  • Function
  • Function with type parameter
  • Property
  • Class

Settings

Theme

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/typedoc/interfaces/lib.fhirclient.JsonPatchRemove.html b/docs/typedoc/interfaces/lib.fhirclient.JsonPatchRemove.html deleted file mode 100644 index 9e5a9e7d..00000000 --- a/docs/typedoc/interfaces/lib.fhirclient.JsonPatchRemove.html +++ /dev/null @@ -1 +0,0 @@ -JsonPatchRemove | FHIRClient - v3.0.0-beta.1
Options
All
  • Public
  • Public/Protected
  • All
Menu

Legend

  • Namespace
  • Variable
  • Function
  • Function with type parameter
  • Property
  • Class

Settings

Theme

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/typedoc/interfaces/lib.fhirclient.JsonPatchReplace.html b/docs/typedoc/interfaces/lib.fhirclient.JsonPatchReplace.html deleted file mode 100644 index 5063b284..00000000 --- a/docs/typedoc/interfaces/lib.fhirclient.JsonPatchReplace.html +++ /dev/null @@ -1 +0,0 @@ -JsonPatchReplace | FHIRClient - v3.0.0-beta.1
Options
All
  • Public
  • Public/Protected
  • All
Menu

Legend

  • Namespace
  • Variable
  • Function
  • Function with type parameter
  • Property
  • Class

Settings

Theme

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/typedoc/interfaces/lib.fhirclient.JsonPatchTest.html b/docs/typedoc/interfaces/lib.fhirclient.JsonPatchTest.html deleted file mode 100644 index 9be8a0f4..00000000 --- a/docs/typedoc/interfaces/lib.fhirclient.JsonPatchTest.html +++ /dev/null @@ -1 +0,0 @@ -JsonPatchTest | FHIRClient - v3.0.0-beta.1
Options
All
  • Public
  • Public/Protected
  • All
Menu

Legend

  • Namespace
  • Variable
  • Function
  • Function with type parameter
  • Property
  • Class

Settings

Theme

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/typedoc/interfaces/lib.fhirclient.RS384JWK.html b/docs/typedoc/interfaces/lib.fhirclient.RS384JWK.html deleted file mode 100644 index 2fac5dc1..00000000 --- a/docs/typedoc/interfaces/lib.fhirclient.RS384JWK.html +++ /dev/null @@ -1 +0,0 @@ -RS384JWK | FHIRClient - v3.0.0-beta.1
Options
All
  • Public
  • Public/Protected
  • All
Menu

Hierarchy

  • JsonWebKey
    • RS384JWK

Indexable

[propName: string]: unknown

Index

Properties

alg: "RS384"
crv?: string
d?: string
dp?: string
dq?: string
e?: string
ext?: boolean
k?: string
key_ops?: KeyUsage[]
kid: string
kty: "RSA"
n?: string
oth?: RsaOtherPrimesInfo[]
p?: string
q?: string
qi?: string
use?: string
x?: string
y?: string

Legend

  • Namespace
  • Variable
  • Function
  • Function with type parameter
  • Property
  • Class

Settings

Theme

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/typedoc/interfaces/lib.fhirclient.ReadyOptions.html b/docs/typedoc/interfaces/lib.fhirclient.ReadyOptions.html deleted file mode 100644 index 88ff8fb3..00000000 --- a/docs/typedoc/interfaces/lib.fhirclient.ReadyOptions.html +++ /dev/null @@ -1 +0,0 @@ -ReadyOptions | FHIRClient - v3.0.0-beta.1
Options
All
  • Public
  • Public/Protected
  • All
Menu

Legend

  • Namespace
  • Variable
  • Function
  • Function with type parameter
  • Property
  • Class

Settings

Theme

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/typedoc/interfaces/lib.fhirclient.RequestOptions.html b/docs/typedoc/interfaces/lib.fhirclient.RequestOptions.html deleted file mode 100644 index 48c80c49..00000000 --- a/docs/typedoc/interfaces/lib.fhirclient.RequestOptions.html +++ /dev/null @@ -1,38 +0,0 @@ -RequestOptions | FHIRClient - v3.0.0-beta.1
Options
All
  • Public
  • Public/Protected
  • All
Menu
-

Options that must contain an url property (String|URL). -A includeResponse boolean option might also be passed. Any other -properties will be passed to the underlying fetch() call.

-

Hierarchy

  • RequestInit
    • RequestOptions

Index

Properties

body?: null | BodyInit
-

A BodyInit object or null to set request's body.

-
cache?: RequestCache
-

A string indicating how the request will interact with the browser's cache to set request's cache.

-
credentials?: RequestCredentials
-

A string indicating whether credentials will be sent with the request always, never, or only when sent to a same-origin URL. Sets request's credentials.

-
headers?: HeadersInit
-

A Headers object, an object literal, or an array of two-item arrays to set request's headers.

-
includeResponse?: boolean
-

If set to true the request function will resolve with an object -like { body: any, response: Response } so that users have -access to the response object and it's properties like headers -status etc.

-
integrity?: string
-

A cryptographic hash of the resource to be fetched by request. Sets request's integrity.

-
keepalive?: boolean
-

A boolean to set request's keepalive.

-
method?: string
-

A string to set request's method.

-
mode?: RequestMode
-

A string to indicate whether the request will use CORS, or will be restricted to same-origin URLs. Sets request's mode.

-
redirect?: RequestRedirect
-

A string indicating whether request follows redirects, results in an error upon encountering a redirect, or returns the redirect (in an opaque fashion). Sets request's redirect.

-
referrer?: string
-

A string whose value is a same-origin URL, "about:client", or the empty string, to set request's referrer.

-
referrerPolicy?: ReferrerPolicy
-

A referrer policy to set request's referrerPolicy.

-
signal?: null | AbortSignal
-

An AbortSignal to set request's signal.

-
url: string | URL
-

The URL to request

-
window?: null
-

Can only be null. Used to disassociate request from any Window.

-

Legend

  • Namespace
  • Variable
  • Function
  • Function with type parameter
  • Property
  • Class

Settings

Theme

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/typedoc/interfaces/lib.fhirclient.RequestWithSession.html b/docs/typedoc/interfaces/lib.fhirclient.RequestWithSession.html deleted file mode 100644 index 87c8220e..00000000 --- a/docs/typedoc/interfaces/lib.fhirclient.RequestWithSession.html +++ /dev/null @@ -1,469 +0,0 @@ -RequestWithSession | FHIRClient - v3.0.0-beta.1
Options
All
  • Public
  • Public/Protected
  • All
Menu

Hierarchy

  • IncomingMessage
    • RequestWithSession

Index

Properties

aborted: boolean
-

The message.aborted property will be true if the request has -been aborted.

-
since

v10.1.0

-
deprecated

Since v17.0.0,v16.12.0 - Check message.destroyed from stream.Readable.

-
closed: boolean
-

Is true after 'close' has been emitted.

-
since

v18.0.0

-
complete: boolean
-

The message.complete property will be true if a complete HTTP message has -been received and successfully parsed.

-

This property is particularly useful as a means of determining if a client or -server fully transmitted a message before a connection was terminated:

-
const req = http.request({
host: '127.0.0.1',
port: 8080,
method: 'POST',
}, (res) => {
res.resume();
res.on('end', () => {
if (!res.complete)
console.error(
'The connection was terminated while the message was still being sent');
});
}); -
-
since

v0.3.0

-
connection: Socket
-

Alias for message.socket.

-
since

v0.1.90

-
deprecated

Since v16.0.0 - Use socket.

-
destroyed: boolean
-

Is true after readable.destroy() has been called.

-
since

v8.0.0

-
errored: null | Error
-

Returns error if the stream has been destroyed with an error.

-
since

v18.0.0

-
headers: IncomingHttpHeaders
-

The request/response headers object.

-

Key-value pairs of header names and values. Header names are lower-cased.

-
// Prints something like:
//
// { 'user-agent': 'curl/7.22.0',
// host: '127.0.0.1:8000',
// accept: '*' }
console.log(request.headers); -
-

Duplicates in raw headers are handled in the following ways, depending on the -header name:

-
    -
  • Duplicates of age, authorization, content-length, content-type, etag, expires, from, host, if-modified-since, if-unmodified-since, last-modified, location, -max-forwards, proxy-authorization, referer, retry-after, server, or user-agent are discarded. -To allow duplicate values of the headers listed above to be joined, -use the option joinDuplicateHeaders in request and {@link createServer}. See RFC 9110 Section 5.3 for more -information.
  • -
  • set-cookie is always an array. Duplicates are added to the array.
  • -
  • For duplicate cookie headers, the values are joined together with ; .
  • -
  • For all other headers, the values are joined together with , .
  • -
-
since

v0.1.5

-
headersDistinct: Dict<string[]>
-

Similar to message.headers, but there is no join logic and the values are -always arrays of strings, even for headers received just once.

-
// Prints something like:
//
// { 'user-agent': ['curl/7.22.0'],
// host: ['127.0.0.1:8000'],
// accept: ['*'] }
console.log(request.headersDistinct); -
-
since

v18.3.0, v16.17.0

-
httpVersion: string
-

In case of server request, the HTTP version sent by the client. In the case of -client response, the HTTP version of the connected-to server. -Probably either '1.1' or '1.0'.

-

Also message.httpVersionMajor is the first integer and message.httpVersionMinor is the second.

-
since

v0.1.1

-
httpVersionMajor: number
httpVersionMinor: number
method?: string
-

Only valid for request obtained from {@link Server}.

-

The request method as a string. Read only. Examples: 'GET', 'DELETE'.

-
since

v0.1.1

-
rawHeaders: string[]
-

The raw request/response headers list exactly as they were received.

-

The keys and values are in the same list. It is not a -list of tuples. So, the even-numbered offsets are key values, and the -odd-numbered offsets are the associated values.

-

Header names are not lowercased, and duplicates are not merged.

-
// Prints something like:
//
// [ 'user-agent',
// 'this is invalid because there can be only one',
// 'User-Agent',
// 'curl/7.22.0',
// 'Host',
// '127.0.0.1:8000',
// 'ACCEPT',
// '*' ]
console.log(request.rawHeaders); -
-
since

v0.11.6

-
rawTrailers: string[]
-

The raw request/response trailer keys and values exactly as they were -received. Only populated at the 'end' event.

-
since

v0.11.6

-
readable: boolean
-

Is true if it is safe to call read, which means -the stream has not been destroyed or emitted 'error' or 'end'.

-
since

v11.4.0

-
readableAborted: boolean
-

Returns whether the stream was destroyed or errored before emitting 'end'.

-
since

v16.8.0

-
experimental
readableDidRead: boolean
-

Returns whether 'data' has been emitted.

-
since

v16.7.0, v14.18.0

-
experimental
readableEncoding: null | BufferEncoding
-

Getter for the property encoding of a given Readable stream. The encoding property can be set using the setEncoding method.

-
since

v12.7.0

-
readableEnded: boolean
-

Becomes true when 'end' event is emitted.

-
since

v12.9.0

-
readableFlowing: null | boolean
-

This property reflects the current state of a Readable stream as described -in the Three states section.

-
since

v9.4.0

-
readableHighWaterMark: number
-

Returns the value of highWaterMark passed when creating this Readable.

-
since

v9.3.0

-
readableLength: number
-

This property contains the number of bytes (or objects) in the queue -ready to be read. The value provides introspection data regarding -the status of the highWaterMark.

-
since

v9.4.0

-
readableObjectMode: boolean
-

Getter for the property objectMode of a given Readable stream.

-
since

v12.3.0

-
socket: Socket
-

The net.Socket object associated with the connection.

-

With HTTPS support, use request.socket.getPeerCertificate() to obtain the -client's authentication details.

-

This property is guaranteed to be an instance of the net.Socket class, -a subclass of stream.Duplex, unless the user specified a socket -type other than net.Socket or internally nulled.

-
since

v0.3.0

-
statusCode?: number
-

Only valid for response obtained from {@link ClientRequest}.

-

The 3-digit HTTP response status code. E.G. 404.

-
since

v0.1.1

-
statusMessage?: string
-

Only valid for response obtained from {@link ClientRequest}.

-

The HTTP response status message (reason phrase). E.G. OK or Internal Server Error.

-
since

v0.11.10

-
trailers: Dict<string>
-

The request/response trailers object. Only populated at the 'end' event.

-
since

v0.3.0

-
trailersDistinct: Dict<string[]>
-

Similar to message.trailers, but there is no join logic and the values are -always arrays of strings, even for headers received just once. -Only populated at the 'end' event.

-
since

v18.3.0, v16.17.0

-
url?: string
-

Only valid for request obtained from {@link Server}.

-

Request URL string. This contains only the URL that is present in the actual -HTTP request. Take the following request:

-
GET /status?name=ryan HTTP/1.1
-Accept: text/plain
-
-

To parse the URL into its parts:

-
new URL(`http://${process.env.HOST ?? 'localhost'}${request.url}`);
-
-

When request.url is '/status?name=ryan' and process.env.HOST is undefined:

-
$ node
-> new URL(`http://${process.env.HOST ?? 'localhost'}${request.url}`);
-URL {
-  href: 'http://localhost/status?name=ryan',
-  origin: 'http://localhost',
-  protocol: 'http:',
-  username: '',
-  password: '',
-  host: 'localhost',
-  hostname: 'localhost',
-  port: '',
-  pathname: '/status',
-  search: '?name=ryan',
-  searchParams: URLSearchParams { 'name' => 'ryan' },
-  hash: ''
-}
-
-

Ensure that you set process.env.HOST to the server's host name, or consider replacing this part entirely. If using req.headers.host, ensure proper -validation is used, as clients may specify a custom Host header.

-
since

v0.1.90

-

Methods

  • [asyncDispose](): Promise<void>
  • -

    Calls readable.destroy() with an AbortError and returns a promise that fulfills when the stream is finished.

    -
    since

    v20.4.0

    -

    Returns Promise<void>

  • [asyncIterator](): AsyncIterableIterator<any>
  • Returns AsyncIterableIterator<any>

  • [captureRejectionSymbol]<K>(error: Error, event: string | symbol, ...args: AnyRest): void
  • Type Parameters

    • K

    Parameters

    • error: Error
    • event: string | symbol
    • Rest ...args: AnyRest

    Returns void

  • _construct(callback: ((error?: null | Error) => void)): void
  • Parameters

    • callback: ((error?: null | Error) => void)
        • (error?: null | Error): void
        • Parameters

          • Optional error: null | Error

          Returns void

    Returns void

  • _destroy(error: null | Error, callback: ((error?: null | Error) => void)): void
  • Parameters

    • error: null | Error
    • callback: ((error?: null | Error) => void)
        • (error?: null | Error): void
        • Parameters

          • Optional error: null | Error

          Returns void

    Returns void

  • _read(size: number): void
  • Parameters

    • size: number

    Returns void

  • -

    Event emitter -The defined events on documents including:

    -
      -
    1. close
    2. -
    3. data
    4. -
    5. end
    6. -
    7. error
    8. -
    9. pause
    10. -
    11. readable
    12. -
    13. resume
    14. -
    -

    Parameters

    • event: "close"
    • listener: (() => void)
        • (): void
        • Returns void

    Returns fhirclient.RequestWithSession

  • Parameters

    • event: "data"
    • listener: ((chunk: any) => void)
        • (chunk: any): void
        • Parameters

          • chunk: any

          Returns void

    Returns fhirclient.RequestWithSession

  • Parameters

    • event: "end"
    • listener: (() => void)
        • (): void
        • Returns void

    Returns fhirclient.RequestWithSession

  • Parameters

    • event: "error"
    • listener: ((err: Error) => void)
        • (err: Error): void
        • Parameters

          • err: Error

          Returns void

    Returns fhirclient.RequestWithSession

  • Parameters

    • event: "pause"
    • listener: (() => void)
        • (): void
        • Returns void

    Returns fhirclient.RequestWithSession

  • Parameters

    • event: "readable"
    • listener: (() => void)
        • (): void
        • Returns void

    Returns fhirclient.RequestWithSession

  • Parameters

    • event: "resume"
    • listener: (() => void)
        • (): void
        • Returns void

    Returns fhirclient.RequestWithSession

  • Parameters

    • event: string | symbol
    • listener: ((...args: any[]) => void)
        • (...args: any[]): void
        • Parameters

          • Rest ...args: any[]

          Returns void

    Returns fhirclient.RequestWithSession

  • asIndexedPairs(options?: Pick<ArrayOptions, "signal">): Readable
  • -

    This method returns a new stream with chunks of the underlying stream paired with a counter -in the form [index, chunk]. The first index value is 0 and it increases by 1 for each chunk produced.

    -
    since

    v17.5.0

    -

    Parameters

    • Optional options: Pick<ArrayOptions, "signal">

    Returns Readable

    a stream of indexed pairs.

    -
  • compose<T>(stream: ComposeFnParam | T | Iterable<T> | AsyncIterable<T>, options?: { signal: AbortSignal }): T
  • Type Parameters

    • T extends ReadableStream<T>

    Parameters

    • stream: ComposeFnParam | T | Iterable<T> | AsyncIterable<T>
    • Optional options: { signal: AbortSignal }
      • signal: AbortSignal

    Returns T

  • -

    Calls destroy() on the socket that received the IncomingMessage. If error is provided, an 'error' event is emitted on the socket and error is passed -as an argument to any listeners on the event.

    -
    since

    v0.3.0

    -

    Parameters

    • Optional error: Error

    Returns fhirclient.RequestWithSession

  • drop(limit: number, options?: Pick<ArrayOptions, "signal">): Readable
  • -

    This method returns a new stream with the first limit chunks dropped from the start.

    -
    since

    v17.5.0

    -

    Parameters

    • limit: number
      -

      the number of chunks to drop from the readable.

      -
    • Optional options: Pick<ArrayOptions, "signal">

    Returns Readable

    a stream with limit chunks dropped from the start.

    -
  • emit(event: "close"): boolean
  • emit(event: "data", chunk: any): boolean
  • emit(event: "end"): boolean
  • emit(event: "error", err: Error): boolean
  • emit(event: "pause"): boolean
  • emit(event: "readable"): boolean
  • emit(event: "resume"): boolean
  • emit(event: string | symbol, ...args: any[]): boolean
  • Parameters

    • event: "close"

    Returns boolean

  • Parameters

    • event: "data"
    • chunk: any

    Returns boolean

  • Parameters

    • event: "end"

    Returns boolean

  • Parameters

    • event: "error"
    • err: Error

    Returns boolean

  • Parameters

    • event: "pause"

    Returns boolean

  • Parameters

    • event: "readable"

    Returns boolean

  • Parameters

    • event: "resume"

    Returns boolean

  • Parameters

    • event: string | symbol
    • Rest ...args: any[]

    Returns boolean

  • eventNames(): (string | symbol)[]
  • -

    Returns an array listing the events for which the emitter has registered -listeners. The values in the array are strings or Symbols.

    -
    import { EventEmitter } from 'node:events';

    const myEE = new EventEmitter();
    myEE.on('foo', () => {});
    myEE.on('bar', () => {});

    const sym = Symbol('symbol');
    myEE.on(sym, () => {});

    console.log(myEE.eventNames());
    // Prints: [ 'foo', 'bar', Symbol(symbol) ] -
    -
    since

    v6.0.0

    -

    Returns (string | symbol)[]

  • every(fn: ((data: any, options?: Pick<ArrayOptions, "signal">) => boolean | Promise<boolean>), options?: ArrayOptions): Promise<boolean>
  • -

    This method is similar to Array.prototype.every and calls fn on each chunk in the stream -to check if all awaited return values are truthy value for fn. Once an fn call on a chunk -awaited return value is falsy, the stream is destroyed and the promise is fulfilled with false. -If all of the fn calls on the chunks return a truthy value, the promise is fulfilled with true.

    -
    since

    v17.5.0

    -

    Parameters

    • fn: ((data: any, options?: Pick<ArrayOptions, "signal">) => boolean | Promise<boolean>)
      -

      a function to call on each chunk of the stream. Async or not.

      -
        • (data: any, options?: Pick<ArrayOptions, "signal">): boolean | Promise<boolean>
        • Parameters

          • data: any
          • Optional options: Pick<ArrayOptions, "signal">

          Returns boolean | Promise<boolean>

    • Optional options: ArrayOptions

    Returns Promise<boolean>

    a promise evaluating to true if fn returned a truthy value for every one of the chunks.

    -
  • filter(fn: ((data: any, options?: Pick<ArrayOptions, "signal">) => boolean | Promise<boolean>), options?: ArrayOptions): Readable
  • -

    This method allows filtering the stream. For each chunk in the stream the fn function will be called -and if it returns a truthy value, the chunk will be passed to the result stream. -If the fn function returns a promise - that promise will be awaited.

    -
    since

    v17.4.0, v16.14.0

    -

    Parameters

    • fn: ((data: any, options?: Pick<ArrayOptions, "signal">) => boolean | Promise<boolean>)
      -

      a function to filter chunks from the stream. Async or not.

      -
        • (data: any, options?: Pick<ArrayOptions, "signal">): boolean | Promise<boolean>
        • Parameters

          • data: any
          • Optional options: Pick<ArrayOptions, "signal">

          Returns boolean | Promise<boolean>

    • Optional options: ArrayOptions

    Returns Readable

    a stream filtered with the predicate fn.

    -
  • find<T>(fn: ((data: any, options?: Pick<ArrayOptions, "signal">) => data is T), options?: ArrayOptions): Promise<undefined | T>
  • find(fn: ((data: any, options?: Pick<ArrayOptions, "signal">) => boolean | Promise<boolean>), options?: ArrayOptions): Promise<any>
  • -

    This method is similar to Array.prototype.find and calls fn on each chunk in the stream -to find a chunk with a truthy value for fn. Once an fn call's awaited return value is truthy, -the stream is destroyed and the promise is fulfilled with value for which fn returned a truthy value. -If all of the fn calls on the chunks return a falsy value, the promise is fulfilled with undefined.

    -
    since

    v17.5.0

    -

    Type Parameters

    • T

    Parameters

    • fn: ((data: any, options?: Pick<ArrayOptions, "signal">) => data is T)
      -

      a function to call on each chunk of the stream. Async or not.

      -
        • (data: any, options?: Pick<ArrayOptions, "signal">): data is T
        • Parameters

          • data: any
          • Optional options: Pick<ArrayOptions, "signal">

          Returns data is T

    • Optional options: ArrayOptions

    Returns Promise<undefined | T>

    a promise evaluating to the first chunk for which fn evaluated with a truthy value, -or undefined if no element was found.

    -
  • Parameters

    • fn: ((data: any, options?: Pick<ArrayOptions, "signal">) => boolean | Promise<boolean>)
        • (data: any, options?: Pick<ArrayOptions, "signal">): boolean | Promise<boolean>
        • Parameters

          • data: any
          • Optional options: Pick<ArrayOptions, "signal">

          Returns boolean | Promise<boolean>

    • Optional options: ArrayOptions

    Returns Promise<any>

  • flatMap(fn: ((data: any, options?: Pick<ArrayOptions, "signal">) => any), options?: ArrayOptions): Readable
  • -

    This method returns a new stream by applying the given callback to each chunk of the stream -and then flattening the result.

    -

    It is possible to return a stream or another iterable or async iterable from fn and the result streams -will be merged (flattened) into the returned stream.

    -
    since

    v17.5.0

    -

    Parameters

    • fn: ((data: any, options?: Pick<ArrayOptions, "signal">) => any)
      -

      a function to map over every chunk in the stream. May be async. May be a stream or generator.

      -
        • (data: any, options?: Pick<ArrayOptions, "signal">): any
        • Parameters

          • data: any
          • Optional options: Pick<ArrayOptions, "signal">

          Returns any

    • Optional options: ArrayOptions

    Returns Readable

    a stream flat-mapped with the function fn.

    -
  • forEach(fn: ((data: any, options?: Pick<ArrayOptions, "signal">) => void | Promise<void>), options?: ArrayOptions): Promise<void>
  • -

    This method allows iterating a stream. For each chunk in the stream the fn function will be called. -If the fn function returns a promise - that promise will be awaited.

    -

    This method is different from for await...of loops in that it can optionally process chunks concurrently. -In addition, a forEach iteration can only be stopped by having passed a signal option -and aborting the related AbortController while for await...of can be stopped with break or return. -In either case the stream will be destroyed.

    -

    This method is different from listening to the 'data' event in that it uses the readable event -in the underlying machinary and can limit the number of concurrent fn calls.

    -
    since

    v17.5.0

    -

    Parameters

    • fn: ((data: any, options?: Pick<ArrayOptions, "signal">) => void | Promise<void>)
      -

      a function to call on each chunk of the stream. Async or not.

      -
        • (data: any, options?: Pick<ArrayOptions, "signal">): void | Promise<void>
        • Parameters

          • data: any
          • Optional options: Pick<ArrayOptions, "signal">

          Returns void | Promise<void>

    • Optional options: ArrayOptions

    Returns Promise<void>

    a promise for when the stream has finished.

    -
  • getMaxListeners(): number
  • -

    Returns the current max listener value for the EventEmitter which is either -set by emitter.setMaxListeners(n) or defaults to {@link defaultMaxListeners}.

    -
    since

    v1.0.0

    -

    Returns number

  • isPaused(): boolean
  • -

    The readable.isPaused() method returns the current operating state of the Readable. -This is used primarily by the mechanism that underlies the readable.pipe() method. -In most typical cases, there will be no reason to use this method directly.

    -
    const readable = new stream.Readable();

    readable.isPaused(); // === false
    readable.pause();
    readable.isPaused(); // === true
    readable.resume();
    readable.isPaused(); // === false -
    -
    since

    v0.11.14

    -

    Returns boolean

  • iterator(options?: { destroyOnReturn?: boolean }): AsyncIterableIterator<any>
  • -

    The iterator created by this method gives users the option to cancel the destruction -of the stream if the for await...of loop is exited by return, break, or throw, -or if the iterator should destroy the stream if the stream emitted an error during iteration.

    -
    since

    v16.3.0

    -

    Parameters

    • Optional options: { destroyOnReturn?: boolean }
      • Optional destroyOnReturn?: boolean
        -

        When set to false, calling return on the async iterator, -or exiting a for await...of iteration using a break, return, or throw will not destroy the stream. -Default: true.

        -

    Returns AsyncIterableIterator<any>

  • listenerCount<K>(eventName: string | symbol, listener?: Function): number
  • -

    Returns the number of listeners listening for the event named eventName. -If listener is provided, it will return how many times the listener is found -in the list of the listeners of the event.

    -
    since

    v3.2.0

    -

    Type Parameters

    • K

    Parameters

    • eventName: string | symbol
      -

      The name of the event being listened for

      -
    • Optional listener: Function
      -

      The event handler function

      -

    Returns number

  • listeners<K>(eventName: string | symbol): Function[]
  • -

    Returns a copy of the array of listeners for the event named eventName.

    -
    server.on('connection', (stream) => {
    console.log('someone connected!');
    });
    console.log(util.inspect(server.listeners('connection')));
    // Prints: [ [Function] ] -
    -
    since

    v0.1.26

    -

    Type Parameters

    • K

    Parameters

    • eventName: string | symbol

    Returns Function[]

  • map(fn: ((data: any, options?: Pick<ArrayOptions, "signal">) => any), options?: ArrayOptions): Readable
  • -

    This method allows mapping over the stream. The fn function will be called for every chunk in the stream. -If the fn function returns a promise - that promise will be awaited before being passed to the result stream.

    -
    since

    v17.4.0, v16.14.0

    -

    Parameters

    • fn: ((data: any, options?: Pick<ArrayOptions, "signal">) => any)
      -

      a function to map over every chunk in the stream. Async or not.

      -
        • (data: any, options?: Pick<ArrayOptions, "signal">): any
        • Parameters

          • data: any
          • Optional options: Pick<ArrayOptions, "signal">

          Returns any

    • Optional options: ArrayOptions

    Returns Readable

    a stream mapped with the function fn.

    -
  • -

    Alias for emitter.removeListener().

    -
    since

    v10.0.0

    -

    Type Parameters

    • K

    Parameters

    • eventName: string | symbol
    • listener: ((...args: any[]) => void)
        • (...args: any[]): void
        • Parameters

          • Rest ...args: any[]

          Returns void

    Returns fhirclient.RequestWithSession

  • Parameters

    • event: "close"
    • listener: (() => void)
        • (): void
        • Returns void

    Returns fhirclient.RequestWithSession

  • Parameters

    • event: "data"
    • listener: ((chunk: any) => void)
        • (chunk: any): void
        • Parameters

          • chunk: any

          Returns void

    Returns fhirclient.RequestWithSession

  • Parameters

    • event: "end"
    • listener: (() => void)
        • (): void
        • Returns void

    Returns fhirclient.RequestWithSession

  • Parameters

    • event: "error"
    • listener: ((err: Error) => void)
        • (err: Error): void
        • Parameters

          • err: Error

          Returns void

    Returns fhirclient.RequestWithSession

  • Parameters

    • event: "pause"
    • listener: (() => void)
        • (): void
        • Returns void

    Returns fhirclient.RequestWithSession

  • Parameters

    • event: "readable"
    • listener: (() => void)
        • (): void
        • Returns void

    Returns fhirclient.RequestWithSession

  • Parameters

    • event: "resume"
    • listener: (() => void)
        • (): void
        • Returns void

    Returns fhirclient.RequestWithSession

  • Parameters

    • event: string | symbol
    • listener: ((...args: any[]) => void)
        • (...args: any[]): void
        • Parameters

          • Rest ...args: any[]

          Returns void

    Returns fhirclient.RequestWithSession

  • Parameters

    • event: "close"
    • listener: (() => void)
        • (): void
        • Returns void

    Returns fhirclient.RequestWithSession

  • Parameters

    • event: "data"
    • listener: ((chunk: any) => void)
        • (chunk: any): void
        • Parameters

          • chunk: any

          Returns void

    Returns fhirclient.RequestWithSession

  • Parameters

    • event: "end"
    • listener: (() => void)
        • (): void
        • Returns void

    Returns fhirclient.RequestWithSession

  • Parameters

    • event: "error"
    • listener: ((err: Error) => void)
        • (err: Error): void
        • Parameters

          • err: Error

          Returns void

    Returns fhirclient.RequestWithSession

  • Parameters

    • event: "pause"
    • listener: (() => void)
        • (): void
        • Returns void

    Returns fhirclient.RequestWithSession

  • Parameters

    • event: "readable"
    • listener: (() => void)
        • (): void
        • Returns void

    Returns fhirclient.RequestWithSession

  • Parameters

    • event: "resume"
    • listener: (() => void)
        • (): void
        • Returns void

    Returns fhirclient.RequestWithSession

  • Parameters

    • event: string | symbol
    • listener: ((...args: any[]) => void)
        • (...args: any[]): void
        • Parameters

          • Rest ...args: any[]

          Returns void

    Returns fhirclient.RequestWithSession

  • -

    The readable.pause() method will cause a stream in flowing mode to stop -emitting 'data' events, switching out of flowing mode. Any data that -becomes available will remain in the internal buffer.

    -
    const readable = getReadableStreamSomehow();
    readable.on('data', (chunk) => {
    console.log(`Received ${chunk.length} bytes of data.`);
    readable.pause();
    console.log('There will be no additional data for 1 second.');
    setTimeout(() => {
    console.log('Now data will start flowing again.');
    readable.resume();
    }, 1000);
    }); -
    -

    The readable.pause() method has no effect if there is a 'readable' event listener.

    -
    since

    v0.9.4

    -

    Returns fhirclient.RequestWithSession

  • pipe<T>(destination: T, options?: { end?: boolean }): T
  • Type Parameters

    • T extends WritableStream<T>

    Parameters

    • destination: T
    • Optional options: { end?: boolean }
      • Optional end?: boolean

    Returns T

  • Parameters

    • event: "close"
    • listener: (() => void)
        • (): void
        • Returns void

    Returns fhirclient.RequestWithSession

  • Parameters

    • event: "data"
    • listener: ((chunk: any) => void)
        • (chunk: any): void
        • Parameters

          • chunk: any

          Returns void

    Returns fhirclient.RequestWithSession

  • Parameters

    • event: "end"
    • listener: (() => void)
        • (): void
        • Returns void

    Returns fhirclient.RequestWithSession

  • Parameters

    • event: "error"
    • listener: ((err: Error) => void)
        • (err: Error): void
        • Parameters

          • err: Error

          Returns void

    Returns fhirclient.RequestWithSession

  • Parameters

    • event: "pause"
    • listener: (() => void)
        • (): void
        • Returns void

    Returns fhirclient.RequestWithSession

  • Parameters

    • event: "readable"
    • listener: (() => void)
        • (): void
        • Returns void

    Returns fhirclient.RequestWithSession

  • Parameters

    • event: "resume"
    • listener: (() => void)
        • (): void
        • Returns void

    Returns fhirclient.RequestWithSession

  • Parameters

    • event: string | symbol
    • listener: ((...args: any[]) => void)
        • (...args: any[]): void
        • Parameters

          • Rest ...args: any[]

          Returns void

    Returns fhirclient.RequestWithSession

  • Parameters

    • event: "close"
    • listener: (() => void)
        • (): void
        • Returns void

    Returns fhirclient.RequestWithSession

  • Parameters

    • event: "data"
    • listener: ((chunk: any) => void)
        • (chunk: any): void
        • Parameters

          • chunk: any

          Returns void

    Returns fhirclient.RequestWithSession

  • Parameters

    • event: "end"
    • listener: (() => void)
        • (): void
        • Returns void

    Returns fhirclient.RequestWithSession

  • Parameters

    • event: "error"
    • listener: ((err: Error) => void)
        • (err: Error): void
        • Parameters

          • err: Error

          Returns void

    Returns fhirclient.RequestWithSession

  • Parameters

    • event: "pause"
    • listener: (() => void)
        • (): void
        • Returns void

    Returns fhirclient.RequestWithSession

  • Parameters

    • event: "readable"
    • listener: (() => void)
        • (): void
        • Returns void

    Returns fhirclient.RequestWithSession

  • Parameters

    • event: "resume"
    • listener: (() => void)
        • (): void
        • Returns void

    Returns fhirclient.RequestWithSession

  • Parameters

    • event: string | symbol
    • listener: ((...args: any[]) => void)
        • (...args: any[]): void
        • Parameters

          • Rest ...args: any[]

          Returns void

    Returns fhirclient.RequestWithSession

  • push(chunk: any, encoding?: BufferEncoding): boolean
  • Parameters

    • chunk: any
    • Optional encoding: BufferEncoding

    Returns boolean

  • rawListeners<K>(eventName: string | symbol): Function[]
  • -

    Returns a copy of the array of listeners for the event named eventName, -including any wrappers (such as those created by .once()).

    -
    import { EventEmitter } from 'node:events';
    const emitter = new EventEmitter();
    emitter.once('log', () => console.log('log once'));

    // Returns a new Array with a function `onceWrapper` which has a property
    // `listener` which contains the original listener bound above
    const listeners = emitter.rawListeners('log');
    const logFnWrapper = listeners[0];

    // Logs "log once" to the console and does not unbind the `once` event
    logFnWrapper.listener();

    // Logs "log once" to the console and removes the listener
    logFnWrapper();

    emitter.on('log', () => console.log('log persistently'));
    // Will return a new Array with a single function bound by `.on()` above
    const newListeners = emitter.rawListeners('log');

    // Logs "log persistently" twice
    newListeners[0]();
    emitter.emit('log'); -
    -
    since

    v9.4.0

    -

    Type Parameters

    • K

    Parameters

    • eventName: string | symbol

    Returns Function[]

  • read(size?: number): any
  • -

    The readable.read() method reads data out of the internal buffer and -returns it. If no data is available to be read, null is returned. By default, -the data is returned as a Buffer object unless an encoding has been -specified using the readable.setEncoding() method or the stream is operating -in object mode.

    -

    The optional size argument specifies a specific number of bytes to read. If -size bytes are not available to be read, null will be returned unless the -stream has ended, in which case all of the data remaining in the internal buffer -will be returned.

    -

    If the size argument is not specified, all of the data contained in the -internal buffer will be returned.

    -

    The size argument must be less than or equal to 1 GiB.

    -

    The readable.read() method should only be called on Readable streams -operating in paused mode. In flowing mode, readable.read() is called -automatically until the internal buffer is fully drained.

    -
    const readable = getReadableStreamSomehow();

    // 'readable' may be triggered multiple times as data is buffered in
    readable.on('readable', () => {
    let chunk;
    console.log('Stream is readable (new data received in buffer)');
    // Use a loop to make sure we read all currently available data
    while (null !== (chunk = readable.read())) {
    console.log(`Read ${chunk.length} bytes of data...`);
    }
    });

    // 'end' will be triggered once when there is no more data available
    readable.on('end', () => {
    console.log('Reached end of stream.');
    }); -
    -

    Each call to readable.read() returns a chunk of data, or null. The chunks -are not concatenated. A while loop is necessary to consume all data -currently in the buffer. When reading a large file .read() may return null, -having consumed all buffered content so far, but there is still more data to -come not yet buffered. In this case a new 'readable' event will be emitted -when there is more data in the buffer. Finally the 'end' event will be -emitted when there is no more data to come.

    -

    Therefore to read a file's whole contents from a readable, it is necessary -to collect chunks across multiple 'readable' events:

    -
    const chunks = [];

    readable.on('readable', () => {
    let chunk;
    while (null !== (chunk = readable.read())) {
    chunks.push(chunk);
    }
    });

    readable.on('end', () => {
    const content = chunks.join('');
    }); -
    -

    A Readable stream in object mode will always return a single item from -a call to readable.read(size), regardless of the value of the size argument.

    -

    If the readable.read() method returns a chunk of data, a 'data' event will -also be emitted.

    -

    Calling read after the 'end' event has -been emitted will return null. No runtime error will be raised.

    -
    since

    v0.9.4

    -

    Parameters

    • Optional size: number
      -

      Optional argument to specify how much data to read.

      -

    Returns any

  • reduce<T>(fn: ((previous: any, data: any, options?: Pick<ArrayOptions, "signal">) => T), initial?: undefined, options?: Pick<ArrayOptions, "signal">): Promise<T>
  • reduce<T>(fn: ((previous: T, data: any, options?: Pick<ArrayOptions, "signal">) => T), initial: T, options?: Pick<ArrayOptions, "signal">): Promise<T>
  • -

    This method calls fn on each chunk of the stream in order, passing it the result from the calculation -on the previous element. It returns a promise for the final value of the reduction.

    -

    If no initial value is supplied the first chunk of the stream is used as the initial value. -If the stream is empty, the promise is rejected with a TypeError with the ERR_INVALID_ARGS code property.

    -

    The reducer function iterates the stream element-by-element which means that there is no concurrency parameter -or parallelism. To perform a reduce concurrently, you can extract the async function to readable.map method.

    -
    since

    v17.5.0

    -

    Type Parameters

    • T = any

    Parameters

    • fn: ((previous: any, data: any, options?: Pick<ArrayOptions, "signal">) => T)
      -

      a reducer function to call over every chunk in the stream. Async or not.

      -
        • (previous: any, data: any, options?: Pick<ArrayOptions, "signal">): T
        • Parameters

          • previous: any
          • data: any
          • Optional options: Pick<ArrayOptions, "signal">

          Returns T

    • Optional initial: undefined
      -

      the initial value to use in the reduction.

      -
    • Optional options: Pick<ArrayOptions, "signal">

    Returns Promise<T>

    a promise for the final value of the reduction.

    -
  • Type Parameters

    • T = any

    Parameters

    • fn: ((previous: T, data: any, options?: Pick<ArrayOptions, "signal">) => T)
        • (previous: T, data: any, options?: Pick<ArrayOptions, "signal">): T
        • Parameters

          • previous: T
          • data: any
          • Optional options: Pick<ArrayOptions, "signal">

          Returns T

    • initial: T
    • Optional options: Pick<ArrayOptions, "signal">

    Returns Promise<T>

  • -

    Removes all listeners, or those of the specified eventName.

    -

    It is bad practice to remove listeners added elsewhere in the code, -particularly when the EventEmitter instance was created by some other -component or module (e.g. sockets or file streams).

    -

    Returns a reference to the EventEmitter, so that calls can be chained.

    -
    since

    v0.1.26

    -

    Parameters

    • Optional eventName: string | symbol

    Returns fhirclient.RequestWithSession

  • Parameters

    • event: "close"
    • listener: (() => void)
        • (): void
        • Returns void

    Returns fhirclient.RequestWithSession

  • Parameters

    • event: "data"
    • listener: ((chunk: any) => void)
        • (chunk: any): void
        • Parameters

          • chunk: any

          Returns void

    Returns fhirclient.RequestWithSession

  • Parameters

    • event: "end"
    • listener: (() => void)
        • (): void
        • Returns void

    Returns fhirclient.RequestWithSession

  • Parameters

    • event: "error"
    • listener: ((err: Error) => void)
        • (err: Error): void
        • Parameters

          • err: Error

          Returns void

    Returns fhirclient.RequestWithSession

  • Parameters

    • event: "pause"
    • listener: (() => void)
        • (): void
        • Returns void

    Returns fhirclient.RequestWithSession

  • Parameters

    • event: "readable"
    • listener: (() => void)
        • (): void
        • Returns void

    Returns fhirclient.RequestWithSession

  • Parameters

    • event: "resume"
    • listener: (() => void)
        • (): void
        • Returns void

    Returns fhirclient.RequestWithSession

  • Parameters

    • event: string | symbol
    • listener: ((...args: any[]) => void)
        • (...args: any[]): void
        • Parameters

          • Rest ...args: any[]

          Returns void

    Returns fhirclient.RequestWithSession

  • -

    The readable.resume() method causes an explicitly paused Readable stream to -resume emitting 'data' events, switching the stream into flowing mode.

    -

    The readable.resume() method can be used to fully consume the data from a -stream without actually processing any of that data:

    -
    getReadableStreamSomehow()
    .resume()
    .on('end', () => {
    console.log('Reached the end, but did not read anything.');
    }); -
    -

    The readable.resume() method has no effect if there is a 'readable' event listener.

    -
    since

    v0.9.4

    -

    Returns fhirclient.RequestWithSession

  • -

    The readable.setEncoding() method sets the character encoding for -data read from the Readable stream.

    -

    By default, no encoding is assigned and stream data will be returned as Buffer objects. Setting an encoding causes the stream data -to be returned as strings of the specified encoding rather than as Buffer objects. For instance, calling readable.setEncoding('utf8') will cause the -output data to be interpreted as UTF-8 data, and passed as strings. Calling readable.setEncoding('hex') will cause the data to be encoded in hexadecimal -string format.

    -

    The Readable stream will properly handle multi-byte characters delivered -through the stream that would otherwise become improperly decoded if simply -pulled from the stream as Buffer objects.

    -
    const readable = getReadableStreamSomehow();
    readable.setEncoding('utf8');
    readable.on('data', (chunk) => {
    assert.equal(typeof chunk, 'string');
    console.log('Got %d characters of string data:', chunk.length);
    }); -
    -
    since

    v0.9.4

    -

    Parameters

    • encoding: BufferEncoding
      -

      The encoding to use.

      -

    Returns fhirclient.RequestWithSession

  • -

    By default EventEmitters will print a warning if more than 10 listeners are -added for a particular event. This is a useful default that helps finding -memory leaks. The emitter.setMaxListeners() method allows the limit to be -modified for this specific EventEmitter instance. The value can be set to Infinity (or 0) to indicate an unlimited number of listeners.

    -

    Returns a reference to the EventEmitter, so that calls can be chained.

    -
    since

    v0.3.5

    -

    Parameters

    • n: number

    Returns fhirclient.RequestWithSession

  • -

    Calls message.socket.setTimeout(msecs, callback).

    -
    since

    v0.5.9

    -

    Parameters

    • msecs: number
    • Optional callback: (() => void)
        • (): void
        • Returns void

    Returns fhirclient.RequestWithSession

  • some(fn: ((data: any, options?: Pick<ArrayOptions, "signal">) => boolean | Promise<boolean>), options?: ArrayOptions): Promise<boolean>
  • -

    This method is similar to Array.prototype.some and calls fn on each chunk in the stream -until the awaited return value is true (or any truthy value). Once an fn call on a chunk -awaited return value is truthy, the stream is destroyed and the promise is fulfilled with true. -If none of the fn calls on the chunks return a truthy value, the promise is fulfilled with false.

    -
    since

    v17.5.0

    -

    Parameters

    • fn: ((data: any, options?: Pick<ArrayOptions, "signal">) => boolean | Promise<boolean>)
      -

      a function to call on each chunk of the stream. Async or not.

      -
        • (data: any, options?: Pick<ArrayOptions, "signal">): boolean | Promise<boolean>
        • Parameters

          • data: any
          • Optional options: Pick<ArrayOptions, "signal">

          Returns boolean | Promise<boolean>

    • Optional options: ArrayOptions

    Returns Promise<boolean>

    a promise evaluating to true if fn returned a truthy value for at least one of the chunks.

    -
  • take(limit: number, options?: Pick<ArrayOptions, "signal">): Readable
  • -

    This method returns a new stream with the first limit chunks.

    -
    since

    v17.5.0

    -

    Parameters

    • limit: number
      -

      the number of chunks to take from the readable.

      -
    • Optional options: Pick<ArrayOptions, "signal">

    Returns Readable

    a stream with limit chunks taken.

    -
  • toArray(options?: Pick<ArrayOptions, "signal">): Promise<any[]>
  • -

    This method allows easily obtaining the contents of a stream.

    -

    As this method reads the entire stream into memory, it negates the benefits of streams. It's intended -for interoperability and convenience, not as the primary way to consume streams.

    -
    since

    v17.5.0

    -

    Parameters

    • Optional options: Pick<ArrayOptions, "signal">

    Returns Promise<any[]>

    a promise containing an array with the contents of the stream.

    -
  • -

    The readable.unpipe() method detaches a Writable stream previously attached -using the pipe method.

    -

    If the destination is not specified, then all pipes are detached.

    -

    If the destination is specified, but no pipe is set up for it, then -the method does nothing.

    -
    const fs = require('node:fs');
    const readable = getReadableStreamSomehow();
    const writable = fs.createWriteStream('file.txt');
    // All the data from readable goes into 'file.txt',
    // but only for the first second.
    readable.pipe(writable);
    setTimeout(() => {
    console.log('Stop writing to file.txt.');
    readable.unpipe(writable);
    console.log('Manually close the file stream.');
    writable.end();
    }, 1000); -
    -
    since

    v0.9.4

    -

    Parameters

    • Optional destination: WritableStream
      -

      Optional specific stream to unpipe

      -

    Returns fhirclient.RequestWithSession

  • unshift(chunk: any, encoding?: BufferEncoding): void
  • -

    Passing chunk as null signals the end of the stream (EOF) and behaves the -same as readable.push(null), after which no more data can be written. The EOF -signal is put at the end of the buffer and any buffered data will still be -flushed.

    -

    The readable.unshift() method pushes a chunk of data back into the internal -buffer. This is useful in certain situations where a stream is being consumed by -code that needs to "un-consume" some amount of data that it has optimistically -pulled out of the source, so that the data can be passed on to some other party.

    -

    The stream.unshift(chunk) method cannot be called after the 'end' event -has been emitted or a runtime error will be thrown.

    -

    Developers using stream.unshift() often should consider switching to -use of a Transform stream instead. See the API for stream implementers section for more information.

    -
    // Pull off a header delimited by \n\n.
    // Use unshift() if we get too much.
    // Call the callback with (error, header, stream).
    const { StringDecoder } = require('node:string_decoder');
    function parseHeader(stream, callback) {
    stream.on('error', callback);
    stream.on('readable', onReadable);
    const decoder = new StringDecoder('utf8');
    let header = '';
    function onReadable() {
    let chunk;
    while (null !== (chunk = stream.read())) {
    const str = decoder.write(chunk);
    if (str.includes('\n\n')) {
    // Found the header boundary.
    const split = str.split(/\n\n/);
    header += split.shift();
    const remaining = split.join('\n\n');
    const buf = Buffer.from(remaining, 'utf8');
    stream.removeListener('error', callback);
    // Remove the 'readable' listener before unshifting.
    stream.removeListener('readable', onReadable);
    if (buf.length)
    stream.unshift(buf);
    // Now the body of the message can be read from the stream.
    callback(null, header, stream);
    return;
    }
    // Still reading the header.
    header += str;
    }
    }
    } -
    -

    Unlike push, stream.unshift(chunk) will not -end the reading process by resetting the internal reading state of the stream. -This can cause unexpected results if readable.unshift() is called during a -read (i.e. from within a _read implementation on a -custom stream). Following the call to readable.unshift() with an immediate push will reset the reading state appropriately, -however it is best to simply avoid calling readable.unshift() while in the -process of performing a read.

    -
    since

    v0.9.11

    -

    Parameters

    • chunk: any
      -

      Chunk of data to unshift onto the read queue. For streams not operating in object mode, chunk must -be a {string}, {Buffer}, {TypedArray}, {DataView} or null. For object mode streams, chunk may be any JavaScript value.

      -
    • Optional encoding: BufferEncoding
      -

      Encoding of string chunks. Must be a valid Buffer encoding, such as 'utf8' or 'ascii'.

      -

    Returns void

  • -

    Prior to Node.js 0.10, streams did not implement the entire node:stream module API as it is currently defined. (See Compatibility for more -information.)

    -

    When using an older Node.js library that emits 'data' events and has a pause method that is advisory only, the readable.wrap() method can be used to create a Readable -stream that uses -the old stream as its data source.

    -

    It will rarely be necessary to use readable.wrap() but the method has been -provided as a convenience for interacting with older Node.js applications and -libraries.

    -
    const { OldReader } = require('./old-api-module.js');
    const { Readable } = require('node:stream');
    const oreader = new OldReader();
    const myReader = new Readable().wrap(oreader);

    myReader.on('readable', () => {
    myReader.read(); // etc.
    }); -
    -
    since

    v0.9.4

    -

    Parameters

    • stream: ReadableStream
      -

      An "old style" readable stream

      -

    Returns fhirclient.RequestWithSession

Legend

  • Namespace
  • Variable
  • Function
  • Function with type parameter
  • Property
  • Class

Settings

Theme

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/typedoc/interfaces/lib.fhirclient.SMART_API.html b/docs/typedoc/interfaces/lib.fhirclient.SMART_API.html deleted file mode 100644 index fec4bdf7..00000000 --- a/docs/typedoc/interfaces/lib.fhirclient.SMART_API.html +++ /dev/null @@ -1,40 +0,0 @@ -SMART_API | FHIRClient - v3.0.0-beta.1
Options
All
  • Public
  • Public/Protected
  • All
Menu

Hierarchy

  • SMART_API

Indexable

[key: string]: any

Index

Properties

Methods

  • -

    Starts the SMART Launch Sequence.

    -
    -

    IMPORTANT: authorize() will end up redirecting you to the - authorization server. This means that you should not add - anything to the returned promise chain. Any code written directly - after the authorize() call might not be executed due to that - redirect!

    -
    -

    The options that you would typically pass for an EHR launch are just -clientId and scope. For standalone launch you should also provide -the iss option.

    -

    Parameters

    Returns Promise<string | void>

  • -

    Creates and returns a Client instance that can be used to query the -FHIR server.

    -

    Parameters

    Returns ClientInterface

  • -

    This function can be used when you want to handle everything in one -page (no launch endpoint needed).

    -
      -
    1. It will only work if your launch_uri is the same as your redirectUri. -While this should be valid, we can't promise that every EHR will allow you -to register client with such settings.
    2. -
    3. Internally, init() will be called twice. First it will redirect to the EHR, - then the EHR will redirect back to the page where init() will be called - again to complete the authorization. This is generally fine, because the - returned promise will only be resolved once, after the second execution, - but please also consider the following:
    4. -
    -
      -
    • You should wrap all your app's code in a function that is only executed - after init() resolves!
    • -
    • Since the page will be loaded twice, you must be careful if your code has - global side effects that can persist between page reloads (for example - writing to localStorage).
    • -
    -

    Parameters

    Returns Promise<ClientInterface>

  • -

    This should be called on your redirectUri. Returns a Promise that -will eventually be resolved with a Client instance that you can use -to query the fhir server.

    -

    Parameters

    Returns Promise<any>

Legend

  • Namespace
  • Variable
  • Function
  • Function with type parameter
  • Property
  • Method
  • Class

Settings

Theme

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/typedoc/interfaces/lib.fhirclient.Storage.html b/docs/typedoc/interfaces/lib.fhirclient.Storage.html deleted file mode 100644 index b1bb237f..00000000 --- a/docs/typedoc/interfaces/lib.fhirclient.Storage.html +++ /dev/null @@ -1,13 +0,0 @@ -Storage | FHIRClient - v3.0.0-beta.1
Options
All
  • Public
  • Public/Protected
  • All
Menu
-

Simple key/value storage interface

-

Hierarchy

  • Storage

Implemented by

Index

Methods

  • get(key: string): Promise<any>
  • -

    Gets the value at key. Returns a promise that will be resolved -with that value (or undefined for missing keys).

    -

    Parameters

    • key: string

    Returns Promise<any>

  • set(key: string, value: any): Promise<any>
  • -

    Sets the value on key and returns a promise that will be resolved -with the value that was set.

    -

    Parameters

    • key: string
    • value: any

    Returns Promise<any>

  • unset(key: string): Promise<boolean>
  • -

    Deletes the value at key. Returns a promise that will be resolved -with true if the key was deleted or with false if it was not (eg. if -did not exist).

    -

    Parameters

    • key: string

    Returns Promise<boolean>

Legend

  • Namespace
  • Variable
  • Function
  • Function with type parameter
  • Method
  • Class

Settings

Theme

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/typedoc/interfaces/lib.fhirclient.TokenResponse.html b/docs/typedoc/interfaces/lib.fhirclient.TokenResponse.html deleted file mode 100644 index d3b5c282..00000000 --- a/docs/typedoc/interfaces/lib.fhirclient.TokenResponse.html +++ /dev/null @@ -1,47 +0,0 @@ -TokenResponse | FHIRClient - v3.0.0-beta.1
Options
All
  • Public
  • Public/Protected
  • All
Menu
-

The response object received from the token endpoint while trying to -exchange the auth code for an access token. This object has a well-known -base structure but the auth servers are free to augment it with -additional properties.

-
see

http://docs.smarthealthit.org/authorization/

-

Hierarchy

  • TokenResponse

Indexable

[key: string]: any
-

Other properties might be passed by the server

-

Index

Properties

access_token?: string
-

The access token issued by the authorization server

-
client_id?: string
-

If you have requested openid and profile scopes the profile of -the active user will be available as client_id. -NOTE: Regardless of it's name, this property does not store an ID -but a token that also suggests the user type like Patient/123, -Practitioner/xyz etc.

-
encounter?: string
-

If you have requested that require it (like launch or launch/encounter) -the selected encounter ID will be available here. -NOTE: This is not widely supported as of 2018.

-
expires_in?: number
-

Lifetime in seconds of the access token, after which the token SHALL NOT -be accepted by the resource server

-
id_token?: string
-

Authenticated patient identity and profile, if requested

-
need_patient_banner?: boolean
-

If present, this tells the app that it is being rendered within an -EHR frame and the UI outside that frame already displays the selected -patient's name, age, gender etc. The app can decide to hide those -details to prevent the UI from duplicated information.

-
patient?: string
-

If you have requested that require it (like launch or launch/patient) -the selected patient ID will be available here.

-
refresh_token?: string
-

Token that can be used to obtain a new access token, using the same or a -subset of the original authorization grants

-
scope?: string
-

Scope of access authorized. Note that this can be different from the -scopes requested by the app.

-
smart_style_url?: string
-

This could be a public location of some style settings that the EHR -would like to suggest. The app might look it up and optionally decide -to apply some or all of it.

-
see

https://launch.smarthealthit.org/smart-style.json

-
token_type?: "bearer" | "Bearer"
-

Fixed value: bearer

-

Legend

  • Namespace
  • Variable
  • Function
  • Function with type parameter
  • Property
  • Class

Settings

Theme

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/typedoc/interfaces/types.fhirclient.Adapter.html b/docs/typedoc/interfaces/types.fhirclient.Adapter.html index e9bb76c0..70608420 100644 --- a/docs/typedoc/interfaces/types.fhirclient.Adapter.html +++ b/docs/typedoc/interfaces/types.fhirclient.Adapter.html @@ -1,30 +1,30 @@ -Adapter | FHIRClient - v3.0.0-beta.1
Options
All
  • Public
  • Public/Protected
  • All
Menu

Hierarchy

  • Adapter

Implemented by

Index

Properties

+Adapter | FHIRClient - v3.0.0-beta.1
Options
All
  • Public
  • Public/Protected
  • All
Menu

Hierarchy

  • Adapter

Implemented by

Index

Properties

Environment-specific options

-
security: { digestSha256: any; generatePKCEChallenge: any; importJWK: any; randomBytes: any; signCompactJws: any }

Type declaration

  • digestSha256:function
    • digestSha256(payload: string): Promise<Uint8Array>
  • generatePKCEChallenge:function
    • generatePKCEChallenge(entropy?: number): Promise<{ codeChallenge: string; codeVerifier: string }>
    • Parameters

      • Optional entropy: number

      Returns Promise<{ codeChallenge: string; codeVerifier: string }>

  • importJWK:function
  • randomBytes:function
    • randomBytes(count: number): Uint8Array
  • signCompactJws:function
    • signCompactJws(alg: "ES384" | "RS384", privateKey: CryptoKey, header: any, payload: any): Promise<string>
    • Parameters

      • alg: "ES384" | "RS384"
      • privateKey: CryptoKey
      • header: any
      • payload: any

      Returns Promise<string>

Methods

  • base64decode(str: string): string
security: { digestSha256: any; generatePKCEChallenge: any; importJWK: any; randomBytes: any; signCompactJws: any }

Type declaration

  • digestSha256:function
    • digestSha256(payload: string): Promise<Uint8Array>
  • generatePKCEChallenge:function
    • generatePKCEChallenge(entropy?: number): Promise<{ codeChallenge: string; codeVerifier: string }>
    • Parameters

      • Optional entropy: number

      Returns Promise<{ codeChallenge: string; codeVerifier: string }>

  • importJWK:function
    • importJWK(jwk: JWK): Promise<CryptoKey>
  • randomBytes:function
    • randomBytes(count: number): Uint8Array
  • signCompactJws:function
    • signCompactJws(alg: "ES384" | "RS384", privateKey: CryptoKey, header: any, payload: any): Promise<string>
    • Parameters

      • alg: "ES384" | "RS384"
      • privateKey: CryptoKey
      • header: any
      • payload: any

      Returns Promise<string>

Methods

  • base64decode(str: string): string
  • base64encode(str: string): string
  • base64encode(str: string): string
  • base64urldecode(input: string): string
  • base64urldecode(input: string): string
  • Base64Url to ASCII string

    -

    Parameters

    • input: string

    Returns string

  • base64urlencode(input: string | Uint8Array): string
  • base64urlencode(input: string | Uint8Array): string
  • ASCII string or Uint8Array to Base64URL

    -

    Parameters

    • input: string | Uint8Array

    Returns string

  • Creates and returns adapter-aware SMART api. Not that while the shape of the returned object is well known, the arguments to this function are not. Those who override this method are free to require any environment-specific arguments. For example in node we will need a request, a response and optionally a storage or storage factory function.

    -

    Returns SMART

  • getUrl(): URL
  • getUrl(): URL
  • Given the current environment, this method returns the current url as URL instance

    -

    Returns URL

  • redirect(to: string): void | Promise<any>
  • redirect(to: string): void | Promise<any>
  • Given the current environment, this method must redirect to the given path

    -

    Parameters

    • to: string

    Returns void | Promise<any>

  • relative(path: string): string
  • relative(path: string): string
  • Given a relative path, compute and return the full url, assuming that it is relative to the current location

    Parameters

    • path: string

      The path to convert to absolute

      -

    Returns string

Legend

  • Namespace
  • Variable
  • Function
  • Function with type parameter
  • Property
  • Method
  • Class

Settings

Theme

Generated using TypeDoc

\ No newline at end of file +

Returns string

Legend

  • Namespace
  • Variable
  • Function
  • Function with type parameter
  • Property
  • Method
  • Class

Settings

Theme

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/typedoc/interfaces/types.fhirclient.AuthorizeParams.html b/docs/typedoc/interfaces/types.fhirclient.AuthorizeParams.html index 706bba36..a510e85d 100644 --- a/docs/typedoc/interfaces/types.fhirclient.AuthorizeParams.html +++ b/docs/typedoc/interfaces/types.fhirclient.AuthorizeParams.html @@ -1,69 +1,69 @@ AuthorizeParams | FHIRClient - v3.0.0-beta.1
Options
All
  • Public
  • Public/Protected
  • All
Menu

Authorization parameters that can be passed to authorize or init

-

Hierarchy

  • AuthorizeParams

Index

Properties

clientId?: string
+

Hierarchy

  • AuthorizeParams

Index

Properties

clientId?: string

The clientId that you have obtained while registering your app in the EHR. This is not required if you only intend to communicate with open FHIR servers.

-
clientPrivateJwk?: fhirclient.JWK
+
clientPrivateJwk?: JWK

If you have registered a confidential client, you should pass your clientPrivateJwk here. Note: ONLY use this on the server, as the browsers are considered incapable of keeping a secret.

-
clientPublicKeySetUrl?: string
+
clientPublicKeySetUrl?: string

If you have registered a confidential client and you host your public key online, you can pass your JWKS URL here Note: ONLY use this on the server, as the browsers are considered incapable of keeping a secret.

-
clientSecret?: string
+
clientSecret?: string

If you have registered a confidential client, you should pass your clientSecret here. Note: ONLY use this on the server, as the browsers are considered incapable of keeping a secret.

-
completeInTarget?: boolean
+
completeInTarget?: boolean

If true, the app will be initialized in the specified AuthorizeParams.target. Otherwise, the app will be initialized in the window in which authorize was called.

-
encounterId?: string
+
encounterId?: string

The ID of the selected encounter. If you are launching against an open FHIR server, there is no way to obtain the launch context that would (in some EHRs) include the selected encounter ID. This way you can "inject" that ID and make the client behave as if this is the currently active encounter.

-
fakeTokenResponse?: object
+
fakeTokenResponse?: object

Useful for testing. This object can contain any properties that are typically contained in an access token response. These properties will be stored into the client state, as if it has been authorized.

-
fhirServiceUrl?: string
+
fhirServiceUrl?: string

The base URL of the FHIR server to use. This is just like the iss option, except that it is designed to bypass the authentication. If fhirServiceUrl is passed, the authorize function will NOT actually attempt to authorize. It will skip that and redirect you to your redirectUri.

-
height?: number
+
height?: number

The height of the authorization popup window. Only used in browsers and if the AuthorizeParams.target option is set to "popup".

-
iss?: string
+
iss?: string

This is the URL of the service you are connecting to. For EHR Launch you MUST NOT provide this option. It will be passed by the EHR as url parameter instead. Using iss as an option will "lock" your app to that service provider. In other words, passing an iss option is how you can do Standalone Launch.

-
issMatch?: string | RegExp | ((iss: string) => boolean)
+
issMatch?: string | RegExp | ((iss: string) => boolean)

Can be used to verify that the app is being launched against certain servers. This is especially useful when working with multiple EHR configurations. Can be a string (in which case it will be expected to match the provided ISS exactly), a regular expression to test against the current ISS, or a function that will be called with the current ISS and should return true or false to signify if that ISS is acceptable.

-
launch?: string
+
launch?: string

Do not pass use this option, unless you want to test it. It should come as url parameter from the SMART authorization server as part of the EHR launch sequence

-
noRedirect?: boolean
patientId?: string
+
noRedirect?: boolean
patientId?: string

The ID of the selected patient. If you are launching against an open FHIR server, there is no way to obtain the launch context that would include the selected patient ID. This way you can "inject" that ID and make the client behave as if that is the currently active patient.

-
pkceMode?: fhirclient.PkceMode
+
pkceMode?: PkceMode

Client expectations for PKCE (Proof Key for Code Exchange). Can be one of:

    @@ -74,9 +74,9 @@ conformance, so validate your server supports PKCE before using this setting
-
redirectUri?: string
+
redirectUri?: string

Defaults to the current directory (it's index file)

-
refreshTokenWithCredentials?: RequestCredentials
+
refreshTokenWithCredentials?: RequestCredentials

Do we want to send cookies while making a request to the token endpoint in order to obtain new access token using existing refresh token. In rare cases the auth server might require the client to send @@ -86,10 +86,10 @@

  • "same-origin" - only send cookies if we are on the same domain (default)
  • "omit" - do not send cookies
  • -
    scope?: string
    +
    scope?: string

    One or more space-separated scopes that you would like to request from the EHR. Learn more

    -
    +
    target?: WindowTarget

    Where to start the auth flow. This option is only applicable in browsers and is ignored on the server. Can be one of:

      @@ -104,7 +104,7 @@
    • Function A function that returns one of the above values or a promise that will resolve to such value.
    -
    width?: number
    +
    width?: number

    The width of the authorization popup window. Only used in browsers and if the AuthorizeParams.target option is set to "popup".

    -

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Property
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file +

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Property
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/typedoc/interfaces/types.fhirclient.BrowserFHIRSettings.html b/docs/typedoc/interfaces/types.fhirclient.BrowserFHIRSettings.html index 6430f3b8..d5dad95a 100644 --- a/docs/typedoc/interfaces/types.fhirclient.BrowserFHIRSettings.html +++ b/docs/typedoc/interfaces/types.fhirclient.BrowserFHIRSettings.html @@ -1 +1 @@ -BrowserFHIRSettings | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file +BrowserFHIRSettings | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/typedoc/interfaces/types.fhirclient.ClientState.html b/docs/typedoc/interfaces/types.fhirclient.ClientState.html index 0b8ca1dc..cfc35d81 100644 --- a/docs/typedoc/interfaces/types.fhirclient.ClientState.html +++ b/docs/typedoc/interfaces/types.fhirclient.ClientState.html @@ -1,39 +1,39 @@ ClientState | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Describes the state that should be passed to the Client constructor. Everything except serverUrl is optional

    -

    Hierarchy

    • ClientState

    Index

    Properties

    authorizeUri?: string
    +

    Hierarchy

    • ClientState

    Index

    Properties

    authorizeUri?: string

    You must call this endpoint to ask for authorization code

    -
    clientId?: string
    +
    clientId?: string

    The clientId that you should have obtained while registering your app with the auth server or EHR (as set in the configuration options)

    -
    clientPrivateJwk?: fhirclient.JWK
    +
    clientPrivateJwk?: JWK

    Your client private JWK if you have one (for asymmetric confidential clients)

    -
    clientPublicKeySetUrl?: string
    +
    clientPublicKeySetUrl?: string

    Your client public JWKS url if you have one (for asymmetric confidential clients that have registered a JWKS URL)

    -
    clientSecret?: string
    +
    clientSecret?: string

    Your client secret if you have one (for symmetric confidential clients)

    -
    codeChallenge?: string
    +
    codeChallenge?: string

    PKCE code challenge base value.

    -
    codeVerifier?: string
    +
    codeVerifier?: string

    PKCE code verification, formatted with base64url-encode (RFC 4648 § 5) without padding, which is NOT the same as regular base64 encoding.

    -
    completeInTarget?: boolean
    +
    completeInTarget?: boolean

    If true, the app requested to be initialized in the specified AuthorizeParams.target. Otherwise, the app requested to be initialized in the window in which authorize was called.

    -
    expiresAt?: number
    +
    expiresAt?: number

    An Unix timestamp (JSON numeric value representing the number of seconds since 1970). This updated every time an access token is received from the server.

    -
    key?: string
    +
    key?: string

    The key under which this state is persisted in the storage

    -
    password?: string
    +
    password?: string

    The password for basic auth. If present, username must also be provided.

    -
    redirectUri?: string
    +
    redirectUri?: string

    The URI to redirect to after successful authorization, as set in the configuration options.

    -
    refreshTokenWithCredentials?: RequestCredentials
    +
    refreshTokenWithCredentials?: RequestCredentials

    Do we want to send cookies while making a request to the token endpoint in order to obtain new access token using existing refresh token. In rare cases the auth server might require the client to send @@ -43,21 +43,21 @@

  • "same-origin" - only send cookies if we are on the same domain (default)
  • "omit" - do not send cookies
  • -
    registrationUri?: string
    +
    registrationUri?: string

    You could register new SMART client at this endpoint (if the server supports dynamic client registration)

    -
    scope?: string
    +
    scope?: string

    The access scopes that you requested in your options (or an empty string).

    see

    http://docs.smarthealthit.org/authorization/scopes-and-launch-context/

    -
    serverUrl: string
    +
    serverUrl: string

    The base URL of the Fhir server. The library should have detected it at authorization time from request query params of from config options.

    -
    tokenResponse?: fhirclient.TokenResponse
    +
    tokenResponse?: TokenResponse

    The response object received from the token endpoint while trying to exchange the auth code for an access token (if you have reached that point).

    -
    tokenUri?: string
    +
    tokenUri?: string

    You must call this endpoint to exchange your authorization code for an access token.

    -
    username?: string
    +
    username?: string

    The username for basic auth. If present, password must also be provided.

    -

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Property
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file +

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Property
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/typedoc/interfaces/types.fhirclient.CodeValue.html b/docs/typedoc/interfaces/types.fhirclient.CodeValue.html index 063b2064..cebf3427 100644 --- a/docs/typedoc/interfaces/types.fhirclient.CodeValue.html +++ b/docs/typedoc/interfaces/types.fhirclient.CodeValue.html @@ -1 +1 @@ -CodeValue | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Property
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file +CodeValue | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Property
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/typedoc/interfaces/types.fhirclient.CombinedFetchResult.html b/docs/typedoc/interfaces/types.fhirclient.CombinedFetchResult.html index 26c5d923..6b36ae3f 100644 --- a/docs/typedoc/interfaces/types.fhirclient.CombinedFetchResult.html +++ b/docs/typedoc/interfaces/types.fhirclient.CombinedFetchResult.html @@ -2,4 +2,4 @@

    If an includeResponse is set to true when calling the lib.request function the returned object will include the Response object and the parsed body if available

    -

    Type Parameters

    Hierarchy

    • CombinedFetchResult

    Index

    Properties

    Properties

    body?: T
    response: Response

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Property
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file +

    Type Parameters

    Hierarchy

    • CombinedFetchResult

    Index

    Properties

    Properties

    body?: T
    response: Response

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Property
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/typedoc/interfaces/types.fhirclient.ES384JWK.html b/docs/typedoc/interfaces/types.fhirclient.ES384JWK.html index 6a970a89..77a9434b 100644 --- a/docs/typedoc/interfaces/types.fhirclient.ES384JWK.html +++ b/docs/typedoc/interfaces/types.fhirclient.ES384JWK.html @@ -1 +1 @@ -ES384JWK | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Hierarchy

    • JsonWebKey
      • ES384JWK

    Indexable

    [propName: string]: unknown

    Index

    Properties

    alg: "ES384"
    crv: "P-384"
    d?: string
    dp?: string
    dq?: string
    e?: string
    ext?: boolean
    k?: string
    key_ops?: KeyUsage[]
    kid: string
    kty: "EC"
    n?: string
    oth?: RsaOtherPrimesInfo[]
    p?: string
    q?: string
    qi?: string
    use?: string
    x?: string
    y?: string

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Property
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file +ES384JWK | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Hierarchy

    • JsonWebKey
      • ES384JWK

    Indexable

    [propName: string]: unknown

    Index

    Properties

    alg: "ES384"
    crv: "P-384"
    d?: string
    dp?: string
    dq?: string
    e?: string
    ext?: boolean
    k?: string
    key_ops?: KeyUsage[]
    kid: string
    kty: "EC"
    n?: string
    oth?: RsaOtherPrimesInfo[]
    p?: string
    q?: string
    qi?: string
    use?: string
    x?: string
    y?: string

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Property
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/typedoc/interfaces/types.fhirclient.FHIR.BackboneElement.html b/docs/typedoc/interfaces/types.fhirclient.FHIR.BackboneElement.html index 5615e099..ad610c68 100644 --- a/docs/typedoc/interfaces/types.fhirclient.FHIR.BackboneElement.html +++ b/docs/typedoc/interfaces/types.fhirclient.FHIR.BackboneElement.html @@ -1 +1 @@ -BackboneElement | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Property
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file +BackboneElement | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Property
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/typedoc/interfaces/types.fhirclient.FHIR.Bundle.html b/docs/typedoc/interfaces/types.fhirclient.FHIR.Bundle.html index ca3af750..4c45aea6 100644 --- a/docs/typedoc/interfaces/types.fhirclient.FHIR.Bundle.html +++ b/docs/typedoc/interfaces/types.fhirclient.FHIR.Bundle.html @@ -1,11 +1,11 @@ -Bundle | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Hierarchy

    Index

    Properties

    id?: string
    +Bundle | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Hierarchy

    Index

    Properties

    entry?: BundleEntry[]
    id?: string

    Logical id of this artifact

    -
    +
    identifier?: Identifier

    Persistent identifier for the bundle

    -
    implicitRules?: string
    +
    implicitRules?: string

    A set of rules under which this content was created

    -
    language?: string
    +
    language?: string

    Language of the resource content

    -
    +
    link: BundleLink[]
    meta?: Meta

    Metadata about the resource

    -
    resourceType?: string
    total?: number
    type: "message" | "document" | "history" | "transaction" | "transaction-response" | "batch" | "batch-response" | "searchset" | "collection"

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Property
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file +
    resourceType?: string
    total?: number
    type: "message" | "document" | "history" | "transaction" | "transaction-response" | "batch" | "batch-response" | "searchset" | "collection"

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Property
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/typedoc/interfaces/types.fhirclient.FHIR.BundleEntry.html b/docs/typedoc/interfaces/types.fhirclient.FHIR.BundleEntry.html index b7d883ee..25d10028 100644 --- a/docs/typedoc/interfaces/types.fhirclient.FHIR.BundleEntry.html +++ b/docs/typedoc/interfaces/types.fhirclient.FHIR.BundleEntry.html @@ -1 +1 @@ -BundleEntry | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Property
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file +BundleEntry | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Property
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/typedoc/interfaces/types.fhirclient.FHIR.BundleLink.html b/docs/typedoc/interfaces/types.fhirclient.FHIR.BundleLink.html index 9d19400c..f9706bdb 100644 --- a/docs/typedoc/interfaces/types.fhirclient.FHIR.BundleLink.html +++ b/docs/typedoc/interfaces/types.fhirclient.FHIR.BundleLink.html @@ -1 +1 @@ -BundleLink | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Property
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file +BundleLink | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Property
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/typedoc/interfaces/types.fhirclient.FHIR.CapabilityStatement.html b/docs/typedoc/interfaces/types.fhirclient.FHIR.CapabilityStatement.html index 0db87bcf..f6a614ea 100644 --- a/docs/typedoc/interfaces/types.fhirclient.FHIR.CapabilityStatement.html +++ b/docs/typedoc/interfaces/types.fhirclient.FHIR.CapabilityStatement.html @@ -1 +1 @@ -CapabilityStatement | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Property
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file +CapabilityStatement | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Hierarchy

    • CapabilityStatement

    Index

    Properties

    fhirVersion: string
    resourceType: string
    rest: { resource: { type: string }[]; security?: { cors?: boolean; extension?: { extension: Extension<"valueUri">[]; url: string }[] } }[]

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Property
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/typedoc/interfaces/types.fhirclient.FHIR.CodeableConcept.html b/docs/typedoc/interfaces/types.fhirclient.FHIR.CodeableConcept.html index f048411e..dcde39fc 100644 --- a/docs/typedoc/interfaces/types.fhirclient.FHIR.CodeableConcept.html +++ b/docs/typedoc/interfaces/types.fhirclient.FHIR.CodeableConcept.html @@ -1,5 +1,5 @@ -CodeableConcept | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Hierarchy

    Index

    Properties

    +CodeableConcept | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Property
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file +

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Property
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/typedoc/interfaces/types.fhirclient.FHIR.Coding.html b/docs/typedoc/interfaces/types.fhirclient.FHIR.Coding.html index aa00e990..80bb59c3 100644 --- a/docs/typedoc/interfaces/types.fhirclient.FHIR.Coding.html +++ b/docs/typedoc/interfaces/types.fhirclient.FHIR.Coding.html @@ -1,11 +1,11 @@ -Coding | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Hierarchy

    Index

    Properties

    code?: string
    +Coding | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Hierarchy

    Index

    Properties

    code?: string

    Symbol in syntax defined by the system

    -
    display?: string
    +
    display?: string

    Representation defined by the system

    -
    id?: string
    system?: string
    +
    extension?: Extension<valueX>[]
    id?: string
    system?: string

    Identity of the terminology system

    -
    userSelected?: boolean
    +
    userSelected?: boolean

    If this coding was chosen directly by the user

    -
    version?: string
    +
    version?: string

    Version of the system - if relevant

    -

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Property
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file +

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Property
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/typedoc/interfaces/types.fhirclient.FHIR.Element.html b/docs/typedoc/interfaces/types.fhirclient.FHIR.Element.html index b0978a05..de823928 100644 --- a/docs/typedoc/interfaces/types.fhirclient.FHIR.Element.html +++ b/docs/typedoc/interfaces/types.fhirclient.FHIR.Element.html @@ -1 +1 @@ -Element | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Property
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file +Element | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Property
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/typedoc/interfaces/types.fhirclient.FHIR.Encounter.html b/docs/typedoc/interfaces/types.fhirclient.FHIR.Encounter.html index 13e8dc95..1556a18b 100644 --- a/docs/typedoc/interfaces/types.fhirclient.FHIR.Encounter.html +++ b/docs/typedoc/interfaces/types.fhirclient.FHIR.Encounter.html @@ -1,9 +1,9 @@ -Encounter | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Hierarchy

    Index

    Properties

    id?: string
    +Encounter | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Hierarchy

    Index

    Properties

    id?: string

    Logical id of this artifact

    -
    implicitRules?: string
    +
    implicitRules?: string

    A set of rules under which this content was created

    -
    language?: string
    +
    language?: string

    Language of the resource content

    -
    +
    meta?: Meta

    Metadata about the resource

    -
    resourceType: "Encounter"

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Property
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file +
    resourceType: "Encounter"

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Property
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/typedoc/interfaces/types.fhirclient.FHIR.Extension.html b/docs/typedoc/interfaces/types.fhirclient.FHIR.Extension.html index f9865231..ceee879b 100644 --- a/docs/typedoc/interfaces/types.fhirclient.FHIR.Extension.html +++ b/docs/typedoc/interfaces/types.fhirclient.FHIR.Extension.html @@ -1,3 +1,3 @@ -Extension | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Type Parameters

    • T = "valueX"

    Hierarchy

    Indexable

    [T: string]: any

    Index

    Properties

    Properties

    id?: string
    url: string
    +Extension | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Property
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file +

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Property
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/typedoc/interfaces/types.fhirclient.FHIR.Identifier.html b/docs/typedoc/interfaces/types.fhirclient.FHIR.Identifier.html index 91b404a1..0de71b36 100644 --- a/docs/typedoc/interfaces/types.fhirclient.FHIR.Identifier.html +++ b/docs/typedoc/interfaces/types.fhirclient.FHIR.Identifier.html @@ -1,11 +1,11 @@ -Identifier | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Hierarchy

    Index

    Properties

    +Identifier | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Hierarchy

    Index

    Properties

    assigner?: Reference

    Organization that issued id (may be just text)

    -
    id?: string
    +
    extension?: Extension<valueX>[]
    id?: string
    period?: Period

    Time period when id is/was valid for use

    -
    system?: string
    +
    system?: string

    The namespace for the identifier value

    -
    +

    Description of identifier

    -
    use?: "usual" | "official" | "temp" | "secondary"
    value?: string
    +
    use?: "usual" | "official" | "temp" | "secondary"
    value?: string

    The value that is unique

    -

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Property
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file +

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Property
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/typedoc/interfaces/types.fhirclient.FHIR.Meta.html b/docs/typedoc/interfaces/types.fhirclient.FHIR.Meta.html index 3142885f..d762ab8d 100644 --- a/docs/typedoc/interfaces/types.fhirclient.FHIR.Meta.html +++ b/docs/typedoc/interfaces/types.fhirclient.FHIR.Meta.html @@ -1,3 +1,3 @@ -Meta | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Hierarchy

    Index

    Properties

    id?: string
    lastUpdated: string
    +Meta | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Property
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file +

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Property
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/typedoc/interfaces/types.fhirclient.FHIR.Observation.html b/docs/typedoc/interfaces/types.fhirclient.FHIR.Observation.html index 0a60de57..b21267ee 100644 --- a/docs/typedoc/interfaces/types.fhirclient.FHIR.Observation.html +++ b/docs/typedoc/interfaces/types.fhirclient.FHIR.Observation.html @@ -1,9 +1,9 @@ -Observation | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Hierarchy

    Index

    Properties

    id?: string
    +Observation | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Hierarchy

    Index

    Properties

    id?: string

    Logical id of this artifact

    -
    implicitRules?: string
    +
    implicitRules?: string

    A set of rules under which this content was created

    -
    language?: string
    +
    language?: string

    Language of the resource content

    -
    +
    meta?: Meta

    Metadata about the resource

    -
    resourceType: "Observation"

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Property
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file +
    resourceType: "Observation"

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Property
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/typedoc/interfaces/types.fhirclient.FHIR.Patient.html b/docs/typedoc/interfaces/types.fhirclient.FHIR.Patient.html index 85337ec2..7c487113 100644 --- a/docs/typedoc/interfaces/types.fhirclient.FHIR.Patient.html +++ b/docs/typedoc/interfaces/types.fhirclient.FHIR.Patient.html @@ -1,9 +1,9 @@ -Patient | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Hierarchy

    Index

    Properties

    id?: string
    +Patient | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Hierarchy

    Index

    Properties

    id?: string

    Logical id of this artifact

    -
    implicitRules?: string
    +
    implicitRules?: string

    A set of rules under which this content was created

    -
    language?: string
    +
    language?: string

    Language of the resource content

    -
    +
    meta?: Meta

    Metadata about the resource

    -
    resourceType: "Patient"

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Property
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file +
    resourceType: "Patient"

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Property
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/typedoc/interfaces/types.fhirclient.FHIR.Period.html b/docs/typedoc/interfaces/types.fhirclient.FHIR.Period.html index 1953647a..7b5d46f0 100644 --- a/docs/typedoc/interfaces/types.fhirclient.FHIR.Period.html +++ b/docs/typedoc/interfaces/types.fhirclient.FHIR.Period.html @@ -1,5 +1,5 @@ -Period | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Hierarchy

    Index

    Properties

    end?: string
    +Period | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Property
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file +

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Property
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/typedoc/interfaces/types.fhirclient.FHIR.Practitioner.html b/docs/typedoc/interfaces/types.fhirclient.FHIR.Practitioner.html index cd3dee62..80e41cf2 100644 --- a/docs/typedoc/interfaces/types.fhirclient.FHIR.Practitioner.html +++ b/docs/typedoc/interfaces/types.fhirclient.FHIR.Practitioner.html @@ -1,9 +1,9 @@ -Practitioner | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Hierarchy

    Index

    Properties

    id?: string
    +Practitioner | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Hierarchy

    Index

    Properties

    id?: string

    Logical id of this artifact

    -
    implicitRules?: string
    +
    implicitRules?: string

    A set of rules under which this content was created

    -
    language?: string
    +
    language?: string

    Language of the resource content

    -
    +
    meta?: Meta

    Metadata about the resource

    -
    resourceType: "Practitioner"

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Property
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file +
    resourceType: "Practitioner"

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Property
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/typedoc/interfaces/types.fhirclient.FHIR.Reference.html b/docs/typedoc/interfaces/types.fhirclient.FHIR.Reference.html index c47377a1..8aa31e36 100644 --- a/docs/typedoc/interfaces/types.fhirclient.FHIR.Reference.html +++ b/docs/typedoc/interfaces/types.fhirclient.FHIR.Reference.html @@ -1,7 +1,7 @@ -Reference | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Hierarchy

    Index

    Properties

    display?: string
    +Reference | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Hierarchy

    Index

    Properties

    display?: string

    Text alternative for the resource

    -
    id?: string
    +
    extension?: Extension<valueX>[]
    id?: string
    identifier?: Identifier

    Logical reference, when literal reference is not known

    -
    reference?: string
    +
    reference?: string

    Literal reference, Relative, internal or absolute URL

    -

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Property
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file +

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Property
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/typedoc/interfaces/types.fhirclient.FHIR.RelatedPerson.html b/docs/typedoc/interfaces/types.fhirclient.FHIR.RelatedPerson.html index c02e6bf2..024b1405 100644 --- a/docs/typedoc/interfaces/types.fhirclient.FHIR.RelatedPerson.html +++ b/docs/typedoc/interfaces/types.fhirclient.FHIR.RelatedPerson.html @@ -1,9 +1,9 @@ -RelatedPerson | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Hierarchy

    Index

    Properties

    id?: string
    +RelatedPerson | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Hierarchy

    Index

    Properties

    id?: string

    Logical id of this artifact

    -
    implicitRules?: string
    +
    implicitRules?: string

    A set of rules under which this content was created

    -
    language?: string
    +
    language?: string

    Language of the resource content

    -
    +
    meta?: Meta

    Metadata about the resource

    -
    resourceType: "RelatedPerson"

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Property
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file +
    resourceType: "RelatedPerson"

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Property
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/typedoc/interfaces/types.fhirclient.FHIR.Resource.html b/docs/typedoc/interfaces/types.fhirclient.FHIR.Resource.html index 21788a1c..9ac4fdb6 100644 --- a/docs/typedoc/interfaces/types.fhirclient.FHIR.Resource.html +++ b/docs/typedoc/interfaces/types.fhirclient.FHIR.Resource.html @@ -1,9 +1,9 @@ -Resource | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Hierarchy

    Index

    Properties

    id?: string
    +Resource | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Hierarchy

    Index

    Properties

    id?: string

    Logical id of this artifact

    -
    implicitRules?: string
    +
    implicitRules?: string

    A set of rules under which this content was created

    -
    language?: string
    +
    language?: string

    Language of the resource content

    -
    +
    meta?: Meta

    Metadata about the resource

    -
    resourceType?: string

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Property
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file +
    resourceType?: string

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Property
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/typedoc/interfaces/types.fhirclient.FetchOptions.html b/docs/typedoc/interfaces/types.fhirclient.FetchOptions.html index 4fcd14aa..0a6325e6 100644 --- a/docs/typedoc/interfaces/types.fhirclient.FetchOptions.html +++ b/docs/typedoc/interfaces/types.fhirclient.FetchOptions.html @@ -8,7 +8,7 @@

    A string indicating whether credentials will be sent with the request always, never, or only when sent to a same-origin URL. Sets request's credentials.

    headers?: HeadersInit

    A Headers object, an object literal, or an array of two-item arrays to set request's headers.

    -
    includeResponse?: boolean
    +
    includeResponse?: boolean

    If true the request function will be instructed to resolve with a CombinedFetchResult object that contains the Response object abd the parsed body (if any)

    @@ -30,4 +30,4 @@

    An AbortSignal to set request's signal.

    window?: null

    Can only be null. Used to disassociate request from any Window.

    -

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Property
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file +

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Property
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/typedoc/interfaces/types.fhirclient.FhirOptions.html b/docs/typedoc/interfaces/types.fhirclient.FhirOptions.html index 37cb55ab..00308bc7 100644 --- a/docs/typedoc/interfaces/types.fhirclient.FhirOptions.html +++ b/docs/typedoc/interfaces/types.fhirclient.FhirOptions.html @@ -1,7 +1,7 @@ FhirOptions | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Additional options that can be passed to client.request to control its behavior

    -

    Hierarchy

    • FhirOptions

    Index

    Properties

    flat?: boolean
    +

    Hierarchy

    • FhirOptions

    Index

    Properties

    flat?: boolean

    When fetching a Bundle, you are typically only interested in the included resources which are located at {response}.entry[N].resource. If this option is set to true, the returned result will be an array of @@ -21,11 +21,11 @@ always get an array, even if it is empty, and even if no entry is found in the response bundle. -

    graph?: boolean
    +
    graph?: boolean

    Only applicable if you use resolveReferences. If false, the resolved references will not be "mounted" in the result tree, but will be returned as separate map object instead. Defaults to true.

    -
    pageLimit?: number
    +
    pageLimit?: number

    When you request a Bundle, the result will typically come back in pages and you will only get the first page. You can use pageLimit greater than 1 to request multiple pages. For example pageLimit: 3 will fetch @@ -35,7 +35,7 @@

  • Defaults to 1.
  • Ignored if the response is not a Bundle.
  • -
    resolveReferences?: string | string[]
    +
    resolveReferences?: string | string[]

    One or more references to resolve. Single item can be specified as a string or as an array of one string. Multiple items must be specified as array.

    @@ -55,7 +55,7 @@
  • This option does not work with contained references (they are "already resolved" anyway).
  • -
    useRefreshToken?: boolean
    +
    useRefreshToken?: boolean

    If the client is authorized, it will possess an access token and pass it with the requests it makes. When that token expires, you should get back a 401 Unauthorized response. When that happens, if the client also has @@ -69,7 +69,7 @@

    • Defaults to true.
    -

    Methods

    Methods

    • When you fetch multiple pages the resulting array may be very large, requiring a lot of time and memory. It is often better if you specify a page callback instead. The onPage callback will be called once for each @@ -87,10 +87,10 @@ handle the result one page at a time, instead of expecting to receive the big combined result.

    -

    Parameters

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Property
    • Method
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file +

    Returns any

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Property
    • Method
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/typedoc/interfaces/types.fhirclient.IDToken.html b/docs/typedoc/interfaces/types.fhirclient.IDToken.html index 77627b64..1752cda2 100644 --- a/docs/typedoc/interfaces/types.fhirclient.IDToken.html +++ b/docs/typedoc/interfaces/types.fhirclient.IDToken.html @@ -1 +1 @@ -IDToken | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Property
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file +IDToken | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Property
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/typedoc/interfaces/types.fhirclient.IncludeResponseHint.html b/docs/typedoc/interfaces/types.fhirclient.IncludeResponseHint.html index c2b43792..3976d784 100644 --- a/docs/typedoc/interfaces/types.fhirclient.IncludeResponseHint.html +++ b/docs/typedoc/interfaces/types.fhirclient.IncludeResponseHint.html @@ -1 +1 @@ -IncludeResponseHint | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Property
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file +IncludeResponseHint | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Property
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/typedoc/interfaces/types.fhirclient.JsonObject.html b/docs/typedoc/interfaces/types.fhirclient.JsonObject.html index 3a2f8aef..73697ff7 100644 --- a/docs/typedoc/interfaces/types.fhirclient.JsonObject.html +++ b/docs/typedoc/interfaces/types.fhirclient.JsonObject.html @@ -1 +1 @@ -JsonObject | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file +JsonObject | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/typedoc/interfaces/types.fhirclient.JsonPatchAdd.html b/docs/typedoc/interfaces/types.fhirclient.JsonPatchAdd.html index d4a4ad92..db8ae063 100644 --- a/docs/typedoc/interfaces/types.fhirclient.JsonPatchAdd.html +++ b/docs/typedoc/interfaces/types.fhirclient.JsonPatchAdd.html @@ -1 +1 @@ -JsonPatchAdd | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Property
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file +JsonPatchAdd | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Property
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/typedoc/interfaces/types.fhirclient.JsonPatchCopy.html b/docs/typedoc/interfaces/types.fhirclient.JsonPatchCopy.html index 86fb922c..dbea8a61 100644 --- a/docs/typedoc/interfaces/types.fhirclient.JsonPatchCopy.html +++ b/docs/typedoc/interfaces/types.fhirclient.JsonPatchCopy.html @@ -1 +1 @@ -JsonPatchCopy | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Property
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file +JsonPatchCopy | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Property
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/typedoc/interfaces/types.fhirclient.JsonPatchMove.html b/docs/typedoc/interfaces/types.fhirclient.JsonPatchMove.html index 20051ee1..e0183944 100644 --- a/docs/typedoc/interfaces/types.fhirclient.JsonPatchMove.html +++ b/docs/typedoc/interfaces/types.fhirclient.JsonPatchMove.html @@ -1 +1 @@ -JsonPatchMove | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Property
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file +JsonPatchMove | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Property
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/typedoc/interfaces/types.fhirclient.JsonPatchRemove.html b/docs/typedoc/interfaces/types.fhirclient.JsonPatchRemove.html index 09952ba0..c8487539 100644 --- a/docs/typedoc/interfaces/types.fhirclient.JsonPatchRemove.html +++ b/docs/typedoc/interfaces/types.fhirclient.JsonPatchRemove.html @@ -1 +1 @@ -JsonPatchRemove | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Property
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file +JsonPatchRemove | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Property
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/typedoc/interfaces/types.fhirclient.JsonPatchReplace.html b/docs/typedoc/interfaces/types.fhirclient.JsonPatchReplace.html index a32b72bc..bfc59507 100644 --- a/docs/typedoc/interfaces/types.fhirclient.JsonPatchReplace.html +++ b/docs/typedoc/interfaces/types.fhirclient.JsonPatchReplace.html @@ -1 +1 @@ -JsonPatchReplace | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Property
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file +JsonPatchReplace | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Property
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/typedoc/interfaces/types.fhirclient.JsonPatchTest.html b/docs/typedoc/interfaces/types.fhirclient.JsonPatchTest.html index e5df3a7a..a608d035 100644 --- a/docs/typedoc/interfaces/types.fhirclient.JsonPatchTest.html +++ b/docs/typedoc/interfaces/types.fhirclient.JsonPatchTest.html @@ -1 +1 @@ -JsonPatchTest | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Property
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file +JsonPatchTest | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Property
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/typedoc/interfaces/types.fhirclient.OAuthSecurityExtensions.html b/docs/typedoc/interfaces/types.fhirclient.OAuthSecurityExtensions.html index f639bad4..63689c34 100644 --- a/docs/typedoc/interfaces/types.fhirclient.OAuthSecurityExtensions.html +++ b/docs/typedoc/interfaces/types.fhirclient.OAuthSecurityExtensions.html @@ -1,14 +1,14 @@ OAuthSecurityExtensions | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    The three security endpoints that SMART servers might declare in the conformance statement

    -

    Hierarchy

    • OAuthSecurityExtensions

    Index

    Properties

    authorizeUri: string
    +

    Hierarchy

    • OAuthSecurityExtensions

    Index

    Properties

    authorizeUri: string

    You must call this endpoint to ask for authorization code

    -
    codeChallengeMethods: string[]
    +
    codeChallengeMethods: string[]

    Supported PKCE Code challenge methods

    -
    registrationUri: string
    +
    registrationUri: string

    You could register new SMART client at this endpoint (if the server supports dynamic client registration)

    -
    tokenUri: string
    +
    tokenUri: string

    You must call this endpoint to exchange your authorization code for an access token.

    -

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Property
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file +

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Property
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/typedoc/interfaces/types.fhirclient.ObservationMap.html b/docs/typedoc/interfaces/types.fhirclient.ObservationMap.html index 6c5ae784..86b7c046 100644 --- a/docs/typedoc/interfaces/types.fhirclient.ObservationMap.html +++ b/docs/typedoc/interfaces/types.fhirclient.ObservationMap.html @@ -1 +1 @@ -ObservationMap | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file +ObservationMap | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/typedoc/interfaces/types.fhirclient.RS384JWK.html b/docs/typedoc/interfaces/types.fhirclient.RS384JWK.html index 2c58a70b..07498262 100644 --- a/docs/typedoc/interfaces/types.fhirclient.RS384JWK.html +++ b/docs/typedoc/interfaces/types.fhirclient.RS384JWK.html @@ -1 +1 @@ -RS384JWK | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Hierarchy

    • JsonWebKey
      • RS384JWK

    Indexable

    [propName: string]: unknown

    Index

    Properties

    alg: "RS384"
    crv?: string
    d?: string
    dp?: string
    dq?: string
    e?: string
    ext?: boolean
    k?: string
    key_ops?: KeyUsage[]
    kid: string
    kty: "RSA"
    n?: string
    oth?: RsaOtherPrimesInfo[]
    p?: string
    q?: string
    qi?: string
    use?: string
    x?: string
    y?: string

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Property
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file +RS384JWK | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Hierarchy

    • JsonWebKey
      • RS384JWK

    Indexable

    [propName: string]: unknown

    Index

    Properties

    alg: "RS384"
    crv?: string
    d?: string
    dp?: string
    dq?: string
    e?: string
    ext?: boolean
    k?: string
    key_ops?: KeyUsage[]
    kid: string
    kty: "RSA"
    n?: string
    oth?: RsaOtherPrimesInfo[]
    p?: string
    q?: string
    qi?: string
    use?: string
    x?: string
    y?: string

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Property
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/typedoc/interfaces/types.fhirclient.ReadyOptions.html b/docs/typedoc/interfaces/types.fhirclient.ReadyOptions.html index 39432df1..a939819f 100644 --- a/docs/typedoc/interfaces/types.fhirclient.ReadyOptions.html +++ b/docs/typedoc/interfaces/types.fhirclient.ReadyOptions.html @@ -1 +1 @@ -ReadyOptions | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Property
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file +ReadyOptions | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Property
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/typedoc/interfaces/types.fhirclient.RequestOptions.html b/docs/typedoc/interfaces/types.fhirclient.RequestOptions.html index fecfb77c..cb2b7fa6 100644 --- a/docs/typedoc/interfaces/types.fhirclient.RequestOptions.html +++ b/docs/typedoc/interfaces/types.fhirclient.RequestOptions.html @@ -10,7 +10,7 @@

    A string indicating whether credentials will be sent with the request always, never, or only when sent to a same-origin URL. Sets request's credentials.

    headers?: HeadersInit

    A Headers object, an object literal, or an array of two-item arrays to set request's headers.

    -
    includeResponse?: boolean
    +
    includeResponse?: boolean

    If set to true the request function will resolve with an object like { body: any, response: Response } so that users have access to the response object and it's properties like headers @@ -31,8 +31,8 @@

    A referrer policy to set request's referrerPolicy.

    signal?: null | AbortSignal

    An AbortSignal to set request's signal.

    -
    url: string | URL
    +
    url: string | URL

    The URL to request

    window?: null

    Can only be null. Used to disassociate request from any Window.

    -

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Property
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file +

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Property
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/typedoc/interfaces/types.fhirclient.RequestWithSession.html b/docs/typedoc/interfaces/types.fhirclient.RequestWithSession.html index 68b05965..16ff14c6 100644 --- a/docs/typedoc/interfaces/types.fhirclient.RequestWithSession.html +++ b/docs/typedoc/interfaces/types.fhirclient.RequestWithSession.html @@ -11,7 +11,7 @@ been received and successfully parsed.

    This property is particularly useful as a means of determining if a client or server fully transmitted a message before a connection was terminated:

    -
    const req = http.request({
    host: '127.0.0.1',
    port: 8080,
    method: 'POST',
    }, (res) => {
    res.resume();
    res.on('end', () => {
    if (!res.complete)
    console.error(
    'The connection was terminated while the message was still being sent');
    });
    }); +
    const req = http.request({
    host: '127.0.0.1',
    port: 8080,
    method: 'POST',
    }, (res) => {
    res.resume();
    res.on('end', () => {
    if (!res.complete)
    console.error(
    'The connection was terminated while the message was still being sent');
    });
    });
    since

    v0.3.0

    connection: Socket
    @@ -102,7 +102,7 @@
    readableObjectMode: boolean

    Getter for the property objectMode of a given Readable stream.

    since

    v12.3.0

    -
    socket: Socket
    +
    session: JsonObject
    socket: Socket

    The net.Socket object associated with the connection.

    With HTTPS support, use request.socket.getPeerCertificate() to obtain the client's authentication details.

    @@ -160,7 +160,7 @@

    Methods

    • [asyncDispose](): Promise<void>
    • Calls readable.destroy() with an AbortError and returns a promise that fulfills when the stream is finished.

      since

      v20.4.0

      -

      Returns Promise<void>

    • [asyncIterator](): AsyncIterableIterator<any>
    • Returns AsyncIterableIterator<any>

    • [captureRejectionSymbol]<K>(error: Error, event: string | symbol, ...args: AnyRest): void
    • Type Parameters

      • K

      Parameters

      • error: Error
      • event: string | symbol
      • Rest ...args: AnyRest

      Returns void

    • _construct(callback: ((error?: null | Error) => void)): void
    • Parameters

      • callback: ((error?: null | Error) => void)
          • (error?: null | Error): void
          • Parameters

            • Optional error: null | Error

            Returns void

      Returns void

    • _destroy(error: null | Error, callback: ((error?: null | Error) => void)): void
    • Parameters

      • error: null | Error
      • callback: ((error?: null | Error) => void)
          • (error?: null | Error): void
          • Parameters

            • Optional error: null | Error

            Returns void

      Returns void

    • _read(size: number): void
    • Parameters

      • size: number

      Returns void

    • +

      Returns Promise<void>

    • [asyncIterator](): AsyncIterableIterator<any>
    • Returns AsyncIterableIterator<any>

    • [captureRejectionSymbol]<K>(error: Error, event: string | symbol, ...args: AnyRest): void
    • Type Parameters

      • K

      Parameters

      • error: Error
      • event: string | symbol
      • Rest ...args: AnyRest

      Returns void

    • _construct(callback: ((error?: null | Error) => void)): void
    • Parameters

      • callback: ((error?: null | Error) => void)
          • (error?: null | Error): void
          • Parameters

            • Optional error: null | Error

            Returns void

      Returns void

    • _destroy(error: null | Error, callback: ((error?: null | Error) => void)): void
    • Parameters

      • error: null | Error
      • callback: ((error?: null | Error) => void)
          • (error?: null | Error): void
          • Parameters

            • Optional error: null | Error

            Returns void

      Returns void

    • _read(size: number): void
    • Parameters

      • size: number

      Returns void

    • Event emitter The defined events on documents including:

        @@ -172,16 +172,16 @@
      1. readable
      2. resume
      -

      Parameters

      • event: "close"
      • listener: (() => void)
          • (): void
          • Returns void

      Returns fhirclient.RequestWithSession

    • Parameters

      • event: "data"
      • listener: ((chunk: any) => void)
          • (chunk: any): void
          • Parameters

            • chunk: any

            Returns void

      Returns fhirclient.RequestWithSession

    • Parameters

      • event: "end"
      • listener: (() => void)
          • (): void
          • Returns void

      Returns fhirclient.RequestWithSession

    • Parameters

      • event: "error"
      • listener: ((err: Error) => void)
          • (err: Error): void
          • Parameters

            • err: Error

            Returns void

      Returns fhirclient.RequestWithSession

    • Parameters

      • event: "pause"
      • listener: (() => void)
          • (): void
          • Returns void

      Returns fhirclient.RequestWithSession

    • Parameters

      • event: "readable"
      • listener: (() => void)
          • (): void
          • Returns void

      Returns fhirclient.RequestWithSession

    • Parameters

      • event: "resume"
      • listener: (() => void)
          • (): void
          • Returns void

      Returns fhirclient.RequestWithSession

    • Parameters

      • event: string | symbol
      • listener: ((...args: any[]) => void)
          • (...args: any[]): void
          • Parameters

            • Rest ...args: any[]

            Returns void

      Returns fhirclient.RequestWithSession

    • asIndexedPairs(options?: Pick<ArrayOptions, "signal">): Readable
    • +

      Parameters

      • event: "close"
      • listener: (() => void)
          • (): void
          • Returns void

      Returns RequestWithSession

    • Parameters

      • event: "data"
      • listener: ((chunk: any) => void)
          • (chunk: any): void
          • Parameters

            • chunk: any

            Returns void

      Returns RequestWithSession

    • Parameters

      • event: "end"
      • listener: (() => void)
          • (): void
          • Returns void

      Returns RequestWithSession

    • Parameters

      • event: "error"
      • listener: ((err: Error) => void)
          • (err: Error): void
          • Parameters

            • err: Error

            Returns void

      Returns RequestWithSession

    • Parameters

      • event: "pause"
      • listener: (() => void)
          • (): void
          • Returns void

      Returns RequestWithSession

    • Parameters

      • event: "readable"
      • listener: (() => void)
          • (): void
          • Returns void

      Returns RequestWithSession

    • Parameters

      • event: "resume"
      • listener: (() => void)
          • (): void
          • Returns void

      Returns RequestWithSession

    • Parameters

      • event: string | symbol
      • listener: ((...args: any[]) => void)
          • (...args: any[]): void
          • Parameters

            • Rest ...args: any[]

            Returns void

      Returns RequestWithSession

    • asIndexedPairs(options?: Pick<ArrayOptions, "signal">): Readable
    • This method returns a new stream with chunks of the underlying stream paired with a counter in the form [index, chunk]. The first index value is 0 and it increases by 1 for each chunk produced.

      since

      v17.5.0

      Parameters

      • Optional options: Pick<ArrayOptions, "signal">

      Returns Readable

      a stream of indexed pairs.

      -
    • compose<T>(stream: ComposeFnParam | T | Iterable<T> | AsyncIterable<T>, options?: { signal: AbortSignal }): T
    • Type Parameters

      • T extends ReadableStream<T>

      Parameters

      • stream: ComposeFnParam | T | Iterable<T> | AsyncIterable<T>
      • Optional options: { signal: AbortSignal }
        • signal: AbortSignal

      Returns T

    • +
    • compose<T>(stream: ComposeFnParam | T | Iterable<T> | AsyncIterable<T>, options?: { signal: AbortSignal }): T
    • Type Parameters

      • T extends ReadableStream<T>

      Parameters

      • stream: ComposeFnParam | T | Iterable<T> | AsyncIterable<T>
      • Optional options: { signal: AbortSignal }
        • signal: AbortSignal

      Returns T

    • Calls destroy() on the socket that received the IncomingMessage. If error is provided, an 'error' event is emitted on the socket and error is passed as an argument to any listeners on the event.

      since

      v0.3.0

      -

      Parameters

      • Optional error: Error

      Returns fhirclient.RequestWithSession

    • drop(limit: number, options?: Pick<ArrayOptions, "signal">): Readable
    • +

      Parameters

      • Optional error: Error

      Returns RequestWithSession

    • drop(limit: number, options?: Pick<ArrayOptions, "signal">): Readable
    • This method returns a new stream with the first limit chunks dropped from the start.

      since

      v17.5.0

      Parameters

      • limit: number
        @@ -190,7 +190,7 @@
    • emit(event: "close"): boolean
    • emit(event: "data", chunk: any): boolean
    • emit(event: "end"): boolean
    • emit(event: "error", err: Error): boolean
    • emit(event: "pause"): boolean
    • emit(event: "readable"): boolean
    • emit(event: "resume"): boolean
    • emit(event: string | symbol, ...args: any[]): boolean
    • Parameters

      • event: "close"

      Returns boolean

    • Parameters

      • event: "data"
      • chunk: any

      Returns boolean

    • Parameters

      • event: "end"

      Returns boolean

    • Parameters

      • event: "error"
      • err: Error

      Returns boolean

    • Parameters

      • event: "pause"

      Returns boolean

    • Parameters

      • event: "readable"

      Returns boolean

    • Parameters

      • event: "resume"

      Returns boolean

    • Parameters

      • event: string | symbol
      • Rest ...args: any[]

      Returns boolean

    • eventNames(): (string | symbol)[]
    • Returns an array listing the events for which the emitter has registered listeners. The values in the array are strings or Symbols.

      -
      import { EventEmitter } from 'node:events';

      const myEE = new EventEmitter();
      myEE.on('foo', () => {});
      myEE.on('bar', () => {});

      const sym = Symbol('symbol');
      myEE.on(sym, () => {});

      console.log(myEE.eventNames());
      // Prints: [ 'foo', 'bar', Symbol(symbol) ] +
      import { EventEmitter } from 'node:events';

      const myEE = new EventEmitter();
      myEE.on('foo', () => {});
      myEE.on('bar', () => {});

      const sym = Symbol('symbol');
      myEE.on(sym, () => {});

      console.log(myEE.eventNames());
      // Prints: [ 'foo', 'bar', Symbol(symbol) ]
      since

      v6.0.0

      Returns (string | symbol)[]

    • every(fn: ((data: any, options?: Pick<ArrayOptions, "signal">) => boolean | Promise<boolean>), options?: ArrayOptions): Promise<boolean>
    • @@ -283,21 +283,21 @@

      Parameters

      • fn: ((data: any, options?: Pick<ArrayOptions, "signal">) => any)

        a function to map over every chunk in the stream. Async or not.

          • (data: any, options?: Pick<ArrayOptions, "signal">): any
          • Parameters

            • data: any
            • Optional options: Pick<ArrayOptions, "signal">

            Returns any

      • Optional options: ArrayOptions

      Returns Readable

      a stream mapped with the function fn.

      -
    • +
    • off<K>(eventName: string | symbol, listener: ((...args: any[]) => void)): RequestWithSession
    • Alias for emitter.removeListener().

      since

      v10.0.0

      -

      Type Parameters

      • K

      Parameters

      • eventName: string | symbol
      • listener: ((...args: any[]) => void)
          • (...args: any[]): void
          • Parameters

            • Rest ...args: any[]

            Returns void

      Returns fhirclient.RequestWithSession

    • Parameters

      • event: "close"
      • listener: (() => void)
          • (): void
          • Returns void

      Returns fhirclient.RequestWithSession

    • Parameters

      • event: "data"
      • listener: ((chunk: any) => void)
          • (chunk: any): void
          • Parameters

            • chunk: any

            Returns void

      Returns fhirclient.RequestWithSession

    • Parameters

      • event: "end"
      • listener: (() => void)
          • (): void
          • Returns void

      Returns fhirclient.RequestWithSession

    • Parameters

      • event: "error"
      • listener: ((err: Error) => void)
          • (err: Error): void
          • Parameters

            • err: Error

            Returns void

      Returns fhirclient.RequestWithSession

    • Parameters

      • event: "pause"
      • listener: (() => void)
          • (): void
          • Returns void

      Returns fhirclient.RequestWithSession

    • Parameters

      • event: "readable"
      • listener: (() => void)
          • (): void
          • Returns void

      Returns fhirclient.RequestWithSession

    • Parameters

      • event: "resume"
      • listener: (() => void)
          • (): void
          • Returns void

      Returns fhirclient.RequestWithSession

    • Parameters

      • event: string | symbol
      • listener: ((...args: any[]) => void)
          • (...args: any[]): void
          • Parameters

            • Rest ...args: any[]

            Returns void

      Returns fhirclient.RequestWithSession

    • Parameters

      • event: "close"
      • listener: (() => void)
          • (): void
          • Returns void

      Returns fhirclient.RequestWithSession

    • Parameters

      • event: "data"
      • listener: ((chunk: any) => void)
          • (chunk: any): void
          • Parameters

            • chunk: any

            Returns void

      Returns fhirclient.RequestWithSession

    • Parameters

      • event: "end"
      • listener: (() => void)
          • (): void
          • Returns void

      Returns fhirclient.RequestWithSession

    • Parameters

      • event: "error"
      • listener: ((err: Error) => void)
          • (err: Error): void
          • Parameters

            • err: Error

            Returns void

      Returns fhirclient.RequestWithSession

    • Parameters

      • event: "pause"
      • listener: (() => void)
          • (): void
          • Returns void

      Returns fhirclient.RequestWithSession

    • Parameters

      • event: "readable"
      • listener: (() => void)
          • (): void
          • Returns void

      Returns fhirclient.RequestWithSession

    • Parameters

      • event: "resume"
      • listener: (() => void)
          • (): void
          • Returns void

      Returns fhirclient.RequestWithSession

    • Parameters

      • event: string | symbol
      • listener: ((...args: any[]) => void)
          • (...args: any[]): void
          • Parameters

            • Rest ...args: any[]

            Returns void

      Returns fhirclient.RequestWithSession

    • +

      Type Parameters

      • K

      Parameters

      • eventName: string | symbol
      • listener: ((...args: any[]) => void)
          • (...args: any[]): void
          • Parameters

            • Rest ...args: any[]

            Returns void

      Returns RequestWithSession

    • Parameters

      • event: "close"
      • listener: (() => void)
          • (): void
          • Returns void

      Returns RequestWithSession

    • Parameters

      • event: "data"
      • listener: ((chunk: any) => void)
          • (chunk: any): void
          • Parameters

            • chunk: any

            Returns void

      Returns RequestWithSession

    • Parameters

      • event: "end"
      • listener: (() => void)
          • (): void
          • Returns void

      Returns RequestWithSession

    • Parameters

      • event: "error"
      • listener: ((err: Error) => void)
          • (err: Error): void
          • Parameters

            • err: Error

            Returns void

      Returns RequestWithSession

    • Parameters

      • event: "pause"
      • listener: (() => void)
          • (): void
          • Returns void

      Returns RequestWithSession

    • Parameters

      • event: "readable"
      • listener: (() => void)
          • (): void
          • Returns void

      Returns RequestWithSession

    • Parameters

      • event: "resume"
      • listener: (() => void)
          • (): void
          • Returns void

      Returns RequestWithSession

    • Parameters

      • event: string | symbol
      • listener: ((...args: any[]) => void)
          • (...args: any[]): void
          • Parameters

            • Rest ...args: any[]

            Returns void

      Returns RequestWithSession

    • Parameters

      • event: "close"
      • listener: (() => void)
          • (): void
          • Returns void

      Returns RequestWithSession

    • Parameters

      • event: "data"
      • listener: ((chunk: any) => void)
          • (chunk: any): void
          • Parameters

            • chunk: any

            Returns void

      Returns RequestWithSession

    • Parameters

      • event: "end"
      • listener: (() => void)
          • (): void
          • Returns void

      Returns RequestWithSession

    • Parameters

      • event: "error"
      • listener: ((err: Error) => void)
          • (err: Error): void
          • Parameters

            • err: Error

            Returns void

      Returns RequestWithSession

    • Parameters

      • event: "pause"
      • listener: (() => void)
          • (): void
          • Returns void

      Returns RequestWithSession

    • Parameters

      • event: "readable"
      • listener: (() => void)
          • (): void
          • Returns void

      Returns RequestWithSession

    • Parameters

      • event: "resume"
      • listener: (() => void)
          • (): void
          • Returns void

      Returns RequestWithSession

    • Parameters

      • event: string | symbol
      • listener: ((...args: any[]) => void)
          • (...args: any[]): void
          • Parameters

            • Rest ...args: any[]

            Returns void

      Returns RequestWithSession

    • The readable.pause() method will cause a stream in flowing mode to stop emitting 'data' events, switching out of flowing mode. Any data that becomes available will remain in the internal buffer.

      -
      const readable = getReadableStreamSomehow();
      readable.on('data', (chunk) => {
      console.log(`Received ${chunk.length} bytes of data.`);
      readable.pause();
      console.log('There will be no additional data for 1 second.');
      setTimeout(() => {
      console.log('Now data will start flowing again.');
      readable.resume();
      }, 1000);
      }); +
      const readable = getReadableStreamSomehow();
      readable.on('data', (chunk) => {
      console.log(`Received ${chunk.length} bytes of data.`);
      readable.pause();
      console.log('There will be no additional data for 1 second.');
      setTimeout(() => {
      console.log('Now data will start flowing again.');
      readable.resume();
      }, 1000);
      });

      The readable.pause() method has no effect if there is a 'readable' event listener.

      since

      v0.9.4

      -

      Returns fhirclient.RequestWithSession

    • pipe<T>(destination: T, options?: { end?: boolean }): T
    • Type Parameters

      • T extends WritableStream<T>

      Parameters

      • destination: T
      • Optional options: { end?: boolean }
        • Optional end?: boolean

      Returns T

    • Parameters

      • event: "close"
      • listener: (() => void)
          • (): void
          • Returns void

      Returns fhirclient.RequestWithSession

    • Parameters

      • event: "data"
      • listener: ((chunk: any) => void)
          • (chunk: any): void
          • Parameters

            • chunk: any

            Returns void

      Returns fhirclient.RequestWithSession

    • Parameters

      • event: "end"
      • listener: (() => void)
          • (): void
          • Returns void

      Returns fhirclient.RequestWithSession

    • Parameters

      • event: "error"
      • listener: ((err: Error) => void)
          • (err: Error): void
          • Parameters

            • err: Error

            Returns void

      Returns fhirclient.RequestWithSession

    • Parameters

      • event: "pause"
      • listener: (() => void)
          • (): void
          • Returns void

      Returns fhirclient.RequestWithSession

    • Parameters

      • event: "readable"
      • listener: (() => void)
          • (): void
          • Returns void

      Returns fhirclient.RequestWithSession

    • Parameters

      • event: "resume"
      • listener: (() => void)
          • (): void
          • Returns void

      Returns fhirclient.RequestWithSession

    • Parameters

      • event: string | symbol
      • listener: ((...args: any[]) => void)
          • (...args: any[]): void
          • Parameters

            • Rest ...args: any[]

            Returns void

      Returns fhirclient.RequestWithSession

    • Parameters

      • event: "close"
      • listener: (() => void)
          • (): void
          • Returns void

      Returns fhirclient.RequestWithSession

    • Parameters

      • event: "data"
      • listener: ((chunk: any) => void)
          • (chunk: any): void
          • Parameters

            • chunk: any

            Returns void

      Returns fhirclient.RequestWithSession

    • Parameters

      • event: "end"
      • listener: (() => void)
          • (): void
          • Returns void

      Returns fhirclient.RequestWithSession

    • Parameters

      • event: "error"
      • listener: ((err: Error) => void)
          • (err: Error): void
          • Parameters

            • err: Error

            Returns void

      Returns fhirclient.RequestWithSession

    • Parameters

      • event: "pause"
      • listener: (() => void)
          • (): void
          • Returns void

      Returns fhirclient.RequestWithSession

    • Parameters

      • event: "readable"
      • listener: (() => void)
          • (): void
          • Returns void

      Returns fhirclient.RequestWithSession

    • Parameters

      • event: "resume"
      • listener: (() => void)
          • (): void
          • Returns void

      Returns fhirclient.RequestWithSession

    • Parameters

      • event: string | symbol
      • listener: ((...args: any[]) => void)
          • (...args: any[]): void
          • Parameters

            • Rest ...args: any[]

            Returns void

      Returns fhirclient.RequestWithSession

    • push(chunk: any, encoding?: BufferEncoding): boolean
    • Parameters

      • chunk: any
      • Optional encoding: BufferEncoding

      Returns boolean

    • rawListeners<K>(eventName: string | symbol): Function[]
    • pipe<T>(destination: T, options?: { end?: boolean }): T
    • Type Parameters

      • T extends WritableStream<T>

      Parameters

      • destination: T
      • Optional options: { end?: boolean }
        • Optional end?: boolean

      Returns T

    • Parameters

      • event: "close"
      • listener: (() => void)
          • (): void
          • Returns void

      Returns RequestWithSession

    • Parameters

      • event: "data"
      • listener: ((chunk: any) => void)
          • (chunk: any): void
          • Parameters

            • chunk: any

            Returns void

      Returns RequestWithSession

    • Parameters

      • event: "end"
      • listener: (() => void)
          • (): void
          • Returns void

      Returns RequestWithSession

    • Parameters

      • event: "error"
      • listener: ((err: Error) => void)
          • (err: Error): void
          • Parameters

            • err: Error

            Returns void

      Returns RequestWithSession

    • Parameters

      • event: "pause"
      • listener: (() => void)
          • (): void
          • Returns void

      Returns RequestWithSession

    • Parameters

      • event: "readable"
      • listener: (() => void)
          • (): void
          • Returns void

      Returns RequestWithSession

    • Parameters

      • event: "resume"
      • listener: (() => void)
          • (): void
          • Returns void

      Returns RequestWithSession

    • Parameters

      • event: string | symbol
      • listener: ((...args: any[]) => void)
          • (...args: any[]): void
          • Parameters

            • Rest ...args: any[]

            Returns void

      Returns RequestWithSession

    • Parameters

      • event: "close"
      • listener: (() => void)
          • (): void
          • Returns void

      Returns RequestWithSession

    • Parameters

      • event: "data"
      • listener: ((chunk: any) => void)
          • (chunk: any): void
          • Parameters

            • chunk: any

            Returns void

      Returns RequestWithSession

    • Parameters

      • event: "end"
      • listener: (() => void)
          • (): void
          • Returns void

      Returns RequestWithSession

    • Parameters

      • event: "error"
      • listener: ((err: Error) => void)
          • (err: Error): void
          • Parameters

            • err: Error

            Returns void

      Returns RequestWithSession

    • Parameters

      • event: "pause"
      • listener: (() => void)
          • (): void
          • Returns void

      Returns RequestWithSession

    • Parameters

      • event: "readable"
      • listener: (() => void)
          • (): void
          • Returns void

      Returns RequestWithSession

    • Parameters

      • event: "resume"
      • listener: (() => void)
          • (): void
          • Returns void

      Returns RequestWithSession

    • Parameters

      • event: string | symbol
      • listener: ((...args: any[]) => void)
          • (...args: any[]): void
          • Parameters

            • Rest ...args: any[]

            Returns void

      Returns RequestWithSession

    • push(chunk: any, encoding?: BufferEncoding): boolean
    • Parameters

      • chunk: any
      • Optional encoding: BufferEncoding

      Returns boolean

    • rawListeners<K>(eventName: string | symbol): Function[]
    • Returns a copy of the array of listeners for the event named eventName, including any wrappers (such as those created by .once()).

      -
      import { EventEmitter } from 'node:events';
      const emitter = new EventEmitter();
      emitter.once('log', () => console.log('log once'));

      // Returns a new Array with a function `onceWrapper` which has a property
      // `listener` which contains the original listener bound above
      const listeners = emitter.rawListeners('log');
      const logFnWrapper = listeners[0];

      // Logs "log once" to the console and does not unbind the `once` event
      logFnWrapper.listener();

      // Logs "log once" to the console and removes the listener
      logFnWrapper();

      emitter.on('log', () => console.log('log persistently'));
      // Will return a new Array with a single function bound by `.on()` above
      const newListeners = emitter.rawListeners('log');

      // Logs "log persistently" twice
      newListeners[0]();
      emitter.emit('log'); +
      import { EventEmitter } from 'node:events';
      const emitter = new EventEmitter();
      emitter.once('log', () => console.log('log once'));

      // Returns a new Array with a function `onceWrapper` which has a property
      // `listener` which contains the original listener bound above
      const listeners = emitter.rawListeners('log');
      const logFnWrapper = listeners[0];

      // Logs "log once" to the console and does not unbind the `once` event
      logFnWrapper.listener();

      // Logs "log once" to the console and removes the listener
      logFnWrapper();

      emitter.on('log', () => console.log('log persistently'));
      // Will return a new Array with a single function bound by `.on()` above
      const newListeners = emitter.rawListeners('log');

      // Logs "log persistently" twice
      newListeners[0]();
      emitter.emit('log');
      since

      v9.4.0

      Type Parameters

      • K

      Parameters

      • eventName: string | symbol

      Returns Function[]

    • read(size?: number): any
    • @@ -316,7 +316,7 @@

      The readable.read() method should only be called on Readable streams operating in paused mode. In flowing mode, readable.read() is called automatically until the internal buffer is fully drained.

      -
      const readable = getReadableStreamSomehow();

      // 'readable' may be triggered multiple times as data is buffered in
      readable.on('readable', () => {
      let chunk;
      console.log('Stream is readable (new data received in buffer)');
      // Use a loop to make sure we read all currently available data
      while (null !== (chunk = readable.read())) {
      console.log(`Read ${chunk.length} bytes of data...`);
      }
      });

      // 'end' will be triggered once when there is no more data available
      readable.on('end', () => {
      console.log('Reached end of stream.');
      }); +
      const readable = getReadableStreamSomehow();

      // 'readable' may be triggered multiple times as data is buffered in
      readable.on('readable', () => {
      let chunk;
      console.log('Stream is readable (new data received in buffer)');
      // Use a loop to make sure we read all currently available data
      while (null !== (chunk = readable.read())) {
      console.log(`Read ${chunk.length} bytes of data...`);
      }
      });

      // 'end' will be triggered once when there is no more data available
      readable.on('end', () => {
      console.log('Reached end of stream.');
      });

      Each call to readable.read() returns a chunk of data, or null. The chunks are not concatenated. A while loop is necessary to consume all data @@ -327,7 +327,7 @@ emitted when there is no more data to come.

      Therefore to read a file's whole contents from a readable, it is necessary to collect chunks across multiple 'readable' events:

      -
      const chunks = [];

      readable.on('readable', () => {
      let chunk;
      while (null !== (chunk = readable.read())) {
      chunks.push(chunk);
      }
      });

      readable.on('end', () => {
      const content = chunks.join('');
      }); +
      const chunks = [];

      readable.on('readable', () => {
      let chunk;
      while (null !== (chunk = readable.read())) {
      chunks.push(chunk);
      }
      });

      readable.on('end', () => {
      const content = chunks.join('');
      });

      A Readable stream in object mode will always return a single item from a call to readable.read(size), regardless of the value of the size argument.

      @@ -351,14 +351,14 @@
        • (previous: any, data: any, options?: Pick<ArrayOptions, "signal">): T
        • Parameters

          • previous: any
          • data: any
          • Optional options: Pick<ArrayOptions, "signal">

          Returns T

    • Optional initial: undefined

      the initial value to use in the reduction.

    • Optional options: Pick<ArrayOptions, "signal">

    Returns Promise<T>

    a promise for the final value of the reduction.

    -
  • Type Parameters

    • T = any

    Parameters

    • fn: ((previous: T, data: any, options?: Pick<ArrayOptions, "signal">) => T)
        • (previous: T, data: any, options?: Pick<ArrayOptions, "signal">): T
        • Parameters

          • previous: T
          • data: any
          • Optional options: Pick<ArrayOptions, "signal">

          Returns T

    • initial: T
    • Optional options: Pick<ArrayOptions, "signal">

    Returns Promise<T>

    • +
    • Type Parameters

      • T = any

      Parameters

      • fn: ((previous: T, data: any, options?: Pick<ArrayOptions, "signal">) => T)
          • (previous: T, data: any, options?: Pick<ArrayOptions, "signal">): T
          • Parameters

            • previous: T
            • data: any
            • Optional options: Pick<ArrayOptions, "signal">

            Returns T

      • initial: T
      • Optional options: Pick<ArrayOptions, "signal">

      Returns Promise<T>

    • Removes all listeners, or those of the specified eventName.

      It is bad practice to remove listeners added elsewhere in the code, particularly when the EventEmitter instance was created by some other component or module (e.g. sockets or file streams).

      Returns a reference to the EventEmitter, so that calls can be chained.

      since

      v0.1.26

      -

      Parameters

      • Optional eventName: string | symbol

      Returns fhirclient.RequestWithSession

    • Parameters

      • event: "close"
      • listener: (() => void)
          • (): void
          • Returns void

      Returns fhirclient.RequestWithSession

    • Parameters

      • event: "data"
      • listener: ((chunk: any) => void)
          • (chunk: any): void
          • Parameters

            • chunk: any

            Returns void

      Returns fhirclient.RequestWithSession

    • Parameters

      • event: "end"
      • listener: (() => void)
          • (): void
          • Returns void

      Returns fhirclient.RequestWithSession

    • Parameters

      • event: "error"
      • listener: ((err: Error) => void)
          • (err: Error): void
          • Parameters

            • err: Error

            Returns void

      Returns fhirclient.RequestWithSession

    • Parameters

      • event: "pause"
      • listener: (() => void)
          • (): void
          • Returns void

      Returns fhirclient.RequestWithSession

    • Parameters

      • event: "readable"
      • listener: (() => void)
          • (): void
          • Returns void

      Returns fhirclient.RequestWithSession

    • Parameters

      • event: "resume"
      • listener: (() => void)
          • (): void
          • Returns void

      Returns fhirclient.RequestWithSession

    • Parameters

      • event: string | symbol
      • listener: ((...args: any[]) => void)
          • (...args: any[]): void
          • Parameters

            • Rest ...args: any[]

            Returns void

      Returns fhirclient.RequestWithSession

    • +

      Parameters

      • Optional eventName: string | symbol

      Returns RequestWithSession

    • Parameters

      • event: "close"
      • listener: (() => void)
          • (): void
          • Returns void

      Returns RequestWithSession

    • Parameters

      • event: "data"
      • listener: ((chunk: any) => void)
          • (chunk: any): void
          • Parameters

            • chunk: any

            Returns void

      Returns RequestWithSession

    • Parameters

      • event: "end"
      • listener: (() => void)
          • (): void
          • Returns void

      Returns RequestWithSession

    • Parameters

      • event: "error"
      • listener: ((err: Error) => void)
          • (err: Error): void
          • Parameters

            • err: Error

            Returns void

      Returns RequestWithSession

    • Parameters

      • event: "pause"
      • listener: (() => void)
          • (): void
          • Returns void

      Returns RequestWithSession

    • Parameters

      • event: "readable"
      • listener: (() => void)
          • (): void
          • Returns void

      Returns RequestWithSession

    • Parameters

      • event: "resume"
      • listener: (() => void)
          • (): void
          • Returns void

      Returns RequestWithSession

    • Parameters

      • event: string | symbol
      • listener: ((...args: any[]) => void)
          • (...args: any[]): void
          • Parameters

            • Rest ...args: any[]

            Returns void

      Returns RequestWithSession

    • The readable.resume() method causes an explicitly paused Readable stream to resume emitting 'data' events, switching the stream into flowing mode.

      The readable.resume() method can be used to fully consume the data from a @@ -367,7 +367,7 @@

      The readable.resume() method has no effect if there is a 'readable' event listener.

      since

      v0.9.4

      -

      Returns fhirclient.RequestWithSession

    • The readable.setEncoding() method sets the character encoding for data read from the Readable stream.

      By default, no encoding is assigned and stream data will be returned as Buffer objects. Setting an encoding causes the stream data @@ -382,17 +382,17 @@

      since

      v0.9.4

      Parameters

      • encoding: BufferEncoding

        The encoding to use.

        -

      Returns fhirclient.RequestWithSession

    • +

    Returns RequestWithSession

    • By default EventEmitters will print a warning if more than 10 listeners are added for a particular event. This is a useful default that helps finding memory leaks. The emitter.setMaxListeners() method allows the limit to be modified for this specific EventEmitter instance. The value can be set to Infinity (or 0) to indicate an unlimited number of listeners.

      Returns a reference to the EventEmitter, so that calls can be chained.

      since

      v0.3.5

      -

      Parameters

      • n: number

      Returns fhirclient.RequestWithSession

    • +

      Parameters

      • n: number

      Returns RequestWithSession

    • Calls message.socket.setTimeout(msecs, callback).

      since

      v0.5.9

      -

      Parameters

      • msecs: number
      • Optional callback: (() => void)
          • (): void
          • Returns void

      Returns fhirclient.RequestWithSession

    • some(fn: ((data: any, options?: Pick<ArrayOptions, "signal">) => boolean | Promise<boolean>), options?: ArrayOptions): Promise<boolean>
    • +

      Parameters

      • msecs: number
      • Optional callback: (() => void)
          • (): void
          • Returns void

      Returns RequestWithSession

    • some(fn: ((data: any, options?: Pick<ArrayOptions, "signal">) => boolean | Promise<boolean>), options?: ArrayOptions): Promise<boolean>
    • This method is similar to Array.prototype.some and calls fn on each chunk in the stream until the awaited return value is true (or any truthy value). Once an fn call on a chunk awaited return value is truthy, the stream is destroyed and the promise is fulfilled with true. @@ -413,18 +413,18 @@ for interoperability and convenience, not as the primary way to consume streams.

      since

      v17.5.0

      Parameters

      • Optional options: Pick<ArrayOptions, "signal">

      Returns Promise<any[]>

      a promise containing an array with the contents of the stream.

      -
    • +
    • The readable.unpipe() method detaches a Writable stream previously attached using the pipe method.

      If the destination is not specified, then all pipes are detached.

      If the destination is specified, but no pipe is set up for it, then the method does nothing.

      -
      const fs = require('node:fs');
      const readable = getReadableStreamSomehow();
      const writable = fs.createWriteStream('file.txt');
      // All the data from readable goes into 'file.txt',
      // but only for the first second.
      readable.pipe(writable);
      setTimeout(() => {
      console.log('Stop writing to file.txt.');
      readable.unpipe(writable);
      console.log('Manually close the file stream.');
      writable.end();
      }, 1000); +
      const fs = require('node:fs');
      const readable = getReadableStreamSomehow();
      const writable = fs.createWriteStream('file.txt');
      // All the data from readable goes into 'file.txt',
      // but only for the first second.
      readable.pipe(writable);
      setTimeout(() => {
      console.log('Stop writing to file.txt.');
      readable.unpipe(writable);
      console.log('Manually close the file stream.');
      writable.end();
      }, 1000);
      since

      v0.9.4

      Parameters

      • Optional destination: WritableStream

        Optional specific stream to unpipe

        -

      Returns fhirclient.RequestWithSession

    • unshift(chunk: any, encoding?: BufferEncoding): void
    • +

    Returns RequestWithSession

    • unshift(chunk: any, encoding?: BufferEncoding): void
    • Passing chunk as null signals the end of the stream (EOF) and behaves the same as readable.push(null), after which no more data can be written. The EOF signal is put at the end of the buffer and any buffered data will still be @@ -437,7 +437,7 @@ has been emitted or a runtime error will be thrown.

      Developers using stream.unshift() often should consider switching to use of a Transform stream instead. See the API for stream implementers section for more information.

      -
      // Pull off a header delimited by \n\n.
      // Use unshift() if we get too much.
      // Call the callback with (error, header, stream).
      const { StringDecoder } = require('node:string_decoder');
      function parseHeader(stream, callback) {
      stream.on('error', callback);
      stream.on('readable', onReadable);
      const decoder = new StringDecoder('utf8');
      let header = '';
      function onReadable() {
      let chunk;
      while (null !== (chunk = stream.read())) {
      const str = decoder.write(chunk);
      if (str.includes('\n\n')) {
      // Found the header boundary.
      const split = str.split(/\n\n/);
      header += split.shift();
      const remaining = split.join('\n\n');
      const buf = Buffer.from(remaining, 'utf8');
      stream.removeListener('error', callback);
      // Remove the 'readable' listener before unshifting.
      stream.removeListener('readable', onReadable);
      if (buf.length)
      stream.unshift(buf);
      // Now the body of the message can be read from the stream.
      callback(null, header, stream);
      return;
      }
      // Still reading the header.
      header += str;
      }
      }
      } +
      // Pull off a header delimited by \n\n.
      // Use unshift() if we get too much.
      // Call the callback with (error, header, stream).
      const { StringDecoder } = require('node:string_decoder');
      function parseHeader(stream, callback) {
      stream.on('error', callback);
      stream.on('readable', onReadable);
      const decoder = new StringDecoder('utf8');
      let header = '';
      function onReadable() {
      let chunk;
      while (null !== (chunk = stream.read())) {
      const str = decoder.write(chunk);
      if (str.includes('\n\n')) {
      // Found the header boundary.
      const split = str.split(/\n\n/);
      header += split.shift();
      const remaining = split.join('\n\n');
      const buf = Buffer.from(remaining, 'utf8');
      stream.removeListener('error', callback);
      // Remove the 'readable' listener before unshifting.
      stream.removeListener('readable', onReadable);
      if (buf.length)
      stream.unshift(buf);
      // Now the body of the message can be read from the stream.
      callback(null, header, stream);
      return;
      }
      // Still reading the header.
      header += str;
      }
      }
      }

      Unlike push, stream.unshift(chunk) will not end the reading process by resetting the internal reading state of the stream. @@ -452,7 +452,7 @@ be a {string}, {Buffer}, {TypedArray}, {DataView} or null. For object mode streams, chunk may be any JavaScript value.

    • Optional encoding: BufferEncoding

      Encoding of string chunks. Must be a valid Buffer encoding, such as 'utf8' or 'ascii'.

      -

    Returns void

    • +

    Returns void

    • Prior to Node.js 0.10, streams did not implement the entire node:stream module API as it is currently defined. (See Compatibility for more information.)

      When using an older Node.js library that emits 'data' events and has a pause method that is advisory only, the readable.wrap() method can be used to create a Readable @@ -466,4 +466,4 @@

      since

      v0.9.4

      Parameters

      • stream: ReadableStream

        An "old style" readable stream

        -

      Returns fhirclient.RequestWithSession

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Property
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file +

    Returns RequestWithSession

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Property
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/typedoc/interfaces/types.fhirclient.SMART.html b/docs/typedoc/interfaces/types.fhirclient.SMART.html index 510fd62b..3245c0a1 100644 --- a/docs/typedoc/interfaces/types.fhirclient.SMART.html +++ b/docs/typedoc/interfaces/types.fhirclient.SMART.html @@ -1,4 +1,4 @@ -SMART | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Hierarchy

    • SMART

    Indexable

    [key: string]: any

    Index

    Properties

    Methods

    • This should be called on your redirectUri. Returns a Promise that will eventually be resolved with a Client instance that you can use to query the fhir server.

      -

      Parameters

      Returns Promise<default>

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Property
    • Method
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file +

    Parameters

    Returns Promise<default>

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Property
    • Method
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/typedoc/interfaces/types.fhirclient.Storage.html b/docs/typedoc/interfaces/types.fhirclient.Storage.html index d22c54b5..6aa13fe5 100644 --- a/docs/typedoc/interfaces/types.fhirclient.Storage.html +++ b/docs/typedoc/interfaces/types.fhirclient.Storage.html @@ -1,13 +1,13 @@ Storage | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Simple key/value storage interface

    -

    Hierarchy

    • Storage

    Index

    Methods

    • get(key: string): Promise<any>

    Hierarchy

    • Storage

    Index

    Methods

    • get(key: string): Promise<any>
    • Gets the value at key. Returns a promise that will be resolved with that value (or undefined for missing keys).

      -

      Parameters

      • key: string

      Returns Promise<any>

    • set(key: string, value: any): Promise<any>
    • set(key: string, value: any): Promise<any>
    • Sets the value on key and returns a promise that will be resolved with the value that was set.

      -

      Parameters

      • key: string
      • value: any

      Returns Promise<any>

    • unset(key: string): Promise<boolean>
    • unset(key: string): Promise<boolean>
    • Deletes the value at key. Returns a promise that will be resolved with true if the key was deleted or with false if it was not (eg. if did not exist).

      -

      Parameters

      • key: string

      Returns Promise<boolean>

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Method
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file +

    Parameters

    • key: string

    Returns Promise<boolean>

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Method
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/typedoc/interfaces/types.fhirclient.TokenResponse.html b/docs/typedoc/interfaces/types.fhirclient.TokenResponse.html index 3271f253..b74581c8 100644 --- a/docs/typedoc/interfaces/types.fhirclient.TokenResponse.html +++ b/docs/typedoc/interfaces/types.fhirclient.TokenResponse.html @@ -6,42 +6,42 @@
    see

    http://docs.smarthealthit.org/authorization/

    Hierarchy

    • TokenResponse

    Indexable

    [key: string]: any

    Other properties might be passed by the server

    -

    Index

    Properties

    access_token?: string
    +

    Index

    Properties

    access_token?: string

    The access token issued by the authorization server

    -
    client_id?: string
    +
    client_id?: string

    If you have requested openid and profile scopes the profile of the active user will be available as client_id. NOTE: Regardless of it's name, this property does not store an ID but a token that also suggests the user type like Patient/123, Practitioner/xyz etc.

    -
    encounter?: string
    +
    encounter?: string

    If you have requested that require it (like launch or launch/encounter) the selected encounter ID will be available here. NOTE: This is not widely supported as of 2018.

    -
    expires_in?: number
    +
    expires_in?: number

    Lifetime in seconds of the access token, after which the token SHALL NOT be accepted by the resource server

    -
    id_token?: string
    +
    id_token?: string

    Authenticated patient identity and profile, if requested

    -
    need_patient_banner?: boolean
    +
    need_patient_banner?: boolean

    If present, this tells the app that it is being rendered within an EHR frame and the UI outside that frame already displays the selected patient's name, age, gender etc. The app can decide to hide those details to prevent the UI from duplicated information.

    -
    patient?: string
    +
    patient?: string

    If you have requested that require it (like launch or launch/patient) the selected patient ID will be available here.

    -
    refresh_token?: string
    +
    refresh_token?: string

    Token that can be used to obtain a new access token, using the same or a subset of the original authorization grants

    -
    scope?: string
    +
    scope?: string

    Scope of access authorized. Note that this can be different from the scopes requested by the app.

    -
    smart_style_url?: string
    +
    smart_style_url?: string

    This could be a public location of some style settings that the EHR would like to suggest. The app might look it up and optionally decide to apply some or all of it.

    see

    https://launch.smarthealthit.org/smart-style.json

    -
    token_type?: "bearer" | "Bearer"
    +
    token_type?: "bearer" | "Bearer"

    Fixed value: bearer

    -

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Property
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file +

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Property
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/typedoc/interfaces/types.fhirclient.WellKnownSmartConfiguration.html b/docs/typedoc/interfaces/types.fhirclient.WellKnownSmartConfiguration.html index 2d83aaca..0fda1d39 100644 --- a/docs/typedoc/interfaces/types.fhirclient.WellKnownSmartConfiguration.html +++ b/docs/typedoc/interfaces/types.fhirclient.WellKnownSmartConfiguration.html @@ -1,29 +1,29 @@ -WellKnownSmartConfiguration | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Hierarchy

    • WellKnownSmartConfiguration

    Index

    Properties

    authorization_endpoint: string
    +WellKnownSmartConfiguration | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Hierarchy

    • WellKnownSmartConfiguration

    Index

    Properties

    authorization_endpoint: string

    URL to the OAuth2 authorization endpoint.

    -
    +

    Array of strings representing SMART capabilities (e.g., single-sign-on or launch-standalone) that the server supports.

    -
    code_challenge_methods_supported?: "S256"[]
    +
    code_challenge_methods_supported?: "S256"[]

    RECOMMENDED! PKCE challenge methods the server supports.

    -
    introspection_endpoint?: string
    +
    introspection_endpoint?: string

    RECOMMENDED! URL to a server’s introspection endpoint that can be used to validate a token.

    -
    management_endpoint?: string
    +
    management_endpoint?: string

    RECOMMENDED! URL where an end-user can view which applications currently have access to data and can make adjustments to these access rights.

    -
    registration_endpoint?: string
    +
    registration_endpoint?: string

    If available, URL to the OAuth2 dynamic registration endpoint for the FHIR server.

    -
    response_types_supported?: string[]
    +
    response_types_supported?: string[]

    Array of OAuth2 response_type values that are supported

    -
    revocation_endpoint?: string
    +
    revocation_endpoint?: string

    RECOMMENDED! URL to a server’s revoke endpoint that can be used to revoke a token.

    -
    scopes_supported?: string[]
    +
    scopes_supported?: string[]

    Array of scopes a client may request.

    -
    token_endpoint: string
    +
    token_endpoint: string

    URL to the OAuth2 token endpoint.

    -
    token_endpoint_auth_methods?: SMARTAuthenticationMethod[]
    +
    token_endpoint_auth_methods?: SMARTAuthenticationMethod[]

    Array of client authentication methods supported by the token endpoint. The options are “client_secret_post” and “client_secret_basic”.

    -

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Property
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file +

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Property
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/typedoc/modules.html b/docs/typedoc/modules.html index aefb1519..a02059c9 100644 --- a/docs/typedoc/modules.html +++ b/docs/typedoc/modules.html @@ -1 +1 @@ -FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    FHIRClient - v3.0.0-beta.1

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file +FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    FHIRClient - v3.0.0-beta.1

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/typedoc/modules/Client.html b/docs/typedoc/modules/Client.html index 90e870c3..b1194999 100644 --- a/docs/typedoc/modules/Client.html +++ b/docs/typedoc/modules/Client.html @@ -1 +1 @@ -Client | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file +Client | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/typedoc/modules/HttpError.html b/docs/typedoc/modules/HttpError.html index f2fa39b2..762cbb84 100644 --- a/docs/typedoc/modules/HttpError.html +++ b/docs/typedoc/modules/HttpError.html @@ -1 +1 @@ -HttpError | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file +HttpError | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/typedoc/modules/adapters_BrowserAdapter.html b/docs/typedoc/modules/adapters_BrowserAdapter.html index 3e87881f..181d0cd2 100644 --- a/docs/typedoc/modules/adapters_BrowserAdapter.html +++ b/docs/typedoc/modules/adapters_BrowserAdapter.html @@ -1 +1 @@ -adapters/BrowserAdapter | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file +adapters/BrowserAdapter | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/typedoc/modules/adapters_HapiAdapter.html b/docs/typedoc/modules/adapters_HapiAdapter.html index e9095ad1..5c63dea4 100644 --- a/docs/typedoc/modules/adapters_HapiAdapter.html +++ b/docs/typedoc/modules/adapters_HapiAdapter.html @@ -1 +1 @@ -adapters/HapiAdapter | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file +adapters/HapiAdapter | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/typedoc/modules/adapters_NodeAdapter.html b/docs/typedoc/modules/adapters_NodeAdapter.html index 7b925ba0..b0dce088 100644 --- a/docs/typedoc/modules/adapters_NodeAdapter.html +++ b/docs/typedoc/modules/adapters_NodeAdapter.html @@ -1 +1 @@ -adapters/NodeAdapter | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file +adapters/NodeAdapter | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/typedoc/modules/base64_browser.html b/docs/typedoc/modules/base64_browser.html index 4cf3ac25..96d993ba 100644 --- a/docs/typedoc/modules/base64_browser.html +++ b/docs/typedoc/modules/base64_browser.html @@ -1 +1 @@ -base64/browser | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file +base64/browser | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Index

    Functions

    • base64urldecode(input: string): string
    • base64urlencode(input: string | Uint8Array): string
    • uint8ArrayToBinaryString(input: Uint8Array): string

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/typedoc/modules/debug.html b/docs/typedoc/modules/debug.html index 1efbecdd..6d8c5227 100644 --- a/docs/typedoc/modules/debug.html +++ b/docs/typedoc/modules/debug.html @@ -1 +1 @@ -debug | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file +debug | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/typedoc/modules/entry_browser.html b/docs/typedoc/modules/entry_browser.html index b6507ef7..8a5f5879 100644 --- a/docs/typedoc/modules/entry_browser.html +++ b/docs/typedoc/modules/entry_browser.html @@ -1,7 +1,7 @@ -entry/browser | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Index

    Variables

    Variables

    default: { client: ((state: string | fhirclient.ClientState) => default); oauth2: { authorize: ((options: fhirclient.AuthorizeParams) => Promise<string | void>); init: ((options: fhirclient.AuthorizeParams) => Promise<default>); ready: ((options?: fhirclient.ReadyOptions) => Promise<default>); settings: fhirclient.BrowserFHIRSettings }; utils: any }

    Type declaration

  • utils: any
  • Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file +

    Parameters

    Returns Promise<default>

  • settings: BrowserFHIRSettings
  • utils: any
  • Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/typedoc/modules/entry_hapi.html b/docs/typedoc/modules/entry_hapi.html index a5200ddc..d6debb3d 100644 --- a/docs/typedoc/modules/entry_hapi.html +++ b/docs/typedoc/modules/entry_hapi.html @@ -1 +1 @@ -entry/hapi | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file +entry/hapi | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/typedoc/modules/entry_node.html b/docs/typedoc/modules/entry_node.html index e9d0413c..416af9c3 100644 --- a/docs/typedoc/modules/entry_node.html +++ b/docs/typedoc/modules/entry_node.html @@ -1 +1 @@ -entry/node | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file +entry/node | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Index

    Functions

    Functions

    • default(request: IncomingMessage, response: ServerResponse<IncomingMessage>, storage?: Storage | storageFactory): SMART
    • Parameters

      • request: IncomingMessage
      • response: ServerResponse<IncomingMessage>
      • Optional storage: Storage | storageFactory

      Returns SMART

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/typedoc/modules/lib.fhirclient.FHIR.html b/docs/typedoc/modules/lib.fhirclient.FHIR.html deleted file mode 100644 index cf7efdcd..00000000 --- a/docs/typedoc/modules/lib.fhirclient.FHIR.html +++ /dev/null @@ -1,51 +0,0 @@ -FHIR | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Index

    Type Aliases

    code: string
    -

    Indicates that the value is taken from a set of controlled strings -defined elsewhere. Technically, a code is restricted to a string which -has at least one character and no leading or trailing whitespace, and -where there is no whitespace other than single spaces in the contents -Regex: [^\s]+([\s]?[^\s]+)*

    -
    dateTime: string
    -

    A date, date-time or partial date (e.g. just year or year + month) as -used in human communication. If hours and minutes are specified, a time -zone SHALL be populated. Seconds must be provided due to schema type -constraints but may be zero-filled and may be ignored. Dates SHALL be -valid dates. The time "24:00" is not allowed.

    -

    Patterns:

    -
      -
    • YYYY-MM-DDTHH:mm:ss.SSSSZ
    • -
    • YYYY-MM-DDTHH:mm:ss.SSSZ
    • -
    • YYYY-MM-DDTHH:mm:ssZ
    • -
    • YYYY-MM-DD
    • -
    • YYYY-MM
    • -
    • YYYY
    • -
    -

    Regex: --?[0-9]{4}(-(0[1-9]|1[0-2])(-(0[0-9]|[1-2][0-9]|3[0-1])(T([01] -[0-9]|2[0-3]):[0-5][0-9]:[0-5]0-9?(Z|(+|-)((0[0-9]|1[0-3]): -[0-5][0-9]|14:00)))?)?)?

    -
    id: string
    -

    Any combination of upper or lower case ASCII letters ('A'..'Z', and -'a'..'z', numerals ('0'..'9'), '-' and '.', with a length limit of 64 -characters. (This might be an integer, an un-prefixed OID, UUID or any -other identifier pattern that meets these constraints.) -Regex: [A-Za-z0-9\-\.]{1,64}

    -
    instant: string
    -

    An instant in time - known at least to the second and always includes a -time zone. Note: This is intended for precisely observed times (typically -system logs etc.), and not human-reported times - for them, use date and -dateTime. instant is a more constrained dateTime.

    -

    Patterns:

    -
      -
    • YYYY-MM-DDTHH:mm:ss.SSSSZ
    • -
    • YYYY-MM-DDTHH:mm:ss.SSSZ
    • -
    • YYYY-MM-DDTHH:mm:ssZ
    • -
    -
    unsignedInt: number
    -

    Any non-negative integer (e.g. >= 0) -Regex: [0]|([1-9][0-9]*)

    -
    uri: string
    -

    A Uniform Resource Identifier Reference (RFC 3986 ). Note: URIs are case -sensitive. For UUID (urn:uuid:53fefa32-fcbb-4ff8-8a92-55ee120877b7) use -all lowercase. URIs can be absolute or relative, and may have an optional -fragment identifier.

    -
    valueX: "valueInteger" | "valueUnsignedInt" | "valuePositiveInt" | "valueDecimal" | "valueDateTime" | "valueDate" | "valueTime" | "valueInstant" | "valueString" | "valueUri" | "valueOid" | "valueUuid" | "valueId" | "valueBoolean" | "valueCode" | "valueMarkdown" | "valueBase64Binary" | "valueCoding" | "valueCodeableConcept" | "valueAttachment" | "valueIdentifier" | "valueQuantity" | "valueSampledData" | "valueRange" | "valuePeriod" | "valueRatio" | "valueHumanName" | "valueAddress" | "valueContactPoint" | "valueTiming" | "valueReference" | "valueAnnotation" | "valueSignature" | "valueMeta"

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/typedoc/modules/lib.fhirclient.html b/docs/typedoc/modules/lib.fhirclient.html deleted file mode 100644 index 6bddfa42..00000000 --- a/docs/typedoc/modules/lib.fhirclient.html +++ /dev/null @@ -1,11 +0,0 @@ -fhirclient | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Index

    Type Aliases

    FetchResult: Response | fhirclient.JsonObject | string | fhirclient.CombinedFetchResult
    -

    The return type of the lib.request function

    -
    JsonArray: fhirclient.JsonValue[]
    JsonPrimitive: string | number | boolean | null
    PkceMode: "ifSupported" | "required" | "disabled" | "unsafeV1"
    RequestFunction<R>: (<O>(requestOptions?: O) => Promise<O["includeResponse"] extends true ? fhirclient.CombinedFetchResult<R> : R>)

    Type Parameters

    • R = any

      -

      The expected return type

      -

    Type declaration

      • -

        A function or method that makes requests to the backend server. If the -includeResponse option is true resolves with CombinedFetchResult -where the response property is the Response object and the body -property is the result of type R (if any). Otherwise resolves with the -result as R.

        -

        Type Parameters

        Parameters

        • Optional requestOptions: O

        Returns Promise<O["includeResponse"] extends true ? fhirclient.CombinedFetchResult<R> : R>

    WindowTargetVariable: "_self" | "_top" | "_parent" | "_blank" | "popup" | string | number | Window
    storageFactory: ((options?: Record<string, any>) => fhirclient.Storage)

    Type declaration

    Functions

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/typedoc/modules/lib.html b/docs/typedoc/modules/lib.html index 15734974..d806350e 100644 --- a/docs/typedoc/modules/lib.html +++ b/docs/typedoc/modules/lib.html @@ -1,27 +1,27 @@ -lib | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Index

    Variables

    units: { any: any; cm: any; kg: any } = ...
    +lib | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Index

    Variables

    units: { any: any; cm: any; kg: any } = ...

    A namespace with functions for converting between different measurement units

    -

    Type declaration

    Other Functions

    • absolute(path: string, baseUrl?: string): string

    Other Functions

    • absolute(path: string, baseUrl?: string): string
    • Given a path, converts it to absolute url based on the baseUrl. If baseUrl is not provided, the result would be a rooted path (one that starts with /).

      Parameters

      • path: string

        The path to convert

      • Optional baseUrl: string

        The base URL

        -

      Returns string

    • assert(condition: any, message: string): asserts condition
    • Parameters

      • condition: any
      • message: string

      Returns asserts condition

    Returns string

    • assert(condition: any, message: string): asserts condition
    • Parameters

      • condition: any
      • message: string

      Returns asserts condition

    • assertJsonPatch(patch: JsonPatch): asserts patch

    Returns ObservationMap

    • First groups the observations by code using byCode. Then returns a function that accepts codes as arguments and will return a flat array of observations having that codes. Example:

      const filter = client.byCodes(observations, "category");
      filter("laboratory") // => [ observation1, observation2 ]
      filter("vital-signs") // => [ observation3 ]
      filter("laboratory", "vital-signs") // => [ observation1, observation2, observation3 ]
      -

      Parameters

      • observations: fhirclient.FHIR.Observation | fhirclient.FHIR.Observation[]
        +

        Parameters

        • observations: Observation | Observation[]

          Array of observations

        • property: string

          The name of a CodeableConcept property to group by

          @@ -31,27 +31,27 @@ having that codes. Example:

          const filter = client.byCodes(observations, "category");
          filter("laboratory") // => [ observation1, observation2 ]
          filter("vital-signs") // => [ observation3 ]
          filter("laboratory", "vital-signs") // => [ observation1, observation2, observation3 ]
          -

          Parameters

          • Rest ...codes: string[]

          Returns any[]

    • checkResponse(resp: Response): Promise<Response>
    • +

      Parameters

      • Rest ...codes: string[]

      Returns any[]

    • checkResponse(resp: Response): Promise<Response>
    • Used in fetch Promise chains to reject if the "ok" property is not true

      -

      Parameters

      • resp: Response

      Returns Promise<Response>

    • +

      Parameters

      • resp: Response

      Returns Promise<Response>

    • fetchConformanceStatement(baseUrl?: string, requestOptions?: RequestInit): Promise<CapabilityStatement>
    • Fetches the conformance statement from the given base URL. Note that the result is cached in memory (until the page is reloaded in the browser) because it might have to be re-used by the client

      Parameters

      • baseUrl: string = "/"

        The base URL of the FHIR server

        -
      • Optional requestOptions: RequestInit

      Returns Promise<fhirclient.FHIR.CapabilityStatement>

    Returns Promise<CapabilityStatement>

    • Given a token response, computes and returns the expiresAt timestamp. Note that this should only be used immediately after an access token is received, otherwise the computed timestamp will be incorrect.

      -

      Parameters

      Returns number

    • getAndCache(url: string, requestOptions?: RequestInit, force?: boolean): Promise<any>
    • getAndCache(url: string, requestOptions?: RequestInit, force?: boolean): Promise<any>
    • Makes a request using fetch and stores the result in internal memory cache. The cache is cleared when the page is unloaded.

      Parameters

      • url: string

        The URL to request

      • Optional requestOptions: RequestInit

        Request options

        -
      • force: boolean = ...

      Returns Promise<any>

    • getPath(obj: Record<string, any>, path?: string): any

    Returns Promise<any>

    • getPath(obj: Record<string, any>, path?: string): any
    • Walks through an object (or array) and returns the value found at the provided path. This function is very simple so it intentionally does not support any argument polymorphism, meaning that the path can only be a @@ -61,22 +61,22 @@

    • path: string = ""

      The path (eg. "a.b.4.c")

    Returns any

    Whatever is found in the path or undefined

    -
    • Given a conformance statement and a resource type, returns the name of the URL parameter that can be used to scope the resource type by patient ID.

      -

      Parameters

      Returns string

    • getTargetWindow(target: WindowTarget, width?: number, height?: number): Promise<Window>
    • Resolves a reference to target window. It may also open new window or tab if the target = "popup" or target = "_blank".

      -

      Parameters

      • target: fhirclient.WindowTarget
      • width: number = 800
        +

        Parameters

        • target: WindowTarget
        • width: number = 800

          Only used when target = "popup"

        • height: number = 720

          Only used when target = "popup"

          -

        Returns Promise<Window>

    • getTimeInFuture(secondsAhead?: number, from?: number | Date): number

    Returns Promise<Window>

    • getTimeInFuture(secondsAhead?: number, from?: number | Date): number
    • Add a supplied number of seconds to the supplied Date, returning an integer number of seconds since the epoch

      Parameters

      • secondsAhead: number = 120

        How far ahead, in seconds (defaults to 120 seconds)

        -
      • Optional from: number | Date

      Returns number

    • loweCaseKeys<T>(obj: T): T
    • Type Parameters

      • T = undefined | any[] | Record<string, any>

      Parameters

      • obj: T

      Returns T

    Returns number

    • loweCaseKeys<T>(obj: T): T
    • Type Parameters

      • T = undefined | any[] | Record<string, any>

      Parameters

      • obj: T

      Returns T

    • request<T>(url: string | Request, requestOptions?: FetchOptions): Promise<T>
    • This is our built-in request function. It does a few things by default (unless told otherwise):

        @@ -87,11 +87,11 @@
      • If the response is text return the result text
      • Otherwise return the response object on which we call stuff like .blob()
      -

      Type Parameters

      Parameters

      Returns Promise<T>

    • responseToJSON(resp: Response): Promise<object | string>
    • responseToJSON(resp: Response): Promise<object | string>
    • Used in fetch Promise chains to return the JSON version of the response. Note that resp.json() will throw on empty body so we use resp.text() instead.

      -

      Parameters

      • resp: Response

      Returns Promise<object | string>

    • setPath(obj: Record<string, any>, path: string, value: any, createEmpty?: boolean): Record<string, any>
    • +

      Parameters

      • resp: Response

      Returns Promise<object | string>

    • setPath(obj: Record<string, any>, path: string, value: any, createEmpty?: boolean): Record<string, any>
    • Like getPath, but if the node is found, its value is set to @value

      Parameters

      • obj: Record<string, any>

        The object (or Array) to walk through

        @@ -102,18 +102,18 @@
      • createEmpty: boolean = false

        If true, create missing intermediate objects or arrays

      Returns Record<string, any>

      The modified object

      -

    Utility Functions

    Utility Functions

    • jwtDecode(token: string, env: Adapter): Record<string, any> | null
    • Decodes a JWT token and returns it's body.

      Parameters

      • token: string

        The token to read

        -
      • env: fhirclient.Adapter
        +
      • env: Adapter

        An Adapter or any other object that has a base64decode method

        -

      Returns Record<string, any> | null

    • makeArray<T>(arg: any): T[]

    Returns Record<string, any> | null

    • makeArray<T>(arg: any): T[]
    • If the argument is an array returns it as is. Otherwise puts it in an array ([arg]) and returns the result

      Type Parameters

      • T = any

      Parameters

      • arg: any

        The element to test and possibly convert to array

        -

      Returns T[]

    • randomString(strLength?: number, charSet?: string): string

    Returns T[]

    • randomString(strLength?: number, charSet?: string): string
    • Generates random strings. By default this returns random 8 characters long alphanumeric strings.

      Parameters

      • strLength: number = 8
        @@ -121,4 +121,4 @@
      • charSet: string = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"

        A string containing all the possible characters. Defaults to all the upper and lower-case letters plus digits.

        -

      Returns string

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file +

    Returns string

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/typedoc/modules/lib_BrowserAdapter.html b/docs/typedoc/modules/lib_BrowserAdapter.html deleted file mode 100644 index 5817c61c..00000000 --- a/docs/typedoc/modules/lib_BrowserAdapter.html +++ /dev/null @@ -1 +0,0 @@ -lib/BrowserAdapter | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/typedoc/modules/lib_BrowserStorage.html b/docs/typedoc/modules/lib_BrowserStorage.html deleted file mode 100644 index 59660f1d..00000000 --- a/docs/typedoc/modules/lib_BrowserStorage.html +++ /dev/null @@ -1 +0,0 @@ -lib/BrowserStorage | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/typedoc/modules/lib_Client.html b/docs/typedoc/modules/lib_Client.html deleted file mode 100644 index 7ca09e65..00000000 --- a/docs/typedoc/modules/lib_Client.html +++ /dev/null @@ -1 +0,0 @@ -lib/Client | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/typedoc/modules/lib_NodeAdapter.html b/docs/typedoc/modules/lib_NodeAdapter.html deleted file mode 100644 index 8d5d5488..00000000 --- a/docs/typedoc/modules/lib_NodeAdapter.html +++ /dev/null @@ -1 +0,0 @@ -lib/NodeAdapter | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/typedoc/modules/lib_ServerStorage.html b/docs/typedoc/modules/lib_ServerStorage.html deleted file mode 100644 index c6c8dbfa..00000000 --- a/docs/typedoc/modules/lib_ServerStorage.html +++ /dev/null @@ -1 +0,0 @@ -lib/ServerStorage | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/typedoc/modules/lib_browser.html b/docs/typedoc/modules/lib_browser.html deleted file mode 100644 index 1d456ce4..00000000 --- a/docs/typedoc/modules/lib_browser.html +++ /dev/null @@ -1,26 +0,0 @@ -lib/browser | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Index

    Functions

    • base64urldecode(input: string): string
    • Parameters

      • input: string

      Returns string

    • base64urlencode(input: string | Uint8Array): string
    • Parameters

      • input: string | Uint8Array

      Returns string

    • digestSha256(payload: string): Promise<Uint8Array>
    • Parameters

      • payload: string

      Returns Promise<Uint8Array>

    • generatePKCEChallenge(entropy?: number): Promise<PkcePair>
    • Parameters

      • entropy: number = 96

      Returns Promise<PkcePair>

    • -

      Resolves a reference to target window. It may also open new window or tab if -the target = "popup" or target = "_blank".

      -

      Parameters

      • target: fhirclient.WindowTarget
      • width: number = 800
        -

        Only used when target = "popup"

        -
      • height: number = 720
        -

        Only used when target = "popup"

        -

      Returns Promise<Window>

    • Parameters

      Returns Promise<CryptoKey>

    • isInFrame(): boolean
    • -

      Checks if called within a frame. Only works in browsers! -If the current window has a parent or top properties that refer to -another window, returns true. If trying to access top or parent throws an -error, returns true. Otherwise returns false.

      -

      Returns boolean

    • isInPopUp(): boolean
    • -

      Checks if called within another window (popup or tab). Only works in browsers! -To consider itself called in a new window, this function verifies that:

      -
        -
      1. self === top (not in frame)
      2. -
      3. !!opener && opener !== self The window has an opener
      4. -
      5. !!window.name The window has a name set
      6. -
      -

      Returns boolean

    • onMessage(e: MessageEvent<any>): void
    • -

      Another window can send a "completeAuth" message to this one, making it to -navigate to e.data.url

      -

      Parameters

      • e: MessageEvent<any>
        -

        The message event

        -

      Returns void

    • randomBytes(count: number): Uint8Array
    • Parameters

      • count: number

      Returns Uint8Array

    • redirect(to: string): void
    • Parameters

      • to: string

      Returns void

    • relative(path: string): string
    • Parameters

      • path: string

      Returns string

    • signCompactJws(alg: "ES384" | "RS384", privateKey: CryptoKey, header: any, payload: any): Promise<string>
    • Parameters

      • alg: "ES384" | "RS384"
      • privateKey: CryptoKey
      • header: any
      • payload: any

      Returns Promise<string>

    • uint8ArrayToBinaryString(input: Uint8Array): string
    • Parameters

      • input: Uint8Array

      Returns string

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/typedoc/modules/lib_browser_entry.default.html b/docs/typedoc/modules/lib_browser_entry.default.html deleted file mode 100644 index 9b2d92e2..00000000 --- a/docs/typedoc/modules/lib_browser_entry.default.html +++ /dev/null @@ -1,40 +0,0 @@ -default | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Index

    Variables

    authorize: ((options: fhirclient.AuthorizeParams) => Promise<string | void>)

    Type declaration

      • -

        Starts the SMART Launch Sequence.

        -
        -

        IMPORTANT: authorize() will end up redirecting you to the - authorization server. This means that you should not add - anything to the returned promise chain. Any code written directly - after the authorize() call might not be executed due to that - redirect!

        -
        -

        The options that you would typically pass for an EHR launch are just -clientId and scope. For standalone launch you should also provide -the iss option.

        -

        Parameters

        Returns Promise<string | void>

    client: ((state: string | fhirclient.ClientState) => ClientInterface)

    Type declaration

    init: ((options: fhirclient.AuthorizeParams) => Promise<ClientInterface>)

    Type declaration

      • -

        This function can be used when you want to handle everything in one -page (no launch endpoint needed).

        -
          -
        1. It will only work if your launch_uri is the same as your redirectUri. -While this should be valid, we can't promise that every EHR will allow you -to register client with such settings.
        2. -
        3. Internally, init() will be called twice. First it will redirect to the EHR, - then the EHR will redirect back to the page where init() will be called - again to complete the authorization. This is generally fine, because the - returned promise will only be resolved once, after the second execution, - but please also consider the following:
        4. -
        -
          -
        • You should wrap all your app's code in a function that is only executed - after init() resolves!
        • -
        • Since the page will be loaded twice, you must be careful if your code has - global side effects that can persist between page reloads (for example - writing to localStorage).
        • -
        -

        Parameters

        Returns Promise<ClientInterface>

    ready: ((options?: fhirclient.ReadyOptions) => Promise<any>)

    Type declaration

      • -

        This should be called on your redirectUri. Returns a Promise that -will eventually be resolved with a Client instance that you can use -to query the fhir server.

        -

        Parameters

        Returns Promise<any>

    utils: any

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/typedoc/modules/lib_browser_entry.html b/docs/typedoc/modules/lib_browser_entry.html deleted file mode 100644 index d596858f..00000000 --- a/docs/typedoc/modules/lib_browser_entry.html +++ /dev/null @@ -1 +0,0 @@ -lib/browser_entry | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/typedoc/modules/lib_isomorphic.html b/docs/typedoc/modules/lib_isomorphic.html deleted file mode 100644 index aa0ead3d..00000000 --- a/docs/typedoc/modules/lib_isomorphic.html +++ /dev/null @@ -1,130 +0,0 @@ -lib/isomorphic | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Index

    Variables

    units: { any: any; cm: any; kg: any } = ...
    -

    A namespace with functions for converting between different measurement units

    -

    Type declaration

    • any:function
      • Parameters

        Returns number

    • cm:function
      • Parameters

        Returns number

    • kg:function
      • Parameters

        Returns number

    Other Functions

    • absolute(path: string, baseUrl?: string): string
    • -

      Given a path, converts it to absolute url based on the baseUrl. If baseUrl -is not provided, the result would be a rooted path (one that starts with /).

      -

      Parameters

      • path: string
        -

        The path to convert

        -
      • Optional baseUrl: string
        -

        The base URL

        -

      Returns string

    • assert(condition: any, message: string): asserts condition
    • Parameters

      • condition: any
      • message: string

      Returns asserts condition

    • base64decode(input: string): string
    • Parameters

      • input: string

      Returns string

    • base64encode(input: string): string
    • Parameters

      • input: string

      Returns string

    • -

      Groups the observations by code. Returns a map that will look like:

      -
      const map = client.byCodes(observations, "code");
      // map = {
      // "55284-4": [ observation1, observation2 ],
      // "6082-2": [ observation3 ]
      // } -
      -

      Parameters

      Returns ObservationMap

    • -

      First groups the observations by code using byCode. Then returns a function -that accepts codes as arguments and will return a flat array of observations -having that codes. Example:

      -
      const filter = client.byCodes(observations, "category");
      filter("laboratory") // => [ observation1, observation2 ]
      filter("vital-signs") // => [ observation3 ]
      filter("laboratory", "vital-signs") // => [ observation1, observation2, observation3 ] -
      -

      Parameters

      Returns ((...codes: string[]) => any[])

        • (...codes: string[]): any[]
        • -

          First groups the observations by code using byCode. Then returns a function -that accepts codes as arguments and will return a flat array of observations -having that codes. Example:

          -
          const filter = client.byCodes(observations, "category");
          filter("laboratory") // => [ observation1, observation2 ]
          filter("vital-signs") // => [ observation3 ]
          filter("laboratory", "vital-signs") // => [ observation1, observation2, observation3 ] -
          -

          Parameters

          • Rest ...codes: string[]

          Returns any[]

    • checkResponse(resp: Response): Promise<Response>
    • -

      Used in fetch Promise chains to reject if the "ok" property is not true

      -

      Parameters

      • resp: Response

      Returns Promise<Response>

    • debug(...args: any[]): void
    • Parameters

      • Rest ...args: any[]

      Returns void

    • -

      Fetches the conformance statement from the given base URL. -Note that the result is cached in memory (until the page is reloaded in the -browser) because it might have to be re-used by the client

      -

      Parameters

      • baseUrl: string = "/"
        -

        The base URL of the FHIR server

        -
      • Optional requestOptions: RequestInit

      Returns Promise<fhirclient.FHIR.CapabilityStatement>

    • -

      Fetches the well-known json file from the given base URL. -Note that the result is cached in memory (until the page is reloaded in the -browser) because it might have to be re-used by the client

      -

      Parameters

      • baseUrl: string = "/"
        -

        The base URL of the FHIR server

        -
      • Optional requestOptions: RequestInit

      Returns Promise<WellKnownSmartConfiguration>

    • -

      Given a token response, computes and returns the expiresAt timestamp. -Note that this should only be used immediately after an access token is -received, otherwise the computed timestamp will be incorrect.

      -

      Parameters

      Returns number

    • getAndCache(url: string, requestOptions?: RequestInit, force?: boolean): Promise<any>
    • -

      Makes a request using fetch and stores the result in internal memory cache. -The cache is cleared when the page is unloaded.

      -

      Parameters

      • url: string
        -

        The URL to request

        -
      • Optional requestOptions: RequestInit
        -

        Request options

        -
      • force: boolean = ...

      Returns Promise<any>

    • getPath(obj: Record<string, any>, path?: string): any
    • -

      Walks through an object (or array) and returns the value found at the -provided path. This function is very simple so it intentionally does not -support any argument polymorphism, meaning that the path can only be a -dot-separated string. If the path is invalid returns undefined.

      -

      Parameters

      • obj: Record<string, any>
        -

        The object (or Array) to walk through

        -
      • path: string = ""
        -

        The path (eg. "a.b.4.c")

        -

      Returns any

      Whatever is found in the path or undefined

      -
    • -

      Given a conformance statement and a resource type, returns the name of the -URL parameter that can be used to scope the resource type by patient ID.

      -

      Parameters

      Returns string

    • -

      Given a FHIR server, returns an object with it's Oauth security endpoints -that we are interested in. This will try to find the info in both the -CapabilityStatement and the .well-known/smart-configuration. Whatever -Arrives first will be used and the other request will be aborted.

      -

      Parameters

      • baseUrl: string = "/"

      Returns Promise<OAuthSecurityExtensions>

    • getSecurityExtensionsFromConformanceStatement(baseUrl?: string, requestOptions?: RequestInit): Promise<OAuthSecurityExtensions>
    • -

      Fetch a CapabilityStatement and extract the SMART endpoints from it

      -

      Parameters

      • baseUrl: string = "/"
      • Optional requestOptions: RequestInit

      Returns Promise<OAuthSecurityExtensions>

    • getSecurityExtensionsFromWellKnownJson(baseUrl?: string, requestOptions?: RequestInit): Promise<OAuthSecurityExtensions>
    • -

      Fetch a "WellKnownJson" and extract the SMART endpoints from it

      -

      Parameters

      • baseUrl: string = "/"
      • Optional requestOptions: RequestInit

      Returns Promise<OAuthSecurityExtensions>

    • getTimeInFuture(secondsAhead?: number, from?: number | Date): number
    • -

      Add a supplied number of seconds to the supplied Date, returning an integer -number of seconds since the epoch

      -

      Parameters

      • secondsAhead: number = 120
        -

        How far ahead, in seconds (defaults to 120 seconds)

        -
      • Optional from: number | Date

      Returns number

    • loweCaseKeys<T>(obj: T): T
    • Type Parameters

      • T = undefined | any[] | Record<string, any>

      Parameters

      • obj: T

      Returns T

    • -

      This is our built-in request function. It does a few things by default -(unless told otherwise):

      -
        -
      • Makes CORS requests
      • -
      • Sets accept header to "application/json"
      • -
      • Handles errors
      • -
      • If the response is json return the json object
      • -
      • If the response is text return the result text
      • -
      • Otherwise return the response object on which we call stuff like .blob()
      • -
      -

      Type Parameters

      Parameters

      Returns Promise<T>

    • responseToJSON(resp: Response): Promise<object | string>
    • -

      Used in fetch Promise chains to return the JSON version of the response. -Note that resp.json() will throw on empty body so we use resp.text() -instead.

      -

      Parameters

      • resp: Response

      Returns Promise<object | string>

    • setPath(obj: Record<string, any>, path: string, value: any, createEmpty?: boolean): Record<string, any>
    • -

      Like getPath, but if the node is found, its value is set to @value

      -

      Parameters

      • obj: Record<string, any>
        -

        The object (or Array) to walk through

        -
      • path: string
        -

        The path (eg. "a.b.4.c")

        -
      • value: any
        -

        The value to set

        -
      • createEmpty: boolean = false
        -

        If true, create missing intermediate objects or arrays

        -

      Returns Record<string, any>

      The modified object

      -
    • shouldIncludeChallenge(S256supported: boolean, pkceMode?: string): boolean
    • Parameters

      • S256supported: boolean
      • Optional pkceMode: string

      Returns boolean

    Utility Functions

    • jwtDecode(token: string): Record<string, any> | null
    • -

      Decodes a JWT token and returns it's body.

      -

      Parameters

      • token: string
        -

        The token to read

        -

      Returns Record<string, any> | null

    • makeArray<T>(arg: any): T[]
    • -

      If the argument is an array returns it as is. Otherwise puts it in an array -([arg]) and returns the result

      -

      Type Parameters

      • T = any

      Parameters

      • arg: any
        -

        The element to test and possibly convert to array

        -

      Returns T[]

    • randomString(strLength?: number, charSet?: string): string
    • -

      Generates random strings. By default this returns random 8 characters long -alphanumeric strings.

      -

      Parameters

      • strLength: number = 8
        -

        The length of the output string. Defaults to 8.

        -
      • charSet: string = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
        -

        A string containing all the possible characters. - Defaults to all the upper and lower-case letters plus digits.

        -

      Returns string

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/typedoc/modules/lib_server.html b/docs/typedoc/modules/lib_server.html deleted file mode 100644 index d74854ae..00000000 --- a/docs/typedoc/modules/lib_server.html +++ /dev/null @@ -1 +0,0 @@ -lib/server | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Index

    References

    Renames and re-exports __type

    Functions

    • base64urldecode(input: string): string
    • Parameters

      • input: string

      Returns string

    • base64urlencode(input: string | Uint8Array): string
    • Parameters

      • input: string | Uint8Array

      Returns string

    • digestSha256(payload: string): Promise<Buffer>
    • Parameters

      • payload: string

      Returns Promise<Buffer>

    • generatePKCEChallenge(entropy?: number): Promise<PkcePair>
    • Parameters

      • entropy: number = 96

      Returns Promise<PkcePair>

    • Parameters

      Returns Promise<CryptoKey>

    • signCompactJws(alg: SupportedAlg, privateKey: KeyLike, header: any, payload: any): Promise<string>
    • Parameters

      • alg: SupportedAlg
      • privateKey: KeyLike
      • header: any
      • payload: any

      Returns Promise<string>

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/typedoc/modules/lib_server_entry.html b/docs/typedoc/modules/lib_server_entry.html deleted file mode 100644 index b2c68287..00000000 --- a/docs/typedoc/modules/lib_server_entry.html +++ /dev/null @@ -1 +0,0 @@ -lib/server_entry | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/typedoc/modules/lib_settings.html b/docs/typedoc/modules/lib_settings.html deleted file mode 100644 index f91027d2..00000000 --- a/docs/typedoc/modules/lib_settings.html +++ /dev/null @@ -1,10 +0,0 @@ -lib/settings | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Index

    Variables

    SMART_KEY: "SMART_KEY" = "SMART_KEY"
    -

    The name of the sessionStorage entry that contains the current key

    -
    fhirVersions: { 0.4.0: number; 0.5.0: number; 1.0.0: number; 1.0.1: number; 1.0.2: number; 1.1.0: number; 1.4.0: number; 1.6.0: number; 1.8.0: number; 3.0.0: number; 3.0.1: number; 3.3.0: number; 3.5.0: number; 4.0.0: number; 4.0.1: number } = ...
    -

    Map of FHIR releases and their abstract version as number

    -

    Type declaration

    • 0.4.0: number
    • 0.5.0: number
    • 1.0.0: number
    • 1.0.1: number
    • 1.0.2: number
    • 1.1.0: number
    • 1.4.0: number
    • 1.6.0: number
    • 1.8.0: number
    • 3.0.0: number
    • 3.0.1: number
    • 3.3.0: number
    • 3.5.0: number
    • 4.0.0: number
    • 4.0.1: number
    patientCompartment: string[] = ...
    -

    Combined list of FHIR resource types accepting patient parameter in FHIR R2-R4

    -
    patientParams: string[] = ...
    -

    Combined (FHIR R2-R4) list of search parameters that can be used to scope -a request by patient ID.

    -

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/typedoc/modules/lib_smart.html b/docs/typedoc/modules/lib_smart.html deleted file mode 100644 index f85b5065..00000000 --- a/docs/typedoc/modules/lib_smart.html +++ /dev/null @@ -1,60 +0,0 @@ -lib/smart | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Index

    Functions

    • -

      Starts the SMART Launch Sequence.

      -
      -

      IMPORTANT: - authorize() will end up redirecting you to the authorization server. - This means that you should not add anything to the returned promise chain. - Any code written directly after the authorize() call might not be executed - due to that redirect!

      -
      -

      Parameters

      Returns Promise<string | void>

    • -

      Builds the token request options. Does not make the request, just -creates it's configuration and returns it in a Promise.

      -

      Parameters

      • env: fhirclient.Adapter
      • __namedParameters: { clientPublicKeySetUrl?: string; code: string; privateKey?: fhirclient.JWK | { alg: "ES384" | "RS384"; key: CryptoKey; kid: string }; state: fhirclient.ClientState }
        • Optional clientPublicKeySetUrl?: string
          -

          If provided overrides the clientPublicKeySetUrl from the authorize -options (if any). Used for jku token header in case of asymmetric auth.

          -
        • code: string
          -

          The code URL parameter received from the auth redirect

          -
        • Optional privateKey?: fhirclient.JWK | { alg: "ES384" | "RS384"; key: CryptoKey; kid: string }
          -

          Can be a private JWK, or an object with alg, kid and key properties, -where key is an un-extractable private CryptoKey object.

          -
        • state: fhirclient.ClientState
          -

          The app state

          -

      Returns Promise<RequestInit>

    • -

      This function can be used when you want to handle everything in one page -(no launch endpoint needed). You can think of it as if it does:

      -
      authorize(options).then(ready)
      -
      -

      Be careful with init()! There are some details you need to be aware of:

      -
        -
      1. It will only work if your launch_uri is the same as your redirect_uri. -While this should be valid, we can’t promise that every EHR will allow you -to register client with such settings.
      2. -
      3. Internally, init() will be called twice. First it will redirect to the -EHR, then the EHR will redirect back to the page where init() will be -called again to complete the authorization. This is generally fine, -because the returned promise will only be resolved once, after the second -execution, but please also consider the following:
          -
        • You should wrap all your app’s code in a function that is only executed -after init() resolves!
        • -
        • Since the page will be loaded twice, you must be careful if your code -has global side effects that can persist between page reloads -(for example writing to localStorage).
        • -
        -
      4. -
      5. For standalone launch, only use init in combination with offline_access -scope. Once the access_token expires, if you don’t have a refresh_token -there is no way to re-authorize properly. We detect that and delete the -expired access token, but it still means that the user will have to -refresh the page twice to re-authorize.
      6. -
      -

      Parameters

      Returns Promise<default | never>

    • -

      The ready function should only be called on the page that represents -the redirectUri. We typically land there after a redirect from the -authorization server, but this code will also be executed upon subsequent -navigation or page refresh.

      -

      Parameters

      Returns Promise<default>

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/typedoc/modules/lib_strings.html b/docs/typedoc/modules/lib_strings.html deleted file mode 100644 index d609f116..00000000 --- a/docs/typedoc/modules/lib_strings.html +++ /dev/null @@ -1 +0,0 @@ -lib/strings | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/typedoc/modules/security_browser.html b/docs/typedoc/modules/security_browser.html index bc32c248..eb0e7b70 100644 --- a/docs/typedoc/modules/security_browser.html +++ b/docs/typedoc/modules/security_browser.html @@ -1 +1 @@ -security/browser | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Index

    Functions

    • digestSha256(payload: string): Promise<Uint8Array>
    • generatePKCEChallenge(entropy?: number): Promise<PkcePair>
    • randomBytes(count: number): Uint8Array
    • signCompactJws(alg: "ES384" | "RS384", privateKey: CryptoKey, header: any, payload: any): Promise<string>
    • Parameters

      • alg: "ES384" | "RS384"
      • privateKey: CryptoKey
      • header: any
      • payload: any

      Returns Promise<string>

    • subtle(): SubtleCrypto

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file +security/browser | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Index

    Functions

    • digestSha256(payload: string): Promise<Uint8Array>
    • generatePKCEChallenge(entropy?: number): Promise<PkcePair>
    • importJWK(jwk: JWK): Promise<CryptoKey>
    • randomBytes(count: number): Uint8Array
    • signCompactJws(alg: "ES384" | "RS384", privateKey: CryptoKey, header: any, payload: any): Promise<string>
    • Parameters

      • alg: "ES384" | "RS384"
      • privateKey: CryptoKey
      • header: any
      • payload: any

      Returns Promise<string>

    • subtle(): SubtleCrypto

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/typedoc/modules/security_server.html b/docs/typedoc/modules/security_server.html index fceaf401..aba7c424 100644 --- a/docs/typedoc/modules/security_server.html +++ b/docs/typedoc/modules/security_server.html @@ -1 +1,29 @@ -security/server | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Index

    References

    Renames and re-exports __type

    Functions

    • digestSha256(payload: string): Promise<Buffer>
    • generatePKCEChallenge(entropy?: number): Promise<PkcePair>
    • signCompactJws(alg: SupportedAlg, privateKey: KeyLike, header: any, payload: any): Promise<string>
    • Parameters

      • alg: SupportedAlg
      • privateKey: KeyLike
      • header: any
      • payload: any

      Returns Promise<string>

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file +security/server | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Index

    Functions

    • digestSha256(payload: string): Promise<Buffer>
    • generatePKCEChallenge(entropy?: number): Promise<PkcePair>
    • importJWK(jwk: JWK): Promise<CryptoKey>
    • randomBytes(size: number): Buffer
    • randomBytes(size: number, callback: ((err: null | Error, buf: Buffer) => void)): void
    • +

      Generates cryptographically strong pseudorandom data. The size argument +is a number indicating the number of bytes to generate.

      +

      If a callback function is provided, the bytes are generated asynchronously +and the callback function is invoked with two arguments: err and buf. +If an error occurs, err will be an Error object; otherwise it is null. The buf argument is a Buffer containing the generated bytes.

      +
      // Asynchronous
      const {
      randomBytes,
      } = await import('node:crypto');

      randomBytes(256, (err, buf) => {
      if (err) throw err;
      console.log(`${buf.length} bytes of random data: ${buf.toString('hex')}`);
      }); +
      +

      If the callback function is not provided, the random bytes are generated +synchronously and returned as a Buffer. An error will be thrown if +there is a problem generating the bytes.

      +
      // Synchronous
      const {
      randomBytes,
      } = await import('node:crypto');

      const buf = randomBytes(256);
      console.log(
      `${buf.length} bytes of random data: ${buf.toString('hex')}`); +
      +

      The crypto.randomBytes() method will not complete until there is +sufficient entropy available. +This should normally never take longer than a few milliseconds. The only time +when generating the random bytes may conceivably block for a longer period of +time is right after boot, when the whole system is still low on entropy.

      +

      This API uses libuv's threadpool, which can have surprising and +negative performance implications for some applications; see the UV_THREADPOOL_SIZE documentation for more information.

      +

      The asynchronous version of crypto.randomBytes() is carried out in a single +threadpool request. To minimize threadpool task length variation, partition +large randomBytes requests when doing so as part of fulfilling a client +request.

      +
      since

      v0.5.8

      +

      Parameters

      • size: number
        +

        The number of bytes to generate. The size must not be larger than 2**31 - 1.

        +

      Returns Buffer

      if the callback function is not provided.

      +
    • Parameters

      • size: number
      • callback: ((err: null | Error, buf: Buffer) => void)
          • (err: null | Error, buf: Buffer): void
          • Parameters

            • err: null | Error
            • buf: Buffer

            Returns void

      Returns void

    • signCompactJws(alg: SupportedAlg, privateKey: KeyLike, header: any, payload: any): Promise<string>
    • Parameters

      • alg: SupportedAlg
      • privateKey: KeyLike
      • header: any
      • payload: any

      Returns Promise<string>

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/typedoc/modules/settings.html b/docs/typedoc/modules/settings.html index 3d1d0985..7d75f92d 100644 --- a/docs/typedoc/modules/settings.html +++ b/docs/typedoc/modules/settings.html @@ -1,10 +1,10 @@ -settings | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Index

    Variables

    SMART_KEY: "SMART_KEY" = "SMART_KEY"
    +settings | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Index

    Variables

    SMART_KEY: "SMART_KEY" = "SMART_KEY"

    The name of the sessionStorage entry that contains the current key

    -
    fhirVersions: { 0.4.0: number; 0.5.0: number; 1.0.0: number; 1.0.1: number; 1.0.2: number; 1.1.0: number; 1.4.0: number; 1.6.0: number; 1.8.0: number; 3.0.0: number; 3.0.1: number; 3.3.0: number; 3.5.0: number; 4.0.0: number; 4.0.1: number } = ...
    +
    fhirVersions: { 0.4.0: number; 0.5.0: number; 1.0.0: number; 1.0.1: number; 1.0.2: number; 1.1.0: number; 1.4.0: number; 1.6.0: number; 1.8.0: number; 3.0.0: number; 3.0.1: number; 3.3.0: number; 3.5.0: number; 4.0.0: number; 4.0.1: number } = ...

    Map of FHIR releases and their abstract version as number

    -

    Type declaration

    • 0.4.0: number
    • 0.5.0: number
    • 1.0.0: number
    • 1.0.1: number
    • 1.0.2: number
    • 1.1.0: number
    • 1.4.0: number
    • 1.6.0: number
    • 1.8.0: number
    • 3.0.0: number
    • 3.0.1: number
    • 3.3.0: number
    • 3.5.0: number
    • 4.0.0: number
    • 4.0.1: number
    patientCompartment: string[] = ...
    +

    Type declaration

    • 0.4.0: number
    • 0.5.0: number
    • 1.0.0: number
    • 1.0.1: number
    • 1.0.2: number
    • 1.1.0: number
    • 1.4.0: number
    • 1.6.0: number
    • 1.8.0: number
    • 3.0.0: number
    • 3.0.1: number
    • 3.3.0: number
    • 3.5.0: number
    • 4.0.0: number
    • 4.0.1: number
    patientCompartment: string[] = ...

    Combined list of FHIR resource types accepting patient parameter in FHIR R2-R4

    -
    patientParams: string[] = ...
    +
    patientParams: string[] = ...

    Combined (FHIR R2-R4) list of search parameters that can be used to scope a request by patient ID.

    -

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file +

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/typedoc/modules/smart.html b/docs/typedoc/modules/smart.html index a8e89c37..a0bc2061 100644 --- a/docs/typedoc/modules/smart.html +++ b/docs/typedoc/modules/smart.html @@ -1,4 +1,4 @@ -smart | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Index

    References

    Renames and re-exports SMART_KEY

    Functions

    Returns Promise<RequestInit>

    • Fetches the well-known json file from the given base URL. Note that the result is cached in memory (until the page is reloaded in the browser) because it might have to be re-used by the client

      Parameters

      • baseUrl: string = "/"

        The base URL of the FHIR server

        -
      • Optional requestOptions: RequestInit

      Returns Promise<WellKnownSmartConfiguration>

    Returns Promise<WellKnownSmartConfiguration>

    • Given a FHIR server, returns an object with it's Oauth security endpoints that we are interested in. This will try to find the info in both the CapabilityStatement and the .well-known/smart-configuration. Whatever Arrives first will be used and the other request will be aborted.

      -

      Parameters

      • baseUrl: string = "/"

      Returns Promise<OAuthSecurityExtensions>

    • This function can be used when you want to handle everything in one page (no launch endpoint needed). You can think of it as if it does:

      authorize(options).then(ready)
      @@ -59,16 +59,16 @@
       expired access token, but it still means that the user will have to
       refresh the page twice to re-authorize.
    • -

    Parameters

    • isInFrame(): boolean

    Returns Promise<default | never>

    • isInFrame(): boolean
    • Checks if called within a frame. Only works in browsers! If the current window has a parent or top properties that refer to another window, returns true. If trying to access top or parent throws an error, returns true. Otherwise returns false.

      -

      Returns boolean

    • isInPopUp(): boolean
    • isInPopUp(): boolean
    • Checks if called within another window (popup or tab). Only works in browsers! To consider itself called in a new window, this function verifies that:

        @@ -76,14 +76,14 @@
      1. !!opener && opener !== self The window has an opener
      2. !!window.name The window has a name set
      -

      Returns boolean

    • onMessage(e: MessageEvent<any>): void
    • onMessage(e: MessageEvent<any>): void
    • Another window can send a "completeAuth" message to this one, making it to navigate to e.data.url

      Parameters

      • e: MessageEvent<any>

        The message event

        -

      Returns void

    Returns void

    • The ready function should only be called on the page that represents the redirectUri. We typically land there after a redirect from the authorization server, but this code will also be executed upon subsequent navigation or page refresh.

      -

      Parameters

      Returns Promise<default>

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file +

    Parameters

    Returns Promise<default>

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/typedoc/modules/storage_BrowserStorage.html b/docs/typedoc/modules/storage_BrowserStorage.html index 4c1d3de3..6522bcad 100644 --- a/docs/typedoc/modules/storage_BrowserStorage.html +++ b/docs/typedoc/modules/storage_BrowserStorage.html @@ -1 +1 @@ -storage/BrowserStorage | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file +storage/BrowserStorage | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/typedoc/modules/storage_ServerStorage.html b/docs/typedoc/modules/storage_ServerStorage.html index a0cd90c6..e54f0d88 100644 --- a/docs/typedoc/modules/storage_ServerStorage.html +++ b/docs/typedoc/modules/storage_ServerStorage.html @@ -1 +1 @@ -storage/ServerStorage | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file +storage/ServerStorage | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/typedoc/modules/strings.html b/docs/typedoc/modules/strings.html index 40048697..c0200d83 100644 --- a/docs/typedoc/modules/strings.html +++ b/docs/typedoc/modules/strings.html @@ -1 +1 @@ -strings | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file +strings | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Index

    Variables

    Variables

    default: { expired: string; noFreeContext: string; noIfNoAuth: string; noScopeForId: string }

    Type declaration

    • expired: string
    • noFreeContext: string
    • noIfNoAuth: string
    • noScopeForId: string

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/typedoc/modules/types.fhirclient.FHIR.html b/docs/typedoc/modules/types.fhirclient.FHIR.html index 8afe19e4..90a8c6fc 100644 --- a/docs/typedoc/modules/types.fhirclient.FHIR.html +++ b/docs/typedoc/modules/types.fhirclient.FHIR.html @@ -1,10 +1,10 @@ -FHIR | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Index

    Type Aliases

    code: string
    +FHIR | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Index

    Type Aliases

    code: string

    Indicates that the value is taken from a set of controlled strings defined elsewhere. Technically, a code is restricted to a string which has at least one character and no leading or trailing whitespace, and where there is no whitespace other than single spaces in the contents Regex: [^\s]+([\s]?[^\s]+)*

    -
    dateTime: string
    +
    dateTime: string

    A date, date-time or partial date (e.g. just year or year + month) as used in human communication. If hours and minutes are specified, a time zone SHALL be populated. Seconds must be provided due to schema type @@ -23,13 +23,13 @@ -?[0-9]{4}(-(0[1-9]|1[0-2])(-(0[0-9]|[1-2][0-9]|3[0-1])(T([01] [0-9]|2[0-3]):[0-5][0-9]:[0-5]0-9?(Z|(+|-)((0[0-9]|1[0-3]): [0-5][0-9]|14:00)))?)?)?

    -
    id: string
    +
    id: string

    Any combination of upper or lower case ASCII letters ('A'..'Z', and 'a'..'z', numerals ('0'..'9'), '-' and '.', with a length limit of 64 characters. (This might be an integer, an un-prefixed OID, UUID or any other identifier pattern that meets these constraints.) Regex: [A-Za-z0-9\-\.]{1,64}

    -
    instant: string
    +
    instant: string

    An instant in time - known at least to the second and always includes a time zone. Note: This is intended for precisely observed times (typically system logs etc.), and not human-reported times - for them, use date and @@ -40,12 +40,12 @@

  • YYYY-MM-DDTHH:mm:ss.SSSZ
  • YYYY-MM-DDTHH:mm:ssZ
  • -
    unsignedInt: number
    +
    unsignedInt: number

    Any non-negative integer (e.g. >= 0) Regex: [0]|([1-9][0-9]*)

    -
    uri: string
    +
    uri: string

    A Uniform Resource Identifier Reference (RFC 3986 ). Note: URIs are case sensitive. For UUID (urn:uuid:53fefa32-fcbb-4ff8-8a92-55ee120877b7) use all lowercase. URIs can be absolute or relative, and may have an optional fragment identifier.

    -
    valueX: "valueInteger" | "valueUnsignedInt" | "valuePositiveInt" | "valueDecimal" | "valueDateTime" | "valueDate" | "valueTime" | "valueInstant" | "valueString" | "valueUri" | "valueOid" | "valueUuid" | "valueId" | "valueBoolean" | "valueCode" | "valueMarkdown" | "valueBase64Binary" | "valueCoding" | "valueCodeableConcept" | "valueAttachment" | "valueIdentifier" | "valueQuantity" | "valueSampledData" | "valueRange" | "valuePeriod" | "valueRatio" | "valueHumanName" | "valueAddress" | "valueContactPoint" | "valueTiming" | "valueReference" | "valueAnnotation" | "valueSignature" | "valueMeta"

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file +
    valueX: "valueInteger" | "valueUnsignedInt" | "valuePositiveInt" | "valueDecimal" | "valueDateTime" | "valueDate" | "valueTime" | "valueInstant" | "valueString" | "valueUri" | "valueOid" | "valueUuid" | "valueId" | "valueBoolean" | "valueCode" | "valueMarkdown" | "valueBase64Binary" | "valueCoding" | "valueCodeableConcept" | "valueAttachment" | "valueIdentifier" | "valueQuantity" | "valueSampledData" | "valueRange" | "valuePeriod" | "valueRatio" | "valueHumanName" | "valueAddress" | "valueContactPoint" | "valueTiming" | "valueReference" | "valueAnnotation" | "valueSignature" | "valueMeta"

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/typedoc/modules/types.fhirclient.html b/docs/typedoc/modules/types.fhirclient.html index 6251ea3f..f302ab70 100644 --- a/docs/typedoc/modules/types.fhirclient.html +++ b/docs/typedoc/modules/types.fhirclient.html @@ -1,11 +1,11 @@ -fhirclient | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Index

    Type Aliases

    FetchResult: Response | fhirclient.JsonObject | string | fhirclient.CombinedFetchResult
    +fhirclient | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Index

    Type Aliases

    FetchResult: Response | JsonObject | string | CombinedFetchResult

    The return type of the lib.request function

    -
    JsonArray: fhirclient.JsonValue[]
    JsonPrimitive: string | number | boolean | null
    PkceMode: "ifSupported" | "required" | "disabled" | "unsafeV1"
    RequestFunction<R>: (<O>(requestOptions?: O) => Promise<O["includeResponse"] extends true ? fhirclient.CombinedFetchResult<R> : R>)

    Type Parameters

    • R = any

      +
    JsonArray: JsonValue[]
    JsonPatch: JsonPatchOperation[]
    JsonPrimitive: string | number | boolean | null
    PkceMode: "ifSupported" | "required" | "disabled" | "unsafeV1"
    RequestFunction<R>: (<O>(requestOptions?: O) => Promise<O["includeResponse"] extends true ? CombinedFetchResult<R> : R>)

    Type Parameters

    • R = any

      The expected return type

      -

    Type declaration

      • +

      Type declaration

        • <O>(requestOptions?: O): Promise<O["includeResponse"] extends true ? CombinedFetchResult<R> : R>
        • A function or method that makes requests to the backend server. If the includeResponse option is true resolves with CombinedFetchResult where the response property is the Response object and the body property is the result of type R (if any). Otherwise resolves with the result as R.

          -

          Type Parameters

          Parameters

          • Optional requestOptions: O

          Returns Promise<O["includeResponse"] extends true ? fhirclient.CombinedFetchResult<R> : R>

    SMARTAuthenticationMethod: "client_secret_post" | "client_secret_basic" | "private_key_jwt"
    WindowTargetVariable: "_self" | "_top" | "_parent" | "_blank" | "popup" | string | number | Window
    clientType: "client-public" | "client-confidential-symmetric"
    codeChallengeMethod: "S256"
    launchContext: "context-banner" | "context-style"
    launchContextEHR: "context-ehr-patient" | "context-ehr-encounter"
    launchContextStandalone: "context-standalone-patient" | "context-standalone-encounter"
    launchMode: "launch-ehr" | "launch-standalone"
    permissions: "permission-offline" | "permission-patient" | "permission-user"
    singleSignOn: "sso-openid-connect"
    storageFactory: ((options?: Record<string, any>) => fhirclient.Storage)

    Type declaration

    Functions

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file +

    Type Parameters

    Parameters

    • Optional requestOptions: O

    Returns Promise<O["includeResponse"] extends true ? CombinedFetchResult<R> : R>

    SMARTAuthenticationMethod: "client_secret_post" | "client_secret_basic" | "private_key_jwt"
    WindowTargetVariable: "_self" | "_top" | "_parent" | "_blank" | "popup" | string | number | Window
    clientType: "client-public" | "client-confidential-symmetric"
    codeChallengeMethod: "S256"
    launchContext: "context-banner" | "context-style"
    launchContextEHR: "context-ehr-patient" | "context-ehr-encounter"
    launchContextStandalone: "context-standalone-patient" | "context-standalone-encounter"
    launchMode: "launch-ehr" | "launch-standalone"
    permissions: "permission-offline" | "permission-patient" | "permission-user"
    singleSignOn: "sso-openid-connect"
    storageFactory: ((options?: Record<string, any>) => Storage)

    Type declaration

      • (options?: Record<string, any>): Storage
      • Parameters

        • Optional options: Record<string, any>

        Returns Storage

    Functions

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/typedoc/modules/types.html b/docs/typedoc/modules/types.html index 61d4d516..7a61e7c4 100644 --- a/docs/typedoc/modules/types.html +++ b/docs/typedoc/modules/types.html @@ -1 +1 @@ -types | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file +types | FHIRClient - v3.0.0-beta.1
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    Legend

    • Namespace
    • Variable
    • Function
    • Function with type parameter
    • Class

    Settings

    Theme

    Generated using TypeDoc

    \ No newline at end of file diff --git a/rollup.config.mjs b/rollup.config.mjs index 350e53fe..341356a6 100644 --- a/rollup.config.mjs +++ b/rollup.config.mjs @@ -94,5 +94,31 @@ export default [ } }) ] + }, + + // ========================================================================= + // EXPERIMENTAL NEXT VERSION + // ========================================================================= + { + input: "src/next/browser_entry.ts", + watch: { + include: 'src/**' + }, + output: { + file : "dist/build/fhir-client.next.mjs", + format : "es", + sourcemap: false, + // banner : "/** @typedef {import('../lib/types').fhirclient.FetchOptions} FetchOptions */" + }, + plugins: [ + resolve(), + typescript({ + compilerOptions: { + module : "esnext", + listEmittedFiles: false, + sourceMap : false + } + }) + ] } ] diff --git a/src/next/BrowserAdapter.ts b/src/next/BrowserAdapter.ts new file mode 100644 index 00000000..07fec466 --- /dev/null +++ b/src/next/BrowserAdapter.ts @@ -0,0 +1,108 @@ +import { fhirclient } from "." +import { ready, authorize, init } from "./smart" +import Client from "./Client" +import BrowserStorage from "./BrowserStorage" +import * as browserLib from "./browser" + +/** + * Browser Adapter + */ +export default class BrowserAdapter implements fhirclient.Adapter +{ + /** + * Stores the URL instance associated with this adapter + */ + private _url: URL | null = null; + + /** + * Holds the Storage instance associated with this instance + */ + private _storage: fhirclient.Storage | null = null; + + /** + * Environment-specific options + */ + options: fhirclient.BrowserFHIRSettings; + + security = { + randomBytes : browserLib.randomBytes, + digestSha256 : browserLib.digestSha256, + generatePKCEChallenge: browserLib.generatePKCEChallenge, + importJWK : browserLib.importJWK, + signCompactJws : browserLib.signCompactJws + }; + + /** + * @param options Environment-specific options + */ + constructor(options: fhirclient.BrowserFHIRSettings = {}) + { + this.options = { ...options }; + } + + /** + * Given a relative path, returns an absolute url using the instance base URL + */ + relative(path: string): string { + return new URL(path, this.getUrl().href).href; + } + + /** + * Given the current environment, this method must return the current url + * as URL instance + */ + getUrl(): URL { + if (!this._url) { + this._url = new URL(location + ""); + } + return this._url; + } + + /** + * Given the current environment, this method must redirect to the given + * path + */ + redirect(to: string): void { + location.href = to; + } + + /** + * Returns a BrowserStorage object which is just a wrapper around + * sessionStorage + */ + getStorage(): BrowserStorage { + if (!this._storage) { + this._storage = new BrowserStorage(); + } + return this._storage; + } + + base64urlencode(input: string | Uint8Array) { + return browserLib.base64urlencode(input); + } + + base64urldecode(input: string) { + return browserLib.base64urldecode(input); + } + + /** + * Creates and returns adapter-aware SMART api. Not that while the shape of + * the returned object is well known, the arguments to this function are not. + * Those who override this method are free to require any environment-specific + * arguments. For example in node we will need a request, a response and + * optionally a storage or storage factory function. + */ + getSmartApi(): fhirclient.SMART_API + { + return { + ready : (...args: any[]) => ready(this, ...args), + authorize: options => authorize(this, options), + init : options => init(this, options), + client : (state: string | fhirclient.ClientState) => new Client(state, this.getStorage()), + options : this.options, + utils: { + security: this.security + } + }; + } +} diff --git a/src/next/BrowserStorage.ts b/src/next/BrowserStorage.ts new file mode 100644 index 00000000..9d18fee9 --- /dev/null +++ b/src/next/BrowserStorage.ts @@ -0,0 +1,25 @@ +import { fhirclient } from "."; + +export default class Storage implements fhirclient.Storage +{ + async get(key: string): Promise { + const value = sessionStorage[key as keyof typeof sessionStorage]; + if (value) { + return JSON.parse(value); + } + return null; + } + + async set(key: string, value: any): Promise { + sessionStorage[key as keyof typeof sessionStorage] = JSON.stringify(value); + return value; + } + + async unset(key: string): Promise { + if (key in sessionStorage) { + delete sessionStorage[key as keyof typeof sessionStorage]; + return true; + } + return false; + } +} diff --git a/src/next/Client.ts b/src/next/Client.ts new file mode 100644 index 00000000..b5c2bbee --- /dev/null +++ b/src/next/Client.ts @@ -0,0 +1,968 @@ +import str from "./strings"; +import { fhirclient } from "."; +import { fhirVersions } from "./settings"; +import HttpError from "../HttpError"; +import { patientCompartment } from "../settings"; +import { + absolute, + assert, + assertJsonPatch, + base64encode, + fetchConformanceStatement, + getPath, + getPatientParam, + makeArray, + request, + setPath, + debug, + getAccessTokenExpiration, + jwtDecode +} from "./isomorphic"; + + +/** + * Adds patient context to requestOptions object to be used with [[Client.request]] + * @param requestOptions Can be a string URL (relative to the serviceUrl), or an + * object which will be passed to fetch() + * @param client Current FHIR client object containing patient context + * @return requestOptions object contextualized to current patient + */ +async function contextualize( + requestOptions: string | URL | fhirclient.RequestOptions, + client: Client +): Promise +{ + const base = absolute("/", client.state.serverUrl); + + async function contextualURL(_url: URL) { + const resourceType = _url.pathname.split("/").pop(); + assert(resourceType, `Invalid url "${_url}"`); + assert(patientCompartment.indexOf(resourceType) > -1, `Cannot filter "${resourceType}" resources by patient`); + const conformance = await fetchConformanceStatement(client.state.serverUrl); + const searchParam = getPatientParam(conformance, resourceType); + _url.searchParams.set(searchParam, client.patient.id as string); + return _url.href; + } + + if (typeof requestOptions == "string" || requestOptions instanceof URL) { + return { url: await contextualURL(new URL(requestOptions + "", base)) }; + } + + requestOptions.url = await contextualURL(new URL(requestOptions.url + "", base)); + return requestOptions; +} + +/** + * Gets single reference by id. Caches the result. + * @param refId + * @param cache A map to store the resolved refs + * @param client The client instance + * @param requestOptions Only signal and headers are currently used if provided + * @returns The resolved reference + * @private + */ +async function getRef( + refId: string, + cache: Record, + client: Client, + requestOptions: RequestInit +): Promise { + if (!cache[refId]) { + + const { signal, headers } = requestOptions; + + // Note that we set cache[refId] immediately! When the promise is + // settled it will be updated. This is to avoid a ref being fetched + // twice because some of these requests are executed in parallel. + cache[refId] = client.request({ + url: refId, + headers, + signal + }).then(res => { + cache[refId] = res; + return res; + }, (error: Error) => { + delete cache[refId]; + throw error; + }); + } + + return cache[refId]; +} + +/** + * Resolves a reference in the given resource. + * @param obj FHIR Resource + */ +function resolveRef( + obj: fhirclient.FHIR.Resource, + path: string, + graph: boolean, + cache: fhirclient.JsonObject, + client: Client, + requestOptions: fhirclient.RequestOptions +) { + const node = getPath(obj, path); + if (node) { + const isArray = Array.isArray(node); + return Promise.all(makeArray(node).filter(Boolean).map((item, i) => { + const ref = item.reference; + if (ref) { + return getRef(ref, cache, client, requestOptions).then(sub => { + if (graph) { + if (isArray) { + if (path.indexOf("..") > -1) { + setPath(obj, `${path.replace("..", `.${i}.`)}`, sub); + } else { + setPath(obj, `${path}.${i}`, sub); + } + } else { + setPath(obj, path, sub); + } + } + }).catch((ex) => { + /* ignore missing references */ + if (ex.status !== 404) { + throw ex; + } + }); + } + })); + } +} + +/** + * Given a resource and a list of ref paths - resolves them all + * @param obj FHIR Resource + * @param fhirOptions The fhir options of the initiating request call + * @param cache A map to store fetched refs + * @param client The client instance + * @private + */ +function resolveRefs( + obj: fhirclient.FHIR.Resource, + fhirOptions: fhirclient.FhirOptions, + cache: fhirclient.JsonObject, + client: Client, + requestOptions: fhirclient.RequestOptions +) { + + // 1. Sanitize paths, remove any invalid ones + let paths = makeArray(fhirOptions.resolveReferences) + .filter(Boolean) // No false, 0, null, undefined or "" + .map(path => String(path).trim()) + .filter(Boolean); // No space-only strings + + // 2. Remove duplicates + paths = paths.filter((p, i) => { + const index = paths.indexOf(p, i + 1); + if (index > -1) { + debug("client: Duplicated reference path \"%s\"", p); + return false; + } + return true; + }); + + // 3. Early exit if no valid paths are found + if (!paths.length) { + return Promise.resolve(); + } + + // 4. Group the paths by depth so that child refs are looked up + // after their parents! + const groups: Record = {}; + paths.forEach(path => { + const len = path.split(".").length; + if (!groups[len]) { + groups[len] = []; + } + groups[len].push(path); + }); + + // 5. Execute groups sequentially! Paths within same group are + // fetched in parallel! + let task: Promise = Promise.resolve(); + Object.keys(groups).sort().forEach(len => { + const group = groups[len]; + task = task.then(() => Promise.all(group.map((path: string) => { + return resolveRef(obj, path, !!fhirOptions.graph, cache, client, requestOptions); + }))); + }); + return task; +} + +/** + * This is a FHIR client that is returned to you from the `ready()` call of the + * **SMART API**. You can also create it yourself if needed: + * + * ```js + * // BROWSER + * const client = FHIR.client("https://r4.smarthealthit.org"); + * + * // SERVER + * const client = smart(req, res).client("https://r4.smarthealthit.org"); + * ``` + */ +export default class Client implements fhirclient.ClientInterface +{ + /** + * The state of the client instance is an object with various properties. + * It contains some details about how the client has been authorized and + * determines the behavior of the client instance. This state is persisted + * in `SessionStorage` in browsers or in request session on the servers. + */ + readonly state: fhirclient.ClientState; + + /** + * The Storage to use + */ + readonly storage: fhirclient.Storage; + + /** + * A SMART app is typically associated with a patient. This is a namespace + * for the patient-related functionality of the client. + */ + readonly patient: { + + /** + * The ID of the current patient or `null` if there is no current patient + */ + id: string | null + + /** + * A method to fetch the current patient resource from the FHIR server. + * If there is no patient context, it will reject with an error. + * @param {fhirclient.FetchOptions} [requestOptions] Any options to pass to the `fetch` call. + * @category Request + */ + read: fhirclient.RequestFunction + + /** + * This is similar to [[request]] but it makes requests in the + * context of the current patient. For example, instead of doing + * ```js + * client.request("Observation?patient=" + client.patient.id) + * ``` + * you can do + * ```js + * client.patient.request("Observation") + * ``` + * The return type depends on the arguments. Typically it will be the + * response payload JSON object. Can also be a string or the `Response` + * object itself if we have received a non-json result, which allows us + * to handle even binary responses. Can also be a [[CombinedFetchResult]] + * object if the `requestOptions.includeResponse`s has been set to true. + * @category Request + */ + request: ( + requestOptions: string|URL|fhirclient.RequestOptions, + fhirOptions?: fhirclient.FhirOptions + ) => Promise + }; + + /** + * The client may be associated with a specific encounter, if the scopes + * permit that and if the back-end server supports that. This is a namespace + * for encounter-related functionality. + */ + readonly encounter: { + + /** + * The ID of the current encounter or `null` if there is no current + * encounter + */ + id: string | null + + /** + * A method to fetch the current encounter resource from the FHIR server. + * If there is no encounter context, it will reject with an error. + * @param [requestOptions] Any options to pass to the `fetch` call. + * @category Request + */ + read: fhirclient.RequestFunction + }; + + /** + * The client may be associated with a specific user, if the scopes + * permit that. This is a namespace for user-related functionality. + */ + readonly user: { + + /** + * The ID of the current user or `null` if there is no current user + */ + id: string | null + + /** + * A method to fetch the current user resource from the FHIR server. + * If there is no user context, it will reject with an error. + * @param [requestOptions] Any options to pass to the `fetch` call. + * @category Request + */ + read: fhirclient.RequestFunction + + /** + * Returns the profile of the logged_in user (if any), or null if the + * user is not available. This is a string having the shape + * `{user type}/{user id}`. For example `Practitioner/abc` or + * `Patient/xyz`. + * @alias client.getFhirUser() + */ + fhirUser: string | null + + /** + * Returns the type of the logged-in user or null. The result can be + * `Practitioner`, `Patient` or `RelatedPerson`. + * @alias client.getUserType() + */ + resourceType: string | null + }; + + /** + * Refers to the refresh task while it is being performed. + * @see [[refresh]] + */ + private _refreshTask: Promise | null; + + /** + * Validates the parameters and creates an instance. + */ + constructor(state: fhirclient.ClientState | string, storage: fhirclient.Storage) + { + const _state = typeof state == "string" ? { serverUrl: state } : state; + + // Valid serverUrl is required! + assert( + _state.serverUrl && _state.serverUrl.match(/https?:\/\/.+/), + "A \"serverUrl\" option is required and must begin with \"http(s)\"" + ); + + this.storage = storage + + this.state = _state; + this._refreshTask = null; + + const client = this; + + // patient api --------------------------------------------------------- + this.patient = { + get id() { return client.getPatientId(); }, + read: (requestOptions) => { + const id = this.patient.id; + return id ? + this.request({ ...requestOptions, url: `Patient/${id}` }) : + Promise.reject(new Error("Patient is not available")); + }, + request: (requestOptions, fhirOptions = {}) => { + if (this.patient.id) { + return (async () => { + const options = await contextualize(requestOptions, this); + return this.request(options, fhirOptions); + })(); + } else { + return Promise.reject(new Error("Patient is not available")); + } + } + }; + + // encounter api ------------------------------------------------------- + this.encounter = { + get id() { return client.getEncounterId(); }, + read: requestOptions => { + const id = this.encounter.id; + return id ? + this.request({ ...requestOptions, url: `Encounter/${id}` }) : + Promise.reject(new Error("Encounter is not available")); + } + }; + + // user api ------------------------------------------------------------ + this.user = { + get fhirUser() { return client.getFhirUser(); }, + get id() { return client.getUserId(); }, + get resourceType() { return client.getUserType(); }, + read: requestOptions => { + const fhirUser = this.user.fhirUser; + return fhirUser ? + this.request({ ...requestOptions, url: fhirUser }) : + Promise.reject(new Error("User is not available")); + } + }; + } + + getPatientId() { + const tokenResponse = this.state.tokenResponse; + if (tokenResponse) { + // We have been authorized against this server but we don't know + // the patient. This should be a scope issue. + if (!tokenResponse.patient) { + if (!(this.state.scope || "").match(/\blaunch(\/patient)?\b/)) { + debug("client: " + str.noScopeForId, "patient", "patient"); + } + else { + // The server should have returned the patient! + debug("client: The ID of the selected patient is not available. Please check if your server supports that."); + } + return null; + } + return tokenResponse.patient; + } + + if (this.state.authorizeUri) { + debug("client: " + str.noIfNoAuth, "the ID of the selected patient"); + } + else { + debug("client: " + str.noFreeContext, "selected patient"); + } + return null; + } + + getEncounterId() { + const tokenResponse = this.state.tokenResponse; + if (tokenResponse) { + // We have been authorized against this server but we don't know + // the encounter. This should be a scope issue. + if (!tokenResponse.encounter) { + if (!(this.state.scope || "").match(/\blaunch(\/encounter)?\b/)) { + debug("client: " + str.noScopeForId, "encounter", "encounter"); + } + else { + // The server should have returned the encounter! + debug("client: The ID of the selected encounter is not available. Please check if your server supports that, and that the selected patient has any recorded encounters."); + } + return null; + } + return tokenResponse.encounter; + } + + if (this.state.authorizeUri) { + debug("client: " + str.noIfNoAuth, "the ID of the selected encounter"); + } + else { + debug("client: " + str.noFreeContext, "selected encounter"); + } + return null; + } + + getIdToken() { + const tokenResponse = this.state.tokenResponse; + if (tokenResponse) { + const idToken = tokenResponse.id_token; + const scope = this.state.scope || ""; + + // We have been authorized against this server but we don't have + // the id_token. This should be a scope issue. + if (!idToken) { + const hasOpenid = scope.match(/\bopenid\b/); + const hasProfile = scope.match(/\bprofile\b/); + const hasFhirUser = scope.match(/\bfhirUser\b/); + if (!hasOpenid || !(hasFhirUser || hasProfile)) { + debug( + "client: You are trying to get the id_token but you are not " + + "using the right scopes. Please add 'openid' and " + + "'fhirUser' or 'profile' to the scopes you are " + + "requesting." + ); + } + else { + // The server should have returned the id_token! + debug("client: The id_token is not available. Please check if your server supports that."); + } + return null; + } + return jwtDecode(idToken) as fhirclient.IDToken; + } + if (this.state.authorizeUri) { + debug("client: " + str.noIfNoAuth, "the id_token"); + } + else { + debug("client: " + str.noFreeContext, "id_token"); + } + return null; + } + + getFhirUser() { + const idToken = this.getIdToken(); + if (idToken) { + // Epic may return a full url + // @see https://github.com/smart-on-fhir/client-js/issues/105 + if (idToken.fhirUser) { + return idToken.fhirUser.split("/").slice(-2).join("/"); + } + return idToken.profile + } + return null; + } + + getUserId() { + const profile = this.getFhirUser(); + if (profile) { + return profile.split("/")[1]; + } + return null; + } + + getUserType() { + const profile = this.getFhirUser(); + if (profile) { + return profile.split("/")[0]; + } + return null; + } + + getAuthorizationHeader() { + const accessToken = this.getState("tokenResponse.access_token"); + if (accessToken) { + return "Bearer " + accessToken; + } + const { username, password } = this.state; + if (username && password) { + return "Basic " + base64encode(username + ":" + password); + } + return null; + } + + /** + * Used internally to clear the state of the instance and the state in the + * associated storage. + */ + private async _clearState() { + const key = await this.storage.get("SMART_KEY"); + if (key) { + await this.storage.unset(key); + } + await this.storage.unset("SMART_KEY"); + this.state.tokenResponse = {}; + } + + create( + resource: fhirclient.FHIR.Resource, + requestOptions?: O + ): Promise : R> + { + return this.request({ + ...requestOptions, + url: `${resource.resourceType}`, + method: "POST", + body: JSON.stringify(resource), + headers: { + // TODO: Do we need to alternate with "application/json+fhir"? + "content-type": "application/json", + ...(requestOptions || {}).headers + } + }); + } + + update( + resource: fhirclient.FHIR.Resource, + requestOptions?: O + ): Promise : R> + { + return this.request({ + ...requestOptions, + url: `${resource.resourceType}/${resource.id}`, + method: "PUT", + body: JSON.stringify(resource), + headers: { + // TODO: Do we need to alternate with "application/json+fhir"? + "content-type": "application/json", + ...(requestOptions || {}).headers + } + }); + } + + delete(url: string, requestOptions: fhirclient.FetchOptions = {}): Promise + { + return this.request({ + ...requestOptions, + url, + method: "DELETE" + }); + } + + patch(url: string, patch: fhirclient.JsonPatch, requestOptions: fhirclient.FetchOptions = {}): Promise + { + assertJsonPatch(patch); + return this.request({ + ...requestOptions, + url, + method: "PATCH", + body: JSON.stringify(patch), + headers: { + "prefer": "return=presentation", + "content-type": "application/json-patch+json; charset=UTF-8", + ...requestOptions.headers, + } + }); + } + + async request( + requestOptions: string|URL|fhirclient.RequestOptions, + fhirOptions: fhirclient.FhirOptions = {}, + _resolvedRefs: fhirclient.JsonObject = {} + ): Promise + { + assert(requestOptions, "request requires an url or request options as argument"); + + // url ----------------------------------------------------------------- + let url: string; + if (typeof requestOptions == "string" || requestOptions instanceof URL) { + url = String(requestOptions); + requestOptions = {} as fhirclient.RequestOptions; + } + else { + url = String(requestOptions.url); + } + + url = absolute(url, this.state.serverUrl); + + const options = { + graph: fhirOptions.graph !== false, + flat : !!fhirOptions.flat, + pageLimit: fhirOptions.pageLimit ?? 1, + resolveReferences: (fhirOptions.resolveReferences || []) as string[], + useRefreshToken: fhirOptions.useRefreshToken !== false, + onPage: typeof fhirOptions.onPage == "function" ? + fhirOptions.onPage as ( + data: fhirclient.JsonObject | fhirclient.JsonObject[], + references?: fhirclient.JsonObject | undefined) => any : + undefined + }; + + const signal = (requestOptions as RequestInit).signal || undefined; + + // Refresh the access token if needed + const job = options.useRefreshToken ? + this.refreshIfNeeded({ signal }).then(() => requestOptions as fhirclient.RequestOptions) : + Promise.resolve(requestOptions as fhirclient.RequestOptions); + + let response: Response | undefined; + + return job + + // Add the Authorization header now, after the access token might + // have been updated + .then(requestOptions => { + const authHeader = this.getAuthorizationHeader(); + if (authHeader) { + requestOptions.headers = { + ...requestOptions.headers, + authorization: authHeader + }; + } + return requestOptions; + }) + + // Make the request + .then(requestOptions => { + debug( + "client:request: %s, options: %O, fhirOptions: %O", + url, + requestOptions, + options + ); + return request(url, requestOptions).then(result => { + if (requestOptions.includeResponse) { + response = (result as fhirclient.CombinedFetchResult).response; + return (result as fhirclient.CombinedFetchResult).body; + } + return result; + }); + }) + + // Handle 401 ------------------------------------------------------ + .catch(async (error: HttpError) => { + if (error.status == 401) { + + // !accessToken -> not authorized -> No session. Need to launch. + if (!this.getState("tokenResponse.access_token")) { + error.message += "\nThis app cannot be accessed directly. Please launch it as SMART app!"; + throw error; + } + + // auto-refresh not enabled and Session expired. + // Need to re-launch. Clear state to start over! + if (!options.useRefreshToken) { + debug("client:request: Your session has expired and the useRefreshToken option is set to false. Please re-launch the app."); + await this._clearState(); + error.message += "\n" + str.expired; + throw error; + } + + // In rare cases we may have a valid access token and a refresh + // token and the request might still fail with 401 just because + // the access token has just been revoked. + + // otherwise -> auto-refresh failed. Session expired. + // Need to re-launch. Clear state to start over! + debug("client:request: Auto-refresh failed! Please re-launch the app."); + await this._clearState(); + error.message += "\n" + str.expired; + throw error; + } + throw error; + }) + + // Handle 403 ------------------------------------------------------ + .catch((error: HttpError) => { + if (error.status == 403) { + debug("client:request: Permission denied! Please make sure that you have requested the proper scopes."); + } + throw error; + }) + + .then((data: any) => { + + // At this point we don't know what `data` actually is! + + // We might get an empty or falsy result. If so return it as is + // Also handle raw responses + if (!data || typeof data == "string" || data instanceof Response) { + if ((requestOptions as fhirclient.FetchOptions).includeResponse) { + return { + body: data, + response + } + } + return data; + } + + // Resolve References ------------------------------------------ + return (async (_data: fhirclient.FHIR.Resource) => { + + if (_data.resourceType == "Bundle") { + await Promise.all(((_data as fhirclient.FHIR.Bundle).entry || []).map(item => resolveRefs( + item.resource, + options, + _resolvedRefs, + this, + requestOptions as fhirclient.RequestOptions + ))); + } + else { + await resolveRefs( + _data, + options, + _resolvedRefs, + this, + requestOptions as fhirclient.RequestOptions + ); + } + + return _data; + })(data) + + // Pagination ---------------------------------------------- + .then(async _data => { + if (_data && _data.resourceType == "Bundle") { + const links = (_data.link || []) as fhirclient.FHIR.BundleLink[]; + + if (options.flat) { + _data = (_data.entry || []).map( + (entry: fhirclient.FHIR.BundleEntry) => entry.resource + ); + } + + if (options.onPage) { + await options.onPage(_data, { ..._resolvedRefs }); + } + + if (--options.pageLimit) { + const next = links.find(l => l.relation == "next"); + _data = makeArray(_data); + if (next && next.url) { + const nextPage = await this.request( + { + url: next.url, + + // Aborting the main request (even after it is complete) + // must propagate to any child requests and abort them! + // To do so, just pass the same AbortSignal if one is + // provided. + signal + }, + options, + _resolvedRefs + ); + + if (options.onPage) { + return null; + } + + if (options.resolveReferences.length) { + Object.assign(_resolvedRefs, nextPage.references); + return _data.concat(makeArray(nextPage.data || nextPage)); + } + return _data.concat(makeArray(nextPage)); + } + } + } + return _data; + }) + + // Finalize ------------------------------------------------ + .then(_data => { + if (options.graph) { + _resolvedRefs = {}; + } + else if (!options.onPage && options.resolveReferences.length) { + return { + data: _data, + references: _resolvedRefs + }; + } + return _data; + }) + .then(_data => { + if ((requestOptions as fhirclient.FetchOptions).includeResponse) { + return { + body: _data, + response + } + } + return _data; + }); + }); + } + + refreshIfNeeded(requestOptions: RequestInit = {}) + { + const accessToken = this.getState("tokenResponse.access_token"); + const refreshToken = this.getState("tokenResponse.refresh_token"); + const expiresAt = this.state.expiresAt || 0; + + if (accessToken && refreshToken && expiresAt - 10 < Date.now() / 1000) { + return this.refresh(requestOptions); + } + + return Promise.resolve(this.state); + } + + refresh(requestOptions: RequestInit = {}) + { + debug("client:refresh: Attempting to refresh with refresh_token..."); + + const refreshToken = this.state?.tokenResponse?.refresh_token; + assert(refreshToken, "Unable to refresh. No refresh_token found."); + + const tokenUri = this.state.tokenUri; + assert(tokenUri, "Unable to refresh. No tokenUri found."); + + const scopes = this.getState("tokenResponse.scope") || ""; + const hasOfflineAccess = scopes.search(/\boffline_access\b/) > -1; + const hasOnlineAccess = scopes.search(/\bonline_access\b/) > -1; + assert(hasOfflineAccess || hasOnlineAccess, "Unable to refresh. No offline_access or online_access scope found."); + + // This method is typically called internally from `request` if certain + // request fails with 401. However, clients will often run multiple + // requests in parallel which may result in multiple refresh calls. + // To avoid that, we keep a reference to the current refresh task (if any). + if (!this._refreshTask) { + + const refreshRequestOptions = { + credentials: this.state.refreshTokenWithCredentials || "same-origin", + ...requestOptions, + method : "POST", + mode : "cors" as RequestMode, + headers: { + ...(requestOptions.headers || {}), + "content-type": "application/x-www-form-urlencoded" + }, + body: `grant_type=refresh_token&refresh_token=${encodeURIComponent(refreshToken)}` + }; + + // custom authorization header can be passed on manual calls + if (!("authorization" in refreshRequestOptions.headers)) { + const { clientSecret, clientId } = this.state; + if (clientSecret) { + // @ts-ignore + refreshRequestOptions.headers.authorization = "Basic " + base64encode( + clientId + ":" + clientSecret + ); + } + } + + this._refreshTask = request(tokenUri, refreshRequestOptions) + .then(data => { + assert(data.access_token, "No access token received"); + debug("client:refresh: Received new access token response %O", data); + this.state.tokenResponse = { ...this.state.tokenResponse, ...data }; + this.state.expiresAt = getAccessTokenExpiration(data); + return this.state; + }) + .catch((error: Error) => { + if (this.state?.tokenResponse?.refresh_token) { + debug("client:refresh: Deleting the expired or invalid refresh token."); + delete this.state.tokenResponse.refresh_token; + } + throw error; + }) + .finally(() => { + this._refreshTask = null; + const key = this.state.key; + if (key) { + return this.storage.set(key, this.state); + } else { + debug("client:refresh: No 'key' found in Clint.state. Cannot persist the instance."); + } + }); + } + + return this._refreshTask; + } + + // utils ------------------------------------------------------------------- + + /** + * Walks through an object (or array) and returns the value found at the + * provided path. This function is very simple so it intentionally does not + * support any argument polymorphism, meaning that the path can only be a + * dot-separated string. If the path is invalid returns undefined. + * @param obj The object (or Array) to walk through + * @param path The path (eg. "a.b.4.c") + * @returns {*} Whatever is found in the path or undefined + * @todo This should be deprecated and moved elsewhere. One should not have + * to obtain an instance of [[Client]] just to use utility functions like this. + * @deprecated + * @category Utility + */ + getPath(obj: Record, path = ""): any { + return getPath(obj, path); + } + + /** + * Returns a copy of the client state. Accepts a dot-separated path argument + * (same as for `getPath`) to allow for selecting specific properties. + * Examples: + * ```js + * client.getState(); // -> the entire state object + * client.getState("serverUrl"); // -> the URL we are connected to + * client.getState("tokenResponse.patient"); // -> The selected patient ID (if any) + * ``` + * @param path The path (eg. "a.b.4.c") + * @returns {*} Whatever is found in the path or undefined + */ + getState(path = "") { + return getPath({ ...this.state }, path); + } + + /** + * Returns a promise that will be resolved with the fhir version as defined + * in the CapabilityStatement. + */ + getFhirVersion(): Promise { + return fetchConformanceStatement(this.state.serverUrl) + .then((metadata) => metadata.fhirVersion); + } + + /** + * Returns a promise that will be resolved with the numeric fhir version + * - 2 for DSTU2 + * - 3 for STU3 + * - 4 for R4 + * - 0 if the version is not known + */ + getFhirRelease(): Promise { + return this.getFhirVersion().then(v => (fhirVersions as any)[v] ?? 0); + } +} diff --git a/src/next/NodeAdapter.ts b/src/next/NodeAdapter.ts new file mode 100644 index 00000000..ff3f6e34 --- /dev/null +++ b/src/next/NodeAdapter.ts @@ -0,0 +1,113 @@ +import { TLSSocket } from "tls" +import { IncomingMessage, ServerResponse } from "http" +import { fhirclient } from "." +import ServerStorage from "./ServerStorage" +import { + base64urldecode, + base64urlencode, + digestSha256, + generatePKCEChallenge, + importJWK, + randomBytes, + signCompactJws +} from "./server" +import { authorize, init, ready } from "./smart" +import Client from "./Client" + + +interface NodeAdapterOptions { + request : IncomingMessage; + response: ServerResponse; + storage?: fhirclient.Storage | fhirclient.storageFactory; +} + +/** + * Node Adapter - works with native NodeJS and with Express + */ +export default class NodeAdapter implements fhirclient.Adapter +{ + /** + * Holds the Storage instance associated with this instance + */ + protected _storage: fhirclient.Storage | null = null; + + options: NodeAdapterOptions; + + security = { + randomBytes, + digestSha256, + generatePKCEChallenge, + importJWK, + signCompactJws + }; + + /** + * @param options Environment-specific options + */ + constructor(options: NodeAdapterOptions) { + this.options = { ...options }; + } + + relative(path: string) { + return new URL(path, this.getUrl().href).href; + } + + getProtocol() { + const req = this.options.request; + const proto = (req.socket as TLSSocket).encrypted ? "https" : "http"; + return req.headers["x-forwarded-proto"] as string || proto; + } + + getUrl() { + const req = this.options.request; + let host = req.headers.host; + if (req.headers["x-forwarded-host"]) { + host = req.headers["x-forwarded-host"] as string; + if (req.headers["x-forwarded-port"] && host.indexOf(":") === -1) { + host += ":" + req.headers["x-forwarded-port"]; + } + } + const protocol = this.getProtocol(); + const orig = String(req.headers["x-original-uri"] || req.url); + return new URL(orig, protocol + "://" + host); + } + + redirect(location: string) { + this.options.response.writeHead(302, { location }); + this.options.response.end(); + } + + getStorage() { + if (!this._storage) { + if (this.options.storage) { + if (typeof this.options.storage == "function") { + this._storage = this.options.storage(this.options); + } else { + this._storage = this.options.storage; + } + } else { + this._storage = new ServerStorage(this.options.request as fhirclient.RequestWithSession); + } + } + return this._storage; + } + + base64urlencode(input: string | Uint8Array) { + return base64urlencode(input); + } + + base64urldecode(input: string) { + return base64urldecode(input); + } + + getSmartApi(): fhirclient.SMART_API + { + return { + ready : (...args: any[]) => ready(this, ...args), + authorize: options => authorize(this, options), + init : options => init(this, options), + client : (state: string | fhirclient.ClientState) => new Client(state, this.getStorage()), + options : this.options + }; + } +} diff --git a/src/next/ServerStorage.ts b/src/next/ServerStorage.ts new file mode 100644 index 00000000..8c6cfa9b --- /dev/null +++ b/src/next/ServerStorage.ts @@ -0,0 +1,28 @@ +import { fhirclient } from "." + + +export default class ServerStorage implements fhirclient.Storage +{ + request: fhirclient.RequestWithSession; + + constructor(request: fhirclient.RequestWithSession) { + this.request = request; + } + + async get(key: string): Promise { + return this.request.session[key]; + } + + async set(key: string, value: any): Promise { + this.request.session[key] = value; + return value; + } + + async unset(key: string): Promise { + if (Object.prototype.hasOwnProperty.call(this.request.session, key)) { + delete this.request.session[key]; + return true; + } + return false; + } +} diff --git a/src/next/browser.ts b/src/next/browser.ts new file mode 100644 index 00000000..1380eb2a --- /dev/null +++ b/src/next/browser.ts @@ -0,0 +1,298 @@ +import { fhirclient } from "../types" +import { debug } from "./isomorphic" + + +const subtle = () => { + if (!crypto?.subtle) { + if (!globalThis.isSecureContext) { + throw new Error( + "Some of the required subtle crypto functionality is not available " + + "unless you run this app in secure context (using HTTPS or running locally). " + + "See https://developer.mozilla.org/en-US/docs/Web/Security/Secure_Contexts" + ) + } + throw new Error( + "Some of the required subtle crypto functionality is not " + + "available in the current environment (no crypto.subtle)" + ) + } + return crypto.subtle +} + +export interface PkcePair { + codeChallenge: string + codeVerifier: string +} + +const ALGS = { + ES384: { + name: "ECDSA", + namedCurve: "P-384" + } as EcKeyGenParams, + RS384: { + name: "RSASSA-PKCS1-v1_5", + modulusLength: 4096, + publicExponent: new Uint8Array([1, 0, 1]), + hash: { + name: 'SHA-384' + } + } as RsaHashedKeyGenParams +}; + +export function randomBytes(count: number): Uint8Array { + return crypto.getRandomValues(new Uint8Array(count)); +} + +export async function digestSha256(payload: string): Promise { + const prepared = new TextEncoder().encode(payload); + const hash = await subtle().digest('SHA-256', prepared); + return new Uint8Array(hash); +} + +export const generatePKCEChallenge = async (entropy = 96): Promise => { + const inputBytes = randomBytes(entropy) + const codeVerifier = base64urlencode(inputBytes) + const codeChallenge = base64urlencode(await digestSha256(codeVerifier)) + return { codeChallenge, codeVerifier } +} + +export async function importJWK(jwk: fhirclient.JWK): Promise { + // alg is optional in JWK but we need it here! + if (!jwk.alg) { + throw new Error('The "alg" property of the JWK must be set to "ES384" or "RS384"') + } + + // Use of the "key_ops" member is OPTIONAL, unless the application requires its presence. + // https://www.rfc-editor.org/rfc/rfc7517.html#section-4.3 + // + // In our case the app will only import private keys so we can assume "sign" + if (!Array.isArray(jwk.key_ops)) { + jwk.key_ops = ["sign"] + } + + // In this case the JWK has a "key_ops" array and "sign" is not listed + if (!jwk.key_ops.includes("sign")) { + throw new Error('The "key_ops" property of the JWK does not contain "sign"') + } + + try { + return await subtle().importKey( + "jwk", + jwk, + ALGS[jwk.alg], + jwk.ext === true, + jwk.key_ops// || ['sign'] + ) + } catch (e) { + throw new Error(`The ${jwk.alg} is not supported by this browser: ${e}`) + } +} + +export async function signCompactJws(alg: keyof typeof ALGS, privateKey: CryptoKey, header: any, payload: any): Promise { + const jwtHeader = JSON.stringify({ ...header, alg }); + const jwtPayload = JSON.stringify(payload); + const jwtAuthenticatedContent = `${base64urlencode(jwtHeader)}.${base64urlencode(jwtPayload)}`; + + const signature = await subtle().sign( + { ...privateKey.algorithm, hash: 'SHA-384' }, + privateKey, + new TextEncoder().encode(jwtAuthenticatedContent) + ); + + return `${jwtAuthenticatedContent}.${base64urlencode(new Uint8Array(signature))}` +} + +export function base64urlencode(input: string | Uint8Array) { + // Step 1: Convert Uint8Array to binary string if needed + if (input instanceof Uint8Array) { + input = uint8ArrayToBinaryString(input) + } + + // Step 2: Encode the binary string to Base64 + let base64 = btoa(input); + + // Step 3: Replace Base64 characters with Base64URL characters and remove padding + let base64Url = base64.replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, ""); + + return base64Url; +} + +export function base64urldecode(input: string) { + // Step 1: Replace Base64URL characters with standard Base64 characters + let base64 = input.replace(/-/g, "+").replace(/_/g, "/"); + + // Step 2: Add padding if necessary + const pad = base64.length % 4; + if (pad) { + base64 += "=".repeat(4 - pad); + } + + // Step 3: Decode the Base64 string + try { + return atob(base64); + } catch (e) { + throw new Error("Invalid Base64URL string"); + } +} + +export function uint8ArrayToBinaryString(input: Uint8Array) { + let bin = "" + for (let i = 0; i < input.length; i++) { + bin += String.fromCharCode(input[i]) + } + return bin +} + +/** + * Resolves a reference to target window. It may also open new window or tab if + * the `target = "popup"` or `target = "_blank"`. + * @param target + * @param width Only used when `target = "popup"` + * @param height Only used when `target = "popup"` + */ +export async function getTargetWindow(target: fhirclient.WindowTarget, width: number = 800, height: number = 720): Promise +{ + // The target can be a function that returns the target. This can be + // used to open a layer pop-up with an iframe and then return a reference + // to that iframe (or its name) + if (typeof target == "function") { + target = await target(); + } + + // The target can be a window reference + if (target && typeof target == "object") { + return target; + } + + // At this point target must be a string + if (typeof target != "string") { + debug("Invalid target type '%s'. Failing back to '_self'.", typeof target); + return self; + } + + // Current window + if (target == "_self") { + return self; + } + + // The parent frame + if (target == "_parent") { + return parent; + } + + // The top window + if (target == "_top") { + return top || self; + } + + // New tab or window + if (target == "_blank") { + let error, targetWindow: Window | null = null; + try { + targetWindow = window.open("", "SMARTAuthPopup"); + if (!targetWindow) { + throw new Error("Perhaps window.open was blocked"); + } + } catch (e) { + error = e; + } + + if (!targetWindow) { + debug("Cannot open window. Failing back to '_self'. %s", error); + return self; + } else { + return targetWindow; + } + } + + // Popup window + if (target == "popup") { + let error, targetWindow: Window | null = null; + // if (!targetWindow || targetWindow.closed) { + try { + targetWindow = window.open("", "SMARTAuthPopup", [ + "height=" + height, + "width=" + width, + "menubar=0", + "resizable=1", + "status=0", + "top=" + (screen.height - height) / 2, + "left=" + (screen.width - width) / 2 + ].join(",")); + if (!targetWindow) { + throw new Error("Perhaps the popup window was blocked"); + } + } catch (e) { + error = e; + } + + if (!targetWindow) { + debug("Cannot open window. Failing back to '_self'. %s", error); + return self; + } else { + return targetWindow; + } + } + + // Frame or window by name + const winOrFrame: Window = frames[target as any]; + if (winOrFrame) { + return winOrFrame; + } + + debug("Unknown target '%s'. Failing back to '_self'.", target); + return self; +} + +/** + * Checks if called within a frame. Only works in browsers! + * If the current window has a `parent` or `top` properties that refer to + * another window, returns true. If trying to access `top` or `parent` throws an + * error, returns true. Otherwise returns `false`. + */ +export function isInFrame() { + try { + return self !== top && parent !== self; + } catch (e) { + return true; + } +} + +/** + * Checks if called within another window (popup or tab). Only works in browsers! + * To consider itself called in a new window, this function verifies that: + * 1. `self === top` (not in frame) + * 2. `!!opener && opener !== self` The window has an opener + * 3. `!!window.name` The window has a `name` set + */ +export function isInPopUp() { + try { + return self === top && + !!opener && + opener !== self && + !!window.name; + } catch (e) { + return false; + } +} + +export function relative(path: string): string { + return new URL(path, window.location.href).href; +} + +export function redirect(to: string): void { + window.location.href = to; +} + +/** + * Another window can send a "completeAuth" message to this one, making it to + * navigate to e.data.url + * @param e The message event + */ +export function onMessage(e: MessageEvent) { + if (e.data.type == "completeAuth" && e.origin === new URL(self.location.href).origin) { + window.removeEventListener("message", onMessage); + window.location.href = e.data.url; + } +} + diff --git a/src/next/browser_entry.ts b/src/next/browser_entry.ts new file mode 100644 index 00000000..bfb24dde --- /dev/null +++ b/src/next/browser_entry.ts @@ -0,0 +1,26 @@ +import BrowserAdapter from "./BrowserAdapter"; + +const { ready, authorize, init, client, options, utils } = new BrowserAdapter().getSmartApi(); + +// export default { +// client, +// utils, +// oauth2: { +// settings: options, +// ready, +// authorize, +// init +// } +// }; + +function smart(settings: Record = {}) { + return smart; +} + +smart.authorize = authorize +smart.ready = ready +smart.init = init +smart.client = client +smart.utils = utils + +export default smart \ No newline at end of file diff --git a/src/next/index.d.ts b/src/next/index.d.ts new file mode 100644 index 00000000..ce2d63b6 --- /dev/null +++ b/src/next/index.d.ts @@ -0,0 +1,1340 @@ +/// + +import { IncomingMessage } from "http"; + +export declare module fhirclient { + + // JSON objects + interface JsonObject { [key: string]: JsonValue; } + type JsonPrimitive = string | number | boolean | null + type JsonValue = JsonPrimitive|JsonArray|JsonObject + type JsonArray = JsonValue[] + + // JSON Patch - https://datatracker.ietf.org/doc/html/rfc6902 + interface JsonPatchAdd { op: "add" ; path: string; value: JsonValue; } + interface JsonPatchReplace { op: "replace"; path: string; value: JsonValue; } + interface JsonPatchTest { op: "test" ; path: string; value: JsonValue; } + interface JsonPatchMove { op: "move" ; path: string; from: string; } + interface JsonPatchCopy { op: "copy" ; path: string; from: string; } + interface JsonPatchRemove { op: "remove" ; path: string; } + type JsonPatchOperation = JsonPatchAdd|JsonPatchRemove|JsonPatchReplace|JsonPatchMove|JsonPatchCopy|JsonPatchTest; + type JsonPatch = JsonPatchOperation[] + + interface ES384JWK extends JsonWebKey { + alg: "ES384" + kty: "EC" + crv: "P-384" + kid: string + key_ops?: KeyUsage[] + [propName: string]: unknown + } + + interface RS384JWK extends JsonWebKey { + alg: "RS384" + kty: "RSA" + kid: string + key_ops?: KeyUsage[] + [propName: string]: unknown + } + + type JWK = ES384JWK | RS384JWK; + + type WindowTargetVariable = "_self"|"_top"|"_parent"|"_blank"|"popup"|string|number|Window; + + function WindowTargetFunction(): WindowTargetVariable; + + function WindowTargetFunction(): Promise; + + type WindowTarget = WindowTargetVariable | typeof WindowTargetFunction; + + type PkceMode = 'ifSupported' | 'required' | 'disabled' | 'unsafeV1'; + + type storageFactory = (options?: Record) => Storage; + + + interface ReadyOptions { + privateKey?: JWK | { + key: CryptoKey + alg: "RS384" | "ES384" + kid: string + }; + clientPublicKeySetUrl?: string; // for jku + // [key: string]: any; // Other options TBD + } + + /** + * Additional options that can be passed to `client.request` to control its + * behavior + */ + interface FhirOptions { + + /** + * When you request a Bundle, the result will typically come back in pages + * and you will only get the first page. You can use `pageLimit` greater + * than `1` to request multiple pages. For example `pageLimit: 3` will fetch + * the first 3 pages as array. To fetch all the available pages you can set + * this to `0`. + * - Defaults to `1`. + * - Ignored if the response is not a `Bundle`. + */ + pageLimit?: number; + + /** + * When you fetch multiple pages the resulting array may be very large, + * requiring a lot of time and memory. It is often better if you specify a + * page callback instead. The `onPage` callback will be called once for each + * page with the page Bundle as it's argument. If you use `resolveReferences` + * and `graph: false`, the references will be passed to `onPage` as second + * argument. + * - If `onPage` returns a promise it will be awaited for, meaning that no + * more pages will be fetched until the `onPage` promise is resolved. + * - If `onPage` returns a rejected promise or throws an error, the client + * will not continue fetching more pages. + * - If you use `onPage` callback, the promise returned by `request()` will + * be resolved with `null`. This is to avoid building that huge array in + * memory. By using the `onPage` option you are stating that you will + * handle the result one page at a time, instead of expecting to receive + * the big combined result. + * @param data Depending in the other options can be `Bundle`, `Bundle[]`, + * `Resource[]` + * @param references Map of resolved references. Only available if the `graph` + * option is set to `false` + */ + onPage?: (data: JsonObject | JsonObject[], references?: JsonObject) => any; + + /** + * When fetching a `Bundle`, you are typically only interested in the + * included resources which are located at `{response}.entry[N].resource`. + * If this option is set to `true`, the returned result will be an array of + * resources instead of the whole bundle. This is especially useful when + * multiple pages are fetched, because an array of page bundles is not that + * useful and will often have to be converted to array of resources that is + * easier to iterate. + * - This option is ignored if the response is not a bundle. + * - If you use `onPage` callback with `flat: true`, it will receive that + * array of resources instead of the page bundle. + * - Resources from multiple pages are flattened into single array (unless + * you use `onPage`, which will be called with one array for each page). + * - Defaults to `false`. + * - Finally, `Bundle.entry` is optional in FHIR and that leads to bugs in + * apps that assume that it is always present. With `flat: true`, you will + * always get an array, even if it is empty, and even if no `entry` is + * found in the response bundle. + */ + flat?: boolean; + + /** + * Only applicable if you use `resolveReferences`. If `false`, the resolved + * references will not be "mounted" in the result tree, but will be returned + * as separate map object instead. **Defaults to `true`**. + */ + graph?: boolean; + + /** + * One or more references to resolve. Single item can be specified as a + * string or as an array of one string. Multiple items must be specified as + * array. + * - Each item is a dot-separated path to the desired reference within the + * result object, excluding the "reference" property. For example + * `context.serviceProvider` will look for `{Response}.context.serviceProvider.reference`. + * - If the target is an array of references (E.g. + * [Patient.generalPractitioner](http://hl7.org/fhir/R4/patient-definitions.html#Patient.generalPractitioner)), you can request one or more of them by index (E.g. `generalPractitioner.0`). + * If the index is not specified, all the references in the array will be + * resolved. + * - The order in which the reference paths are specified does not matter. + * For example, if you use `["subject", "encounter.serviceProvider", "encounter"]`, + * the library should figure out that `encounter.serviceProvider` must be + * fetched after `encounter`. In fact, in this case it will first fetch + * subject and encounter in parallel, and then proceed to encounter.serviceProvider. + * - This option does not work with contained references (they are "already + * resolved" anyway). + */ + resolveReferences?: string|string[]; + + /** + * If the client is authorized, it will possess an access token and pass it + * with the requests it makes. When that token expires, you should get back + * a `401 Unauthorized` response. When that happens, if the client also has + * a refresh token and if `useRefreshToken` is `true` (default), the client + * will attempt to automatically re-authorize itself and then it will re-run + * the failed request and eventually resolve it's promise with the final + * result. This means that your requests should never fail with `401`, + * unless the refresh token is also expired. If you don't want this, you can + * set `useRefreshToken` to `false`. There is a `refresh` method on the + * client that can be called manually to renew the access token. + * - **Defaults to `true`**. + */ + useRefreshToken?: boolean; + } + + /** + * Authorization parameters that can be passed to `authorize` or `init` + */ + interface AuthorizeParams { + + /** + * This is the URL of the service you are connecting to. + * For [EHR Launch](http://hl7.org/fhir/smart-app-launch/#ehr-launch-sequence) + * you **MUST NOT** provide this option. It will be passed by the EHR as + * url parameter instead. Using `iss` as an option will "lock" your app to + * that service provider. In other words, passing an `iss` option is how + * you can do [Standalone Launch](http://hl7.org/fhir/smart-app-launch/#standalone-launch-sequence). + */ + iss?: string; + + /** + * Can be used to verify that the app is being launched against certain + * servers. This is especially useful when working with multiple EHR + * configurations. Can be a string (in which case it will be expected to + * match the provided ISS exactly), a regular expression to test against + * the current ISS, or a function that will be called with the current + * ISS and should return true or false to signify if that ISS is acceptable. + */ + issMatch?: string | RegExp | ((iss: string) => boolean); + + /** + * Do not pass use this option, unless you want to test it. It should come + * as url parameter from the SMART authorization server as part of the EHR + * launch sequence + */ + launch?: string; + + /** + * The base URL of the FHIR server to use. This is just like the `iss` + * option, except that it is designed to bypass the authentication. If + * `fhirServiceUrl` is passed, the `authorize` function will NOT actually + * attempt to authorize. It will skip that and redirect you to your + * `redirectUri`. + */ + fhirServiceUrl?: string; + + /** + * Defaults to the current directory (it's index file) + */ + redirectUri?: string; + + /** + * + */ + noRedirect?: boolean; + + /** + * The clientId that you have obtained while registering your app in the + * EHR. This is not required if you only intend to communicate with open + * FHIR servers. + */ + clientId?: string; + + /** + * One or more space-separated scopes that you would like to request from + * the EHR. [Learn more](http://hl7.org/fhir/smart-app-launch/scopes-and-launch-context/index.html) + */ + scope?: string; + + /** + * The ID of the selected patient. If you are launching against an open FHIR + * server, there is no way to obtain the launch context that would include + * the selected patient ID. This way you can "inject" that ID and make the + * client behave as if that is the currently active patient. + */ + patientId?: string; + + /** + * The ID of the selected encounter. If you are launching against an open + * FHIR server, there is no way to obtain the launch context that would + * (in some EHRs) include the selected encounter ID. This way you can + * "inject" that ID and make the client behave as if this is the currently + * active encounter. + */ + encounterId?: string; + + /** + * If you have registered a confidential client, you should pass your + * `clientSecret` here. **Note: ONLY use this on the server**, as the + * browsers are considered incapable of keeping a secret. + */ + clientSecret?: string; + + /** + * If you have registered a confidential client and you host your public + * key online, you can pass your JWKS URL here **Note: ONLY use this on the server**, as the + * browsers are considered incapable of keeping a secret. + */ + clientPublicKeySetUrl?: string; + + /** + * If you have registered a confidential client, you should pass your + * `clientPrivateJwk` here. **Note: ONLY use this on the server**, as + * the browsers are considered incapable of keeping a secret. + */ + clientPrivateJwk?: JWK; + + /** + * Useful for testing. This object can contain any properties that are + * typically contained in an [access token response](http://hl7.org/fhir/smart-app-launch/#step-3-app-exchanges-authorization-code-for-access-token). + * These properties will be stored into the client state, as if it has been + * authorized. + */ + fakeTokenResponse?: object; + + /** + * Where to start the auth flow. This option is only applicable in + * browsers and is ignored on the server. Can be one of: + * - `_self` Authorize in the same window (**default**) + * - `_top` Authorize in the topmost window + * - `_parent` Authorize in the parent window + * - `_blank` Authorize in new tab or window + * - `"popup"` Open a popup, authorize in it and close it when done + * - `String` Frame name (string index in window.frames) + * - `Number` Numeric index in `window.frames` + * - `Object` Window reference (must have the same `origin`) + * - `Function` A function that returns one of the above values or a + * promise that will resolve to such value. + */ + target?: WindowTarget; + + /** + * The width of the authorization popup window. Only used in browsers + * and if the [[AuthorizeParams.target]] option is set to "popup". + */ + width?: number; + + /** + * The height of the authorization popup window. Only used in browsers + * and if the [[AuthorizeParams.target]] option is set to "popup". + */ + height?: number; + + /** + * If `true`, the app will be initialized in the specified [[AuthorizeParams.target]]. + * Otherwise, the app will be initialized in the window in which + * [[authorize]] was called. + */ + completeInTarget?: boolean; + + /** + * Client expectations for PKCE (Proof Key for Code Exchange). Can be + * one of: + * - `ifSupported` Use if a matching code challenge method is available (**default**) + * - `required` Do not attempt authorization to servers without support + * - `disabled` Do not use PKCE + * - `unsafeV1` Use against Smart v1 servers. Smart v1 does not define + * conformance, so validate your server supports PKCE before using + * this setting + */ + pkceMode?: PkceMode; + + /** + * Do we want to send cookies while making a request to the token + * endpoint in order to obtain new access token using existing refresh + * token. In rare cases the auth server might require the client to send + * cookies along with those requests. Can be one of: + * - "include" - always send cookies + * - "same-origin" - only send cookies if we are on the same domain (default) + * - "omit" - do not send cookies + */ + refreshTokenWithCredentials?: RequestCredentials + } + + interface SMART_API { + + options: BrowserFHIRSettings; + + /** + * This should be called on your `redirectUri`. Returns a Promise that + * will eventually be resolved with a Client instance that you can use + * to query the fhir server. + */ + ready(options?: ReadyOptions): Promise; + + /** + * Starts the [SMART Launch Sequence](http://hl7.org/fhir/smart-app-launch/#smart-launch-sequence). + * + * > **IMPORTANT:** `authorize()` will end up redirecting you to the + * authorization server. This means that you should **not** add + * anything to the returned promise chain. Any code written directly + * after the `authorize()` call might not be executed due to that + * redirect! + * + * The options that you would typically pass for an EHR launch are just + * `clientId` and `scope`. For standalone launch you should also provide + * the `iss` option. + */ + authorize(options: AuthorizeParams): Promise; + + /** + * This function can be used when you want to handle everything in one + * page (no launch endpoint needed). + * + * 1. It will only work if your `launch_uri` is the same as your `redirectUri`. + * While this should be valid, we can't promise that every EHR will allow you + * to register client with such settings. + * 2. Internally, init() will be called twice. First it will redirect to the EHR, + * then the EHR will redirect back to the page where `init()` will be called + * again to complete the authorization. This is generally fine, because the + * returned promise will only be resolved once, after the second execution, + * but please also consider the following: + * - You should wrap all your app's code in a function that is only executed + * after init() resolves! + * - Since the page will be loaded twice, you must be careful if your code has + * global side effects that can persist between page reloads (for example + * writing to localStorage). + */ + init(options: AuthorizeParams): Promise; + + /** + * Creates and returns a Client instance that can be used to query the + * FHIR server. + */ + client(state: string | ClientState): ClientInterface; + + [key: string]: any + } + + /** + * Describes the state that should be passed to the Client constructor. + * Everything except `serverUrl` is optional + */ + interface ClientState { + /** + * The base URL of the Fhir server. The library should have detected it + * at authorization time from request query params of from config options. + */ + serverUrl: string; + + /** + * The clientId that you should have obtained while registering your + * app with the auth server or EHR (as set in the configuration options) + */ + clientId?: string; + + /** + * The URI to redirect to after successful authorization, as set in the + * configuration options. + */ + redirectUri?: string; + + /** + * The access scopes that you requested in your options (or an empty string). + * @see http://docs.smarthealthit.org/authorization/scopes-and-launch-context/ + */ + scope?: string; + + /** + * Your client public JWKS url if you have one + * (for asymmetric confidential clients that have registered a JWKS URL) + */ + clientPublicKeySetUrl?: AuthorizeParams['clientPublicKeySetUrl']; + + /** + * Your client private JWK if you have one (for asymmetric confidential clients) + */ + clientPrivateJwk?: JWK; + + /** + * Your client secret if you have one (for symmetric confidential clients) + */ + clientSecret?: string; + + /** + * The (encrypted) access token, in case you have completed the auth flow + * already. + */ + // access_token?: string; + + /** + * The response object received from the token endpoint while trying to + * exchange the auth code for an access token (if you have reached that point). + */ + tokenResponse?: TokenResponse; + + /** + * The username for basic auth. If present, `password` must also be provided. + */ + username?: string; + + /** + * The password for basic auth. If present, `username` must also be provided. + */ + password?: string; + + /** + * You could register new SMART client at this endpoint (if the server + * supports dynamic client registration) + */ + registrationUri?: string; + + /** + * You must call this endpoint to ask for authorization code + */ + authorizeUri?: string; + + /** + * You must call this endpoint to exchange your authorization code + * for an access token. + */ + tokenUri?: string; + + /** + * The key under which this state is persisted in the storage + */ + key?: string; + + /** + * If `true`, the app requested to be initialized in the specified [[AuthorizeParams.target]]. + * Otherwise, the app requested to be initialized in the window in which + * [[authorize]] was called. + */ + completeInTarget?: boolean; + + /** + * An Unix timestamp (JSON numeric value representing the number of + * seconds since 1970). This updated every time an access token is + * received from the server. + */ + expiresAt?: number; + + /** + * PKCE code challenge base value. + */ + codeChallenge?: string; + + /** + * PKCE code verification, formatted with base64url-encode (RFC 4648 § 5) + * without padding, which is NOT the same as regular base64 encoding. + */ + codeVerifier?: string; + + /** + * Do we want to send cookies while making a request to the token + * endpoint in order to obtain new access token using existing refresh + * token. In rare cases the auth server might require the client to send + * cookies along with those requests. Can be one of: + * - "include" - always send cookies + * - "same-origin" - only send cookies if we are on the same domain (default) + * - "omit" - do not send cookies + */ + refreshTokenWithCredentials?: RequestCredentials + } + + /** + * The response object received from the token endpoint while trying to + * exchange the auth code for an access token. This object has a well-known + * base structure but the auth servers are free to augment it with + * additional properties. + * @see http://docs.smarthealthit.org/authorization/ + */ + interface TokenResponse { + + /** + * If present, this tells the app that it is being rendered within an + * EHR frame and the UI outside that frame already displays the selected + * patient's name, age, gender etc. The app can decide to hide those + * details to prevent the UI from duplicated information. + */ + need_patient_banner?: boolean; + + /** + * This could be a public location of some style settings that the EHR + * would like to suggest. The app might look it up and optionally decide + * to apply some or all of it. + * @see https://launch.smarthealthit.org/smart-style.json + */ + smart_style_url?: string; + + /** + * If you have requested that require it (like `launch` or `launch/patient`) + * the selected patient ID will be available here. + */ + patient?: string; + + /** + * If you have requested that require it (like `launch` or `launch/encounter`) + * the selected encounter ID will be available here. + * **NOTE:** This is not widely supported as of 2018. + */ + encounter?: string; + + /** + * If you have requested `openid` and `profile` scopes the profile of + * the active user will be available as `client_id`. + * **NOTE:** Regardless of it's name, this property does not store an ID + * but a token that also suggests the user type like `Patient/123`, + * `Practitioner/xyz` etc. + */ + client_id?: string; + + /** + * Fixed value: bearer + */ + token_type?: "bearer" | "Bearer"; + + /** + * Scope of access authorized. Note that this can be different from the + * scopes requested by the app. + */ + scope?: string; + + /** + * Lifetime in seconds of the access token, after which the token SHALL NOT + * be accepted by the resource server + */ + expires_in ?: number; + + /** + * The access token issued by the authorization server + */ + access_token?: string; + + /** + * Authenticated patient identity and profile, if requested + */ + id_token ?: string; + + /** + * Token that can be used to obtain a new access token, using the same or a + * subset of the original authorization grants + */ + refresh_token ?: string; + + /** + * Other properties might be passed by the server + */ + [key: string]: any; + } + + /** + * Simple key/value storage interface + */ + interface Storage { + + /** + * Sets the `value` on `key` and returns a promise that will be resolved + * with the value that was set. + */ + set: (key: string, value: any) => Promise; + + /** + * Gets the value at `key`. Returns a promise that will be resolved + * with that value (or undefined for missing keys). + */ + get: (key: string) => Promise; + + /** + * Deletes the value at `key`. Returns a promise that will be resolved + * with true if the key was deleted or with false if it was not (eg. if + * did not exist). + */ + unset: (key: string) => Promise; + } + + interface ClientInterface { + + /** + * The state of the client instance is an object with various properties. + * It contains some details about how the client has been authorized and + * determines the behavior of the client instance. This state is persisted + * in `SessionStorage` in browsers or in request session on the servers. + */ + readonly state: ClientState; + + /** + * The Storage to use + */ + readonly storage: Storage; + + /** + * A SMART app is typically associated with a patient. This is a namespace + * for the patient-related functionality of the client. + */ + readonly patient: { + + /** + * The ID of the current patient or `null` if there is no current patient + */ + id: string | null + + /** + * A method to fetch the current patient resource from the FHIR server. + * If there is no patient context, it will reject with an error. + * @param {FetchOptions} [requestOptions] Any options to pass to the `fetch` call. + * @category Request + */ + read: RequestFunction + + /** + * This is similar to [[request]] but it makes requests in the + * context of the current patient. For example, instead of doing + * ```js + * client.request("Observation?patient=" + client.patient.id) + * ``` + * you can do + * ```js + * client.patient.request("Observation") + * ``` + * The return type depends on the arguments. Typically it will be the + * response payload JSON object. Can also be a string or the `Response` + * object itself if we have received a non-json result, which allows us + * to handle even binary responses. Can also be a [[CombinedFetchResult]] + * object if the `requestOptions.includeResponse`s has been set to true. + * @category Request + */ + request: ( + requestOptions: string | URL | RequestOptions, + fhirOptions ?: fhirclient.FhirOptions + ) => Promise + }; + + /** + * The client may be associated with a specific encounter, if the scopes + * permit that and if the back-end server supports that. This is a namespace + * for encounter-related functionality. + */ + readonly encounter: { + + /** + * The ID of the current encounter or `null` if there is no current + * encounter + */ + id: string | null + + /** + * A method to fetch the current encounter resource from the FHIR server. + * If there is no encounter context, it will reject with an error. + * @param [requestOptions] Any options to pass to the `fetch` call. + * @category Request + */ + read: RequestFunction + }; + + /** + * The client may be associated with a specific user, if the scopes + * permit that. This is a namespace for user-related functionality. + */ + readonly user: { + + /** + * The ID of the current user or `null` if there is no current user + */ + id: string | null + + /** + * A method to fetch the current user resource from the FHIR server. + * If there is no user context, it will reject with an error. + * @param [requestOptions] Any options to pass to the `fetch` call. + * @category Request + */ + read: RequestFunction + + /** + * Returns the profile of the logged_in user (if any), or null if the + * user is not available. This is a string having the shape + * `{user type}/{user id}`. For example `Practitioner/abc` or + * `Patient/xyz`. + * @alias client.getFhirUser() + */ + fhirUser: string | null + + /** + * Returns the type of the logged-in user or null. The result can be + * `Practitioner`, `Patient` or `RelatedPerson`. + * @alias client.getUserType() + */ + resourceType: string | null + }; + + /** + * Validates the parameters and creates an instance. + */ + // constructor: (state: ClientState | string, storage: Storage) => Client + + /** + * Returns the ID of the selected patient or null. You should have requested + * "launch/patient" scope. Otherwise this will return null. + */ + getPatientId(): string | null; + + /** + * Returns the ID of the selected encounter or null. You should have + * requested "launch/encounter" scope. Otherwise this will return null. + * Note that not all servers support the "launch/encounter" scope so this + * will be null if they don't. + */ + getEncounterId(): string | null; + + /** + * Returns the (decoded) id_token if any. You need to request "openid" and + * "profile" scopes if you need to receive an id_token (if you need to know + * who the logged-in user is). + */ + getIdToken(): IDToken | null; + + /** + * Returns the profile of the logged_in user (if any). This is a string + * having the following shape `"{user type}/{user id}"`. For example: + * `"Practitioner/abc"` or `"Patient/xyz"`. + */ + getFhirUser(): string | null; + + /** + * Returns the user ID or null. + */ + getUserId(): string | null; + + /** + * Returns the type of the logged-in user or null. The result can be + * `Practitioner`, `Patient` or `RelatedPerson`. + */ + getUserType(): string | null; + + /** + * Builds and returns the value of the `Authorization` header that can be + * sent to the FHIR server + */ + getAuthorizationHeader(): string | null; + + /** + * Creates a new resource in a server-assigned location + * @see http://hl7.org/fhir/http.html#create + * @param resource A FHIR resource to be created + * @param [requestOptions] Any options to be passed to the fetch call. + * Note that `method` and `body` will be ignored. + * @category Request + */ + create( + resource: FHIR.Resource, + requestOptions?: O + ): Promise : R>; + + /** + * Creates a new current version for an existing resource or creates an + * initial version if no resource already exists for the given id. + * @see http://hl7.org/fhir/http.html#update + * @param resource A FHIR resource to be updated + * @param requestOptions Any options to be passed to the fetch call. + * Note that `method` and `body` will be ignored. + * @category Request + */ + update( + resource: FHIR.Resource, + requestOptions?: O + ): Promise : R>; + + /** + * Removes an existing resource. + * @see http://hl7.org/fhir/http.html#delete + * @param url Relative URI of the FHIR resource to be deleted + * (format: `resourceType/id`) + * @param requestOptions Any options (except `method` which will be fixed + * to `DELETE`) to be passed to the fetch call. + * @category Request + */ + delete(url: string, requestOptions?: FetchOptions): Promise; + + /** + * Makes a JSON Patch to the given resource + * @see http://hl7.org/fhir/http.html#patch + * @param url Relative URI of the FHIR resource to be patched + * (format: `resourceType/id`) + * @param patch A JSON Patch array to send to the server, For details + * see https://datatracker.ietf.org/doc/html/rfc6902 + * @param requestOptions Any options to be passed to the fetch call, + * except for `method`, `url` and `body` which cannot be overridden. + * @since 2.4.0 + * @category Request + * @typeParam ResolveType This method would typically resolve with the + * patched resource or reject with an OperationOutcome. However, this may + * depend on the server implementation or even on the request headers. + * For that reason, if the default resolve type (which is + * [[fhirclient.FHIR.Resource]]) does not work for you, you can pass + * in your own resolve type parameter. + */ + patch( + url: string, + patch: JsonPatch, + requestOptions?: FetchOptions + ): Promise + + /** + * @param requestOptions Can be a string URL (relative to the serviceUrl), + * or an object which will be passed to fetch() + * @param fhirOptions Additional options to control the behavior + * @param _resolvedRefs DO NOT USE! Used internally. + * @category Request + */ + request( + requestOptions: string | URL | RequestOptions, + fhirOptions?: FhirOptions, + _resolvedRefs?: JsonObject + ): Promise + + /** + * Checks if access token and refresh token are present. If they are, and if + * the access token is expired or is about to expire in the next 10 seconds, + * calls `this.refresh()` to obtain new access token. + * @param requestOptions Any options to pass to the fetch call. Most of them + * will be overridden, bit it might still be useful for passing additional + * request options or an abort signal. + * @category Request + */ + refreshIfNeeded(requestOptions?: RequestInit): Promise; + + /** + * Use the refresh token to obtain new access token. If the refresh token is + * expired (or this fails for any other reason) it will be deleted from the + * state, so that we don't enter into loops trying to re-authorize. + * + * This method is typically called internally from [[request]] if + * certain request fails with 401. + * + * @param requestOptions Any options to pass to the fetch call. Most of them + * will be overridden, bit it might still be useful for passing additional + * request options or an abort signal. + * @category Request + */ + refresh(requestOptions?: RequestInit): Promise + + getPath: any + getState: any + getFhirVersion: any + getFhirRelease: any + // _clearState: any + // _refreshTask: any + } + + /** + * Options passed to the lib.request function + */ + interface FetchOptions extends RequestInit { + /** + * If `true` the request function will be instructed to resolve with a + * [[CombinedFetchResult]] object that contains the `Response` object + * abd the parsed body (if any) + */ + includeResponse?: boolean; + } + + /** + * A function or method that makes requests to the backend server. If the + * `includeResponse` option is `true` resolves with `CombinedFetchResult` + * where the `response` property is the `Response` object and the `body` + * property is the result of type `R` (if any). Otherwise resolves with the + * result as `R`. + * @param R The expected return type + * @param O May contain the `includeResponse` flag to signal that we also + * want to receive the raw response object. Any other option will be passed + * to the underlying `fetch` call. + */ + type RequestFunction = (requestOptions?: O) => + Promise : R>; + + interface IncludeResponseHint { + includeResponse?: boolean + [k: string]: any + } + + /** + * If an `includeResponse` is set to true when calling the lib.request + * function the returned object will include the Response object and the + * parsed body if available + */ + interface CombinedFetchResult { + body?: T + response: Response + } + + /** + * The return type of the lib.request function + */ + type FetchResult = Response | JsonObject | string | CombinedFetchResult + + /** + * Options that must contain an `url` property (String|URL). + * A `includeResponse` boolean option might also be passed. Any other + * properties will be passed to the underlying `fetch()` call. + */ + interface RequestOptions extends RequestInit { + /** + * The URL to request + */ + url: string | URL; + + /** + * If set to true the request function will resolve with an object + * like `{ body: any, response: Response }` so that users have + * access to the response object and it's properties like headers + * status etc. + */ + includeResponse?: boolean; + } + + interface IDToken { + profile: string; + aud: string; + sub: string; + iss: string; + iat: number; + exp: number; + [key: string]: any; + } + + namespace FHIR { + + /** + * Any combination of upper or lower case ASCII letters ('A'..'Z', and + * 'a'..'z', numerals ('0'..'9'), '-' and '.', with a length limit of 64 + * characters. (This might be an integer, an un-prefixed OID, UUID or any + * other identifier pattern that meets these constraints.) + * Regex: `[A-Za-z0-9\-\.]{1,64}` + */ + type id = string; + + /** + * A Uniform Resource Identifier Reference (RFC 3986 ). Note: URIs are case + * sensitive. For UUID (urn:uuid:53fefa32-fcbb-4ff8-8a92-55ee120877b7) use + * all lowercase. URIs can be absolute or relative, and may have an optional + * fragment identifier. + */ + type uri = string; + + /** + * Indicates that the value is taken from a set of controlled strings + * defined elsewhere. Technically, a code is restricted to a string which + * has at least one character and no leading or trailing whitespace, and + * where there is no whitespace other than single spaces in the contents + * Regex: [^\s]+([\s]?[^\s]+)* + */ + type code = string; + + /** + * An instant in time - known at least to the second and always includes a + * time zone. Note: This is intended for precisely observed times (typically + * system logs etc.), and not human-reported times - for them, use date and + * dateTime. instant is a more constrained dateTime. + * + * Patterns: + * - `YYYY-MM-DDTHH:mm:ss.SSSSZ` + * - `YYYY-MM-DDTHH:mm:ss.SSSZ` + * - `YYYY-MM-DDTHH:mm:ssZ` + */ + type instant = string; // "2018-04-30T13:31:44.140-04:00" + + /** + * A date, date-time or partial date (e.g. just year or year + month) as + * used in human communication. If hours and minutes are specified, a time + * zone SHALL be populated. Seconds must be provided due to schema type + * constraints but may be zero-filled and may be ignored. Dates SHALL be + * valid dates. The time "24:00" is not allowed. + * + * Patterns: + * - `YYYY-MM-DDTHH:mm:ss.SSSSZ` + * - `YYYY-MM-DDTHH:mm:ss.SSSZ` + * - `YYYY-MM-DDTHH:mm:ssZ` + * - `YYYY-MM-DD` + * - `YYYY-MM` + * - `YYYY` + * + * Regex: + * -?[0-9]{4}(-(0[1-9]|1[0-2])(-(0[0-9]|[1-2][0-9]|3[0-1])(T([01] + * [0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](\.[0-9]+)?(Z|(\+|-)((0[0-9]|1[0-3]): + * [0-5][0-9]|14:00)))?)?)? + */ + type dateTime = string; + + /** + * Any non-negative integer (e.g. >= 0) + * Regex: [0]|([1-9][0-9]*) + */ + type unsignedInt = number; + + type valueX = "valueInteger" | "valueUnsignedInt" | "valuePositiveInt" | + "valueDecimal"|"valueDateTime"|"valueDate"|"valueTime"|"valueInstant"| + "valueString"|"valueUri"|"valueOid"|"valueUuid"|"valueId"| + "valueBoolean"|"valueCode"|"valueMarkdown"|"valueBase64Binary"| + "valueCoding"|"valueCodeableConcept"|"valueAttachment"| + "valueIdentifier"|"valueQuantity"|"valueSampledData"|"valueRange"| + "valuePeriod"|"valueRatio"|"valueHumanName"|"valueAddress"| + "valueContactPoint"|"valueTiming"|"valueReference"|"valueAnnotation"| + "valueSignature"|"valueMeta"; + + interface Element { + id?: id; + extension?: Array>; + } + + interface Extension extends Element { + /** + * identifies the meaning of the extension + */ + url: uri; + + [T: string]: any; + } + + interface CapabilityStatement { + resourceType: string; + fhirVersion: string; + rest: Array<{ + security?: { + cors?: boolean; + extension?: Array<{ + url: string; + extension: Array> + }> + }; + resource: Array<{ + type: string + }> + }>; + } + + interface Resource extends Record { + /** + * Logical id of this artifact + */ + id ?: id; + + resourceType?: string; + + /** + * Metadata about the resource + */ + meta ?: Meta; + + /** + * A set of rules under which this content was created + */ + implicitRules ?: uri; + + /** + * Language of the resource content + */ + language ?: code; + } + + interface Meta extends Element { + + /** + * When the resource version last changed + */ + lastUpdated: instant; + } + + interface Observation extends Resource { + resourceType: "Observation"; + } + + interface Patient extends Resource { + resourceType: "Patient"; + } + + interface Practitioner extends Resource { + resourceType: "Practitioner"; + } + + interface RelatedPerson extends Resource { + resourceType: "RelatedPerson"; + } + + interface Encounter extends Resource { + resourceType: "Encounter"; + } + + interface Period extends Element { + /** + * Starting time with inclusive boundary + */ + start ?: dateTime; + + /** + * End time with inclusive boundary, if not ongoing + */ + end ?: dateTime; + } + + interface BackboneElement extends Element { + modifierExtension ?: Extension[]; + } + + interface CodeableConcept extends Element { + /** + * Code defined by a terminology system + */ + coding?: Coding[]; + + /** + * Plain text representation of the concept + */ + text?: string; + } + + interface Coding extends Element { + /** + * Identity of the terminology system + */ + system ?: uri; + + /** + * Version of the system - if relevant + */ + version ?: string; + + /** + * Symbol in syntax defined by the system + */ + code ?: code; + + /** + * Representation defined by the system + */ + display ?: string; + + /** + * If this coding was chosen directly by the user + */ + userSelected ?: boolean; + } + + interface Identifier extends Element { + use ?: "usual" | "official" | "temp" | "secondary"; + /** + * Description of identifier + */ + type ?: CodeableConcept; + + /** + * The namespace for the identifier value + */ + system ?: uri; + + /** + * The value that is unique + */ + value ?: string; + + /** + * Time period when id is/was valid for use + */ + period ?: Period; + + /** + * Organization that issued id (may be just text) + */ + assigner ?: Reference; + } + + interface Reference extends Element { + + /** + * Literal reference, Relative, internal or absolute URL + */ + reference ?: string; + + /** + * Logical reference, when literal reference is not known + */ + identifier ?: Identifier; + + /** + * Text alternative for the resource + */ + display ?: string; + } + + interface BundleLink extends BackboneElement { + relation: string; + url: uri; + } + + interface BundleEntry extends BackboneElement { + fullUrl: string; // This is optional on POSTs + resource: Resource; + } + + interface Bundle extends Resource { + /** + * Persistent identifier for the bundle + */ + identifier ?: Identifier; + + type: "document" | "message" | "transaction" | "transaction-response" + | "batch" | "batch-response" | "history" | "searchset" | "collection"; + + total ?: unsignedInt; + + link: BundleLink[]; + entry?: BundleEntry[]; + } + } + + interface RequestWithSession extends IncomingMessage { + session: fhirclient.JsonObject; + } + + interface Adapter { + + /** + * Environment-specific options + */ + options: BrowserFHIRSettings; + + /** + * Given the current environment, this method returns the current url + * as URL instance + */ + getUrl(): URL; + + /** + * Given the current environment, this method must redirect to the given + * path + * @param path The relative path to redirect to + */ + redirect(to: string): void | Promise; + + /** + * This must return a Storage object + * @returns {fhirclient.Storage} + */ + getStorage(): Storage; + + /** + * Given a relative path, compute and return the full url, assuming that + * it is relative to the current location + * @param {String} path The path to convert to absolute + */ + relative(path: string): string; + + /** + * ASCII string or Uint8Array to Base64URL + */ + base64urlencode: (input: string | Uint8Array) => string + + /** + * Base64Url to ASCII string + */ + base64urldecode: (input: string) => string + + /** + * Creates and returns adapter-aware SMART api. Not that while the shape of + * the returned object is well known, the arguments to this function are not. + * Those who override this method are free to require any environment-specific + * arguments. For example in node we will need a request, a response and + * optionally a storage or storage factory function. + */ + getSmartApi(): SMART_API; + + security: { + randomBytes: (count: number) => Uint8Array + digestSha256: (payload: string) => Promise + generatePKCEChallenge: (entropy?: number) => Promise<{ codeChallenge: string; codeVerifier: string }> + importJWK: (jwk: JWK) => Promise + signCompactJws: (alg: "ES384" | "RS384", privateKey: CryptoKey, header: any, payload: any) => Promise + } + } + + interface BrowserFHIRSettings extends Record { + // storage?: Storage | ((options?: JsonObject) => Storage); + } +} + +// export as namespace fhirclient diff --git a/src/next/isomorphic.ts b/src/next/isomorphic.ts new file mode 100644 index 00000000..ebf8dae8 --- /dev/null +++ b/src/next/isomorphic.ts @@ -0,0 +1,594 @@ +import HttpError from "../HttpError" +import { patientParams } from "../settings" +import { fhirclient } from "../types" + +export const debug = typeof window === "undefined" ? + (process.env.NODE_DEBUG || "").match(/\bdebugFhirClient\b/) ? + (...args: any[]) => console.debug("FHIR:", ...args) : + () => {}: + localStorage?.debugFhirClient ? + (...args: any[]) => console.debug("FHIR:", ...args) : + () => {}; + +/** + * The cache for the `getAndCache` function + */ +const cache: Record = {}; + +/** + * A namespace with functions for converting between different measurement units + */ +export const units = { + cm({ code, value }: fhirclient.CodeValue) { + ensureNumerical({ code, value }); + if (code == "cm" ) return value; + if (code == "m" ) return value * 100; + if (code == "in" ) return value * 2.54; + if (code == "[in_us]") return value * 2.54; + if (code == "[in_i]" ) return value * 2.54; + if (code == "ft" ) return value * 30.48; + if (code == "[ft_us]") return value * 30.48; + throw new Error("Unrecognized length unit: " + code); + }, + kg({ code, value }: fhirclient.CodeValue){ + ensureNumerical({ code, value }); + if (code == "kg" ) return value; + if (code == "g" ) return value / 1000; + if (code.match(/lb/)) return value / 2.20462; + if (code.match(/oz/)) return value / 35.274; + throw new Error("Unrecognized weight unit: " + code); + }, + any(pq: fhirclient.CodeValue){ + ensureNumerical(pq); + return pq.value; + } +}; + +/** + * Assertion function to guard arguments for `units` functions + */ +function ensureNumerical({ value, code }: fhirclient.CodeValue) { + if (typeof value !== "number") { + throw new Error("Found a non-numerical unit: " + value + " " + code); + } +} + +/** + * Used in fetch Promise chains to reject if the "ok" property is not true + */ +export async function checkResponse(resp: Response): Promise { + if (!resp.ok) { + const error = new HttpError(resp); + await error.parse(); + throw error; + } + return resp; +} + +/** + * Used in fetch Promise chains to return the JSON version of the response. + * Note that `resp.json()` will throw on empty body so we use resp.text() + * instead. + */ +export function responseToJSON(resp: Response): Promise { + return resp.text().then(text => text.length ? JSON.parse(text) : ""); +} + +export function loweCaseKeys | any[] | undefined>(obj: T): T { + + // Can be undefined to signal that this key should be removed + if (!obj) { + return obj as T + } + + // Arrays are valid values in case of recursive calls + if (Array.isArray(obj)) { + return obj.map(v => v && typeof v === "object" ? loweCaseKeys(v) : v) as unknown as T; + } + + // Plain object + let out: Record = {}; + Object.keys(obj).forEach(key => { + const lowerKey = key.toLowerCase() + const v = (obj as Record)[key] + out[lowerKey] = v && typeof v == "object" ? loweCaseKeys(v) : v; + }); + return out as T; +} + +/** + * This is our built-in request function. It does a few things by default + * (unless told otherwise): + * - Makes CORS requests + * - Sets accept header to "application/json" + * - Handles errors + * - If the response is json return the json object + * - If the response is text return the result text + * - Otherwise return the response object on which we call stuff like `.blob()` + * @param {string | Request} url + * @param {FetchOptions} [requestOptions] + */ +export async function request( + url: string | Request, + requestOptions: fhirclient.FetchOptions = {} +): Promise +{ + const { includeResponse, ...options } = requestOptions; + + const response = await fetch(url, { + mode: "cors", + ...options, + headers: { + accept: "application/json", + ...loweCaseKeys(options.headers) + } + }) + + await checkResponse(response) + + const type = response.headers.get("content-type") + ""; + + let body; + + if (type.match(/\bjson\b/i)) { + body = await responseToJSON(response); + } + else if (type.match(/^text\//i)) { + body = await response.text(); + } + + // Some servers will reply after CREATE with json content type but with + // empty body. In this case check if a location header is received and + // fetch that to use it as the final result. + if (!body && response.status == 201) { + const location = response.headers.get("location"); + if (location) { + return request(location, { ...options, method: "GET", body: null, includeResponse }); + } + } + + if (includeResponse) { + return { body, response } as unknown as T; + } + + // For any non-text and non-json response return the Response object. + // This to let users decide if they want to call text(), blob() or + // something else on it + if (body === undefined) { + return response as unknown as T; + } + + // Otherwise just return the parsed body (can also be "" or null) + return body as unknown as T; +} + +/** + * Makes a request using `fetch` and stores the result in internal memory cache. + * The cache is cleared when the page is unloaded. + * @param url The URL to request + * @param requestOptions Request options + * @param [force] If true, reload from source and update the cache, even if it + * has already been cached. + */ +export async function getAndCache(url: string, requestOptions?: RequestInit, force: boolean = globalThis?.process?.env?.NODE_ENV === "test"): Promise { + if (force || !cache[url]) { + cache[url] = request(url, requestOptions); + } + return cache[url]; +} + +/** + * Fetches the conformance statement from the given base URL. + * Note that the result is cached in memory (until the page is reloaded in the + * browser) because it might have to be re-used by the client + * @param baseUrl The base URL of the FHIR server + * @param [requestOptions] Any options passed to the fetch call + */ +export function fetchConformanceStatement(baseUrl = "/", requestOptions?: RequestInit): Promise +{ + const url = String(baseUrl).replace(/\/*$/, "/") + "metadata"; + return getAndCache(url, requestOptions).catch((ex: Error) => { + throw new Error( + `Failed to fetch the conformance statement from "${url}". ${ex}` + ); + }); +} + +/** + * Walks through an object (or array) and returns the value found at the + * provided path. This function is very simple so it intentionally does not + * support any argument polymorphism, meaning that the path can only be a + * dot-separated string. If the path is invalid returns undefined. + * @param obj The object (or Array) to walk through + * @param path The path (eg. "a.b.4.c") + * @returns {*} Whatever is found in the path or undefined + */ +export function getPath(obj: Record, path = ""): any { + path = path.trim(); + if (!path) { + return obj; + } + + let segments = path.split("."); + let result = obj; + + while (result && segments.length) { + const key = segments.shift(); + if (!key && Array.isArray(result)) { + return result.map(o => getPath(o, segments.join("."))); + } else { + result = result[key + ""]; + } + } + + return result; +} + +/** + * Like getPath, but if the node is found, its value is set to @value + * @param obj The object (or Array) to walk through + * @param path The path (eg. "a.b.4.c") + * @param value The value to set + * @param createEmpty If true, create missing intermediate objects or arrays + * @returns The modified object + */ +export function setPath(obj: Record, path: string, value: any, createEmpty = false): Record { + path.trim().split(".").reduce( + (out, key, idx, arr) => { + if (out && idx === arr.length - 1) { + out[key] = value; + } + else { + if (out && out[key] === undefined && createEmpty) { + out[key] = arr[idx + 1].match(/^[0-9]+$/) ? [] : {}; + } + return out ? out[key] : undefined; + } + }, + obj + ); + return obj; +} + +/** + * If the argument is an array returns it as is. Otherwise puts it in an array + * (`[arg]`) and returns the result + * @param arg The element to test and possibly convert to array + * @category Utility + */ +export function makeArray(arg: any): T[] { + if (Array.isArray(arg)) { + return arg; + } + return [arg]; +} + +/** + * Given a path, converts it to absolute url based on the `baseUrl`. If baseUrl + * is not provided, the result would be a rooted path (one that starts with `/`). + * @param path The path to convert + * @param baseUrl The base URL + */ +export function absolute(path: string, baseUrl?: string): string +{ + if (path.match(/^http/)) return path; + if (path.match(/^urn/)) return path; + return String(baseUrl || "").replace(/\/+$/, "") + "/" + path.replace(/^\/+/, ""); +} + +/** + * Generates random strings. By default this returns random 8 characters long + * alphanumeric strings. + * @param strLength The length of the output string. Defaults to 8. + * @param charSet A string containing all the possible characters. + * Defaults to all the upper and lower-case letters plus digits. + * @category Utility + */ +export function randomString( + strLength = 8, + charSet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" +): string +{ + const result = []; + const len = charSet.length; + while (strLength--) { + result.push(charSet.charAt(Math.floor(Math.random() * len))); + } + return result.join(""); +} + +/** + * Add a supplied number of seconds to the supplied Date, returning an integer + * number of seconds since the epoch + * @param secondsAhead How far ahead, in seconds (defaults to 120 seconds) + * @param [from] Initial time (defaults to current time) + */ +export function getTimeInFuture(secondsAhead: number = 120, from?: Date | number): number { + return Math.floor(+(from || new Date()) / 1000 + secondsAhead) +} + +/** + * Groups the observations by code. Returns a map that will look like: + * ```js + * const map = client.byCodes(observations, "code"); + * // map = { + * // "55284-4": [ observation1, observation2 ], + * // "6082-2": [ observation3 ] + * // } + * ``` + * @param observations Array of observations + * @param property The name of a CodeableConcept property to group by + */ +export function byCode( + observations: fhirclient.FHIR.Observation | fhirclient.FHIR.Observation[], + property: string +): fhirclient.ObservationMap +{ + const ret: fhirclient.ObservationMap = {}; + + function handleCodeableConcept(concept: fhirclient.FHIR.CodeableConcept, observation: fhirclient.FHIR.Observation) { + if (concept && Array.isArray(concept.coding)) { + concept.coding.forEach(({ code }) => { + if (code) { + ret[code] = ret[code] || [] as fhirclient.FHIR.Observation[]; + ret[code].push(observation); + } + }); + } + } + + makeArray(observations).forEach(o => { + if (o.resourceType === "Observation" && o[property]) { + if (Array.isArray(o[property])) { + o[property].forEach((concept: fhirclient.FHIR.CodeableConcept) => handleCodeableConcept(concept, o)); + } else { + handleCodeableConcept(o[property], o); + } + } + }); + + return ret; +} + +/** + * First groups the observations by code using `byCode`. Then returns a function + * that accepts codes as arguments and will return a flat array of observations + * having that codes. Example: + * ```js + * const filter = client.byCodes(observations, "category"); + * filter("laboratory") // => [ observation1, observation2 ] + * filter("vital-signs") // => [ observation3 ] + * filter("laboratory", "vital-signs") // => [ observation1, observation2, observation3 ] + * ``` + * @param observations Array of observations + * @param property The name of a CodeableConcept property to group by + */ +export function byCodes( + observations: fhirclient.FHIR.Observation | fhirclient.FHIR.Observation[], + property: string +): (...codes: string[]) => any[] +{ + const bank = byCode(observations, property); + return (...codes) => codes + .filter(code => (code + "") in bank) + .reduce( + (prev, code) => prev.concat(bank[code + ""]), + [] as fhirclient.FHIR.Observation[] + ); +} + +/** + * Given a conformance statement and a resource type, returns the name of the + * URL parameter that can be used to scope the resource type by patient ID. + */ +export function getPatientParam(conformance: fhirclient.FHIR.CapabilityStatement, resourceType: string): string +{ + // Find what resources are supported by this server + const resources = getPath(conformance, "rest.0.resource") || []; + + // Check if this resource is supported + const meta = resources.find((r: any) => r.type === resourceType); + if (!meta) { + throw new Error(`Resource "${resourceType}" is not supported by this FHIR server`); + } + + // Check if any search parameters are available for this resource + if (!Array.isArray(meta.searchParam)) { + throw new Error(`No search parameters supported for "${resourceType}" on this FHIR server`); + } + + // This is a rare case but could happen in generic workflows + if (resourceType == "Patient" && meta.searchParam.find((x: any) => x.name == "_id")) { + return "_id"; + } + + // Now find the first possible parameter name + const out = patientParams.find(p => meta.searchParam.find((x: any) => x.name == p)); + + // If there is no match + if (!out) { + throw new Error("I don't know what param to use for " + resourceType); + } + + return out; +} + +export function assert(condition: any, message: string): asserts condition { + if (!(condition)) { + throw new Error(message) + } +} + +export function assertJsonPatch(patch: fhirclient.JsonPatch): asserts patch { + assert(Array.isArray(patch), "The JSON patch must be an array") + assert(patch.length > 0, "The JSON patch array should not be empty") + patch.forEach((operation: fhirclient.JsonPatchOperation) => { + assert( + ["add", "replace", "test", "move", "copy", "remove"].indexOf(operation.op) > -1, + 'Each patch operation must have an "op" property which must be one of: "add", "replace", "test", "move", "copy", "remove"' + ) + assert(operation.path && typeof operation.path, `Invalid "${operation.op}" operation. Missing "path" property`) + + if (operation.op == "add" || operation.op == "replace" || operation.op == "test") { + assert("value" in operation, `Invalid "${operation.op}" operation. Missing "value" property`) + assert(Object.keys(operation).length == 3, `Invalid "${operation.op}" operation. Contains unknown properties`) + } + + else if (operation.op == "move" || operation.op == "copy") { + assert(typeof operation.from == "string", `Invalid "${operation.op}" operation. Requires a string "from" property`) + assert(Object.keys(operation).length == 3, `Invalid "${operation.op}" operation. Contains unknown properties`) + } + + else { + assert(Object.keys(operation).length == 2, `Invalid "${operation.op}" operation. Contains unknown properties`) + } + }) +} + +/** + * Fetches the well-known json file from the given base URL. + * Note that the result is cached in memory (until the page is reloaded in the + * browser) because it might have to be re-used by the client + * @param baseUrl The base URL of the FHIR server + */ +export function fetchWellKnownJson(baseUrl = "/", requestOptions?: RequestInit): Promise { + const url = String(baseUrl).replace(/\/*$/, "/") + ".well-known/smart-configuration"; + return getAndCache(url, requestOptions).catch((ex: Error) => { + throw new Error(`Failed to fetch the well-known json "${url}". ${ex.message}`); + }); +} + +/** + * Fetch a "WellKnownJson" and extract the SMART endpoints from it + */ +export function getSecurityExtensionsFromWellKnownJson(baseUrl = "/", requestOptions?: RequestInit): Promise +{ + return fetchWellKnownJson(baseUrl, requestOptions).then(meta => { + if (!meta.authorization_endpoint || !meta.token_endpoint) { + throw new Error("Invalid wellKnownJson"); + } + return { + registrationUri : meta.registration_endpoint || "", + authorizeUri : meta.authorization_endpoint, + tokenUri : meta.token_endpoint, + codeChallengeMethods: meta.code_challenge_methods_supported || [] + }; + }); +} + +/** + * Fetch a `CapabilityStatement` and extract the SMART endpoints from it + */ +export function getSecurityExtensionsFromConformanceStatement(baseUrl = "/", requestOptions?: RequestInit): Promise +{ + return fetchConformanceStatement(baseUrl, requestOptions).then(meta => { + const nsUri = "http://fhir-registry.smarthealthit.org/StructureDefinition/oauth-uris"; + const extensions = ((getPath(meta || {}, "rest.0.security.extension") || []) as Array>) + .filter(e => e.url === nsUri) + .map(o => o.extension)[0]; + + const out:fhirclient.OAuthSecurityExtensions = { + registrationUri : "", + authorizeUri : "", + tokenUri : "", + codeChallengeMethods: [], + }; + + if (extensions) { + extensions.forEach(ext => { + if (ext.url === "register") { + out.registrationUri = ext.valueUri; + } + if (ext.url === "authorize") { + out.authorizeUri = ext.valueUri; + } + if (ext.url === "token") { + out.tokenUri = ext.valueUri; + } + }); + } + + return out; + }); +} + +/** + * Given a FHIR server, returns an object with it's Oauth security endpoints + * that we are interested in. This will try to find the info in both the + * `CapabilityStatement` and the `.well-known/smart-configuration`. Whatever + * Arrives first will be used and the other request will be aborted. + * @param [baseUrl = "/"] Fhir server base URL + */ +export function getSecurityExtensions(baseUrl = "/"): Promise { + return getSecurityExtensionsFromWellKnownJson(baseUrl) + .catch(() => getSecurityExtensionsFromConformanceStatement(baseUrl)); +} + +export function base64encode(input: string) { + try { + return Buffer.from(input, "utf8").toString('base64') + } catch { + return btoa(input) + } +} + +export function base64decode(input: string) { + try { + return Buffer.from(input, "base64").toString('utf8') + } catch { + return btoa(input) + } +} + +export function shouldIncludeChallenge(S256supported: boolean, pkceMode?: string) { + if (pkceMode === "disabled") { + return false; + } + if (pkceMode === "unsafeV1") { + return true; + } + if (pkceMode === "required") { + if (!S256supported) { + throw new Error("Required PKCE code challenge method (`S256`) was not found in the server's codeChallengeMethods declaration."); + } + return true; + } + return S256supported; +} + +/** + * Decodes a JWT token and returns it's body. + * @param token The token to read + * @category Utility + */ +export function jwtDecode(token: string): Record | null { + const payload = token.split(".")[1]; + return payload ? JSON.parse(base64decode(payload)) : null; +} + +/** + * Given a token response, computes and returns the expiresAt timestamp. + * Note that this should only be used immediately after an access token is + * received, otherwise the computed timestamp will be incorrect. + * @param tokenResponse + */ +export function getAccessTokenExpiration(tokenResponse: fhirclient.TokenResponse): number +{ + const now = Math.floor(Date.now() / 1000); + + // Option 1 - using the expires_in property of the token response + if (tokenResponse.expires_in) { + return now + tokenResponse.expires_in; + } + + // Option 2 - using the exp property of JWT tokens (must not assume JWT!) + if (tokenResponse.access_token) { + let tokenBody = jwtDecode(tokenResponse.access_token); + if (tokenBody && tokenBody.exp) { + return tokenBody.exp; + } + } + + // Option 3 - if none of the above worked set this to 5 minutes after now + return now + 300; +} diff --git a/src/next/server.ts b/src/next/server.ts new file mode 100644 index 00000000..2ffba1f4 --- /dev/null +++ b/src/next/server.ts @@ -0,0 +1,62 @@ +import { randomBytes, createHash } from "crypto" +import { base64url, KeyLike, SignJWT, importJWK as joseImportJWK } from "jose" +import { fhirclient } from "../types" + + +interface PkcePair { + codeChallenge: string; + codeVerifier: string; +} + +type SupportedAlg = 'ES384' | 'RS384' + +export { randomBytes } + +export async function digestSha256(payload: string) { + const hash = createHash('sha256') + hash.update(payload) + return hash.digest() +} + +export async function generatePKCEChallenge(entropy = 96): Promise { + const inputBytes = randomBytes(entropy) + const codeVerifier = base64url.encode(inputBytes) + const codeChallenge = base64url.encode(await digestSha256(codeVerifier)) + return { codeChallenge, codeVerifier } +} + +export async function importJWK(jwk: fhirclient.JWK): Promise { + // alg is optional in JWK but we need it here! + if (!jwk.alg) { + throw new Error('The "alg" property of the JWK must be set to "ES384" or "RS384"') + } + + // Use of the "key_ops" member is OPTIONAL, unless the application requires its presence. + // https://www.rfc-editor.org/rfc/rfc7517.html#section-4.3 + // + // In our case the app will only import private keys so we can assume "sign" + if (!Array.isArray(jwk.key_ops)) { + jwk.key_ops = ["sign"] + } + + // In this case the JWK has a "key_ops" array and "sign" is not listed + if (!jwk.key_ops.includes("sign")) { + throw new Error('The "key_ops" property of the JWK does not contain "sign"') + } + + return joseImportJWK(jwk) as Promise +} + +export async function signCompactJws(alg: SupportedAlg, privateKey: KeyLike, header: any, payload: any): Promise { + return new SignJWT(payload).setProtectedHeader({...header, alg}).sign(privateKey) +} + +export function base64urlencode(input: string | Uint8Array) { + return base64url.encode(input); +} + +export function base64urldecode(input: string) { + return base64url.decode(input).toString(); +} + + diff --git a/src/next/server_entry.ts b/src/next/server_entry.ts new file mode 100644 index 00000000..664f42b8 --- /dev/null +++ b/src/next/server_entry.ts @@ -0,0 +1,18 @@ +import { IncomingMessage, ServerResponse } from "http" +import { fhirclient } from "." +import NodeAdapter from "./NodeAdapter" + +type storageFactory = (options?: Record) => fhirclient.Storage; + +export default function smart( + request: IncomingMessage, + response: ServerResponse, + storage?: fhirclient.Storage | storageFactory +) +{ + return new NodeAdapter({ + request, + response, + storage + }).getSmartApi(); +} diff --git a/src/next/settings.ts b/src/next/settings.ts new file mode 100644 index 00000000..22842ad6 --- /dev/null +++ b/src/next/settings.ts @@ -0,0 +1,121 @@ + +/** + * Combined list of FHIR resource types accepting patient parameter in FHIR R2-R4 + */ +export const patientCompartment = [ + "Account", + "AdverseEvent", + "AllergyIntolerance", + "Appointment", + "AppointmentResponse", + "AuditEvent", + "Basic", + "BodySite", + "BodyStructure", + "CarePlan", + "CareTeam", + "ChargeItem", + "Claim", + "ClaimResponse", + "ClinicalImpression", + "Communication", + "CommunicationRequest", + "Composition", + "Condition", + "Consent", + "Coverage", + "CoverageEligibilityRequest", + "CoverageEligibilityResponse", + "DetectedIssue", + "DeviceRequest", + "DeviceUseRequest", + "DeviceUseStatement", + "DiagnosticOrder", + "DiagnosticReport", + "DocumentManifest", + "DocumentReference", + "EligibilityRequest", + "Encounter", + "EnrollmentRequest", + "EpisodeOfCare", + "ExplanationOfBenefit", + "FamilyMemberHistory", + "Flag", + "Goal", + "Group", + "ImagingManifest", + "ImagingObjectSelection", + "ImagingStudy", + "Immunization", + "ImmunizationEvaluation", + "ImmunizationRecommendation", + "Invoice", + "List", + "MeasureReport", + "Media", + "MedicationAdministration", + "MedicationDispense", + "MedicationOrder", + "MedicationRequest", + "MedicationStatement", + "MolecularSequence", + "NutritionOrder", + "Observation", + "Order", + "Patient", + "Person", + "Procedure", + "ProcedureRequest", + "Provenance", + "QuestionnaireResponse", + "ReferralRequest", + "RelatedPerson", + "RequestGroup", + "ResearchSubject", + "RiskAssessment", + "Schedule", + "ServiceRequest", + "Specimen", + "SupplyDelivery", + "SupplyRequest", + "VisionPrescription" +]; + +/** + * Map of FHIR releases and their abstract version as number + */ +export const fhirVersions = { + "0.4.0": 2, + "0.5.0": 2, + "1.0.0": 2, + "1.0.1": 2, + "1.0.2": 2, + "1.1.0": 3, + "1.4.0": 3, + "1.6.0": 3, + "1.8.0": 3, + "3.0.0": 3, + "3.0.1": 3, + "3.3.0": 4, + "3.5.0": 4, + "4.0.0": 4, + "4.0.1": 4 +}; + +/** + * Combined (FHIR R2-R4) list of search parameters that can be used to scope + * a request by patient ID. + */ +export const patientParams = [ + "patient", + "subject", + "requester", + "member", + "actor", + "beneficiary" +]; + +/** + * The name of the sessionStorage entry that contains the current key + */ +export const SMART_KEY = "SMART_KEY"; diff --git a/src/next/smart.ts b/src/next/smart.ts new file mode 100644 index 00000000..ee7a59ad --- /dev/null +++ b/src/next/smart.ts @@ -0,0 +1,619 @@ + +import { fhirclient } from "." +import Client from "./Client" +import { SMART_KEY } from "./settings" +import { + assert, + base64encode, + debug, + getAccessTokenExpiration, + getPath, + getSecurityExtensions, + getTimeInFuture, + randomString, + request, + shouldIncludeChallenge +} from "./isomorphic" +import { + getTargetWindow, + isInPopUp, + isInFrame, + onMessage +} from "./browser" + + +function isBrowser() { + return typeof window === "object"; +} + +/** + * Starts the SMART Launch Sequence. + * > **IMPORTANT**: + * `authorize()` will end up redirecting you to the authorization server. + * This means that you should not add anything to the returned promise chain. + * Any code written directly after the authorize() call might not be executed + * due to that redirect! + * @param env + * @param [params] + */ +export async function authorize( + env: fhirclient.Adapter, + params: fhirclient.AuthorizeParams | fhirclient.AuthorizeParams[] = {} +): Promise +{ + const url = env.getUrl(); + + // Multiple config for EHR launches --------------------------------------- + if (Array.isArray(params)) { + const urlISS = url.searchParams.get("iss") || url.searchParams.get("fhirServiceUrl"); + if (!urlISS) { + throw new Error( + 'Passing in an "iss" url parameter is required if authorize ' + + 'uses multiple configurations' + ); + } + // pick the right config + const cfg = params.find(x => { + if (x.issMatch) { + if (typeof x.issMatch === "function") { + return !!x.issMatch(urlISS); + } + if (typeof x.issMatch === "string") { + return x.issMatch === urlISS; + } + if (x.issMatch instanceof RegExp) { + return x.issMatch.test(urlISS); + } + } + return false; + }); + assert(cfg, `No configuration found matching the current "iss" parameter "${urlISS}"`); + return await authorize(env, cfg); + } + // ------------------------------------------------------------------------ + + // Obtain input + const { + clientSecret, + fakeTokenResponse, + encounterId, + target, + width, + height, + pkceMode, + clientPublicKeySetUrl + } = params; + + let { + iss, + launch, + patientId, + fhirServiceUrl, + redirectUri, + noRedirect, + scope = "", + clientId, + completeInTarget, + clientPrivateJwk + } = params; + + const storage = env.getStorage(); + + // For these, a url param takes precedence over inline option + iss = url.searchParams.get("iss") || iss; + fhirServiceUrl = url.searchParams.get("fhirServiceUrl") || fhirServiceUrl; + launch = url.searchParams.get("launch") || launch; + patientId = url.searchParams.get("patientId") || patientId; + clientId = url.searchParams.get("clientId") || clientId; + + if (!redirectUri) { + redirectUri = env.relative("."); + } else if (!redirectUri.match(/^https?\:\/\//)) { + redirectUri = env.relative(redirectUri); + } + + const serverUrl = String(iss || fhirServiceUrl || ""); + + // Validate input + if (!serverUrl) { + throw new Error( + "No server url found. It must be specified as `iss` or as " + + "`fhirServiceUrl` parameter" + ); + } + + if (iss) { + debug("Making %s launch...", launch ? "EHR" : "standalone"); + } + + // append launch scope if needed + if (launch && !scope.match(/launch/)) { + scope += " launch"; + } + + if (isBrowser()) { + const inFrame = isInFrame(); + const inPopUp = isInPopUp(); + + if ((inFrame || inPopUp) && completeInTarget !== true && completeInTarget !== false) { + + // completeInTarget will default to true if authorize is called from + // within an iframe. This is to avoid issues when the entire app + // happens to be rendered in an iframe (including in some EHRs), + // even though that was not how the app developer's intention. + completeInTarget = inFrame; + + // In this case we can't always make the best decision so ask devs + // to be explicit in their configuration. + console.warn( + 'Your app is being authorized from within an iframe or popup ' + + 'window. Please be explicit and provide a "completeInTarget" ' + + 'option. Use "true" to complete the authorization in the ' + + 'same window, or "false" to try to complete it in the parent ' + + 'or the opener window. See http://docs.smarthealthit.org/client-js/api.html' + ); + } + } + + // If `authorize` is called, make sure we clear any previous state (in case + // this is a re-authorize) + const oldKey = await storage.get(SMART_KEY); + await storage.unset(oldKey); + + // create initial state + const stateKey = randomString(16); + const state: fhirclient.ClientState = { + clientId, + scope, + redirectUri, + serverUrl, + clientSecret, + clientPrivateJwk, + tokenResponse: {}, + key: stateKey, + completeInTarget, + clientPublicKeySetUrl + }; + + await storage.set(SMART_KEY, stateKey); + + // fakeTokenResponse to override stuff (useful in development) + if (fakeTokenResponse) { + Object.assign(state.tokenResponse!, fakeTokenResponse); + } + + // Fixed patientId (useful in development) + if (patientId) { + Object.assign(state.tokenResponse!, { patient: patientId }); + } + + // Fixed encounterId (useful in development) + if (encounterId) { + Object.assign(state.tokenResponse!, { encounter: encounterId }); + } + + let redirectUrl = redirectUri + "?state=" + encodeURIComponent(stateKey); + + // bypass oauth if fhirServiceUrl is used (but iss takes precedence) + if (fhirServiceUrl && !iss) { + debug("Making fake launch..."); + await storage.set(stateKey, state); + if (noRedirect) { + return redirectUrl; + } + return await env.redirect(redirectUrl); + } + + // Get oauth endpoints and add them to the state + const extensions = await getSecurityExtensions(serverUrl); + Object.assign(state, extensions); + await storage.set(stateKey, state); + + // If this happens to be an open server and there is no authorizeUri + if (!state.authorizeUri) { + if (noRedirect) { + return redirectUrl; + } + return await env.redirect(redirectUrl); + } + + // build the redirect uri + const redirectParams = [ + "response_type=code", + "client_id=" + encodeURIComponent(clientId || ""), + "scope=" + encodeURIComponent(scope), + "redirect_uri=" + encodeURIComponent(redirectUri!), + "aud=" + encodeURIComponent(serverUrl), + "state=" + encodeURIComponent(stateKey) + ]; + + // also pass this in case of EHR launch + if (launch) { + redirectParams.push("launch=" + encodeURIComponent(launch)); + } + + if (shouldIncludeChallenge(extensions.codeChallengeMethods.includes('S256'), pkceMode)) { + let codes = await env.security.generatePKCEChallenge() + Object.assign(state, codes); + await storage.set(stateKey, state); + redirectParams.push("code_challenge=" + state.codeChallenge);// note that the challenge is ALREADY encoded properly + redirectParams.push("code_challenge_method=S256"); + } + + redirectUrl = state.authorizeUri + "?" + redirectParams.join("&"); + + if (noRedirect) { + return redirectUrl; + } + + if (target && isBrowser()) { + let win: Window; + + win = await getTargetWindow(target, width, height); + + if (win !== self) { + try { + // Also remove any old state from the target window and then + // transfer the current state there + win.sessionStorage.removeItem(oldKey); + win.sessionStorage.setItem(stateKey, JSON.stringify(state)); + } catch (ex) { + debug(`oauth2: Failed to modify window.sessionStorage. Perhaps it is from different origin?. Failing back to "_self". %s`, ex); + win = self; + } + } + + if (win !== self) { + try { + win.location.href = redirectUrl; + self.addEventListener("message", onMessage); + } catch (ex) { + debug(`oauth2: Failed to modify window.location. Perhaps it is from different origin?. Failing back to "_self". %s`, ex); + self.location.href = redirectUrl; + } + } else { + self.location.href = redirectUrl; + } + + return; + } + + return await env.redirect(redirectUrl); +} + +/** + * The ready function should only be called on the page that represents + * the redirectUri. We typically land there after a redirect from the + * authorization server, but this code will also be executed upon subsequent + * navigation or page refresh. + */ +export async function ready(env: fhirclient.Adapter, options: fhirclient.ReadyOptions = {}): Promise +{ + const url = env.getUrl(); + const Storage = env.getStorage(); + const params = url.searchParams; + + let key = params.get("state"); + const code = params.get("code"); + const authError = params.get("error"); + const authErrorDescription = params.get("error_description"); + + if (!key) { + key = await Storage.get(SMART_KEY); + } + + // Start by checking the url for `error` and `error_description` parameters. + // This happens when the auth server rejects our authorization attempt. In + // this case it has no other way to tell us what the error was, other than + // appending these parameters to the redirect url. + // From client's point of view, this is not very reliable (because we can't + // know how we have landed on this page - was it a redirect or was it loaded + // manually). However, if `ready()` is being called, we can assume + // that the url comes from the auth server (otherwise the app won't work + // anyway). + if (authError || authErrorDescription) { + throw new Error([ + authError, + authErrorDescription + ].filter(Boolean).join(": ")); + } + + debug("key: %s, code: %s", key, code); + + // key might be coming from the page url so it might be empty or missing + assert(key, "No 'state' parameter found. Please (re)launch the app."); + + // Check if we have a previous state + let state = (await Storage.get(key)) as fhirclient.ClientState; + + // If we are in a popup window or an iframe and the authorization is + // complete, send the location back to our opener and exit. + if (isBrowser() && state && !state.completeInTarget) { + + const inFrame = isInFrame(); + const inPopUp = isInPopUp(); + + // we are about to return to the opener/parent where completeAuth will + // be called again. In rare cases the opener or parent might also be + // a frame or popup. Then inFrame or inPopUp will be true but we still + // have to stop going up the chain. To guard against that weird form of + // recursion we pass one additional parameter to the url which we later + // remove. + if ((inFrame || inPopUp) && !url.searchParams.get("complete")) { + url.searchParams.set("complete", "1"); + const { href, origin } = url; + if (inFrame) { + parent.postMessage({ type: "completeAuth", url: href }, origin); + } + if (inPopUp) { + opener.postMessage({ type: "completeAuth", url: href }, origin); + window.close(); + } + + return new Promise(() => { /* leave it pending!!! */ }); + } + } + + url.searchParams.delete("complete"); + + // Do we have to remove the `code` and `state` params from the URL? + const hasState = params.has("state"); + + if (isBrowser() && (code || hasState)) { + // `code` is the flag that tell us to request an access token. + // We have to remove it, otherwise the page will authorize on + // every load! + if (code) { + params.delete("code"); + debug("Removed code parameter from the url."); + } + + // We no longer need the `state` key. It will be stored to a well know + // location - sessionStorage[SMART_KEY] + if (hasState) { + params.delete("state"); + debug("Removed state parameter from the url."); + } + + // If the browser does not support the replaceState method for the + // History Web API, the "code" parameter cannot be removed. As a + // consequence, the page will (re)authorize on every load. The + // workaround is to reload the page to new location without those + // parameters. + if (window.history.replaceState) { + window.history.replaceState({}, "", url.href); + } + } + + // If the state does not exist, it means the page has been loaded directly. + assert(state, "No state found! Please (re)launch the app."); + + // Assume the client has already completed a token exchange when + // there is no code (but we have a state) or access token is found in state + const authorized = !code || state.tokenResponse?.access_token; + + // If we are authorized already, then this is just a reload. + // Otherwise, we have to complete the code flow + if (!authorized && state.tokenUri) { + + assert(code, "'code' url parameter is required"); + + debug("Preparing to exchange the code for access token..."); + const requestOptions = await buildTokenRequest(env, { + code, + state, + clientPublicKeySetUrl: options.clientPublicKeySetUrl, + privateKey: options.privateKey || state.clientPrivateJwk + }); + debug("Token request options: %O", requestOptions); + + // The EHR authorization server SHALL return a JSON structure that + // includes an access token or a message indicating that the + // authorization request has been denied. + const tokenResponse = await request(state.tokenUri, requestOptions); + debug("Token response: %O", tokenResponse); + assert(tokenResponse.access_token, "Failed to obtain access token."); + + // Now we need to determine when is this authorization going to expire + state.expiresAt = getAccessTokenExpiration(tokenResponse); + + // save the tokenResponse so that we don't have to re-authorize on + // every page reload + state = { ...state, tokenResponse }; + await Storage.set(key, state); + debug("Authorization successful!"); + } + else { + debug(state.tokenResponse?.access_token ? + "Already authorized" : + "No authorization needed" + ); + } + + await Storage.set(SMART_KEY, key); + + const client = new Client(state, env.getStorage()); + debug("Created client instance: %O", client); + return client; +} + +/** + * Builds the token request options. Does not make the request, just + * creates it's configuration and returns it in a Promise. + */ +export async function buildTokenRequest( + env: fhirclient.Adapter, + { + code, + state, + clientPublicKeySetUrl, + privateKey + }: { + /** + * The `code` URL parameter received from the auth redirect + */ + code: string, + + /** + * The app state + */ + state: fhirclient.ClientState + + /** + * If provided overrides the `clientPublicKeySetUrl` from the authorize + * options (if any). Used for `jku` token header in case of asymmetric auth. + */ + clientPublicKeySetUrl?: string + + /** + * Can be a private JWK, or an object with alg, kid and key properties, + * where `key` is an un-extractable private CryptoKey object. + */ + privateKey?: fhirclient.JWK | { + key: CryptoKey + alg: "RS384" | "ES384" + kid: string + } + } +): Promise +{ + const { redirectUri, clientSecret, tokenUri, clientId, codeVerifier } = state; + + assert(redirectUri, "Missing state.redirectUri"); + assert(tokenUri, "Missing state.tokenUri"); + assert(clientId, "Missing state.clientId"); + + const requestOptions: Record = { + method: "POST", + headers: { "content-type": "application/x-www-form-urlencoded" }, + body: `code=${code}&grant_type=authorization_code&redirect_uri=${ + encodeURIComponent(redirectUri)}` + }; + + // For public apps, authentication is not possible (and thus not required), + // since a client with no secret cannot prove its identity when it issues a + // call. (The end-to-end system can still be secure because the client comes + // from a known, https protected endpoint specified and enforced by the + // redirect uri.) For confidential apps, an Authorization header using HTTP + // Basic authentication is required, where the username is the app’s + // clientId and the password is the app’s clientSecret (see example). + if (clientSecret) { + requestOptions.headers.authorization = "Basic " + base64encode( + clientId + ":" + clientSecret + ); + debug( + "Using state.clientSecret to construct the authorization header: %s", + requestOptions.headers.authorization + ); + } + + // Asymmetric auth + else if (privateKey) { + + const pk = "key" in privateKey ? + privateKey.key as CryptoKey: + await env.security.importJWK(privateKey as fhirclient.JWK) + + const jwtHeaders = { + typ: "JWT", + kid: privateKey.kid, + jku: clientPublicKeySetUrl || state.clientPublicKeySetUrl + }; + + const jwtClaims = { + iss: clientId, + sub: clientId, + aud: tokenUri, + jti: env.base64urlencode(env.security.randomBytes(32)), + exp: getTimeInFuture(120) // two minutes in the future + }; + + const clientAssertion = await env.security.signCompactJws(privateKey.alg, pk, jwtHeaders, jwtClaims); + requestOptions.body += `&client_assertion_type=${encodeURIComponent("urn:ietf:params:oauth:client-assertion-type:jwt-bearer")}`; + requestOptions.body += `&client_assertion=${encodeURIComponent(clientAssertion)}`; + debug("Using state.clientPrivateJwk to add a client_assertion to the POST body") + } + + // Public client + else { + debug("Public client detected; adding state.clientId to the POST body"); + requestOptions.body += `&client_id=${encodeURIComponent(clientId)}`; + } + + if (codeVerifier) { + debug("Found state.codeVerifier, adding to the POST body") + // Note that the codeVerifier is ALREADY encoded properly + requestOptions.body += "&code_verifier=" + codeVerifier; + } + + return requestOptions as RequestInit; +} + +/** + * This function can be used when you want to handle everything in one page + * (no launch endpoint needed). You can think of it as if it does: + * ```js + * authorize(options).then(ready) + * ``` + * + * **Be careful with init()!** There are some details you need to be aware of: + * + * 1. It will only work if your launch_uri is the same as your redirect_uri. + * While this should be valid, we can’t promise that every EHR will allow you + * to register client with such settings. + * 2. Internally, `init()` will be called twice. First it will redirect to the + * EHR, then the EHR will redirect back to the page where init() will be + * called again to complete the authorization. This is generally fine, + * because the returned promise will only be resolved once, after the second + * execution, but please also consider the following: + * - You should wrap all your app’s code in a function that is only executed + * after `init()` resolves! + * - Since the page will be loaded twice, you must be careful if your code + * has global side effects that can persist between page reloads + * (for example writing to localStorage). + * 3. For standalone launch, only use init in combination with offline_access + * scope. Once the access_token expires, if you don’t have a refresh_token + * there is no way to re-authorize properly. We detect that and delete the + * expired access token, but it still means that the user will have to + * refresh the page twice to re-authorize. + * @param env The adapter + * @param authorizeOptions The authorize options + * @param [readyOptions] + */ +export async function init( + env: fhirclient.Adapter, + authorizeOptions: fhirclient.AuthorizeParams, + readyOptions?: fhirclient.ReadyOptions +): Promise +{ + const url = env.getUrl(); + const code = url.searchParams.get("code"); + const state = url.searchParams.get("state"); + + // if `code` and `state` params are present we need to complete the auth flow + if (code && state) { + return ready(env, readyOptions); + } + + // Check for existing client state. If state is found, it means a client + // instance have already been created in this session and we should try to + // "revive" it. + const storage = env.getStorage(); + const key = state || await storage.get(SMART_KEY); + const cached = await storage.get(key); + if (cached) { + return new Client(cached, env.getStorage()); + } + + // Otherwise try to launch + return authorize(env, authorizeOptions).then(() => { + // `init` promises a Client but that cannot happen in this case. The + // browser will be redirected (unload the page and be redirected back + // to it later and the same init function will be called again). On + // success, authorize will resolve with the redirect url but we don't + // want to return that from this promise chain because it is not a + // Client instance. At the same time, if authorize fails, we do want to + // pass the error to those waiting for a client instance. + return new Promise(() => { /* leave it pending!!! */ }); + }); +} diff --git a/src/next/strings.ts b/src/next/strings.ts new file mode 100644 index 00000000..2c2df674 --- /dev/null +++ b/src/next/strings.ts @@ -0,0 +1,7 @@ +// This map contains reusable debug messages (only those used in multiple places) +export default { + expired : "Session expired! Please re-launch the app", + noScopeForId : "Trying to get the ID of the selected %s. Please add 'launch' or 'launch/%s' to the requested scopes and try again.", + noIfNoAuth : "You are trying to get %s but the app is not authorized yet.", + noFreeContext: "Please don't use open fhir servers if you need to access launch context items like the %S." +}; diff --git a/typedoc.js b/typedoc.js index 33383cc6..5d0dcee0 100644 --- a/typedoc.js +++ b/typedoc.js @@ -13,7 +13,7 @@ module.exports = { out: "docs/typedoc", // Define patterns for excluded files when specifying paths. - exclude: [ "./src/lib" ], + exclude: [ "./src/next" ], // Define patterns for files that should be considered being external. // externalPattern: "node_modules",