@medplum/core 2.0.7 → 2.0.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"client.mjs","sources":["../../src/client.ts"],"sourcesContent":["// PKCE auth based on:\n// https://aws.amazon.com/blogs/security/how-to-add-authentication-single-page-web-application-with-amazon-cognito-oauth2-implementation/\n\nimport {\n Binary,\n Bundle,\n BundleEntry,\n Communication,\n Device,\n Encounter,\n ExtractResource,\n OperationOutcome,\n Patient,\n Project,\n ProjectMembership,\n ProjectSecret,\n Reference,\n Resource,\n ResourceType,\n SearchParameter,\n StructureDefinition,\n UserConfiguration,\n ValueSet,\n} from '@medplum/fhirtypes';\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n/** @ts-ignore */\nimport type { CustomTableLayout, TDocumentDefinitions, TFontDictionary } from 'pdfmake/interfaces';\nimport { LRUCache } from './cache';\nimport { encryptSHA256, getRandomString } from './crypto';\nimport { EventTarget } from './eventtarget';\nimport { Hl7Message } from './hl7';\nimport { parseJWTPayload } from './jwt';\nimport { isOk, normalizeOperationOutcome, OperationOutcomeError } from './outcomes';\nimport { ReadablePromise } from './readablepromise';\nimport { ClientStorage } from './storage';\nimport { globalSchema, IndexedStructureDefinition, indexSearchParameter, indexStructureDefinition } from './types';\nimport { arrayBufferToBase64, createReference, ProfileResource } from './utils';\n\nexport const MEDPLUM_VERSION = process.env.MEDPLUM_VERSION;\n\nconst DEFAULT_BASE_URL = 'https://api.medplum.com/';\nconst DEFAULT_RESOURCE_CACHE_SIZE = 1000;\nconst DEFAULT_CACHE_TIME = 60000; // 60 seconds\nconst JSON_CONTENT_TYPE = 'application/json';\nconst FHIR_CONTENT_TYPE = 'application/fhir+json';\nconst PATCH_CONTENT_TYPE = 'application/json-patch+json';\n\nconst system: Device = { resourceType: 'Device', id: 'system', deviceName: [{ name: 'System' }] };\n\n/**\n * The MedplumClientOptions interface defines configuration options for MedplumClient.\n *\n * All configuration settings are optional.\n */\nexport interface MedplumClientOptions {\n /**\n * Base server URL.\n *\n * Default value is https://api.medplum.com/\n *\n * Use this to point to a custom Medplum deployment.\n */\n baseUrl?: string;\n\n /**\n * OAuth2 authorize URL.\n *\n * Default value is baseUrl + \"/oauth2/authorize\".\n *\n * Use this if you want to use a separate OAuth server.\n */\n authorizeUrl?: string;\n\n /**\n * OAuth2 token URL.\n *\n * Default value is baseUrl + \"/oauth2/token\".\n *\n * Use this if you want to use a separate OAuth server.\n */\n tokenUrl?: string;\n\n /**\n * OAuth2 logout URL.\n *\n * Default value is baseUrl + \"/oauth2/logout\".\n *\n * Use this if you want to use a separate OAuth server.\n */\n logoutUrl?: string;\n\n /**\n * The client ID.\n *\n * Client ID can be used for SMART-on-FHIR customization.\n */\n clientId?: string;\n\n /**\n * Number of resources to store in the cache.\n *\n * Default value is 1000.\n *\n * Consider using this for performance of displaying Patient or Practitioner resources.\n */\n resourceCacheSize?: number;\n\n /**\n * The length of time in milliseconds to cache resources.\n *\n * Default value is 10000 (10 seconds).\n *\n * Cache time of zero disables all caching.\n *\n * For any individual request, the cache behavior can be overridden by setting the cache property on request options.\n *\n * See: https://developer.mozilla.org/en-US/docs/Web/API/Request/cache\n */\n cacheTime?: number;\n\n /**\n * The length of time in milliseconds to delay requests for auto batching.\n *\n * Auto batching attempts to group multiple requests together into a single batch request.\n *\n * Default value is 0, which disables auto batching.\n */\n autoBatchTime?: number;\n\n /**\n * Fetch implementation.\n *\n * Default is window.fetch (if available).\n *\n * For Node.js applications, consider the 'node-fetch' package.\n */\n fetch?: FetchLike;\n\n /**\n * Create PDF implementation.\n *\n * Default is none, and PDF generation is disabled.\n *\n * In browser environments, import the client-side pdfmake library.\n *\n * ```html\n * <script src=\"pdfmake.min.js\"></script>\n * <script>\n * async function createPdf(docDefinition, tableLayouts, fonts) {\n * return new Promise((resolve) => {\n * pdfMake.createPdf(docDefinition, tableLayouts, fonts).getBlob(resolve);\n * });\n * }\n * </script>\n * ```\n *\n * In Node.js applications:\n *\n * ```ts\n * import type { CustomTableLayout, TDocumentDefinitions, TFontDictionary } from 'pdfmake/interfaces';\n * function createPdf(\n * docDefinition: TDocumentDefinitions,\n * tableLayouts?: { [name: string]: CustomTableLayout },\n * fonts?: TFontDictionary\n * ): Promise<Buffer> {\n * return new Promise((resolve, reject) => {\n * const printer = new PdfPrinter(fonts || {});\n * const pdfDoc = printer.createPdfKitDocument(docDefinition, { tableLayouts });\n * const chunks: Uint8Array[] = [];\n * pdfDoc.on('data', (chunk: Uint8Array) => chunks.push(chunk));\n * pdfDoc.on('end', () => resolve(Buffer.concat(chunks)));\n * pdfDoc.on('error', reject);\n * pdfDoc.end();\n * });\n * }\n * ```\n */\n createPdf?: CreatePdfFunction;\n\n /**\n * Callback for when the client is unauthenticated.\n *\n * Default is do nothing.\n *\n * For client side applications, consider redirecting to a sign in page.\n */\n onUnauthenticated?: () => void;\n}\n\nexport interface FetchLike {\n (url: string, options?: any): Promise<any>;\n}\n\n/**\n * QueryTypes defines the different ways to specify FHIR search parameters.\n *\n * Can be any valid input to the URLSearchParams() constructor.\n *\n * TypeScript definitions for URLSearchParams do not match runtime behavior.\n * The official spec only accepts string values.\n * Web browsers and Node.js automatically coerce values to strings.\n * See: https://github.com/microsoft/TypeScript/issues/32951\n */\nexport type QueryTypes = URLSearchParams | string[][] | Record<string, any> | string | undefined;\n\nexport interface CreatePdfFunction {\n (\n docDefinition: TDocumentDefinitions,\n tableLayouts?:\n | {\n [name: string]: CustomTableLayout;\n }\n | undefined,\n fonts?: TFontDictionary | undefined\n ): Promise<any>;\n}\n\nexport interface BaseLoginRequest {\n readonly projectId?: string;\n readonly clientId?: string;\n readonly resourceType?: string;\n readonly scope?: string;\n readonly nonce?: string;\n readonly codeChallenge?: string;\n readonly codeChallengeMethod?: string;\n readonly googleClientId?: string;\n readonly launch?: string;\n readonly redirectUri?: string;\n}\n\nexport interface EmailPasswordLoginRequest extends BaseLoginRequest {\n readonly email: string;\n readonly password: string;\n readonly remember?: boolean;\n}\n\nexport interface NewUserRequest {\n readonly firstName: string;\n readonly lastName: string;\n readonly email: string;\n readonly password: string;\n readonly recaptchaToken: string;\n readonly recaptchaSiteKey?: string;\n readonly remember?: boolean;\n readonly projectId?: string;\n}\n\nexport interface NewProjectRequest {\n readonly login: string;\n readonly projectName: string;\n}\n\nexport interface NewPatientRequest {\n readonly login: string;\n readonly projectId: string;\n}\n\nexport interface GoogleCredentialResponse {\n readonly clientId: string;\n readonly credential: string;\n}\n\nexport interface GoogleLoginRequest extends BaseLoginRequest {\n readonly googleClientId: string;\n readonly googleCredential: string;\n readonly createUser?: boolean;\n}\n\nexport interface LoginAuthenticationResponse {\n readonly login: string;\n readonly mfaRequired?: boolean;\n readonly code?: string;\n readonly memberships?: ProjectMembership[];\n}\n\nexport interface LoginProfileResponse {\n readonly login: string;\n readonly scope: string;\n}\n\nexport interface LoginScopeResponse {\n readonly login: string;\n readonly code: string;\n}\n\nexport interface LoginState {\n readonly project: Reference<Project>;\n readonly profile: Reference<ProfileResource>;\n readonly accessToken: string;\n readonly refreshToken: string;\n}\n\nexport interface TokenResponse {\n readonly token_type: string;\n readonly id_token: string;\n readonly access_token: string;\n readonly refresh_token: string;\n readonly expires_in: number;\n readonly project: Reference<Project>;\n readonly profile: Reference<ProfileResource>;\n}\n\nexport interface BotEvent<T = Resource | Hl7Message | string | Record<string, any>> {\n readonly contentType: string;\n readonly input: T;\n readonly secrets: Record<string, ProjectSecret>;\n}\n\n/**\n * JSONPatch patch operation.\n * Compatible with fast-json-patch and rfc6902 Operation.\n */\nexport interface PatchOperation {\n readonly op: 'add' | 'remove' | 'replace' | 'copy' | 'move' | 'test';\n readonly path: string;\n readonly value?: any;\n}\n\n/**\n * Email address definition.\n * Compatible with nodemailer Mail.Address.\n */\nexport interface MailAddress {\n readonly name: string;\n readonly address: string;\n}\n\n/**\n * Email attachment definition.\n * Compatible with nodemailer Mail.Options.\n */\nexport interface MailAttachment {\n /** String, Buffer or a Stream contents for the attachmentent */\n readonly content?: string;\n /** path to a file or an URL (data uris are allowed as well) if you want to stream the file instead of including it (better for larger attachments) */\n readonly path?: string;\n /** filename to be reported as the name of the attached file, use of unicode is allowed. If you do not want to use a filename, set this value as false, otherwise a filename is generated automatically */\n readonly filename?: string | false;\n /** optional content type for the attachment, if not set will be derived from the filename property */\n readonly contentType?: string;\n}\n\n/**\n * Email message definition.\n * Compatible with nodemailer Mail.Options.\n */\nexport interface MailOptions {\n /** The e-mail address of the sender. All e-mail addresses can be plain 'sender@server.com' or formatted 'Sender Name <sender@server.com>' */\n readonly from?: string | MailAddress;\n /** An e-mail address that will appear on the Sender: field */\n readonly sender?: string | MailAddress;\n /** Comma separated list or an array of recipients e-mail addresses that will appear on the To: field */\n readonly to?: string | MailAddress | string[] | MailAddress[];\n /** Comma separated list or an array of recipients e-mail addresses that will appear on the Cc: field */\n readonly cc?: string | MailAddress | string[] | MailAddress[];\n /** Comma separated list or an array of recipients e-mail addresses that will appear on the Bcc: field */\n readonly bcc?: string | MailAddress | string[] | MailAddress[];\n /** An e-mail address that will appear on the Reply-To: field */\n readonly replyTo?: string | MailAddress;\n /** The subject of the e-mail */\n readonly subject?: string;\n /** The plaintext version of the message */\n readonly text?: string;\n /** The HTML version of the message */\n readonly html?: string;\n /** An array of attachment objects */\n readonly attachments?: MailAttachment[];\n}\n\ninterface SchemaGraphQLResponse {\n readonly data: {\n readonly StructureDefinitionList: StructureDefinition[];\n readonly SearchParameterList: SearchParameter[];\n };\n}\n\ninterface RequestCacheEntry {\n readonly requestTime: number;\n readonly value: ReadablePromise<any>;\n}\n\ninterface AutoBatchEntry<T = any> {\n readonly method: string;\n readonly url: string;\n readonly options: RequestInit;\n readonly resolve: (value: T) => void;\n readonly reject: (reason: any) => void;\n}\n\n/**\n * The MedplumClient class provides a client for the Medplum FHIR server.\n *\n * The client can be used in the browser, in a Node.js application, or in a Medplum Bot.\n *\n * The client provides helpful methods for common operations such as:\n * 1) Authenticating\n * 2) Creating resources\n * 2) Reading resources\n * 3) Updating resources\n * 5) Deleting resources\n * 6) Searching\n * 7) Making GraphQL queries\n *\n * Here is a quick example of how to use the client:\n *\n * ```typescript\n * import { MedplumClient } from '@medplum/core';\n * const medplum = new MedplumClient();\n * ```\n *\n * Create a `Patient`:\n *\n * ```typescript\n * const patient = await medplum.createResource({\n * resourceType: 'Patient',\n * name: [{\n * given: ['Alice'],\n * family: 'Smith'\n * }]\n * });\n * ```\n *\n * Read a `Patient` by ID:\n *\n * ```typescript\n * const patient = await medplum.readResource('Patient', '123');\n * console.log(patient.name[0].given[0]);\n * ```\n *\n * Search for a `Patient` by name:\n *\n * ```typescript\n * const bundle = await medplum.search('Patient', 'name=Alice');\n * console.log(bundle.total);\n * ```\n *\n * <head>\n * <meta name=\"algolia:pageRank\" content=\"100\" />\n * </head>\n\n */\nexport class MedplumClient extends EventTarget {\n readonly #fetch: FetchLike;\n readonly #createPdf?: CreatePdfFunction;\n readonly #storage: ClientStorage;\n readonly #requestCache: LRUCache<RequestCacheEntry>;\n readonly #cacheTime: number;\n readonly #baseUrl: string;\n readonly #fhirBaseUrl: string;\n readonly #authorizeUrl: string;\n readonly #tokenUrl: string;\n readonly #logoutUrl: string;\n readonly #onUnauthenticated?: () => void;\n readonly #autoBatchTime: number;\n readonly #autoBatchQueue: AutoBatchEntry[];\n #clientId?: string;\n #clientSecret?: string;\n #autoBatchTimerId?: any;\n #accessToken?: string;\n #refreshToken?: string;\n #refreshPromise?: Promise<any>;\n #profilePromise?: Promise<any>;\n #profile?: ProfileResource;\n #config?: UserConfiguration;\n\n constructor(options?: MedplumClientOptions) {\n super();\n\n if (options?.baseUrl) {\n if (!options.baseUrl.startsWith('http')) {\n throw new Error('Base URL must start with http or https');\n }\n }\n\n this.#fetch = options?.fetch || getDefaultFetch();\n this.#createPdf = options?.createPdf;\n this.#storage = new ClientStorage();\n this.#requestCache = new LRUCache(options?.resourceCacheSize ?? DEFAULT_RESOURCE_CACHE_SIZE);\n this.#cacheTime = options?.cacheTime ?? DEFAULT_CACHE_TIME;\n this.#baseUrl = ensureTrailingSlash(options?.baseUrl) || DEFAULT_BASE_URL;\n this.#fhirBaseUrl = this.#baseUrl + 'fhir/R4/';\n this.#clientId = options?.clientId || '';\n this.#authorizeUrl = options?.authorizeUrl || this.#baseUrl + 'oauth2/authorize';\n this.#tokenUrl = options?.tokenUrl || this.#baseUrl + 'oauth2/token';\n this.#logoutUrl = options?.logoutUrl || this.#baseUrl + 'oauth2/logout';\n this.#onUnauthenticated = options?.onUnauthenticated;\n this.#autoBatchTime = options?.autoBatchTime ?? 0;\n this.#autoBatchQueue = [];\n\n const activeLogin = this.getActiveLogin();\n if (activeLogin) {\n this.#accessToken = activeLogin.accessToken;\n this.#refreshToken = activeLogin.refreshToken;\n this.#refreshProfile().catch(console.log);\n }\n\n this.#setupStorageListener();\n }\n\n /**\n * Returns the current base URL for all API requests.\n * By default, this is set to `https://api.medplum.com/`.\n * This can be overridden by setting the `baseUrl` option when creating the client.\n * @category HTTP\n * @returns The current base URL for all API requests.\n */\n getBaseUrl(): string {\n return this.#baseUrl;\n }\n\n /**\n * Clears all auth state including local storage and session storage.\n * @category Authentication\n */\n clear(): void {\n this.#storage.clear();\n this.clearActiveLogin();\n }\n\n /**\n * Clears the active login from local storage.\n * Does not clear all local storage (such as other logins).\n * @category Authentication\n */\n clearActiveLogin(): void {\n this.#storage.setString('activeLogin', undefined);\n this.#requestCache.clear();\n this.#accessToken = undefined;\n this.#refreshToken = undefined;\n this.#profile = undefined;\n this.#config = undefined;\n this.dispatchEvent({ type: 'change' });\n }\n\n /**\n * Invalidates any cached values or cached requests for the given URL.\n * @category Caching\n * @param url The URL to invalidate.\n */\n invalidateUrl(url: URL | string): void {\n url = url.toString();\n this.#requestCache.delete(url);\n }\n\n /**\n * Invalidates all cached search results or cached requests for the given resourceType.\n * @category Caching\n * @param resourceType The resource type to invalidate.\n */\n invalidateSearches<K extends ResourceType>(resourceType: K): void {\n const url = 'fhir/R4/' + resourceType;\n for (const key of this.#requestCache.keys()) {\n if (key.endsWith(url) || key.includes(url + '?')) {\n this.#requestCache.delete(key);\n }\n }\n }\n\n /**\n * Makes an HTTP GET request to the specified URL.\n *\n * This is a lower level method for custom requests.\n * For common operations, we recommend using higher level methods\n * such as `readResource()`, `search()`, etc.\n *\n * @category HTTP\n * @param url The target URL.\n * @param options Optional fetch options.\n * @returns Promise to the response content.\n */\n get<T = any>(url: URL | string, options: RequestInit = {}): ReadablePromise<T> {\n url = url.toString();\n const cached = this.#getCacheEntry(url, options);\n if (cached) {\n return cached.value;\n }\n\n let promise: Promise<T>;\n\n if (url.startsWith(this.#fhirBaseUrl) && this.#autoBatchTime > 0) {\n promise = new Promise<T>((resolve, reject) => {\n this.#autoBatchQueue.push({\n method: 'GET',\n url: (url as string).replace(this.#fhirBaseUrl, ''),\n options,\n resolve,\n reject,\n });\n if (!this.#autoBatchTimerId) {\n this.#autoBatchTimerId = setTimeout(() => this.#executeAutoBatch(), this.#autoBatchTime);\n }\n });\n } else {\n promise = this.#request<T>('GET', url, options);\n }\n\n const readablePromise = new ReadablePromise(promise);\n this.#setCacheEntry(url, readablePromise);\n return readablePromise;\n }\n\n /**\n * Makes an HTTP POST request to the specified URL.\n *\n * This is a lower level method for custom requests.\n * For common operations, we recommend using higher level methods\n * such as `createResource()`.\n *\n * @category HTTP\n * @param url The target URL.\n * @param body The content body. Strings and `File` objects are passed directly. Other objects are converted to JSON.\n * @param contentType The content type to be included in the \"Content-Type\" header.\n * @param options Optional fetch options.\n * @returns Promise to the response content.\n */\n post(url: URL | string, body: any, contentType?: string, options: RequestInit = {}): Promise<any> {\n url = url.toString();\n if (body) {\n this.#setRequestBody(options, body);\n }\n if (contentType) {\n this.#setRequestContentType(options, contentType);\n }\n this.invalidateUrl(url);\n return this.#request('POST', url, options);\n }\n\n /**\n * Makes an HTTP PUT request to the specified URL.\n *\n * This is a lower level method for custom requests.\n * For common operations, we recommend using higher level methods\n * such as `updateResource()`.\n *\n * @category HTTP\n * @param url The target URL.\n * @param body The content body. Strings and `File` objects are passed directly. Other objects are converted to JSON.\n * @param contentType The content type to be included in the \"Content-Type\" header.\n * @param options Optional fetch options.\n * @returns Promise to the response content.\n */\n put(url: URL | string, body: any, contentType?: string, options: RequestInit = {}): Promise<any> {\n url = url.toString();\n if (body) {\n this.#setRequestBody(options, body);\n }\n if (contentType) {\n this.#setRequestContentType(options, contentType);\n }\n this.invalidateUrl(url);\n return this.#request('PUT', url, options);\n }\n\n /**\n * Makes an HTTP PATCH request to the specified URL.\n *\n * This is a lower level method for custom requests.\n * For common operations, we recommend using higher level methods\n * such as `patchResource()`.\n *\n * @category HTTP\n * @param url The target URL.\n * @param operations Array of JSONPatch operations.\n * @param options Optional fetch options.\n * @returns Promise to the response content.\n */\n patch(url: URL | string, operations: PatchOperation[], options: RequestInit = {}): Promise<any> {\n url = url.toString();\n this.#setRequestBody(options, operations);\n this.#setRequestContentType(options, PATCH_CONTENT_TYPE);\n this.invalidateUrl(url);\n return this.#request('PATCH', url, options);\n }\n\n /**\n * Makes an HTTP DELETE request to the specified URL.\n *\n *\n * This is a lower level method for custom requests.\n * For common operations, we recommend using higher level methods\n * such as `deleteResource()`.\n *\n * @category HTTP\n * @param url The target URL.\n * @param options Optional fetch options.\n * @returns Promise to the response content.\n */\n delete(url: URL | string, options: RequestInit = {}): Promise<any> {\n url = url.toString();\n this.invalidateUrl(url);\n return this.#request('DELETE', url, options);\n }\n\n /**\n * Initiates a new user flow.\n *\n * This method is part of the two different user registration flows:\n * 1) New Practitioner and new Project\n * 2) New Patient registration\n *\n * @category Authentication\n * @param newUserRequest Register request including email and password.\n * @returns Promise to the authentication response.\n */\n async startNewUser(newUserRequest: NewUserRequest): Promise<LoginAuthenticationResponse> {\n const { codeChallengeMethod, codeChallenge } = await this.startPkce();\n return this.post('auth/newuser', {\n ...newUserRequest,\n codeChallengeMethod,\n codeChallenge,\n }) as Promise<LoginAuthenticationResponse>;\n }\n\n /**\n * Initiates a new project flow.\n *\n * This requires a partial login from `startNewUser` or `startNewGoogleUser`.\n *\n * @param newProjectRequest Register request including email and password.\n * @returns Promise to the authentication response.\n */\n async startNewProject(newProjectRequest: NewProjectRequest): Promise<LoginAuthenticationResponse> {\n return this.post('auth/newproject', newProjectRequest) as Promise<LoginAuthenticationResponse>;\n }\n\n /**\n * Initiates a new patient flow.\n *\n * This requires a partial login from `startNewUser` or `startNewGoogleUser`.\n *\n * @param newPatientRequest Register request including email and password.\n * @returns Promise to the authentication response.\n */\n async startNewPatient(newPatientRequest: NewPatientRequest): Promise<LoginAuthenticationResponse> {\n return this.post('auth/newpatient', newPatientRequest) as Promise<LoginAuthenticationResponse>;\n }\n\n /**\n * Initiates a user login flow.\n * @category Authentication\n * @param loginRequest Login request including email and password.\n * @returns Promise to the authentication response.\n */\n async startLogin(loginRequest: EmailPasswordLoginRequest): Promise<LoginAuthenticationResponse> {\n return this.post('auth/login', {\n ...(await this.ensureCodeChallenge(loginRequest)),\n clientId: loginRequest.clientId ?? this.#clientId,\n scope: loginRequest.scope,\n }) as Promise<LoginAuthenticationResponse>;\n }\n\n /**\n * Tries to sign in with Google authentication.\n * The response parameter is the result of a Google authentication.\n * See: https://developers.google.com/identity/gsi/web/guides/handle-credential-responses-js-functions\n * @category Authentication\n * @param loginRequest Login request including Google credential response.\n * @returns Promise to the authentication response.\n */\n async startGoogleLogin(loginRequest: GoogleLoginRequest): Promise<LoginAuthenticationResponse> {\n return this.post('auth/google', {\n ...(await this.ensureCodeChallenge(loginRequest)),\n clientId: loginRequest.clientId ?? this.#clientId,\n scope: loginRequest.scope,\n }) as Promise<LoginAuthenticationResponse>;\n }\n\n /**\n * Returns the PKCE code challenge and method.\n * If the login request already includes a code challenge, it is returned.\n * Otherwise, a new PKCE code challenge is generated.\n * @category Authentication\n * @param loginRequest The original login request.\n * @returns The PKCE code challenge and method.\n */\n async ensureCodeChallenge<T extends BaseLoginRequest>(loginRequest: T): Promise<T> {\n if (loginRequest.codeChallenge) {\n return loginRequest;\n }\n return { ...loginRequest, ...(await this.startPkce()) };\n }\n\n /**\n * Signs out locally.\n * Does not invalidate tokens with the server.\n * @category Authentication\n */\n async signOut(): Promise<void> {\n await this.post(this.#logoutUrl, {});\n this.clear();\n }\n\n /**\n * Tries to sign in the user.\n * Returns true if the user is signed in.\n * This may result in navigating away to the sign in page.\n * @category Authentication\n * @param loginParams Optional login parameters.\n */\n async signInWithRedirect(loginParams?: Partial<BaseLoginRequest>): Promise<ProfileResource | void> {\n const urlParams = new URLSearchParams(window.location.search);\n const code = urlParams.get('code');\n if (!code) {\n await this.#requestAuthorization(loginParams);\n return undefined;\n } else {\n return this.processCode(code);\n }\n }\n\n /**\n * Tries to sign out the user.\n * See: https://docs.aws.amazon.com/cognito/latest/developerguide/logout-endpoint.html\n * @category Authentication\n */\n signOutWithRedirect(): void {\n window.location.assign(this.#logoutUrl);\n }\n\n /**\n * Initiates sign in with an external identity provider.\n * @param authorizeUrl The external authorization URL.\n * @param clientId The external client ID.\n * @param redirectUri The external identity provider redirect URI.\n * @param baseLogin The Medplum login request.\n * @category Authentication\n */\n async signInWithExternalAuth(\n authorizeUrl: string,\n clientId: string,\n redirectUri: string,\n baseLogin: BaseLoginRequest\n ): Promise<void> {\n const loginRequest = await this.ensureCodeChallenge(baseLogin);\n window.location.assign(this.getExternalAuthRedirectUri(authorizeUrl, clientId, redirectUri, loginRequest));\n }\n\n /**\n * Builds the external identity provider redirect URI.\n * @param authorizeUrl The external authorization URL.\n * @param clientId The external client ID.\n * @param redirectUri The external identity provider redirect URI.\n * @param loginRequest The Medplum login request.\n * @returns The external identity provider redirect URI.\n * @category Authentication\n */\n getExternalAuthRedirectUri(\n authorizeUrl: string,\n clientId: string,\n redirectUri: string,\n loginRequest: BaseLoginRequest\n ): string {\n const url = new URL(authorizeUrl);\n url.searchParams.set('response_type', 'code');\n url.searchParams.set('client_id', clientId);\n url.searchParams.set('redirect_uri', redirectUri);\n url.searchParams.set('scope', 'openid profile email');\n url.searchParams.set('state', JSON.stringify(loginRequest));\n return url.toString();\n }\n\n /**\n * Builds a FHIR URL from a collection of URL path components.\n * For example, `buildUrl('/Patient', '123')` returns `fhir/R4/Patient/123`.\n * @category HTTP\n * @param path The path component of the URL.\n * @returns The well-formed FHIR URL.\n */\n fhirUrl(...path: string[]): URL {\n return new URL(this.#fhirBaseUrl + path.join('/'));\n }\n\n /**\n * Builds a FHIR search URL from a search query or structured query object.\n * @category HTTP\n * @category Search\n * @param resourceType The FHIR resource type.\n * @param query The FHIR search query or structured query object. Can be any valid input to the URLSearchParams() constructor.\n * @returns The well-formed FHIR URL.\n */\n fhirSearchUrl(resourceType: ResourceType, query: QueryTypes): URL {\n const url = this.fhirUrl(resourceType);\n if (query) {\n url.search = new URLSearchParams(query).toString();\n }\n return url;\n }\n\n /**\n * Sends a FHIR search request.\n *\n * Example using a FHIR search string:\n *\n * ```typescript\n * const bundle = await client.search('Patient', 'name=Alice');\n * console.log(bundle);\n * ```\n *\n * The return value is a FHIR bundle:\n *\n * ```json\n * {\n * \"resourceType\": \"Bundle\",\n * \"type\": \"searchset\",\n * \"entry\": [\n * {\n * \"resource\": {\n * \"resourceType\": \"Patient\",\n * \"name\": [\n * {\n * \"given\": [\n * \"George\"\n * ],\n * \"family\": \"Washington\"\n * }\n * ],\n * }\n * }\n * ]\n * }\n * ```\n *\n * To query the count of a search, use the summary feature like so:\n *\n * ```typescript\n * const patients = medplum.search('Patient', '_summary=count');\n * ```\n *\n * See FHIR search for full details: https://www.hl7.org/fhir/search.html\n *\n * @category Search\n * @param resourceType The FHIR resource type.\n * @param query Optional FHIR search query or structured query object. Can be any valid input to the URLSearchParams() constructor.\n * @param options Optional fetch options.\n * @returns Promise to the search result bundle.\n */\n search<K extends ResourceType>(\n resourceType: K,\n query?: QueryTypes,\n options: RequestInit = {}\n ): ReadablePromise<Bundle<ExtractResource<K>>> {\n const url = this.fhirSearchUrl(resourceType, query);\n const cacheKey = url.toString() + '-search';\n const cached = this.#getCacheEntry(cacheKey, options);\n if (cached) {\n return cached.value;\n }\n const promise = new ReadablePromise(\n (async () => {\n const bundle = await this.get<Bundle<ExtractResource<K>>>(url, options);\n if (bundle.entry) {\n for (const entry of bundle.entry) {\n this.#cacheResource(entry.resource);\n }\n }\n return bundle;\n })()\n );\n this.#setCacheEntry(cacheKey, promise);\n return promise;\n }\n\n /**\n * Sends a FHIR search request for a single resource.\n *\n * This is a convenience method for `search()` that returns the first resource rather than a `Bundle`.\n *\n * Example using a FHIR search string:\n *\n * ```typescript\n * const patient = await client.searchOne('Patient', 'identifier=123');\n * console.log(patient);\n * ```\n *\n * The return value is the resource, if available; otherwise, undefined.\n *\n * See FHIR search for full details: https://www.hl7.org/fhir/search.html\n *\n * @category Search\n * @param resourceType The FHIR resource type.\n * @param query Optional FHIR search query or structured query object. Can be any valid input to the URLSearchParams() constructor.\n * @param options Optional fetch options.\n * @returns Promise to the search result bundle.\n */\n searchOne<K extends ResourceType>(\n resourceType: K,\n query?: QueryTypes,\n options: RequestInit = {}\n ): ReadablePromise<ExtractResource<K> | undefined> {\n const url = this.fhirSearchUrl(resourceType, query);\n url.searchParams.set('_count', '1');\n url.searchParams.sort();\n const cacheKey = url.toString() + '-searchOne';\n const cached = this.#getCacheEntry(cacheKey, options);\n if (cached) {\n return cached.value;\n }\n const promise = new ReadablePromise(\n this.search<K>(resourceType, url.searchParams, options).then((b) => b.entry?.[0]?.resource)\n );\n this.#setCacheEntry(cacheKey, promise);\n return promise;\n }\n\n /**\n * Sends a FHIR search request for an array of resources.\n *\n * This is a convenience method for `search()` that returns the resources as an array rather than a `Bundle`.\n *\n * Example using a FHIR search string:\n *\n * ```typescript\n * const patients = await client.searchResources('Patient', 'name=Alice');\n * console.log(patients);\n * ```\n *\n * The return value is an array of resources.\n *\n * See FHIR search for full details: https://www.hl7.org/fhir/search.html\n *\n * @category Search\n * @param resourceType The FHIR resource type.\n * @param query Optional FHIR search query or structured query object. Can be any valid input to the URLSearchParams() constructor.\n * @param options Optional fetch options.\n * @returns Promise to the search result bundle.\n */\n searchResources<K extends ResourceType>(\n resourceType: K,\n query?: QueryTypes,\n options: RequestInit = {}\n ): ReadablePromise<ExtractResource<K>[]> {\n const url = this.fhirSearchUrl(resourceType, query);\n const cacheKey = url.toString() + '-searchResources';\n const cached = this.#getCacheEntry(cacheKey, options);\n if (cached) {\n return cached.value;\n }\n const promise = new ReadablePromise(\n this.search<K>(resourceType, query, options).then(\n (b) => b.entry?.map((e) => e.resource as ExtractResource<K>) ?? []\n )\n );\n this.#setCacheEntry(cacheKey, promise);\n return promise;\n }\n\n /**\n * Searches a ValueSet resource using the \"expand\" operation.\n * See: https://www.hl7.org/fhir/operation-valueset-expand.html\n *\n * @category Search\n * @param system The ValueSet system url.\n * @param filter The search string.\n * @param options Optional fetch options.\n * @returns Promise to expanded ValueSet.\n */\n searchValueSet(system: string, filter: string, options: RequestInit = {}): ReadablePromise<ValueSet> {\n const url = this.fhirUrl('ValueSet', '$expand');\n url.searchParams.set('url', system);\n url.searchParams.set('filter', filter);\n return this.get(url.toString(), options);\n }\n\n /**\n * Returns a cached resource if it is available.\n * @category Caching\n * @param resourceType The FHIR resource type.\n * @param id The FHIR resource ID.\n * @returns The resource if it is available in the cache; undefined otherwise.\n */\n getCached<K extends ResourceType>(resourceType: K, id: string): ExtractResource<K> | undefined {\n const cached = this.#requestCache.get(this.fhirUrl(resourceType, id).toString())?.value;\n return cached && cached.isOk() ? (cached.read() as ExtractResource<K>) : undefined;\n }\n\n /**\n * Returns a cached resource if it is available.\n * @category Caching\n * @param resourceType The FHIR resource type.\n * @param id The FHIR resource ID.\n * @returns The resource if it is available in the cache; undefined otherwise.\n */\n getCachedReference<T extends Resource>(reference: Reference<T>): T | undefined {\n const refString = reference.reference as string;\n if (!refString) {\n return undefined;\n }\n if (refString === 'system') {\n return system as T;\n }\n const [resourceType, id] = refString.split('/');\n if (!resourceType || !id) {\n return undefined;\n }\n return this.getCached(resourceType as ResourceType, id) as T | undefined;\n }\n\n /**\n * Reads a resource by resource type and ID.\n *\n * Example:\n *\n * ```typescript\n * const patient = await medplum.readResource('Patient', '123');\n * console.log(patient);\n * ```\n *\n * See the FHIR \"read\" operation for full details: https://www.hl7.org/fhir/http.html#read\n *\n * @category Read\n * @param resourceType The FHIR resource type.\n * @param id The resource ID.\n * @param options Optional fetch options.\n * @returns The resource if available; undefined otherwise.\n */\n readResource<K extends ResourceType>(\n resourceType: K,\n id: string,\n options: RequestInit = {}\n ): ReadablePromise<ExtractResource<K>> {\n return this.get<ExtractResource<K>>(this.fhirUrl(resourceType, id), options);\n }\n\n /**\n * Reads a resource by `Reference`.\n *\n * This is a convenience method for `readResource()` that accepts a `Reference` object.\n *\n * Example:\n *\n * ```typescript\n * const serviceRequest = await medplum.readResource('ServiceRequest', '123');\n * const patient = await medplum.readReference(serviceRequest.subject);\n * console.log(patient);\n * ```\n *\n * See the FHIR \"read\" operation for full details: https://www.hl7.org/fhir/http.html#read\n *\n * @category Read\n * @param reference The FHIR reference object.\n * @param options Optional fetch options.\n * @returns The resource if available; undefined otherwise.\n */\n readReference<T extends Resource>(reference: Reference<T>, options: RequestInit = {}): ReadablePromise<T> {\n const refString = reference?.reference;\n if (!refString) {\n return new ReadablePromise(Promise.reject(new Error('Missing reference')));\n }\n if (refString === 'system') {\n return new ReadablePromise(Promise.resolve(system as unknown as T));\n }\n const [resourceType, id] = refString.split('/');\n if (!resourceType || !id) {\n return new ReadablePromise(Promise.reject(new Error('Invalid reference')));\n }\n return this.readResource(resourceType as ResourceType, id, options) as ReadablePromise<T>;\n }\n\n /**\n * Returns a cached schema for a resource type.\n * If the schema is not cached, returns undefined.\n * It is assumed that a client will call requestSchema before using this method.\n * @category Schema\n * @returns The schema if immediately available, undefined otherwise.\n * @deprecated Use globalSchema instead.\n */\n getSchema(): IndexedStructureDefinition {\n return globalSchema;\n }\n\n /**\n * Requests the schema for a resource type.\n * If the schema is already cached, the promise is resolved immediately.\n * @category Schema\n * @param resourceType The FHIR resource type.\n * @returns Promise to a schema with the requested resource type.\n */\n requestSchema(resourceType: string): Promise<IndexedStructureDefinition> {\n if (resourceType in globalSchema.types) {\n return Promise.resolve(globalSchema);\n }\n\n const cacheKey = resourceType + '-requestSchema';\n const cached = this.#getCacheEntry(cacheKey, undefined);\n if (cached) {\n return cached.value;\n }\n\n const promise = new ReadablePromise<IndexedStructureDefinition>(\n (async () => {\n const query = `{\n StructureDefinitionList(name: \"${resourceType}\") {\n name,\n description,\n snapshot {\n element {\n id,\n path,\n min,\n max,\n type {\n code,\n targetProfile\n },\n binding {\n valueSet\n },\n definition\n }\n }\n }\n SearchParameterList(base: \"${resourceType}\", _count: 100) {\n base,\n code,\n type,\n expression,\n target\n }\n }`.replace(/\\s+/g, ' ');\n\n const response = (await this.graphql(query)) as SchemaGraphQLResponse;\n\n for (const structureDefinition of response.data.StructureDefinitionList) {\n indexStructureDefinition(structureDefinition);\n }\n\n for (const searchParameter of response.data.SearchParameterList) {\n indexSearchParameter(searchParameter);\n }\n\n return globalSchema;\n })()\n );\n this.#setCacheEntry(cacheKey, promise);\n return promise;\n }\n\n /**\n * Reads resource history by resource type and ID.\n *\n * The return value is a bundle of all versions of the resource.\n *\n * Example:\n *\n * ```typescript\n * const history = await medplum.readHistory('Patient', '123');\n * console.log(history);\n * ```\n *\n * See the FHIR \"history\" operation for full details: https://www.hl7.org/fhir/http.html#history\n *\n * @category Read\n * @param resourceType The FHIR resource type.\n * @param id The resource ID.\n * @param options Optional fetch options.\n * @returns Promise to the resource history.\n */\n readHistory<K extends ResourceType>(\n resourceType: K,\n id: string,\n options: RequestInit = {}\n ): ReadablePromise<Bundle<ExtractResource<K>>> {\n return this.get(this.fhirUrl(resourceType, id, '_history'), options);\n }\n\n /**\n * Reads a specific version of a resource by resource type, ID, and version ID.\n *\n * Example:\n *\n * ```typescript\n * const version = await medplum.readVersion('Patient', '123', '456');\n * console.log(version);\n * ```\n *\n * See the FHIR \"vread\" operation for full details: https://www.hl7.org/fhir/http.html#vread\n *\n * @category Read\n * @param resourceType The FHIR resource type.\n * @param id The resource ID.\n * @param vid The version ID.\n * @param options Optional fetch options.\n * @returns The resource if available; undefined otherwise.\n */\n readVersion<K extends ResourceType>(\n resourceType: K,\n id: string,\n vid: string,\n options: RequestInit = {}\n ): ReadablePromise<ExtractResource<K>> {\n return this.get(this.fhirUrl(resourceType, id, '_history', vid), options);\n }\n\n /**\n * Executes the Patient \"everything\" operation for a patient.\n *\n * Example:\n *\n * ```typescript\n * const bundle = await medplum.readPatientEverything('123');\n * console.log(bundle);\n * ```\n *\n * See the FHIR \"patient-everything\" operation for full details: https://hl7.org/fhir/operation-patient-everything.html\n *\n * @category Read\n * @param id The Patient Id\n * @param options Optional fetch options.\n * @returns A Bundle of all Resources related to the Patient\n */\n readPatientEverything(id: string, options: RequestInit = {}): ReadablePromise<Bundle> {\n return this.get(this.fhirUrl('Patient', id, '$everything'), options);\n }\n\n /**\n * Creates a new FHIR resource.\n *\n * The return value is the newly created resource, including the ID and meta.\n *\n * Example:\n *\n * ```typescript\n * const result = await medplum.createResource({\n * resourceType: 'Patient',\n * name: [{\n * family: 'Smith',\n * given: ['John']\n * }]\n * });\n * console.log(result.id);\n * ```\n *\n * See the FHIR \"create\" operation for full details: https://www.hl7.org/fhir/http.html#create\n *\n * @category Create\n * @param resource The FHIR resource to create.\n * @returns The result of the create operation.\n */\n createResource<T extends Resource>(resource: T): Promise<T> {\n if (!resource.resourceType) {\n throw new Error('Missing resourceType');\n }\n this.invalidateSearches(resource.resourceType);\n return this.post(this.fhirUrl(resource.resourceType), resource);\n }\n\n /**\n * Conditionally create a new FHIR resource only if some equivalent resource does not already exist on the server.\n *\n * The return value is the existing resource or the newly created resource, including the ID and meta.\n *\n * Example:\n *\n * ```typescript\n * const result = await medplum.createResourceIfNoneExist(\n * {\n * resourceType: 'Patient',\n * identifier: [{\n * system: 'http://example.com/mrn',\n * value: '123'\n * }]\n * name: [{\n * family: 'Smith',\n * given: ['John']\n * }]\n * },\n * 'identifier=123'\n * );\n * console.log(result.id);\n * ```\n *\n * This method is syntactic sugar for:\n *\n * ```typescript\n * return searchOne(resourceType, query) ?? createResource(resource);\n * ```\n *\n * The query parameter only contains the search parameters (what would be in the URL following the \"?\").\n *\n * See the FHIR \"conditional create\" operation for full details: https://www.hl7.org/fhir/http.html#ccreate\n *\n * @category Create\n * @param resource The FHIR resource to create.\n * @param query The search query for an equivalent resource (should not include resource type or \"?\").\n * @returns The result of the create operation.\n */\n async createResourceIfNoneExist<T extends Resource>(resource: T, query: string): Promise<T> {\n return ((await this.searchOne(resource.resourceType, query)) ?? this.createResource(resource)) as Promise<T>;\n }\n\n /**\n * Creates a FHIR `Binary` resource with the provided data content.\n *\n * The return value is the newly created resource, including the ID and meta.\n *\n * The `data` parameter can be a string or a `File` object.\n *\n * A `File` object often comes from a `<input type=\"file\">` element.\n *\n * Example:\n *\n * ```typescript\n * const result = await medplum.createBinary(myFile, 'test.jpg', 'image/jpeg');\n * console.log(result.id);\n * ```\n *\n * See the FHIR \"create\" operation for full details: https://www.hl7.org/fhir/http.html#create\n *\n * @category Create\n * @param data The binary data to upload.\n * @param filename Optional filename for the binary.\n * @param contentType Content type for the binary.\n * @returns The result of the create operation.\n */\n createBinary(\n data: string | File | Blob | Uint8Array,\n filename: string | undefined,\n contentType: string,\n onProgress?: (e: ProgressEvent) => void\n ): Promise<Binary> {\n const url = this.fhirUrl('Binary');\n if (filename) {\n url.searchParams.set('_filename', filename);\n }\n\n if (onProgress) {\n return this.uploadwithProgress(url, data, contentType, onProgress);\n } else {\n return this.post(url, data, contentType);\n }\n }\n\n uploadwithProgress(\n url: URL,\n data: string | File | Blob | Uint8Array,\n contentType: string,\n onProgress: (e: ProgressEvent) => void\n ): Promise<any> {\n return new Promise((resolve, reject) => {\n const xhr = new XMLHttpRequest();\n xhr.responseType = 'json';\n xhr.onabort = () => reject(new Error('Request aborted'));\n xhr.onerror = () => reject(new Error('Request error'));\n\n if (onProgress) {\n xhr.upload.onprogress = (e) => onProgress(e);\n xhr.upload.onload = (e) => onProgress(e);\n }\n\n xhr.onload = () => {\n if (xhr.status >= 200 && xhr.status < 300) {\n resolve(xhr.response);\n } else {\n reject(new Error(xhr.statusText));\n }\n };\n\n xhr.open('POST', url);\n xhr.withCredentials = true;\n xhr.setRequestHeader('Authorization', 'Bearer ' + this.#accessToken);\n xhr.setRequestHeader('Cache-Control', 'no-cache, no-store, max-age=0');\n xhr.setRequestHeader('Content-Type', contentType);\n xhr.setRequestHeader('X-Medplum', 'extended');\n xhr.send(data);\n });\n }\n\n /**\n * Creates a PDF as a FHIR `Binary` resource based on pdfmake document definition.\n *\n * The return value is the newly created resource, including the ID and meta.\n *\n * The `docDefinition` parameter is a pdfmake document definition.\n *\n * Example:\n *\n * ```typescript\n * const result = await medplum.createPdf({\n * content: ['Hello world']\n * });\n * console.log(result.id);\n * ```\n *\n * See the pdfmake document definition for full details: https://pdfmake.github.io/docs/0.1/document-definition-object/\n *\n * @category Media\n * @param docDefinition The PDF document definition.\n * @returns The result of the create operation.\n */\n async createPdf(\n docDefinition: TDocumentDefinitions,\n filename?: string,\n tableLayouts?: { [name: string]: CustomTableLayout },\n fonts?: TFontDictionary\n ): Promise<Binary> {\n if (!this.#createPdf) {\n throw new Error('PDF creation not enabled');\n }\n const blob = await this.#createPdf(docDefinition, tableLayouts, fonts);\n return this.createBinary(blob, filename, 'application/pdf');\n }\n\n /**\n * Creates a FHIR `Communication` resource with the provided data content.\n *\n * This is a convenience method to handle commmon cases where a `Communication` resource is created with a `payload`.\n *\n * @category Create\n * @param resource The FHIR resource to comment on.\n * @param text The text of the comment.\n * @returns The result of the create operation.\n */\n createComment(resource: Resource, text: string): Promise<Communication> {\n const profile = this.getProfile();\n let encounter: Reference<Encounter> | undefined = undefined;\n let subject: Reference<Patient> | undefined = undefined;\n\n if (resource.resourceType === 'Encounter') {\n encounter = createReference(resource);\n subject = resource.subject as Reference<Patient> | undefined;\n }\n\n if (resource.resourceType === 'ServiceRequest') {\n encounter = resource.encounter;\n subject = resource.subject as Reference<Patient> | undefined;\n }\n\n if (resource.resourceType === 'Patient') {\n subject = createReference(resource);\n }\n\n return this.createResource<Communication>({\n resourceType: 'Communication',\n basedOn: [createReference(resource)],\n encounter,\n subject,\n sender: profile ? createReference(profile) : undefined,\n sent: new Date().toISOString(),\n payload: [{ contentString: text }],\n });\n }\n\n /**\n * Updates a FHIR resource.\n *\n * The return value is the updated resource, including the ID and meta.\n *\n * Example:\n *\n * ```typescript\n * const result = await medplum.updateResource({\n * resourceType: 'Patient',\n * id: '123',\n * name: [{\n * family: 'Smith',\n * given: ['John']\n * }]\n * });\n * console.log(result.meta.versionId);\n * ```\n *\n * See the FHIR \"update\" operation for full details: https://www.hl7.org/fhir/http.html#update\n *\n * @category Write\n * @param resource The FHIR resource to update.\n * @returns The result of the update operation.\n */\n async updateResource<T extends Resource>(resource: T): Promise<T> {\n if (!resource.resourceType) {\n throw new Error('Missing resourceType');\n }\n if (!resource.id) {\n throw new Error('Missing id');\n }\n this.invalidateSearches(resource.resourceType);\n let result = await this.put(this.fhirUrl(resource.resourceType, resource.id), resource);\n if (!result) {\n // On 304 not modified, result will be undefined\n // Return the user input instead\n // return result ?? resource;\n result = resource;\n }\n this.#cacheResource(result);\n return result;\n }\n\n /**\n * Updates a FHIR resource using JSONPatch operations.\n *\n * The return value is the updated resource, including the ID and meta.\n *\n * Example:\n *\n * ```typescript\n * const result = await medplum.patchResource('Patient', '123', [\n * {op: 'replace', path: '/name/0/family', value: 'Smith'},\n * ]);\n * console.log(result.meta.versionId);\n * ```\n *\n * See the FHIR \"update\" operation for full details: https://www.hl7.org/fhir/http.html#patch\n *\n * See the JSONPatch specification for full details: https://tools.ietf.org/html/rfc6902\n *\n * @category Write\n * @param resourceType The FHIR resource type.\n * @param id The resource ID.\n * @param operations The JSONPatch operations.\n * @returns The result of the patch operations.\n */\n patchResource<K extends ResourceType>(\n resourceType: K,\n id: string,\n operations: PatchOperation[]\n ): Promise<ExtractResource<K>> {\n this.invalidateSearches(resourceType);\n return this.patch(this.fhirUrl(resourceType, id), operations);\n }\n\n /**\n * Deletes a FHIR resource by resource type and ID.\n *\n * Example:\n *\n * ```typescript\n * await medplum.deleteResource('Patient', '123');\n * ```\n *\n * See the FHIR \"delete\" operation for full details: https://www.hl7.org/fhir/http.html#delete\n *\n * @category Delete\n * @param resourceType The FHIR resource type.\n * @param id The resource ID.\n * @returns The result of the delete operation.\n */\n deleteResource(resourceType: ResourceType, id: string): Promise<any> {\n this.#deleteCacheEntry(this.fhirUrl(resourceType, id).toString());\n this.invalidateSearches(resourceType);\n return this.delete(this.fhirUrl(resourceType, id));\n }\n\n /**\n * Executes the validate operation with the provided resource.\n *\n * Example:\n *\n * ```typescript\n * const result = await medplum.validateResource({\n * resourceType: 'Patient',\n * name: [{ given: ['Alice'], family: 'Smith' }],\n * });\n * ```\n *\n * See the FHIR \"$validate\" operation for full details: https://www.hl7.org/fhir/resource-operation-validate.html\n *\n * @param resource The FHIR resource.\n * @returns The validate operation outcome.\n */\n validateResource<T extends Resource>(resource: T): Promise<OperationOutcome> {\n return this.post(this.fhirUrl(resource.resourceType, '$validate'), resource);\n }\n\n /**\n * Executes a batch or transaction of FHIR operations.\n *\n * Example:\n *\n * ```typescript\n * await medplum.executeBatch({\n * \"resourceType\": \"Bundle\",\n * \"type\": \"transaction\",\n * \"entry\": [\n * {\n * \"fullUrl\": \"urn:uuid:61ebe359-bfdc-4613-8bf2-c5e300945f0a\",\n * \"resource\": {\n * \"resourceType\": \"Patient\",\n * \"name\": [{ \"use\": \"official\", \"given\": [\"Alice\"], \"family\": \"Smith\" }],\n * \"gender\": \"female\",\n * \"birthDate\": \"1974-12-25\"\n * },\n * \"request\": {\n * \"method\": \"POST\",\n * \"url\": \"Patient\"\n * }\n * },\n * {\n * \"fullUrl\": \"urn:uuid:88f151c0-a954-468a-88bd-5ae15c08e059\",\n * \"resource\": {\n * \"resourceType\": \"Patient\",\n * \"identifier\": [{ \"system\": \"http:/example.org/fhir/ids\", \"value\": \"234234\" }],\n * \"name\": [{ \"use\": \"official\", \"given\": [\"Bob\"], \"family\": \"Jones\" }],\n * \"gender\": \"male\",\n * \"birthDate\": \"1974-12-25\"\n * },\n * \"request\": {\n * \"method\": \"POST\",\n * \"url\": \"Patient\",\n * \"ifNoneExist\": \"identifier=http:/example.org/fhir/ids|234234\"\n * }\n * }\n * ]\n * });\n * ```\n *\n * See The FHIR \"batch/transaction\" section for full details: https://hl7.org/fhir/http.html#transaction\n * @category Batch\n * @param bundle The FHIR batch/transaction bundle.\n * @returns The FHIR batch/transaction response bundle.\n */\n executeBatch(bundle: Bundle): Promise<Bundle> {\n return this.post('fhir/R4', bundle);\n }\n\n /**\n * Sends an email using the Medplum Email API.\n *\n * Builds the email using nodemailer MailComposer.\n *\n * Examples:\n *\n * Send a simple text email:\n *\n * ```typescript\n * await medplum.sendEmail({\n * to: 'alice@example.com',\n * cc: 'bob@example.com',\n * subject: 'Hello',\n * text: 'Hello Alice',\n * });\n * ```\n *\n * Send an email with a `Binary` attachment:\n *\n * ```typescript\n * await medplum.sendEmail({\n * to: 'alice@example.com',\n * subject: 'Email with attachment',\n * text: 'See the attached report',\n * attachments: [{\n * filename: 'report.pdf',\n * path: \"Binary/\" + binary.id\n * }]\n * });\n * ```\n *\n * See options here: https://nodemailer.com/extras/mailcomposer/\n * @category Media\n * @param options The MailComposer options.\n * @returns Promise to the operation outcome.\n */\n sendEmail(email: MailOptions): Promise<OperationOutcome> {\n return this.post('email/v1/send', email, 'application/json');\n }\n\n /**\n * Executes a GraphQL query.\n *\n * Example:\n *\n * ```typescript\n * const result = await medplum.graphql(`{\n * Patient(id: \"123\") {\n * resourceType\n * id\n * name {\n * given\n * family\n * }\n * }\n * }`);\n * ```\n *\n * Advanced queries such as named operations and variable substitution are supported:\n *\n * ```typescript\n * const result = await medplum.graphql(\n * `query GetPatientById($patientId: ID!) {\n * Patient(id: $patientId) {\n * resourceType\n * id\n * name {\n * given\n * family\n * }\n * }\n * }`,\n * 'GetPatientById',\n * { patientId: '123' }\n * );\n * ```\n *\n * See the GraphQL documentation for more details: https://graphql.org/learn/\n *\n * See the FHIR GraphQL documentation for FHIR specific details: https://www.hl7.org/fhir/graphql.html\n *\n * @category Read\n * @param query The GraphQL query.\n * @param operationName Optional GraphQL operation name.\n * @param variables Optional GraphQL variables.\n * @param options Optional fetch options.\n * @returns The GraphQL result.\n */\n graphql(query: string, operationName?: string | null, variables?: any, options?: RequestInit): Promise<any> {\n return this.post(this.fhirUrl('$graphql'), { query, operationName, variables }, JSON_CONTENT_TYPE, options);\n }\n\n /**\n *\n * Executes the $graph operation on this resource to fetch a Bundle of resources linked to the target resource\n * according to a graph definition\n\n * @category Read\n * @param resourceType The FHIR resource type.\n * @param id The resource ID.\n * @param graphName `name` parameter of the GraphDefinition\n * @returns A Bundle\n */\n readResourceGraph<K extends ResourceType>(\n resourceType: K,\n id: string,\n graphName: string\n ): ReadablePromise<Bundle<Resource>> {\n return this.get<Bundle<Resource>>(`${this.fhirUrl(resourceType, id)}/$graph?graph=${graphName}`);\n }\n\n /**\n * @category Authentication\n * @returns The Login State\n */\n getActiveLogin(): LoginState | undefined {\n return this.#storage.getObject('activeLogin');\n }\n\n /**\n * @category Authentication\n */\n async setActiveLogin(login: LoginState): Promise<void> {\n this.clearActiveLogin();\n this.#accessToken = login.accessToken;\n this.#refreshToken = login.refreshToken;\n this.#storage.setObject('activeLogin', login);\n this.#addLogin(login);\n this.#refreshPromise = undefined;\n await this.#refreshProfile();\n }\n\n /**\n * @category Authentication\n */\n getAccessToken(): string | undefined {\n return this.#accessToken;\n }\n\n /**\n * @category Authentication\n */\n setAccessToken(accessToken: string): void {\n this.#accessToken = accessToken;\n this.#refreshToken = undefined;\n this.#profile = undefined;\n this.#config = undefined;\n }\n\n /**\n * @category Authentication\n */\n getLogins(): LoginState[] {\n return this.#storage.getObject<LoginState[]>('logins') ?? [];\n }\n\n #addLogin(newLogin: LoginState): void {\n const logins = this.getLogins().filter((login) => login.profile?.reference !== newLogin.profile?.reference);\n logins.push(newLogin);\n this.#storage.setObject('logins', logins);\n }\n\n async #refreshProfile(): Promise<ProfileResource | undefined> {\n this.#profilePromise = new Promise((resolve, reject) => {\n this.get('auth/me')\n .then((result) => {\n this.#profilePromise = undefined;\n this.#profile = result.profile;\n this.#config = result.config;\n this.dispatchEvent({ type: 'change' });\n resolve(this.#profile);\n })\n .catch(reject);\n });\n\n return this.#profilePromise;\n }\n\n /**\n * @category Authentication\n */\n isLoading(): boolean {\n return !!this.#profilePromise;\n }\n\n /**\n * @category User Profile\n */\n getProfile(): ProfileResource | undefined {\n return this.#profile;\n }\n\n /**\n * @category User Profile\n */\n async getProfileAsync(): Promise<ProfileResource | undefined> {\n if (this.#profilePromise) {\n await this.#profilePromise;\n }\n return this.getProfile();\n }\n\n /**\n * @category User Profile\n */\n getUserConfiguration(): UserConfiguration | undefined {\n return this.#config;\n }\n\n /**\n * Downloads the URL as a blob.\n *\n * @category Read\n * @param url The URL to request.\n * @returns Promise to the response body as a blob.\n */\n async download(url: URL | string, options: RequestInit = {}): Promise<Blob> {\n if (this.#refreshPromise) {\n await this.#refreshPromise;\n }\n this.#addFetchOptionsDefaults(options);\n const response = await this.#fetch(url.toString(), options);\n return response.blob();\n }\n\n //\n // Private helpers\n //\n\n /**\n * Returns the cache entry if available and not expired.\n * @param key The cache key to retrieve.\n * @param options Optional fetch options for cache settings.\n * @returns The cached entry if found.\n */\n #getCacheEntry(key: string, options: RequestInit | undefined): RequestCacheEntry | undefined {\n if (this.#cacheTime <= 0 || options?.cache === 'no-cache' || options?.cache === 'reload') {\n return undefined;\n }\n const entry = this.#requestCache.get(key);\n if (!entry || entry.requestTime + this.#cacheTime < Date.now()) {\n return undefined;\n }\n return entry;\n }\n\n /**\n * Adds a readable promise to the cache.\n * @param key The cache key to store.\n * @param value The readable promise to store.\n */\n #setCacheEntry(key: string, value: ReadablePromise<any>): void {\n if (this.#cacheTime > 0) {\n this.#requestCache.set(key, { requestTime: Date.now(), value });\n }\n }\n\n /**\n * Adds a concrete value as the cache entry for the given resource.\n * This is used in cases where the resource is loaded indirectly.\n * For example, when a resource is loaded as part of a Bundle.\n * @param resource The resource to cache.\n */\n #cacheResource(resource: Resource | undefined): void {\n if (resource?.id) {\n this.#setCacheEntry(\n this.fhirUrl(resource.resourceType, resource.id).toString(),\n new ReadablePromise(Promise.resolve(resource))\n );\n }\n }\n\n /**\n * Deletes a cache entry.\n * @param key The cache key to delete.\n */\n #deleteCacheEntry(key: string): void {\n if (this.#cacheTime > 0) {\n this.#requestCache.delete(key);\n }\n }\n\n /**\n * Makes an HTTP request.\n * @param {string} method\n * @param {string} url\n * @param {string=} contentType\n * @param {Object=} body\n */\n async #request<T>(method: string, url: string, options: RequestInit = {}): Promise<T> {\n if (this.#refreshPromise) {\n await this.#refreshPromise;\n }\n\n if (!url.startsWith('http')) {\n url = this.#baseUrl + url;\n }\n\n options.method = method;\n this.#addFetchOptionsDefaults(options);\n\n const response = await this.#fetchWithRetry(url, options);\n if (response.status === 401) {\n // Refresh and try again\n return this.#handleUnauthenticated(method, url, options);\n }\n\n if (response.status === 204 || response.status === 304) {\n // No content or change\n return undefined as unknown as T;\n }\n\n let obj: any = undefined;\n try {\n obj = await response.json();\n } catch (err) {\n console.error('Error parsing response', response.status, err);\n throw err;\n }\n\n if (response.status >= 400) {\n throw new OperationOutcomeError(normalizeOperationOutcome(obj));\n }\n return obj;\n }\n\n async #fetchWithRetry(url: string, options: RequestInit): Promise<Response> {\n const maxRetries = 3;\n const retryDelay = 200;\n let response: Response | undefined = undefined;\n for (let retry = 0; retry < maxRetries; retry++) {\n response = (await this.#fetch(url, options)) as Response;\n if (response.status < 500) {\n return response;\n }\n await new Promise((resolve) => setTimeout(resolve, retryDelay));\n }\n return response as Response;\n }\n\n /**\n * Executes a batch of requests that were automatically batched together.\n */\n async #executeAutoBatch(): Promise<void> {\n // Get the current queue\n const entries = [...this.#autoBatchQueue];\n\n // Clear the queue\n this.#autoBatchQueue.length = 0;\n\n // Clear the timer\n this.#autoBatchTimerId = undefined;\n\n // If there is only one request in the batch, just execute it\n if (entries.length === 1) {\n const entry = entries[0];\n entry.resolve(await this.#request(entry.method, this.#fhirBaseUrl + entry.url, entry.options));\n return;\n }\n\n // Build the batch request\n const batch: Bundle = {\n resourceType: 'Bundle',\n type: 'batch',\n entry: entries.map(\n (e) =>\n ({\n request: {\n method: e.method,\n url: e.url,\n },\n resource: e.options.body ? (JSON.parse(e.options.body as string) as Resource) : undefined,\n } as BundleEntry)\n ),\n };\n\n // Execute the batch request\n const response = (await this.post('fhir/R4', batch)) as Bundle;\n\n // Process the response\n for (let i = 0; i < entries.length; i++) {\n const entry = entries[i];\n const responseEntry = response.entry?.[i];\n if (responseEntry?.response?.outcome && !isOk(responseEntry.response.outcome)) {\n entry.reject(new OperationOutcomeError(responseEntry.response.outcome));\n } else {\n entry.resolve(responseEntry?.resource);\n }\n }\n }\n\n /**\n * Adds default options to the fetch options.\n * @param options The options to add defaults to.\n */\n #addFetchOptionsDefaults(options: RequestInit): void {\n if (!options.headers) {\n options.headers = {};\n }\n\n const headers = options.headers as Record<string, string>;\n headers['X-Medplum'] = 'extended';\n\n if (!headers['Content-Type']) {\n headers['Content-Type'] = FHIR_CONTENT_TYPE;\n }\n\n if (this.#accessToken) {\n headers['Authorization'] = 'Bearer ' + this.#accessToken;\n }\n\n if (!options.cache) {\n options.cache = 'no-cache';\n }\n\n if (!options.credentials) {\n options.credentials = 'include';\n }\n }\n\n /**\n * Sets the \"Content-Type\" header on fetch options.\n * @param options The fetch options.\n * @param contentType The new content type to set.\n */\n #setRequestContentType(options: RequestInit, contentType: string): void {\n if (!options.headers) {\n options.headers = {};\n }\n const headers = options.headers as Record<string, string>;\n headers['Content-Type'] = contentType;\n }\n\n /**\n * Sets the body on fetch options.\n * @param options The fetch options.\n * @param data The new content body.\n */\n #setRequestBody(options: RequestInit, data: any): void {\n if (\n typeof data === 'string' ||\n (typeof Blob !== 'undefined' && data instanceof Blob) ||\n (typeof File !== 'undefined' && data instanceof File) ||\n (typeof Uint8Array !== 'undefined' && data instanceof Uint8Array)\n ) {\n options.body = data;\n } else if (data) {\n options.body = JSON.stringify(data);\n }\n }\n\n /**\n * Handles an unauthenticated response from the server.\n * First, tries to refresh the access token and retry the request.\n * Otherwise, calls unauthenticated callbacks and rejects.\n * @param method The HTTP method of the original request.\n * @param url The URL of the original request.\n * @param contentType The content type of the original request.\n * @param body The body of the original request.\n */\n #handleUnauthenticated(method: string, url: string, options: RequestInit): Promise<any> {\n if (this.#refresh()) {\n return this.#request(method, url, options);\n }\n this.clearActiveLogin();\n if (this.#onUnauthenticated) {\n this.#onUnauthenticated();\n }\n return Promise.reject(new Error('Unauthenticated'));\n }\n\n /**\n * Starts a new PKCE flow.\n * These PKCE values are stateful, and must survive redirects and page refreshes.\n * @category Authentication\n */\n async startPkce(): Promise<{ codeChallengeMethod: string; codeChallenge: string }> {\n const pkceState = getRandomString();\n sessionStorage.setItem('pkceState', pkceState);\n\n const codeVerifier = getRandomString();\n sessionStorage.setItem('codeVerifier', codeVerifier);\n\n const arrayHash = await encryptSHA256(codeVerifier);\n const codeChallenge = arrayBufferToBase64(arrayHash).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=/g, '');\n sessionStorage.setItem('codeChallenge', codeChallenge);\n\n return { codeChallengeMethod: 'S256', codeChallenge };\n }\n\n /**\n * Redirects the user to the login screen for authorization.\n * Clears all auth state including local storage and session storage.\n * See: https://openid.net/specs/openid-connect-core-1_0.html#AuthorizationEndpoint\n */\n async #requestAuthorization(loginParams?: Partial<BaseLoginRequest>): Promise<void> {\n const loginRequest = await this.ensureCodeChallenge(loginParams || {});\n const url = new URL(this.#authorizeUrl);\n url.searchParams.set('response_type', 'code');\n url.searchParams.set('state', sessionStorage.getItem('pkceState') as string);\n url.searchParams.set('client_id', loginRequest.clientId || (this.#clientId as string));\n url.searchParams.set('redirect_uri', loginRequest.redirectUri || getWindowOrigin());\n url.searchParams.set('code_challenge_method', loginRequest.codeChallengeMethod as string);\n url.searchParams.set('code_challenge', loginRequest.codeChallenge as string);\n url.searchParams.set('scope', loginRequest.scope || 'openid profile');\n window.location.assign(url.toString());\n }\n\n /**\n * Processes an OAuth authorization code.\n * See: https://openid.net/specs/openid-connect-core-1_0.html#TokenRequest\n * @param code The authorization code received by URL parameter.\n * @category Authentication\n */\n processCode(code: string): Promise<ProfileResource> {\n const formBody = new URLSearchParams();\n formBody.set('grant_type', 'authorization_code');\n formBody.set('client_id', this.#clientId as string);\n formBody.set('code', code);\n formBody.set('redirect_uri', getWindowOrigin());\n\n if (typeof sessionStorage !== 'undefined') {\n const codeVerifier = sessionStorage.getItem('codeVerifier');\n if (codeVerifier) {\n formBody.set('code_verifier', codeVerifier);\n }\n }\n\n return this.#fetchTokens(formBody);\n }\n\n /**\n * Tries to refresh the auth tokens.\n * See: https://openid.net/specs/openid-connect-core-1_0.html#RefreshTokens\n */\n #refresh(): Promise<void> | undefined {\n if (this.#refreshPromise) {\n return this.#refreshPromise;\n }\n\n if (this.#refreshToken) {\n const formBody = new URLSearchParams();\n formBody.set('grant_type', 'refresh_token');\n formBody.set('client_id', this.#clientId as string);\n formBody.set('refresh_token', this.#refreshToken);\n this.#refreshPromise = this.#fetchTokens(formBody);\n return this.#refreshPromise;\n }\n\n if (this.#clientId && this.#clientSecret) {\n this.#refreshPromise = this.startClientLogin(this.#clientId, this.#clientSecret);\n return this.#refreshPromise;\n }\n\n return undefined;\n }\n\n /**\n * Starts a new OAuth2 client credentials flow.\n * See: https://datatracker.ietf.org/doc/html/rfc6749#section-4.4\n * @category Authentication\n * @param clientId The client ID.\n * @param clientSecret The client secret.\n * @returns Promise that resolves to the client profile.\n */\n async startClientLogin(clientId: string, clientSecret: string): Promise<ProfileResource> {\n this.#clientId = clientId;\n this.#clientSecret = clientSecret;\n\n const formBody = new URLSearchParams();\n formBody.set('grant_type', 'client_credentials');\n formBody.set('client_id', clientId);\n formBody.set('client_secret', clientSecret);\n return this.#fetchTokens(formBody);\n }\n\n /**\n * Makes a POST request to the tokens endpoint.\n * See: https://openid.net/specs/openid-connect-core-1_0.html#TokenEndpoint\n * @param formBody Token parameters in URL encoded format.\n */\n async #fetchTokens(formBody: URLSearchParams): Promise<ProfileResource> {\n const response = await this.#fetch(this.#tokenUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n body: formBody,\n credentials: 'include',\n });\n if (!response.ok) {\n this.clearActiveLogin();\n throw new Error('Failed to fetch tokens');\n }\n const tokens = await response.json();\n await this.#verifyTokens(tokens);\n return this.getProfile() as ProfileResource;\n }\n\n /**\n * Verifies the tokens received from the auth server.\n * Validates the JWT against the JWKS.\n * See: https://openid.net/specs/openid-connect-core-1_0.html#TokenEndpoint\n * @param tokens\n */\n async #verifyTokens(tokens: TokenResponse): Promise<void> {\n const token = tokens.access_token;\n\n // Verify token has not expired\n const tokenPayload = parseJWTPayload(token);\n if (Date.now() >= (tokenPayload.exp as number) * 1000) {\n this.clearActiveLogin();\n throw new Error('Token expired');\n }\n\n // Verify app_client_id\n if (this.#clientId && tokenPayload.client_id !== this.#clientId) {\n this.clearActiveLogin();\n throw new Error('Token was not issued for this audience');\n }\n\n return this.setActiveLogin({\n accessToken: token,\n refreshToken: tokens.refresh_token,\n project: tokens.project,\n profile: tokens.profile,\n });\n }\n\n /**\n * Sets up a listener for window storage events.\n * This synchronizes state across browser windows and browser tabs.\n */\n #setupStorageListener(): void {\n try {\n window.addEventListener('storage', (e: StorageEvent) => {\n if (e.key === null || e.key === 'activeLogin') {\n // Storage events fire when different tabs make changes.\n // On storage clear (key === null) or activeLogin change (key === 'activeLogin')\n // Refresh the page to ensure the active login is up to date.\n window.location.reload();\n }\n });\n } catch (err) {\n // Silently ignore if this environment does not support storage events\n }\n }\n}\n\n/**\n * Returns the default fetch method.\n * The default fetch is currently only available in browser environments.\n * If you want to use SSR such as Next.js, you should pass a custom fetch function.\n * @returns The default fetch function for the current environment.\n */\nfunction getDefaultFetch(): FetchLike {\n if (!globalThis.fetch) {\n throw new Error('Fetch not available in this environment');\n }\n return globalThis.fetch.bind(globalThis);\n}\n\n/**\n * Returns the base URL for the current page.\n * @category HTTP\n */\nfunction getWindowOrigin(): string {\n if (typeof window === 'undefined') {\n return '';\n }\n return window.location.protocol + '//' + window.location.host + '/';\n}\n\nfunction ensureTrailingSlash(url: string | undefined): string | undefined {\n if (!url) {\n return url;\n }\n return url.endsWith('/') ? url : url + '/';\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.mjs","sources":["../../src/client.ts"],"sourcesContent":["// PKCE auth based on:\n// https://aws.amazon.com/blogs/security/how-to-add-authentication-single-page-web-application-with-amazon-cognito-oauth2-implementation/\n\nimport {\n Binary,\n Bundle,\n BundleEntry,\n Communication,\n Device,\n Encounter,\n ExtractResource,\n OperationOutcome,\n Patient,\n Project,\n ProjectMembership,\n ProjectSecret,\n Reference,\n Resource,\n ResourceType,\n SearchParameter,\n StructureDefinition,\n UserConfiguration,\n ValueSet,\n} from '@medplum/fhirtypes';\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n/** @ts-ignore */\nimport type { CustomTableLayout, TDocumentDefinitions, TFontDictionary } from 'pdfmake/interfaces';\nimport { LRUCache } from './cache';\nimport { encryptSHA256, getRandomString } from './crypto';\nimport { EventTarget } from './eventtarget';\nimport { Hl7Message } from './hl7';\nimport { parseJWTPayload } from './jwt';\nimport { isOk, normalizeOperationOutcome, OperationOutcomeError } from './outcomes';\nimport { ReadablePromise } from './readablepromise';\nimport { ClientStorage } from './storage';\nimport { globalSchema, IndexedStructureDefinition, indexSearchParameter, indexStructureDefinition } from './types';\nimport { arrayBufferToBase64, createReference, ProfileResource } from './utils';\n\nexport const MEDPLUM_VERSION = process.env.MEDPLUM_VERSION;\n\nconst DEFAULT_BASE_URL = 'https://api.medplum.com/';\nconst DEFAULT_RESOURCE_CACHE_SIZE = 1000;\nconst DEFAULT_CACHE_TIME = 60000; // 60 seconds\nconst JSON_CONTENT_TYPE = 'application/json';\nconst FHIR_CONTENT_TYPE = 'application/fhir+json';\nconst PATCH_CONTENT_TYPE = 'application/json-patch+json';\n\nconst system: Device = { resourceType: 'Device', id: 'system', deviceName: [{ name: 'System' }] };\n\n/**\n * The MedplumClientOptions interface defines configuration options for MedplumClient.\n *\n * All configuration settings are optional.\n */\nexport interface MedplumClientOptions {\n /**\n * Base server URL.\n *\n * Default value is https://api.medplum.com/\n *\n * Use this to point to a custom Medplum deployment.\n */\n baseUrl?: string;\n\n /**\n * OAuth2 authorize URL.\n *\n * Default value is baseUrl + \"/oauth2/authorize\".\n *\n * Use this if you want to use a separate OAuth server.\n */\n authorizeUrl?: string;\n\n /**\n * OAuth2 token URL.\n *\n * Default value is baseUrl + \"/oauth2/token\".\n *\n * Use this if you want to use a separate OAuth server.\n */\n tokenUrl?: string;\n\n /**\n * OAuth2 logout URL.\n *\n * Default value is baseUrl + \"/oauth2/logout\".\n *\n * Use this if you want to use a separate OAuth server.\n */\n logoutUrl?: string;\n\n /**\n * The client ID.\n *\n * Client ID can be used for SMART-on-FHIR customization.\n */\n clientId?: string;\n\n /**\n * Number of resources to store in the cache.\n *\n * Default value is 1000.\n *\n * Consider using this for performance of displaying Patient or Practitioner resources.\n */\n resourceCacheSize?: number;\n\n /**\n * The length of time in milliseconds to cache resources.\n *\n * Default value is 10000 (10 seconds).\n *\n * Cache time of zero disables all caching.\n *\n * For any individual request, the cache behavior can be overridden by setting the cache property on request options.\n *\n * See: https://developer.mozilla.org/en-US/docs/Web/API/Request/cache\n */\n cacheTime?: number;\n\n /**\n * The length of time in milliseconds to delay requests for auto batching.\n *\n * Auto batching attempts to group multiple requests together into a single batch request.\n *\n * Default value is 0, which disables auto batching.\n */\n autoBatchTime?: number;\n\n /**\n * Fetch implementation.\n *\n * Default is window.fetch (if available).\n *\n * For Node.js applications, consider the 'node-fetch' package.\n */\n fetch?: FetchLike;\n\n /**\n * Storage implementation.\n *\n * Default is window.localStorage (if available), or an in-memory storage implementation.\n */\n storage?: ClientStorage;\n\n /**\n * Create PDF implementation.\n *\n * Default is none, and PDF generation is disabled.\n *\n * In browser environments, import the client-side pdfmake library.\n *\n * ```html\n * <script src=\"pdfmake.min.js\"></script>\n * <script>\n * async function createPdf(docDefinition, tableLayouts, fonts) {\n * return new Promise((resolve) => {\n * pdfMake.createPdf(docDefinition, tableLayouts, fonts).getBlob(resolve);\n * });\n * }\n * </script>\n * ```\n *\n * In Node.js applications:\n *\n * ```ts\n * import type { CustomTableLayout, TDocumentDefinitions, TFontDictionary } from 'pdfmake/interfaces';\n * function createPdf(\n * docDefinition: TDocumentDefinitions,\n * tableLayouts?: { [name: string]: CustomTableLayout },\n * fonts?: TFontDictionary\n * ): Promise<Buffer> {\n * return new Promise((resolve, reject) => {\n * const printer = new PdfPrinter(fonts || {});\n * const pdfDoc = printer.createPdfKitDocument(docDefinition, { tableLayouts });\n * const chunks: Uint8Array[] = [];\n * pdfDoc.on('data', (chunk: Uint8Array) => chunks.push(chunk));\n * pdfDoc.on('end', () => resolve(Buffer.concat(chunks)));\n * pdfDoc.on('error', reject);\n * pdfDoc.end();\n * });\n * }\n * ```\n */\n createPdf?: CreatePdfFunction;\n\n /**\n * Callback for when the client is unauthenticated.\n *\n * Default is do nothing.\n *\n * For client side applications, consider redirecting to a sign in page.\n */\n onUnauthenticated?: () => void;\n}\n\nexport interface FetchLike {\n (url: string, options?: any): Promise<any>;\n}\n\n/**\n * QueryTypes defines the different ways to specify FHIR search parameters.\n *\n * Can be any valid input to the URLSearchParams() constructor.\n *\n * TypeScript definitions for URLSearchParams do not match runtime behavior.\n * The official spec only accepts string values.\n * Web browsers and Node.js automatically coerce values to strings.\n * See: https://github.com/microsoft/TypeScript/issues/32951\n */\nexport type QueryTypes = URLSearchParams | string[][] | Record<string, any> | string | undefined;\n\nexport interface CreatePdfFunction {\n (\n docDefinition: TDocumentDefinitions,\n tableLayouts?:\n | {\n [name: string]: CustomTableLayout;\n }\n | undefined,\n fonts?: TFontDictionary | undefined\n ): Promise<any>;\n}\n\nexport interface BaseLoginRequest {\n readonly projectId?: string;\n readonly clientId?: string;\n readonly resourceType?: string;\n readonly scope?: string;\n readonly nonce?: string;\n readonly codeChallenge?: string;\n readonly codeChallengeMethod?: string;\n readonly googleClientId?: string;\n readonly launch?: string;\n readonly redirectUri?: string;\n}\n\nexport interface EmailPasswordLoginRequest extends BaseLoginRequest {\n readonly email: string;\n readonly password: string;\n readonly remember?: boolean;\n}\n\nexport interface NewUserRequest {\n readonly firstName: string;\n readonly lastName: string;\n readonly email: string;\n readonly password: string;\n readonly recaptchaToken: string;\n readonly recaptchaSiteKey?: string;\n readonly remember?: boolean;\n readonly projectId?: string;\n}\n\nexport interface NewProjectRequest {\n readonly login: string;\n readonly projectName: string;\n}\n\nexport interface NewPatientRequest {\n readonly login: string;\n readonly projectId: string;\n}\n\nexport interface GoogleCredentialResponse {\n readonly clientId: string;\n readonly credential: string;\n}\n\nexport interface GoogleLoginRequest extends BaseLoginRequest {\n readonly googleClientId: string;\n readonly googleCredential: string;\n readonly createUser?: boolean;\n}\n\nexport interface LoginAuthenticationResponse {\n readonly login: string;\n readonly mfaRequired?: boolean;\n readonly code?: string;\n readonly memberships?: ProjectMembership[];\n}\n\nexport interface LoginProfileResponse {\n readonly login: string;\n readonly scope: string;\n}\n\nexport interface LoginScopeResponse {\n readonly login: string;\n readonly code: string;\n}\n\nexport interface LoginState {\n readonly project: Reference<Project>;\n readonly profile: Reference<ProfileResource>;\n readonly accessToken: string;\n readonly refreshToken: string;\n}\n\nexport interface TokenResponse {\n readonly token_type: string;\n readonly id_token: string;\n readonly access_token: string;\n readonly refresh_token: string;\n readonly expires_in: number;\n readonly project: Reference<Project>;\n readonly profile: Reference<ProfileResource>;\n}\n\nexport interface BotEvent<T = Resource | Hl7Message | string | Record<string, any>> {\n readonly contentType: string;\n readonly input: T;\n readonly secrets: Record<string, ProjectSecret>;\n}\n\n/**\n * JSONPatch patch operation.\n * Compatible with fast-json-patch and rfc6902 Operation.\n */\nexport interface PatchOperation {\n readonly op: 'add' | 'remove' | 'replace' | 'copy' | 'move' | 'test';\n readonly path: string;\n readonly value?: any;\n}\n\n/**\n * Email address definition.\n * Compatible with nodemailer Mail.Address.\n */\nexport interface MailAddress {\n readonly name: string;\n readonly address: string;\n}\n\n/**\n * Email attachment definition.\n * Compatible with nodemailer Mail.Options.\n */\nexport interface MailAttachment {\n /** String, Buffer or a Stream contents for the attachmentent */\n readonly content?: string;\n /** path to a file or an URL (data uris are allowed as well) if you want to stream the file instead of including it (better for larger attachments) */\n readonly path?: string;\n /** filename to be reported as the name of the attached file, use of unicode is allowed. If you do not want to use a filename, set this value as false, otherwise a filename is generated automatically */\n readonly filename?: string | false;\n /** optional content type for the attachment, if not set will be derived from the filename property */\n readonly contentType?: string;\n}\n\n/**\n * Email message definition.\n * Compatible with nodemailer Mail.Options.\n */\nexport interface MailOptions {\n /** The e-mail address of the sender. All e-mail addresses can be plain 'sender@server.com' or formatted 'Sender Name <sender@server.com>' */\n readonly from?: string | MailAddress;\n /** An e-mail address that will appear on the Sender: field */\n readonly sender?: string | MailAddress;\n /** Comma separated list or an array of recipients e-mail addresses that will appear on the To: field */\n readonly to?: string | MailAddress | string[] | MailAddress[];\n /** Comma separated list or an array of recipients e-mail addresses that will appear on the Cc: field */\n readonly cc?: string | MailAddress | string[] | MailAddress[];\n /** Comma separated list or an array of recipients e-mail addresses that will appear on the Bcc: field */\n readonly bcc?: string | MailAddress | string[] | MailAddress[];\n /** An e-mail address that will appear on the Reply-To: field */\n readonly replyTo?: string | MailAddress;\n /** The subject of the e-mail */\n readonly subject?: string;\n /** The plaintext version of the message */\n readonly text?: string;\n /** The HTML version of the message */\n readonly html?: string;\n /** An array of attachment objects */\n readonly attachments?: MailAttachment[];\n}\n\ninterface SchemaGraphQLResponse {\n readonly data: {\n readonly StructureDefinitionList: StructureDefinition[];\n readonly SearchParameterList: SearchParameter[];\n };\n}\n\ninterface RequestCacheEntry {\n readonly requestTime: number;\n readonly value: ReadablePromise<any>;\n}\n\ninterface AutoBatchEntry<T = any> {\n readonly method: string;\n readonly url: string;\n readonly options: RequestInit;\n readonly resolve: (value: T) => void;\n readonly reject: (reason: any) => void;\n}\n\n/**\n * The MedplumClient class provides a client for the Medplum FHIR server.\n *\n * The client can be used in the browser, in a Node.js application, or in a Medplum Bot.\n *\n * The client provides helpful methods for common operations such as:\n * 1) Authenticating\n * 2) Creating resources\n * 2) Reading resources\n * 3) Updating resources\n * 5) Deleting resources\n * 6) Searching\n * 7) Making GraphQL queries\n *\n * Here is a quick example of how to use the client:\n *\n * ```typescript\n * import { MedplumClient } from '@medplum/core';\n * const medplum = new MedplumClient();\n * ```\n *\n * Create a `Patient`:\n *\n * ```typescript\n * const patient = await medplum.createResource({\n * resourceType: 'Patient',\n * name: [{\n * given: ['Alice'],\n * family: 'Smith'\n * }]\n * });\n * ```\n *\n * Read a `Patient` by ID:\n *\n * ```typescript\n * const patient = await medplum.readResource('Patient', '123');\n * console.log(patient.name[0].given[0]);\n * ```\n *\n * Search for a `Patient` by name:\n *\n * ```typescript\n * const bundle = await medplum.search('Patient', 'name=Alice');\n * console.log(bundle.total);\n * ```\n *\n * <head>\n * <meta name=\"algolia:pageRank\" content=\"100\" />\n * </head>\n\n */\nexport class MedplumClient extends EventTarget {\n readonly #fetch: FetchLike;\n readonly #createPdf?: CreatePdfFunction;\n readonly #storage: ClientStorage;\n readonly #requestCache: LRUCache<RequestCacheEntry>;\n readonly #cacheTime: number;\n readonly #baseUrl: string;\n readonly #fhirBaseUrl: string;\n readonly #authorizeUrl: string;\n readonly #tokenUrl: string;\n readonly #logoutUrl: string;\n readonly #onUnauthenticated?: () => void;\n readonly #autoBatchTime: number;\n readonly #autoBatchQueue: AutoBatchEntry[];\n #clientId?: string;\n #clientSecret?: string;\n #autoBatchTimerId?: any;\n #accessToken?: string;\n #refreshToken?: string;\n #refreshPromise?: Promise<any>;\n #profilePromise?: Promise<any>;\n #profile?: ProfileResource;\n #config?: UserConfiguration;\n\n constructor(options?: MedplumClientOptions) {\n super();\n\n if (options?.baseUrl) {\n if (!options.baseUrl.startsWith('http')) {\n throw new Error('Base URL must start with http or https');\n }\n }\n\n this.#fetch = options?.fetch || getDefaultFetch();\n this.#storage = options?.storage || new ClientStorage();\n this.#createPdf = options?.createPdf;\n this.#requestCache = new LRUCache(options?.resourceCacheSize ?? DEFAULT_RESOURCE_CACHE_SIZE);\n this.#cacheTime = options?.cacheTime ?? DEFAULT_CACHE_TIME;\n this.#baseUrl = ensureTrailingSlash(options?.baseUrl) || DEFAULT_BASE_URL;\n this.#fhirBaseUrl = this.#baseUrl + 'fhir/R4/';\n this.#clientId = options?.clientId || '';\n this.#authorizeUrl = options?.authorizeUrl || this.#baseUrl + 'oauth2/authorize';\n this.#tokenUrl = options?.tokenUrl || this.#baseUrl + 'oauth2/token';\n this.#logoutUrl = options?.logoutUrl || this.#baseUrl + 'oauth2/logout';\n this.#onUnauthenticated = options?.onUnauthenticated;\n this.#autoBatchTime = options?.autoBatchTime ?? 0;\n this.#autoBatchQueue = [];\n\n const activeLogin = this.getActiveLogin();\n if (activeLogin) {\n this.#accessToken = activeLogin.accessToken;\n this.#refreshToken = activeLogin.refreshToken;\n this.#refreshProfile().catch(console.log);\n }\n\n this.#setupStorageListener();\n }\n\n /**\n * Returns the current base URL for all API requests.\n * By default, this is set to `https://api.medplum.com/`.\n * This can be overridden by setting the `baseUrl` option when creating the client.\n * @category HTTP\n * @returns The current base URL for all API requests.\n */\n getBaseUrl(): string {\n return this.#baseUrl;\n }\n\n /**\n * Clears all auth state including local storage and session storage.\n * @category Authentication\n */\n clear(): void {\n this.#storage.clear();\n this.clearActiveLogin();\n }\n\n /**\n * Clears the active login from local storage.\n * Does not clear all local storage (such as other logins).\n * @category Authentication\n */\n clearActiveLogin(): void {\n this.#storage.setString('activeLogin', undefined);\n this.#requestCache.clear();\n this.#accessToken = undefined;\n this.#refreshToken = undefined;\n this.#profile = undefined;\n this.#config = undefined;\n this.dispatchEvent({ type: 'change' });\n }\n\n /**\n * Invalidates any cached values or cached requests for the given URL.\n * @category Caching\n * @param url The URL to invalidate.\n */\n invalidateUrl(url: URL | string): void {\n url = url.toString();\n this.#requestCache.delete(url);\n }\n\n /**\n * Invalidates all cached search results or cached requests for the given resourceType.\n * @category Caching\n * @param resourceType The resource type to invalidate.\n */\n invalidateSearches<K extends ResourceType>(resourceType: K): void {\n const url = 'fhir/R4/' + resourceType;\n for (const key of this.#requestCache.keys()) {\n if (key.endsWith(url) || key.includes(url + '?')) {\n this.#requestCache.delete(key);\n }\n }\n }\n\n /**\n * Makes an HTTP GET request to the specified URL.\n *\n * This is a lower level method for custom requests.\n * For common operations, we recommend using higher level methods\n * such as `readResource()`, `search()`, etc.\n *\n * @category HTTP\n * @param url The target URL.\n * @param options Optional fetch options.\n * @returns Promise to the response content.\n */\n get<T = any>(url: URL | string, options: RequestInit = {}): ReadablePromise<T> {\n url = url.toString();\n const cached = this.#getCacheEntry(url, options);\n if (cached) {\n return cached.value;\n }\n\n let promise: Promise<T>;\n\n if (url.startsWith(this.#fhirBaseUrl) && this.#autoBatchTime > 0) {\n promise = new Promise<T>((resolve, reject) => {\n this.#autoBatchQueue.push({\n method: 'GET',\n url: (url as string).replace(this.#fhirBaseUrl, ''),\n options,\n resolve,\n reject,\n });\n if (!this.#autoBatchTimerId) {\n this.#autoBatchTimerId = setTimeout(() => this.#executeAutoBatch(), this.#autoBatchTime);\n }\n });\n } else {\n promise = this.#request<T>('GET', url, options);\n }\n\n const readablePromise = new ReadablePromise(promise);\n this.#setCacheEntry(url, readablePromise);\n return readablePromise;\n }\n\n /**\n * Makes an HTTP POST request to the specified URL.\n *\n * This is a lower level method for custom requests.\n * For common operations, we recommend using higher level methods\n * such as `createResource()`.\n *\n * @category HTTP\n * @param url The target URL.\n * @param body The content body. Strings and `File` objects are passed directly. Other objects are converted to JSON.\n * @param contentType The content type to be included in the \"Content-Type\" header.\n * @param options Optional fetch options.\n * @returns Promise to the response content.\n */\n post(url: URL | string, body: any, contentType?: string, options: RequestInit = {}): Promise<any> {\n url = url.toString();\n if (body) {\n this.#setRequestBody(options, body);\n }\n if (contentType) {\n this.#setRequestContentType(options, contentType);\n }\n this.invalidateUrl(url);\n return this.#request('POST', url, options);\n }\n\n /**\n * Makes an HTTP PUT request to the specified URL.\n *\n * This is a lower level method for custom requests.\n * For common operations, we recommend using higher level methods\n * such as `updateResource()`.\n *\n * @category HTTP\n * @param url The target URL.\n * @param body The content body. Strings and `File` objects are passed directly. Other objects are converted to JSON.\n * @param contentType The content type to be included in the \"Content-Type\" header.\n * @param options Optional fetch options.\n * @returns Promise to the response content.\n */\n put(url: URL | string, body: any, contentType?: string, options: RequestInit = {}): Promise<any> {\n url = url.toString();\n if (body) {\n this.#setRequestBody(options, body);\n }\n if (contentType) {\n this.#setRequestContentType(options, contentType);\n }\n this.invalidateUrl(url);\n return this.#request('PUT', url, options);\n }\n\n /**\n * Makes an HTTP PATCH request to the specified URL.\n *\n * This is a lower level method for custom requests.\n * For common operations, we recommend using higher level methods\n * such as `patchResource()`.\n *\n * @category HTTP\n * @param url The target URL.\n * @param operations Array of JSONPatch operations.\n * @param options Optional fetch options.\n * @returns Promise to the response content.\n */\n patch(url: URL | string, operations: PatchOperation[], options: RequestInit = {}): Promise<any> {\n url = url.toString();\n this.#setRequestBody(options, operations);\n this.#setRequestContentType(options, PATCH_CONTENT_TYPE);\n this.invalidateUrl(url);\n return this.#request('PATCH', url, options);\n }\n\n /**\n * Makes an HTTP DELETE request to the specified URL.\n *\n *\n * This is a lower level method for custom requests.\n * For common operations, we recommend using higher level methods\n * such as `deleteResource()`.\n *\n * @category HTTP\n * @param url The target URL.\n * @param options Optional fetch options.\n * @returns Promise to the response content.\n */\n delete(url: URL | string, options: RequestInit = {}): Promise<any> {\n url = url.toString();\n this.invalidateUrl(url);\n return this.#request('DELETE', url, options);\n }\n\n /**\n * Initiates a new user flow.\n *\n * This method is part of the two different user registration flows:\n * 1) New Practitioner and new Project\n * 2) New Patient registration\n *\n * @category Authentication\n * @param newUserRequest Register request including email and password.\n * @returns Promise to the authentication response.\n */\n async startNewUser(newUserRequest: NewUserRequest): Promise<LoginAuthenticationResponse> {\n const { codeChallengeMethod, codeChallenge } = await this.startPkce();\n return this.post('auth/newuser', {\n ...newUserRequest,\n codeChallengeMethod,\n codeChallenge,\n }) as Promise<LoginAuthenticationResponse>;\n }\n\n /**\n * Initiates a new project flow.\n *\n * This requires a partial login from `startNewUser` or `startNewGoogleUser`.\n *\n * @param newProjectRequest Register request including email and password.\n * @returns Promise to the authentication response.\n */\n async startNewProject(newProjectRequest: NewProjectRequest): Promise<LoginAuthenticationResponse> {\n return this.post('auth/newproject', newProjectRequest) as Promise<LoginAuthenticationResponse>;\n }\n\n /**\n * Initiates a new patient flow.\n *\n * This requires a partial login from `startNewUser` or `startNewGoogleUser`.\n *\n * @param newPatientRequest Register request including email and password.\n * @returns Promise to the authentication response.\n */\n async startNewPatient(newPatientRequest: NewPatientRequest): Promise<LoginAuthenticationResponse> {\n return this.post('auth/newpatient', newPatientRequest) as Promise<LoginAuthenticationResponse>;\n }\n\n /**\n * Initiates a user login flow.\n * @category Authentication\n * @param loginRequest Login request including email and password.\n * @returns Promise to the authentication response.\n */\n async startLogin(loginRequest: EmailPasswordLoginRequest): Promise<LoginAuthenticationResponse> {\n return this.post('auth/login', {\n ...(await this.ensureCodeChallenge(loginRequest)),\n clientId: loginRequest.clientId ?? this.#clientId,\n scope: loginRequest.scope,\n }) as Promise<LoginAuthenticationResponse>;\n }\n\n /**\n * Tries to sign in with Google authentication.\n * The response parameter is the result of a Google authentication.\n * See: https://developers.google.com/identity/gsi/web/guides/handle-credential-responses-js-functions\n * @category Authentication\n * @param loginRequest Login request including Google credential response.\n * @returns Promise to the authentication response.\n */\n async startGoogleLogin(loginRequest: GoogleLoginRequest): Promise<LoginAuthenticationResponse> {\n return this.post('auth/google', {\n ...(await this.ensureCodeChallenge(loginRequest)),\n clientId: loginRequest.clientId ?? this.#clientId,\n scope: loginRequest.scope,\n }) as Promise<LoginAuthenticationResponse>;\n }\n\n /**\n * Returns the PKCE code challenge and method.\n * If the login request already includes a code challenge, it is returned.\n * Otherwise, a new PKCE code challenge is generated.\n * @category Authentication\n * @param loginRequest The original login request.\n * @returns The PKCE code challenge and method.\n */\n async ensureCodeChallenge<T extends BaseLoginRequest>(loginRequest: T): Promise<T> {\n if (loginRequest.codeChallenge) {\n return loginRequest;\n }\n return { ...loginRequest, ...(await this.startPkce()) };\n }\n\n /**\n * Signs out locally.\n * Does not invalidate tokens with the server.\n * @category Authentication\n */\n async signOut(): Promise<void> {\n await this.post(this.#logoutUrl, {});\n this.clear();\n }\n\n /**\n * Tries to sign in the user.\n * Returns true if the user is signed in.\n * This may result in navigating away to the sign in page.\n * @category Authentication\n * @param loginParams Optional login parameters.\n */\n async signInWithRedirect(loginParams?: Partial<BaseLoginRequest>): Promise<ProfileResource | void> {\n const urlParams = new URLSearchParams(window.location.search);\n const code = urlParams.get('code');\n if (!code) {\n await this.#requestAuthorization(loginParams);\n return undefined;\n } else {\n return this.processCode(code);\n }\n }\n\n /**\n * Tries to sign out the user.\n * See: https://docs.aws.amazon.com/cognito/latest/developerguide/logout-endpoint.html\n * @category Authentication\n */\n signOutWithRedirect(): void {\n window.location.assign(this.#logoutUrl);\n }\n\n /**\n * Initiates sign in with an external identity provider.\n * @param authorizeUrl The external authorization URL.\n * @param clientId The external client ID.\n * @param redirectUri The external identity provider redirect URI.\n * @param baseLogin The Medplum login request.\n * @category Authentication\n */\n async signInWithExternalAuth(\n authorizeUrl: string,\n clientId: string,\n redirectUri: string,\n baseLogin: BaseLoginRequest\n ): Promise<void> {\n const loginRequest = await this.ensureCodeChallenge(baseLogin);\n window.location.assign(this.getExternalAuthRedirectUri(authorizeUrl, clientId, redirectUri, loginRequest));\n }\n\n /**\n * Builds the external identity provider redirect URI.\n * @param authorizeUrl The external authorization URL.\n * @param clientId The external client ID.\n * @param redirectUri The external identity provider redirect URI.\n * @param loginRequest The Medplum login request.\n * @returns The external identity provider redirect URI.\n * @category Authentication\n */\n getExternalAuthRedirectUri(\n authorizeUrl: string,\n clientId: string,\n redirectUri: string,\n loginRequest: BaseLoginRequest\n ): string {\n const url = new URL(authorizeUrl);\n url.searchParams.set('response_type', 'code');\n url.searchParams.set('client_id', clientId);\n url.searchParams.set('redirect_uri', redirectUri);\n url.searchParams.set('scope', 'openid profile email');\n url.searchParams.set('state', JSON.stringify(loginRequest));\n return url.toString();\n }\n\n /**\n * Builds a FHIR URL from a collection of URL path components.\n * For example, `buildUrl('/Patient', '123')` returns `fhir/R4/Patient/123`.\n * @category HTTP\n * @param path The path component of the URL.\n * @returns The well-formed FHIR URL.\n */\n fhirUrl(...path: string[]): URL {\n return new URL(this.#fhirBaseUrl + path.join('/'));\n }\n\n /**\n * Builds a FHIR search URL from a search query or structured query object.\n * @category HTTP\n * @category Search\n * @param resourceType The FHIR resource type.\n * @param query The FHIR search query or structured query object. Can be any valid input to the URLSearchParams() constructor.\n * @returns The well-formed FHIR URL.\n */\n fhirSearchUrl(resourceType: ResourceType, query: QueryTypes): URL {\n const url = this.fhirUrl(resourceType);\n if (query) {\n url.search = new URLSearchParams(query).toString();\n }\n return url;\n }\n\n /**\n * Sends a FHIR search request.\n *\n * Example using a FHIR search string:\n *\n * ```typescript\n * const bundle = await client.search('Patient', 'name=Alice');\n * console.log(bundle);\n * ```\n *\n * The return value is a FHIR bundle:\n *\n * ```json\n * {\n * \"resourceType\": \"Bundle\",\n * \"type\": \"searchset\",\n * \"entry\": [\n * {\n * \"resource\": {\n * \"resourceType\": \"Patient\",\n * \"name\": [\n * {\n * \"given\": [\n * \"George\"\n * ],\n * \"family\": \"Washington\"\n * }\n * ],\n * }\n * }\n * ]\n * }\n * ```\n *\n * To query the count of a search, use the summary feature like so:\n *\n * ```typescript\n * const patients = medplum.search('Patient', '_summary=count');\n * ```\n *\n * See FHIR search for full details: https://www.hl7.org/fhir/search.html\n *\n * @category Search\n * @param resourceType The FHIR resource type.\n * @param query Optional FHIR search query or structured query object. Can be any valid input to the URLSearchParams() constructor.\n * @param options Optional fetch options.\n * @returns Promise to the search result bundle.\n */\n search<K extends ResourceType>(\n resourceType: K,\n query?: QueryTypes,\n options: RequestInit = {}\n ): ReadablePromise<Bundle<ExtractResource<K>>> {\n const url = this.fhirSearchUrl(resourceType, query);\n const cacheKey = url.toString() + '-search';\n const cached = this.#getCacheEntry(cacheKey, options);\n if (cached) {\n return cached.value;\n }\n const promise = new ReadablePromise(\n (async () => {\n const bundle = await this.get<Bundle<ExtractResource<K>>>(url, options);\n if (bundle.entry) {\n for (const entry of bundle.entry) {\n this.#cacheResource(entry.resource);\n }\n }\n return bundle;\n })()\n );\n this.#setCacheEntry(cacheKey, promise);\n return promise;\n }\n\n /**\n * Sends a FHIR search request for a single resource.\n *\n * This is a convenience method for `search()` that returns the first resource rather than a `Bundle`.\n *\n * Example using a FHIR search string:\n *\n * ```typescript\n * const patient = await client.searchOne('Patient', 'identifier=123');\n * console.log(patient);\n * ```\n *\n * The return value is the resource, if available; otherwise, undefined.\n *\n * See FHIR search for full details: https://www.hl7.org/fhir/search.html\n *\n * @category Search\n * @param resourceType The FHIR resource type.\n * @param query Optional FHIR search query or structured query object. Can be any valid input to the URLSearchParams() constructor.\n * @param options Optional fetch options.\n * @returns Promise to the search result bundle.\n */\n searchOne<K extends ResourceType>(\n resourceType: K,\n query?: QueryTypes,\n options: RequestInit = {}\n ): ReadablePromise<ExtractResource<K> | undefined> {\n const url = this.fhirSearchUrl(resourceType, query);\n url.searchParams.set('_count', '1');\n url.searchParams.sort();\n const cacheKey = url.toString() + '-searchOne';\n const cached = this.#getCacheEntry(cacheKey, options);\n if (cached) {\n return cached.value;\n }\n const promise = new ReadablePromise(\n this.search<K>(resourceType, url.searchParams, options).then((b) => b.entry?.[0]?.resource)\n );\n this.#setCacheEntry(cacheKey, promise);\n return promise;\n }\n\n /**\n * Sends a FHIR search request for an array of resources.\n *\n * This is a convenience method for `search()` that returns the resources as an array rather than a `Bundle`.\n *\n * Example using a FHIR search string:\n *\n * ```typescript\n * const patients = await client.searchResources('Patient', 'name=Alice');\n * console.log(patients);\n * ```\n *\n * The return value is an array of resources.\n *\n * See FHIR search for full details: https://www.hl7.org/fhir/search.html\n *\n * @category Search\n * @param resourceType The FHIR resource type.\n * @param query Optional FHIR search query or structured query object. Can be any valid input to the URLSearchParams() constructor.\n * @param options Optional fetch options.\n * @returns Promise to the search result bundle.\n */\n searchResources<K extends ResourceType>(\n resourceType: K,\n query?: QueryTypes,\n options: RequestInit = {}\n ): ReadablePromise<ExtractResource<K>[]> {\n const url = this.fhirSearchUrl(resourceType, query);\n const cacheKey = url.toString() + '-searchResources';\n const cached = this.#getCacheEntry(cacheKey, options);\n if (cached) {\n return cached.value;\n }\n const promise = new ReadablePromise(\n this.search<K>(resourceType, query, options).then(\n (b) => b.entry?.map((e) => e.resource as ExtractResource<K>) ?? []\n )\n );\n this.#setCacheEntry(cacheKey, promise);\n return promise;\n }\n\n /**\n * Searches a ValueSet resource using the \"expand\" operation.\n * See: https://www.hl7.org/fhir/operation-valueset-expand.html\n *\n * @category Search\n * @param system The ValueSet system url.\n * @param filter The search string.\n * @param options Optional fetch options.\n * @returns Promise to expanded ValueSet.\n */\n searchValueSet(system: string, filter: string, options: RequestInit = {}): ReadablePromise<ValueSet> {\n const url = this.fhirUrl('ValueSet', '$expand');\n url.searchParams.set('url', system);\n url.searchParams.set('filter', filter);\n return this.get(url.toString(), options);\n }\n\n /**\n * Returns a cached resource if it is available.\n * @category Caching\n * @param resourceType The FHIR resource type.\n * @param id The FHIR resource ID.\n * @returns The resource if it is available in the cache; undefined otherwise.\n */\n getCached<K extends ResourceType>(resourceType: K, id: string): ExtractResource<K> | undefined {\n const cached = this.#requestCache.get(this.fhirUrl(resourceType, id).toString())?.value;\n return cached && cached.isOk() ? (cached.read() as ExtractResource<K>) : undefined;\n }\n\n /**\n * Returns a cached resource if it is available.\n * @category Caching\n * @param resourceType The FHIR resource type.\n * @param id The FHIR resource ID.\n * @returns The resource if it is available in the cache; undefined otherwise.\n */\n getCachedReference<T extends Resource>(reference: Reference<T>): T | undefined {\n const refString = reference.reference as string;\n if (!refString) {\n return undefined;\n }\n if (refString === 'system') {\n return system as T;\n }\n const [resourceType, id] = refString.split('/');\n if (!resourceType || !id) {\n return undefined;\n }\n return this.getCached(resourceType as ResourceType, id) as T | undefined;\n }\n\n /**\n * Reads a resource by resource type and ID.\n *\n * Example:\n *\n * ```typescript\n * const patient = await medplum.readResource('Patient', '123');\n * console.log(patient);\n * ```\n *\n * See the FHIR \"read\" operation for full details: https://www.hl7.org/fhir/http.html#read\n *\n * @category Read\n * @param resourceType The FHIR resource type.\n * @param id The resource ID.\n * @param options Optional fetch options.\n * @returns The resource if available; undefined otherwise.\n */\n readResource<K extends ResourceType>(\n resourceType: K,\n id: string,\n options: RequestInit = {}\n ): ReadablePromise<ExtractResource<K>> {\n return this.get<ExtractResource<K>>(this.fhirUrl(resourceType, id), options);\n }\n\n /**\n * Reads a resource by `Reference`.\n *\n * This is a convenience method for `readResource()` that accepts a `Reference` object.\n *\n * Example:\n *\n * ```typescript\n * const serviceRequest = await medplum.readResource('ServiceRequest', '123');\n * const patient = await medplum.readReference(serviceRequest.subject);\n * console.log(patient);\n * ```\n *\n * See the FHIR \"read\" operation for full details: https://www.hl7.org/fhir/http.html#read\n *\n * @category Read\n * @param reference The FHIR reference object.\n * @param options Optional fetch options.\n * @returns The resource if available; undefined otherwise.\n */\n readReference<T extends Resource>(reference: Reference<T>, options: RequestInit = {}): ReadablePromise<T> {\n const refString = reference?.reference;\n if (!refString) {\n return new ReadablePromise(Promise.reject(new Error('Missing reference')));\n }\n if (refString === 'system') {\n return new ReadablePromise(Promise.resolve(system as unknown as T));\n }\n const [resourceType, id] = refString.split('/');\n if (!resourceType || !id) {\n return new ReadablePromise(Promise.reject(new Error('Invalid reference')));\n }\n return this.readResource(resourceType as ResourceType, id, options) as ReadablePromise<T>;\n }\n\n /**\n * Returns a cached schema for a resource type.\n * If the schema is not cached, returns undefined.\n * It is assumed that a client will call requestSchema before using this method.\n * @category Schema\n * @returns The schema if immediately available, undefined otherwise.\n * @deprecated Use globalSchema instead.\n */\n getSchema(): IndexedStructureDefinition {\n return globalSchema;\n }\n\n /**\n * Requests the schema for a resource type.\n * If the schema is already cached, the promise is resolved immediately.\n * @category Schema\n * @param resourceType The FHIR resource type.\n * @returns Promise to a schema with the requested resource type.\n */\n requestSchema(resourceType: string): Promise<IndexedStructureDefinition> {\n if (resourceType in globalSchema.types) {\n return Promise.resolve(globalSchema);\n }\n\n const cacheKey = resourceType + '-requestSchema';\n const cached = this.#getCacheEntry(cacheKey, undefined);\n if (cached) {\n return cached.value;\n }\n\n const promise = new ReadablePromise<IndexedStructureDefinition>(\n (async () => {\n const query = `{\n StructureDefinitionList(name: \"${resourceType}\") {\n name,\n description,\n snapshot {\n element {\n id,\n path,\n min,\n max,\n type {\n code,\n targetProfile\n },\n binding {\n valueSet\n },\n definition\n }\n }\n }\n SearchParameterList(base: \"${resourceType}\", _count: 100) {\n base,\n code,\n type,\n expression,\n target\n }\n }`.replace(/\\s+/g, ' ');\n\n const response = (await this.graphql(query)) as SchemaGraphQLResponse;\n\n for (const structureDefinition of response.data.StructureDefinitionList) {\n indexStructureDefinition(structureDefinition);\n }\n\n for (const searchParameter of response.data.SearchParameterList) {\n indexSearchParameter(searchParameter);\n }\n\n return globalSchema;\n })()\n );\n this.#setCacheEntry(cacheKey, promise);\n return promise;\n }\n\n /**\n * Reads resource history by resource type and ID.\n *\n * The return value is a bundle of all versions of the resource.\n *\n * Example:\n *\n * ```typescript\n * const history = await medplum.readHistory('Patient', '123');\n * console.log(history);\n * ```\n *\n * See the FHIR \"history\" operation for full details: https://www.hl7.org/fhir/http.html#history\n *\n * @category Read\n * @param resourceType The FHIR resource type.\n * @param id The resource ID.\n * @param options Optional fetch options.\n * @returns Promise to the resource history.\n */\n readHistory<K extends ResourceType>(\n resourceType: K,\n id: string,\n options: RequestInit = {}\n ): ReadablePromise<Bundle<ExtractResource<K>>> {\n return this.get(this.fhirUrl(resourceType, id, '_history'), options);\n }\n\n /**\n * Reads a specific version of a resource by resource type, ID, and version ID.\n *\n * Example:\n *\n * ```typescript\n * const version = await medplum.readVersion('Patient', '123', '456');\n * console.log(version);\n * ```\n *\n * See the FHIR \"vread\" operation for full details: https://www.hl7.org/fhir/http.html#vread\n *\n * @category Read\n * @param resourceType The FHIR resource type.\n * @param id The resource ID.\n * @param vid The version ID.\n * @param options Optional fetch options.\n * @returns The resource if available; undefined otherwise.\n */\n readVersion<K extends ResourceType>(\n resourceType: K,\n id: string,\n vid: string,\n options: RequestInit = {}\n ): ReadablePromise<ExtractResource<K>> {\n return this.get(this.fhirUrl(resourceType, id, '_history', vid), options);\n }\n\n /**\n * Executes the Patient \"everything\" operation for a patient.\n *\n * Example:\n *\n * ```typescript\n * const bundle = await medplum.readPatientEverything('123');\n * console.log(bundle);\n * ```\n *\n * See the FHIR \"patient-everything\" operation for full details: https://hl7.org/fhir/operation-patient-everything.html\n *\n * @category Read\n * @param id The Patient Id\n * @param options Optional fetch options.\n * @returns A Bundle of all Resources related to the Patient\n */\n readPatientEverything(id: string, options: RequestInit = {}): ReadablePromise<Bundle> {\n return this.get(this.fhirUrl('Patient', id, '$everything'), options);\n }\n\n /**\n * Creates a new FHIR resource.\n *\n * The return value is the newly created resource, including the ID and meta.\n *\n * Example:\n *\n * ```typescript\n * const result = await medplum.createResource({\n * resourceType: 'Patient',\n * name: [{\n * family: 'Smith',\n * given: ['John']\n * }]\n * });\n * console.log(result.id);\n * ```\n *\n * See the FHIR \"create\" operation for full details: https://www.hl7.org/fhir/http.html#create\n *\n * @category Create\n * @param resource The FHIR resource to create.\n * @returns The result of the create operation.\n */\n createResource<T extends Resource>(resource: T): Promise<T> {\n if (!resource.resourceType) {\n throw new Error('Missing resourceType');\n }\n this.invalidateSearches(resource.resourceType);\n return this.post(this.fhirUrl(resource.resourceType), resource);\n }\n\n /**\n * Conditionally create a new FHIR resource only if some equivalent resource does not already exist on the server.\n *\n * The return value is the existing resource or the newly created resource, including the ID and meta.\n *\n * Example:\n *\n * ```typescript\n * const result = await medplum.createResourceIfNoneExist(\n * {\n * resourceType: 'Patient',\n * identifier: [{\n * system: 'http://example.com/mrn',\n * value: '123'\n * }]\n * name: [{\n * family: 'Smith',\n * given: ['John']\n * }]\n * },\n * 'identifier=123'\n * );\n * console.log(result.id);\n * ```\n *\n * This method is syntactic sugar for:\n *\n * ```typescript\n * return searchOne(resourceType, query) ?? createResource(resource);\n * ```\n *\n * The query parameter only contains the search parameters (what would be in the URL following the \"?\").\n *\n * See the FHIR \"conditional create\" operation for full details: https://www.hl7.org/fhir/http.html#ccreate\n *\n * @category Create\n * @param resource The FHIR resource to create.\n * @param query The search query for an equivalent resource (should not include resource type or \"?\").\n * @returns The result of the create operation.\n */\n async createResourceIfNoneExist<T extends Resource>(resource: T, query: string): Promise<T> {\n return ((await this.searchOne(resource.resourceType, query)) ?? this.createResource(resource)) as Promise<T>;\n }\n\n /**\n * Creates a FHIR `Binary` resource with the provided data content.\n *\n * The return value is the newly created resource, including the ID and meta.\n *\n * The `data` parameter can be a string or a `File` object.\n *\n * A `File` object often comes from a `<input type=\"file\">` element.\n *\n * Example:\n *\n * ```typescript\n * const result = await medplum.createBinary(myFile, 'test.jpg', 'image/jpeg');\n * console.log(result.id);\n * ```\n *\n * See the FHIR \"create\" operation for full details: https://www.hl7.org/fhir/http.html#create\n *\n * @category Create\n * @param data The binary data to upload.\n * @param filename Optional filename for the binary.\n * @param contentType Content type for the binary.\n * @returns The result of the create operation.\n */\n createBinary(\n data: string | File | Blob | Uint8Array,\n filename: string | undefined,\n contentType: string,\n onProgress?: (e: ProgressEvent) => void\n ): Promise<Binary> {\n const url = this.fhirUrl('Binary');\n if (filename) {\n url.searchParams.set('_filename', filename);\n }\n\n if (onProgress) {\n return this.uploadwithProgress(url, data, contentType, onProgress);\n } else {\n return this.post(url, data, contentType);\n }\n }\n\n uploadwithProgress(\n url: URL,\n data: string | File | Blob | Uint8Array,\n contentType: string,\n onProgress: (e: ProgressEvent) => void\n ): Promise<any> {\n return new Promise((resolve, reject) => {\n const xhr = new XMLHttpRequest();\n xhr.responseType = 'json';\n xhr.onabort = () => reject(new Error('Request aborted'));\n xhr.onerror = () => reject(new Error('Request error'));\n\n if (onProgress) {\n xhr.upload.onprogress = (e) => onProgress(e);\n xhr.upload.onload = (e) => onProgress(e);\n }\n\n xhr.onload = () => {\n if (xhr.status >= 200 && xhr.status < 300) {\n resolve(xhr.response);\n } else {\n reject(new Error(xhr.statusText));\n }\n };\n\n xhr.open('POST', url);\n xhr.withCredentials = true;\n xhr.setRequestHeader('Authorization', 'Bearer ' + this.#accessToken);\n xhr.setRequestHeader('Cache-Control', 'no-cache, no-store, max-age=0');\n xhr.setRequestHeader('Content-Type', contentType);\n xhr.setRequestHeader('X-Medplum', 'extended');\n xhr.send(data);\n });\n }\n\n /**\n * Creates a PDF as a FHIR `Binary` resource based on pdfmake document definition.\n *\n * The return value is the newly created resource, including the ID and meta.\n *\n * The `docDefinition` parameter is a pdfmake document definition.\n *\n * Example:\n *\n * ```typescript\n * const result = await medplum.createPdf({\n * content: ['Hello world']\n * });\n * console.log(result.id);\n * ```\n *\n * See the pdfmake document definition for full details: https://pdfmake.github.io/docs/0.1/document-definition-object/\n *\n * @category Media\n * @param docDefinition The PDF document definition.\n * @returns The result of the create operation.\n */\n async createPdf(\n docDefinition: TDocumentDefinitions,\n filename?: string,\n tableLayouts?: { [name: string]: CustomTableLayout },\n fonts?: TFontDictionary\n ): Promise<Binary> {\n if (!this.#createPdf) {\n throw new Error('PDF creation not enabled');\n }\n const blob = await this.#createPdf(docDefinition, tableLayouts, fonts);\n return this.createBinary(blob, filename, 'application/pdf');\n }\n\n /**\n * Creates a FHIR `Communication` resource with the provided data content.\n *\n * This is a convenience method to handle commmon cases where a `Communication` resource is created with a `payload`.\n *\n * @category Create\n * @param resource The FHIR resource to comment on.\n * @param text The text of the comment.\n * @returns The result of the create operation.\n */\n createComment(resource: Resource, text: string): Promise<Communication> {\n const profile = this.getProfile();\n let encounter: Reference<Encounter> | undefined = undefined;\n let subject: Reference<Patient> | undefined = undefined;\n\n if (resource.resourceType === 'Encounter') {\n encounter = createReference(resource);\n subject = resource.subject as Reference<Patient> | undefined;\n }\n\n if (resource.resourceType === 'ServiceRequest') {\n encounter = resource.encounter;\n subject = resource.subject as Reference<Patient> | undefined;\n }\n\n if (resource.resourceType === 'Patient') {\n subject = createReference(resource);\n }\n\n return this.createResource<Communication>({\n resourceType: 'Communication',\n basedOn: [createReference(resource)],\n encounter,\n subject,\n sender: profile ? createReference(profile) : undefined,\n sent: new Date().toISOString(),\n payload: [{ contentString: text }],\n });\n }\n\n /**\n * Updates a FHIR resource.\n *\n * The return value is the updated resource, including the ID and meta.\n *\n * Example:\n *\n * ```typescript\n * const result = await medplum.updateResource({\n * resourceType: 'Patient',\n * id: '123',\n * name: [{\n * family: 'Smith',\n * given: ['John']\n * }]\n * });\n * console.log(result.meta.versionId);\n * ```\n *\n * See the FHIR \"update\" operation for full details: https://www.hl7.org/fhir/http.html#update\n *\n * @category Write\n * @param resource The FHIR resource to update.\n * @returns The result of the update operation.\n */\n async updateResource<T extends Resource>(resource: T): Promise<T> {\n if (!resource.resourceType) {\n throw new Error('Missing resourceType');\n }\n if (!resource.id) {\n throw new Error('Missing id');\n }\n this.invalidateSearches(resource.resourceType);\n let result = await this.put(this.fhirUrl(resource.resourceType, resource.id), resource);\n if (!result) {\n // On 304 not modified, result will be undefined\n // Return the user input instead\n // return result ?? resource;\n result = resource;\n }\n this.#cacheResource(result);\n return result;\n }\n\n /**\n * Updates a FHIR resource using JSONPatch operations.\n *\n * The return value is the updated resource, including the ID and meta.\n *\n * Example:\n *\n * ```typescript\n * const result = await medplum.patchResource('Patient', '123', [\n * {op: 'replace', path: '/name/0/family', value: 'Smith'},\n * ]);\n * console.log(result.meta.versionId);\n * ```\n *\n * See the FHIR \"update\" operation for full details: https://www.hl7.org/fhir/http.html#patch\n *\n * See the JSONPatch specification for full details: https://tools.ietf.org/html/rfc6902\n *\n * @category Write\n * @param resourceType The FHIR resource type.\n * @param id The resource ID.\n * @param operations The JSONPatch operations.\n * @returns The result of the patch operations.\n */\n patchResource<K extends ResourceType>(\n resourceType: K,\n id: string,\n operations: PatchOperation[]\n ): Promise<ExtractResource<K>> {\n this.invalidateSearches(resourceType);\n return this.patch(this.fhirUrl(resourceType, id), operations);\n }\n\n /**\n * Deletes a FHIR resource by resource type and ID.\n *\n * Example:\n *\n * ```typescript\n * await medplum.deleteResource('Patient', '123');\n * ```\n *\n * See the FHIR \"delete\" operation for full details: https://www.hl7.org/fhir/http.html#delete\n *\n * @category Delete\n * @param resourceType The FHIR resource type.\n * @param id The resource ID.\n * @returns The result of the delete operation.\n */\n deleteResource(resourceType: ResourceType, id: string): Promise<any> {\n this.#deleteCacheEntry(this.fhirUrl(resourceType, id).toString());\n this.invalidateSearches(resourceType);\n return this.delete(this.fhirUrl(resourceType, id));\n }\n\n /**\n * Executes the validate operation with the provided resource.\n *\n * Example:\n *\n * ```typescript\n * const result = await medplum.validateResource({\n * resourceType: 'Patient',\n * name: [{ given: ['Alice'], family: 'Smith' }],\n * });\n * ```\n *\n * See the FHIR \"$validate\" operation for full details: https://www.hl7.org/fhir/resource-operation-validate.html\n *\n * @param resource The FHIR resource.\n * @returns The validate operation outcome.\n */\n validateResource<T extends Resource>(resource: T): Promise<OperationOutcome> {\n return this.post(this.fhirUrl(resource.resourceType, '$validate'), resource);\n }\n\n /**\n * Executes a batch or transaction of FHIR operations.\n *\n * Example:\n *\n * ```typescript\n * await medplum.executeBatch({\n * \"resourceType\": \"Bundle\",\n * \"type\": \"transaction\",\n * \"entry\": [\n * {\n * \"fullUrl\": \"urn:uuid:61ebe359-bfdc-4613-8bf2-c5e300945f0a\",\n * \"resource\": {\n * \"resourceType\": \"Patient\",\n * \"name\": [{ \"use\": \"official\", \"given\": [\"Alice\"], \"family\": \"Smith\" }],\n * \"gender\": \"female\",\n * \"birthDate\": \"1974-12-25\"\n * },\n * \"request\": {\n * \"method\": \"POST\",\n * \"url\": \"Patient\"\n * }\n * },\n * {\n * \"fullUrl\": \"urn:uuid:88f151c0-a954-468a-88bd-5ae15c08e059\",\n * \"resource\": {\n * \"resourceType\": \"Patient\",\n * \"identifier\": [{ \"system\": \"http:/example.org/fhir/ids\", \"value\": \"234234\" }],\n * \"name\": [{ \"use\": \"official\", \"given\": [\"Bob\"], \"family\": \"Jones\" }],\n * \"gender\": \"male\",\n * \"birthDate\": \"1974-12-25\"\n * },\n * \"request\": {\n * \"method\": \"POST\",\n * \"url\": \"Patient\",\n * \"ifNoneExist\": \"identifier=http:/example.org/fhir/ids|234234\"\n * }\n * }\n * ]\n * });\n * ```\n *\n * See The FHIR \"batch/transaction\" section for full details: https://hl7.org/fhir/http.html#transaction\n * @category Batch\n * @param bundle The FHIR batch/transaction bundle.\n * @returns The FHIR batch/transaction response bundle.\n */\n executeBatch(bundle: Bundle): Promise<Bundle> {\n return this.post('fhir/R4', bundle);\n }\n\n /**\n * Sends an email using the Medplum Email API.\n *\n * Builds the email using nodemailer MailComposer.\n *\n * Examples:\n *\n * Send a simple text email:\n *\n * ```typescript\n * await medplum.sendEmail({\n * to: 'alice@example.com',\n * cc: 'bob@example.com',\n * subject: 'Hello',\n * text: 'Hello Alice',\n * });\n * ```\n *\n * Send an email with a `Binary` attachment:\n *\n * ```typescript\n * await medplum.sendEmail({\n * to: 'alice@example.com',\n * subject: 'Email with attachment',\n * text: 'See the attached report',\n * attachments: [{\n * filename: 'report.pdf',\n * path: \"Binary/\" + binary.id\n * }]\n * });\n * ```\n *\n * See options here: https://nodemailer.com/extras/mailcomposer/\n * @category Media\n * @param options The MailComposer options.\n * @returns Promise to the operation outcome.\n */\n sendEmail(email: MailOptions): Promise<OperationOutcome> {\n return this.post('email/v1/send', email, 'application/json');\n }\n\n /**\n * Executes a GraphQL query.\n *\n * Example:\n *\n * ```typescript\n * const result = await medplum.graphql(`{\n * Patient(id: \"123\") {\n * resourceType\n * id\n * name {\n * given\n * family\n * }\n * }\n * }`);\n * ```\n *\n * Advanced queries such as named operations and variable substitution are supported:\n *\n * ```typescript\n * const result = await medplum.graphql(\n * `query GetPatientById($patientId: ID!) {\n * Patient(id: $patientId) {\n * resourceType\n * id\n * name {\n * given\n * family\n * }\n * }\n * }`,\n * 'GetPatientById',\n * { patientId: '123' }\n * );\n * ```\n *\n * See the GraphQL documentation for more details: https://graphql.org/learn/\n *\n * See the FHIR GraphQL documentation for FHIR specific details: https://www.hl7.org/fhir/graphql.html\n *\n * @category Read\n * @param query The GraphQL query.\n * @param operationName Optional GraphQL operation name.\n * @param variables Optional GraphQL variables.\n * @param options Optional fetch options.\n * @returns The GraphQL result.\n */\n graphql(query: string, operationName?: string | null, variables?: any, options?: RequestInit): Promise<any> {\n return this.post(this.fhirUrl('$graphql'), { query, operationName, variables }, JSON_CONTENT_TYPE, options);\n }\n\n /**\n *\n * Executes the $graph operation on this resource to fetch a Bundle of resources linked to the target resource\n * according to a graph definition\n\n * @category Read\n * @param resourceType The FHIR resource type.\n * @param id The resource ID.\n * @param graphName `name` parameter of the GraphDefinition\n * @returns A Bundle\n */\n readResourceGraph<K extends ResourceType>(\n resourceType: K,\n id: string,\n graphName: string\n ): ReadablePromise<Bundle<Resource>> {\n return this.get<Bundle<Resource>>(`${this.fhirUrl(resourceType, id)}/$graph?graph=${graphName}`);\n }\n\n /**\n * @category Authentication\n * @returns The Login State\n */\n getActiveLogin(): LoginState | undefined {\n return this.#storage.getObject('activeLogin');\n }\n\n /**\n * @category Authentication\n */\n async setActiveLogin(login: LoginState): Promise<void> {\n this.clearActiveLogin();\n this.#accessToken = login.accessToken;\n this.#refreshToken = login.refreshToken;\n this.#storage.setObject('activeLogin', login);\n this.#addLogin(login);\n this.#refreshPromise = undefined;\n await this.#refreshProfile();\n }\n\n /**\n * Returns the current access token.\n * @category Authentication\n */\n getAccessToken(): string | undefined {\n return this.#accessToken;\n }\n\n /**\n * Sets the current access token.\n * @category Authentication\n */\n setAccessToken(accessToken: string): void {\n this.#accessToken = accessToken;\n this.#refreshToken = undefined;\n this.#profile = undefined;\n this.#config = undefined;\n }\n\n /**\n * @category Authentication\n */\n getLogins(): LoginState[] {\n return this.#storage.getObject<LoginState[]>('logins') ?? [];\n }\n\n #addLogin(newLogin: LoginState): void {\n const logins = this.getLogins().filter((login) => login.profile?.reference !== newLogin.profile?.reference);\n logins.push(newLogin);\n this.#storage.setObject('logins', logins);\n }\n\n async #refreshProfile(): Promise<ProfileResource | undefined> {\n this.#profilePromise = new Promise((resolve, reject) => {\n this.get('auth/me')\n .then((result) => {\n this.#profilePromise = undefined;\n this.#profile = result.profile;\n this.#config = result.config;\n this.dispatchEvent({ type: 'change' });\n resolve(this.#profile);\n })\n .catch(reject);\n });\n\n return this.#profilePromise;\n }\n\n /**\n * @category Authentication\n */\n isLoading(): boolean {\n return !!this.#profilePromise;\n }\n\n /**\n * @category User Profile\n */\n getProfile(): ProfileResource | undefined {\n return this.#profile;\n }\n\n /**\n * @category User Profile\n */\n async getProfileAsync(): Promise<ProfileResource | undefined> {\n if (this.#profilePromise) {\n await this.#profilePromise;\n }\n return this.getProfile();\n }\n\n /**\n * @category User Profile\n */\n getUserConfiguration(): UserConfiguration | undefined {\n return this.#config;\n }\n\n /**\n * Downloads the URL as a blob.\n *\n * @category Read\n * @param url The URL to request.\n * @returns Promise to the response body as a blob.\n */\n async download(url: URL | string, options: RequestInit = {}): Promise<Blob> {\n if (this.#refreshPromise) {\n await this.#refreshPromise;\n }\n this.#addFetchOptionsDefaults(options);\n const response = await this.#fetch(url.toString(), options);\n return response.blob();\n }\n\n //\n // Private helpers\n //\n\n /**\n * Returns the cache entry if available and not expired.\n * @param key The cache key to retrieve.\n * @param options Optional fetch options for cache settings.\n * @returns The cached entry if found.\n */\n #getCacheEntry(key: string, options: RequestInit | undefined): RequestCacheEntry | undefined {\n if (this.#cacheTime <= 0 || options?.cache === 'no-cache' || options?.cache === 'reload') {\n return undefined;\n }\n const entry = this.#requestCache.get(key);\n if (!entry || entry.requestTime + this.#cacheTime < Date.now()) {\n return undefined;\n }\n return entry;\n }\n\n /**\n * Adds a readable promise to the cache.\n * @param key The cache key to store.\n * @param value The readable promise to store.\n */\n #setCacheEntry(key: string, value: ReadablePromise<any>): void {\n if (this.#cacheTime > 0) {\n this.#requestCache.set(key, { requestTime: Date.now(), value });\n }\n }\n\n /**\n * Adds a concrete value as the cache entry for the given resource.\n * This is used in cases where the resource is loaded indirectly.\n * For example, when a resource is loaded as part of a Bundle.\n * @param resource The resource to cache.\n */\n #cacheResource(resource: Resource | undefined): void {\n if (resource?.id) {\n this.#setCacheEntry(\n this.fhirUrl(resource.resourceType, resource.id).toString(),\n new ReadablePromise(Promise.resolve(resource))\n );\n }\n }\n\n /**\n * Deletes a cache entry.\n * @param key The cache key to delete.\n */\n #deleteCacheEntry(key: string): void {\n if (this.#cacheTime > 0) {\n this.#requestCache.delete(key);\n }\n }\n\n /**\n * Makes an HTTP request.\n * @param {string} method\n * @param {string} url\n * @param {string=} contentType\n * @param {Object=} body\n */\n async #request<T>(method: string, url: string, options: RequestInit = {}): Promise<T> {\n if (this.#refreshPromise) {\n await this.#refreshPromise;\n }\n\n if (!url.startsWith('http')) {\n url = this.#baseUrl + url;\n }\n\n options.method = method;\n this.#addFetchOptionsDefaults(options);\n\n const response = await this.#fetchWithRetry(url, options);\n if (response.status === 401) {\n // Refresh and try again\n return this.#handleUnauthenticated(method, url, options);\n }\n\n if (response.status === 204 || response.status === 304) {\n // No content or change\n return undefined as unknown as T;\n }\n\n let obj: any = undefined;\n try {\n obj = await response.json();\n } catch (err) {\n console.error('Error parsing response', response.status, err);\n throw err;\n }\n\n if (response.status >= 400) {\n throw new OperationOutcomeError(normalizeOperationOutcome(obj));\n }\n return obj;\n }\n\n async #fetchWithRetry(url: string, options: RequestInit): Promise<Response> {\n const maxRetries = 3;\n const retryDelay = 200;\n let response: Response | undefined = undefined;\n for (let retry = 0; retry < maxRetries; retry++) {\n response = (await this.#fetch(url, options)) as Response;\n if (response.status < 500) {\n return response;\n }\n await new Promise((resolve) => setTimeout(resolve, retryDelay));\n }\n return response as Response;\n }\n\n /**\n * Executes a batch of requests that were automatically batched together.\n */\n async #executeAutoBatch(): Promise<void> {\n // Get the current queue\n const entries = [...this.#autoBatchQueue];\n\n // Clear the queue\n this.#autoBatchQueue.length = 0;\n\n // Clear the timer\n this.#autoBatchTimerId = undefined;\n\n // If there is only one request in the batch, just execute it\n if (entries.length === 1) {\n const entry = entries[0];\n entry.resolve(await this.#request(entry.method, this.#fhirBaseUrl + entry.url, entry.options));\n return;\n }\n\n // Build the batch request\n const batch: Bundle = {\n resourceType: 'Bundle',\n type: 'batch',\n entry: entries.map(\n (e) =>\n ({\n request: {\n method: e.method,\n url: e.url,\n },\n resource: e.options.body ? (JSON.parse(e.options.body as string) as Resource) : undefined,\n } as BundleEntry)\n ),\n };\n\n // Execute the batch request\n const response = (await this.post('fhir/R4', batch)) as Bundle;\n\n // Process the response\n for (let i = 0; i < entries.length; i++) {\n const entry = entries[i];\n const responseEntry = response.entry?.[i];\n if (responseEntry?.response?.outcome && !isOk(responseEntry.response.outcome)) {\n entry.reject(new OperationOutcomeError(responseEntry.response.outcome));\n } else {\n entry.resolve(responseEntry?.resource);\n }\n }\n }\n\n /**\n * Adds default options to the fetch options.\n * @param options The options to add defaults to.\n */\n #addFetchOptionsDefaults(options: RequestInit): void {\n if (!options.headers) {\n options.headers = {};\n }\n\n const headers = options.headers as Record<string, string>;\n headers['X-Medplum'] = 'extended';\n\n if (!headers['Content-Type']) {\n headers['Content-Type'] = FHIR_CONTENT_TYPE;\n }\n\n if (this.#accessToken) {\n headers['Authorization'] = 'Bearer ' + this.#accessToken;\n }\n\n if (!options.cache) {\n options.cache = 'no-cache';\n }\n\n if (!options.credentials) {\n options.credentials = 'include';\n }\n }\n\n /**\n * Sets the \"Content-Type\" header on fetch options.\n * @param options The fetch options.\n * @param contentType The new content type to set.\n */\n #setRequestContentType(options: RequestInit, contentType: string): void {\n if (!options.headers) {\n options.headers = {};\n }\n const headers = options.headers as Record<string, string>;\n headers['Content-Type'] = contentType;\n }\n\n /**\n * Sets the body on fetch options.\n * @param options The fetch options.\n * @param data The new content body.\n */\n #setRequestBody(options: RequestInit, data: any): void {\n if (\n typeof data === 'string' ||\n (typeof Blob !== 'undefined' && data instanceof Blob) ||\n (typeof File !== 'undefined' && data instanceof File) ||\n (typeof Uint8Array !== 'undefined' && data instanceof Uint8Array)\n ) {\n options.body = data;\n } else if (data) {\n options.body = JSON.stringify(data);\n }\n }\n\n /**\n * Handles an unauthenticated response from the server.\n * First, tries to refresh the access token and retry the request.\n * Otherwise, calls unauthenticated callbacks and rejects.\n * @param method The HTTP method of the original request.\n * @param url The URL of the original request.\n * @param contentType The content type of the original request.\n * @param body The body of the original request.\n */\n #handleUnauthenticated(method: string, url: string, options: RequestInit): Promise<any> {\n if (this.#refresh()) {\n return this.#request(method, url, options);\n }\n this.clearActiveLogin();\n if (this.#onUnauthenticated) {\n this.#onUnauthenticated();\n }\n return Promise.reject(new Error('Unauthenticated'));\n }\n\n /**\n * Starts a new PKCE flow.\n * These PKCE values are stateful, and must survive redirects and page refreshes.\n * @category Authentication\n */\n async startPkce(): Promise<{ codeChallengeMethod: string; codeChallenge: string }> {\n const pkceState = getRandomString();\n sessionStorage.setItem('pkceState', pkceState);\n\n const codeVerifier = getRandomString();\n sessionStorage.setItem('codeVerifier', codeVerifier);\n\n const arrayHash = await encryptSHA256(codeVerifier);\n const codeChallenge = arrayBufferToBase64(arrayHash).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=/g, '');\n sessionStorage.setItem('codeChallenge', codeChallenge);\n\n return { codeChallengeMethod: 'S256', codeChallenge };\n }\n\n /**\n * Redirects the user to the login screen for authorization.\n * Clears all auth state including local storage and session storage.\n * See: https://openid.net/specs/openid-connect-core-1_0.html#AuthorizationEndpoint\n */\n async #requestAuthorization(loginParams?: Partial<BaseLoginRequest>): Promise<void> {\n const loginRequest = await this.ensureCodeChallenge(loginParams || {});\n const url = new URL(this.#authorizeUrl);\n url.searchParams.set('response_type', 'code');\n url.searchParams.set('state', sessionStorage.getItem('pkceState') as string);\n url.searchParams.set('client_id', loginRequest.clientId || (this.#clientId as string));\n url.searchParams.set('redirect_uri', loginRequest.redirectUri || getWindowOrigin());\n url.searchParams.set('code_challenge_method', loginRequest.codeChallengeMethod as string);\n url.searchParams.set('code_challenge', loginRequest.codeChallenge as string);\n url.searchParams.set('scope', loginRequest.scope || 'openid profile');\n window.location.assign(url.toString());\n }\n\n /**\n * Processes an OAuth authorization code.\n * See: https://openid.net/specs/openid-connect-core-1_0.html#TokenRequest\n * @param code The authorization code received by URL parameter.\n * @param loginParams Optional login parameters.\n * @category Authentication\n */\n processCode(code: string, loginParams?: Partial<BaseLoginRequest>): Promise<ProfileResource> {\n const formBody = new URLSearchParams();\n formBody.set('grant_type', 'authorization_code');\n formBody.set('code', code);\n formBody.set('client_id', loginParams?.clientId || (this.#clientId as string));\n formBody.set('redirect_uri', loginParams?.redirectUri || getWindowOrigin());\n\n if (typeof sessionStorage !== 'undefined') {\n const codeVerifier = sessionStorage.getItem('codeVerifier');\n if (codeVerifier) {\n formBody.set('code_verifier', codeVerifier);\n }\n }\n\n return this.#fetchTokens(formBody);\n }\n\n /**\n * Tries to refresh the auth tokens.\n * See: https://openid.net/specs/openid-connect-core-1_0.html#RefreshTokens\n */\n #refresh(): Promise<void> | undefined {\n if (this.#refreshPromise) {\n return this.#refreshPromise;\n }\n\n if (this.#refreshToken) {\n const formBody = new URLSearchParams();\n formBody.set('grant_type', 'refresh_token');\n formBody.set('client_id', this.#clientId as string);\n formBody.set('refresh_token', this.#refreshToken);\n this.#refreshPromise = this.#fetchTokens(formBody);\n return this.#refreshPromise;\n }\n\n if (this.#clientId && this.#clientSecret) {\n this.#refreshPromise = this.startClientLogin(this.#clientId, this.#clientSecret);\n return this.#refreshPromise;\n }\n\n return undefined;\n }\n\n /**\n * Starts a new OAuth2 client credentials flow.\n * See: https://datatracker.ietf.org/doc/html/rfc6749#section-4.4\n * @category Authentication\n * @param clientId The client ID.\n * @param clientSecret The client secret.\n * @returns Promise that resolves to the client profile.\n */\n async startClientLogin(clientId: string, clientSecret: string): Promise<ProfileResource> {\n this.#clientId = clientId;\n this.#clientSecret = clientSecret;\n\n const formBody = new URLSearchParams();\n formBody.set('grant_type', 'client_credentials');\n formBody.set('client_id', clientId);\n formBody.set('client_secret', clientSecret);\n return this.#fetchTokens(formBody);\n }\n\n /**\n * Makes a POST request to the tokens endpoint.\n * See: https://openid.net/specs/openid-connect-core-1_0.html#TokenEndpoint\n * @param formBody Token parameters in URL encoded format.\n */\n async #fetchTokens(formBody: URLSearchParams): Promise<ProfileResource> {\n const response = await this.#fetch(this.#tokenUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n body: formBody,\n credentials: 'include',\n });\n if (!response.ok) {\n this.clearActiveLogin();\n throw new Error('Failed to fetch tokens');\n }\n const tokens = await response.json();\n await this.#verifyTokens(tokens);\n return this.getProfile() as ProfileResource;\n }\n\n /**\n * Verifies the tokens received from the auth server.\n * Validates the JWT against the JWKS.\n * See: https://openid.net/specs/openid-connect-core-1_0.html#TokenEndpoint\n * @param tokens\n */\n async #verifyTokens(tokens: TokenResponse): Promise<void> {\n const token = tokens.access_token;\n\n // Verify token has not expired\n const tokenPayload = parseJWTPayload(token);\n if (Date.now() >= (tokenPayload.exp as number) * 1000) {\n this.clearActiveLogin();\n throw new Error('Token expired');\n }\n\n // Verify app_client_id\n if (this.#clientId && tokenPayload.client_id !== this.#clientId) {\n this.clearActiveLogin();\n throw new Error('Token was not issued for this audience');\n }\n\n return this.setActiveLogin({\n accessToken: token,\n refreshToken: tokens.refresh_token,\n project: tokens.project,\n profile: tokens.profile,\n });\n }\n\n /**\n * Sets up a listener for window storage events.\n * This synchronizes state across browser windows and browser tabs.\n */\n #setupStorageListener(): void {\n try {\n window.addEventListener('storage', (e: StorageEvent) => {\n if (e.key === null || e.key === 'activeLogin') {\n // Storage events fire when different tabs make changes.\n // On storage clear (key === null) or activeLogin change (key === 'activeLogin')\n // Refresh the page to ensure the active login is up to date.\n window.location.reload();\n }\n });\n } catch (err) {\n // Silently ignore if this environment does not support storage events\n }\n }\n}\n\n/**\n * Returns the default fetch method.\n * The default fetch is currently only available in browser environments.\n * If you want to use SSR such as Next.js, you should pass a custom fetch function.\n * @returns The default fetch function for the current environment.\n */\nfunction getDefaultFetch(): FetchLike {\n if (!globalThis.fetch) {\n throw new Error('Fetch not available in this environment');\n }\n return globalThis.fetch.bind(globalThis);\n}\n\n/**\n * Returns the base URL for the current page.\n * @category HTTP\n */\nfunction getWindowOrigin(): string {\n if (typeof window === 'undefined') {\n return '';\n }\n return window.location.protocol + '//' + window.location.host + '/';\n}\n\nfunction ensureTrailingSlash(url: string | undefined): string | undefined {\n if (!url) {\n return url;\n }\n return url.endsWith('/') ? url : url + '/';\n}\n"],"names":[],"mappings":"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"}