@oystehr/sdk 4.3.9 → 4.3.11
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.
- package/dist/cjs/client/client.cjs +12 -5
- package/dist/cjs/client/client.cjs.map +1 -1
- package/dist/cjs/client/client.d.ts +5 -0
- package/dist/cjs/index.min.cjs +1 -1
- package/dist/cjs/index.min.cjs.map +1 -1
- package/dist/cjs/resources/classes/fhir-ext.cjs +196 -4
- package/dist/cjs/resources/classes/fhir-ext.cjs.map +1 -1
- package/dist/cjs/resources/classes/fhir-ext.d.ts +70 -3
- package/dist/cjs/resources/classes/fhir.cjs +14 -3
- package/dist/cjs/resources/classes/fhir.cjs.map +1 -1
- package/dist/cjs/resources/classes/fhir.d.ts +14 -3
- package/dist/cjs/resources/types/FaxSendParams.d.ts +1 -1
- package/dist/cjs/resources/types/ZambdaCreateParams.d.ts +1 -1
- package/dist/cjs/resources/types/ZambdaUpdateParams.d.ts +1 -1
- package/dist/cjs/resources/types/fhir.d.ts +20 -0
- package/dist/esm/client/client.d.ts +5 -0
- package/dist/esm/client/client.js +12 -5
- package/dist/esm/client/client.js.map +1 -1
- package/dist/esm/index.min.js +1 -1
- package/dist/esm/index.min.js.map +1 -1
- package/dist/esm/resources/classes/fhir-ext.d.ts +70 -3
- package/dist/esm/resources/classes/fhir-ext.js +194 -5
- package/dist/esm/resources/classes/fhir-ext.js.map +1 -1
- package/dist/esm/resources/classes/fhir.d.ts +14 -3
- package/dist/esm/resources/classes/fhir.js +15 -4
- package/dist/esm/resources/classes/fhir.js.map +1 -1
- package/dist/esm/resources/types/FaxSendParams.d.ts +1 -1
- package/dist/esm/resources/types/ZambdaCreateParams.d.ts +1 -1
- package/dist/esm/resources/types/ZambdaUpdateParams.d.ts +1 -1
- package/dist/esm/resources/types/fhir.d.ts +20 -0
- package/package.json +1 -1
- package/src/client/client.ts +22 -8
- package/src/resources/classes/fhir-ext.ts +257 -7
- package/src/resources/classes/fhir.ts +14 -3
- package/src/resources/types/FaxSendParams.ts +1 -1
- package/src/resources/types/ZambdaCreateParams.ts +1 -1
- package/src/resources/types/ZambdaUpdateParams.ts +1 -1
- package/src/resources/types/fhir.ts +22 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Address as AddressR4B, HumanName as HumanNameR4B } from 'fhir/r4b';
|
|
2
2
|
import { Address as AddressR5, HumanName as HumanNameR5 } from 'fhir/r5';
|
|
3
|
-
import { BatchBundle, BatchInput, Bundle, FhirAsyncJobHandle, FhirAsyncJobStatus, FhirAsyncWaitOptions, FhirCreateParams, FhirDeleteParams, FhirGetParams, FhirHistoryGetParams, FhirHistorySearchParams, FhirPatchParams, FhirResource, FhirResourceReturnValue, FhirResponseMode, FhirSearchParams, FhirUpdateParams, GenerateFriendlyPatientIdParams, TransactionBundle } from '../..';
|
|
3
|
+
import { BatchBundle, BatchInput, Bundle, FhirAsyncBulkOutputResult, FhirAsyncJobHandle, FhirAsyncJobStatus, FhirAsyncWaitOptions, FhirCreateParams, FhirDeleteParams, FhirGetParams, FhirHistoryGetParams, FhirHistorySearchParams, FhirPatchParams, FhirResource, FhirResourceReturnValue, FhirResponseMode, FhirSearchParams, FhirUpdateParams, GenerateFriendlyPatientIdParams, SearchParam, TransactionBundle } from '../..';
|
|
4
4
|
import { FhirFetcherResponse, OystehrClientRequest, SDKResource } from '../../client/client';
|
|
5
5
|
/**
|
|
6
6
|
* Optional parameter that can be passed to the client methods. It allows
|
|
@@ -16,6 +16,26 @@ export interface OystehrFHIRUpdateClientRequest extends OystehrClientRequest {
|
|
|
16
16
|
*/
|
|
17
17
|
optimisticLockingVersionId?: string;
|
|
18
18
|
}
|
|
19
|
+
/**
|
|
20
|
+
* Optional parameter that can be passed to the FHIR create method. In addition
|
|
21
|
+
* to the standard request options, it supports FHIR conditional create via the
|
|
22
|
+
* 'If-None-Exist' header.
|
|
23
|
+
*/
|
|
24
|
+
export interface OystehrFHIRCreateClientRequest extends OystehrClientRequest {
|
|
25
|
+
/**
|
|
26
|
+
* Perform a FHIR conditional create using the 'If-None-Exist' header. The value is a
|
|
27
|
+
* FHIR search query that identifies whether a matching resource already exists:
|
|
28
|
+
* - if no resource matches, the resource is created as normal;
|
|
29
|
+
* - if exactly one resource matches, no resource is created and the existing one is returned;
|
|
30
|
+
* - if more than one resource matches, the request fails with a 412 Precondition Failed error.
|
|
31
|
+
*
|
|
32
|
+
* Accepts either a raw search query string (e.g. `'identifier=http://acme.org|1234'`) or an
|
|
33
|
+
* array of SearchParam objects (e.g. `[{ name: 'identifier', value: 'http://acme.org|1234' }]`).
|
|
34
|
+
*
|
|
35
|
+
* @see https://www.hl7.org/fhir/http.html#cond-update for the conditional create specification.
|
|
36
|
+
*/
|
|
37
|
+
ifNoneExist?: string | SearchParam[];
|
|
38
|
+
}
|
|
19
39
|
/**
|
|
20
40
|
* Performs a FHIR search and returns the results as a Bundle resource
|
|
21
41
|
*
|
|
@@ -29,10 +49,24 @@ export declare function search<T extends FhirResource>(this: SDKResource, params
|
|
|
29
49
|
export declare function search<T extends FhirResource>(this: SDKResource, params: FhirSearchParams<T>, request?: OystehrClientRequest & {
|
|
30
50
|
mode?: 'sync' | undefined;
|
|
31
51
|
}): Promise<FhirFetcherResponse<Bundle<T>>>;
|
|
32
|
-
|
|
52
|
+
/**
|
|
53
|
+
* Performs an iterative FHIR search over initial request and following "next" urls,
|
|
54
|
+
* collecting all pages into a single Bundle.
|
|
55
|
+
*
|
|
56
|
+
* @param params FHIR search parameters plus optional pageSize that will overwrite _count in params
|
|
57
|
+
* @param request optional OystehrClientRequest object
|
|
58
|
+
* @returns FHIR Bundle resource that contains all entries across all pages. Bundle-level metadata
|
|
59
|
+
* (id, meta, total, etc.) is taken from the first page.
|
|
60
|
+
*/
|
|
61
|
+
export declare function searchAndGetAllPages<T extends FhirResource>(this: SDKResource, params: FhirSearchParams<T> & {
|
|
62
|
+
pageSize?: number;
|
|
63
|
+
}, request?: OystehrClientRequest & {
|
|
64
|
+
mode?: 'sync' | undefined;
|
|
65
|
+
}): Promise<Bundle<T>>;
|
|
66
|
+
export declare function create<T extends FhirResource>(this: SDKResource, params: FhirCreateParams<T>, request: OystehrFHIRCreateClientRequest & {
|
|
33
67
|
mode: Exclude<FhirResponseMode, 'sync'>;
|
|
34
68
|
}): Promise<FhirAsyncJobHandle>;
|
|
35
|
-
export declare function create<T extends FhirResource>(this: SDKResource, params: FhirCreateParams<T>, request?:
|
|
69
|
+
export declare function create<T extends FhirResource>(this: SDKResource, params: FhirCreateParams<T>, request?: OystehrFHIRCreateClientRequest & {
|
|
36
70
|
mode?: 'sync' | undefined;
|
|
37
71
|
}): Promise<FhirFetcherResponse<FhirResourceReturnValue<T>>>;
|
|
38
72
|
export declare function get<T extends FhirResource>(this: SDKResource, { resourceType, id }: FhirGetParams<T>, request: OystehrClientRequest & {
|
|
@@ -60,8 +94,41 @@ declare function del<T extends FhirResource>(this: SDKResource, params: FhirDele
|
|
|
60
94
|
mode?: 'sync' | undefined;
|
|
61
95
|
}): Promise<FhirFetcherResponse<FhirResourceReturnValue<T>>>;
|
|
62
96
|
export { del as delete };
|
|
97
|
+
/**
|
|
98
|
+
* Fetches the status of an async job. If the job is still in progress, returns an object with status 202. If the job is completed, returns the job result with status 200. If the job has failed, returns an object with status 500 and an OperationOutcome resource describing the failure. If the job has expired, returns an object with status 410.
|
|
99
|
+
* @param this The SDKResource context (this is an extension method and should be called with the SDKResource instance as the context, e.g. `sdkResource.getAsyncJob(jobId)`)
|
|
100
|
+
* @param jobId The ID of the async job to fetch
|
|
101
|
+
* @param request Optional OystehrClientRequest for authentication and headers
|
|
102
|
+
* @returns A Promise that resolves to the FhirAsyncJobStatus
|
|
103
|
+
*/
|
|
63
104
|
export declare function getAsyncJob<T extends FhirResource>(this: SDKResource, jobId: string, request?: OystehrClientRequest): Promise<FhirAsyncJobStatus<T>>;
|
|
105
|
+
/**
|
|
106
|
+
* Waits for an async job to complete by polling its status until it reaches a terminal state (success, failure, or expiration) or the specified timeout is reached. Returns the final job status. Throws if the job fails, expires, or does not complete within the timeout.
|
|
107
|
+
* @param this The SDKResource context (this is an extension method and should be called with the SDKResource instance as the context, e.g. `sdkResource.waitForAsyncJob(jobId)`)
|
|
108
|
+
* @param jobId The ID of the async job to wait for
|
|
109
|
+
* @param options Optional FhirAsyncWaitOptions to configure polling behavior
|
|
110
|
+
* @param request Optional OystehrClientRequest for authentication and headers
|
|
111
|
+
* @returns A Promise that resolves to the final FhirAsyncJobStatus
|
|
112
|
+
*/
|
|
64
113
|
export declare function waitForAsyncJob<T extends FhirResource>(this: SDKResource, jobId: string, options?: FhirAsyncWaitOptions, request?: OystehrClientRequest): Promise<FhirAsyncJobStatus<T>>;
|
|
114
|
+
/**
|
|
115
|
+
* Waits for an async job to complete and retrieves the bulk output manifest and files. Throws if the job fails, expires, or does not complete within the specified timeout.
|
|
116
|
+
* @param this The SDKResource context (this is an extension method and should be called with the SDKResource instance as the context, e.g. `sdkResource.waitForAsyncBulkOutput(jobId)`)
|
|
117
|
+
* @param jobId The ID of the async job to wait for
|
|
118
|
+
* @param options Optional FhirAsyncWaitOptions to configure polling behavior
|
|
119
|
+
* @param request Optional OystehrClientRequest for authentication and headers
|
|
120
|
+
* @returns A Promise that resolves to a FhirAsyncBulkOutputResult containing the bulk output manifest and files
|
|
121
|
+
*/
|
|
122
|
+
export declare function waitForAsyncBulkOutput<T extends FhirResource>(this: SDKResource, jobId: string, options?: FhirAsyncWaitOptions, request?: OystehrClientRequest): Promise<FhirAsyncBulkOutputResult<T>>;
|
|
123
|
+
/**
|
|
124
|
+
* Wrapper around waitForAsyncBulkOutput that transforms the retrieved bulk output files into a single Bundle resource containing all the output resources as entries. This is a convenience method for use cases where you want to work with the bulk output as a Bundle, but it may not be efficient for large outputs due to the overhead of downloading and parsing all files and constructing the Bundle in memory.
|
|
125
|
+
* Can be slow due to downloading and parsing potentially large NDJSON files, so use only if you need the full output as a Bundle resource. For more efficient processing of large bulk outputs, use waitForAsyncBulkOutput directly.
|
|
126
|
+
* @param jobId the ID of the async job to wait for
|
|
127
|
+
* @param options optional FhirAsyncWaitOptions to configure polling behavior
|
|
128
|
+
* @param request optional OystehrClientRequest for authentication and headers
|
|
129
|
+
* @returns a Promise that resolves to a Bundle containing all resources from the bulk output
|
|
130
|
+
*/
|
|
131
|
+
export declare function waitForAsyncBulkBundle<T extends FhirResource>(this: SDKResource, jobId: string, options?: FhirAsyncWaitOptions, request?: OystehrClientRequest): Promise<Bundle<T>>;
|
|
65
132
|
export declare function cancelAsyncJob(this: SDKResource, jobId: string, request?: OystehrClientRequest): Promise<void>;
|
|
66
133
|
export declare function history<T extends FhirResource>(this: SDKResource, { resourceType, id }: FhirHistorySearchParams<T>, request: OystehrClientRequest & {
|
|
67
134
|
mode: Exclude<FhirResponseMode, 'sync'>;
|
|
@@ -18,14 +18,25 @@ class Fhir extends client.SDKResource {
|
|
|
18
18
|
* @returns FHIR Bundle resource
|
|
19
19
|
*/
|
|
20
20
|
search = fhirExt.search;
|
|
21
|
+
/**
|
|
22
|
+
* Performs an iterative FHIR search over initial request and following "next" urls,
|
|
23
|
+
* collecting all pages into a single Bundle.
|
|
24
|
+
* @param params FHIR search parameters plus optional pageSize that will overwrite _count in params
|
|
25
|
+
* @param request optional OystehrClientRequest object
|
|
26
|
+
* @returns FHIR Bundle resource that contains all entries across all pages. Bundle-level metadata
|
|
27
|
+
* (id, meta, total, etc.) is taken from the first page.
|
|
28
|
+
*/
|
|
29
|
+
searchAndGetAllPages = fhirExt.searchAndGetAllPages;
|
|
21
30
|
create = fhirExt.create;
|
|
22
31
|
get = fhirExt.get;
|
|
23
|
-
getAsyncJob = fhirExt.getAsyncJob;
|
|
24
|
-
waitForAsyncJob = fhirExt.waitForAsyncJob;
|
|
25
|
-
cancelAsyncJob = fhirExt.cancelAsyncJob;
|
|
26
32
|
update = fhirExt.update;
|
|
27
33
|
patch = fhirExt.patch;
|
|
28
34
|
delete = fhirExt.delete;
|
|
35
|
+
getAsyncJob = fhirExt.getAsyncJob;
|
|
36
|
+
waitForAsyncJob = fhirExt.waitForAsyncJob;
|
|
37
|
+
waitForAsyncBulkOutput = fhirExt.waitForAsyncBulkOutput;
|
|
38
|
+
waitForAsyncBulkBundle = fhirExt.waitForAsyncBulkBundle;
|
|
39
|
+
cancelAsyncJob = fhirExt.cancelAsyncJob;
|
|
29
40
|
history = fhirExt.history;
|
|
30
41
|
batch = fhirExt.batch;
|
|
31
42
|
transaction = fhirExt.transaction;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fhir.cjs","sources":["../../../../src/resources/classes/fhir.ts"],"sourcesContent":["// AUTOGENERATED -- DO NOT EDIT\n\nimport { SDKResource } from '../../client/client';\nimport { OystehrConfig } from '../../config';\nimport * as ext from './fhir-ext';\n\nexport class Fhir extends SDKResource {\n constructor(config: OystehrConfig) {\n super(config);\n }\n #baseUrlThunk(): string {\n return this.config.services?.['fhirApiUrl'] ?? 'https://fhir-api.zapehr.com';\n }\n /**\n * Performs a FHIR search and returns the results as a Bundle resource\n * @param options FHIR resource type and FHIR search parameters\n * @param request optional OystehrClientRequest object\n * @returns FHIR Bundle resource\n */\n search = ext.search;\n create = ext.create;\n get = ext.get;\n
|
|
1
|
+
{"version":3,"file":"fhir.cjs","sources":["../../../../src/resources/classes/fhir.ts"],"sourcesContent":["// AUTOGENERATED -- DO NOT EDIT\n\nimport { SDKResource } from '../../client/client';\nimport { OystehrConfig } from '../../config';\nimport * as ext from './fhir-ext';\n\nexport class Fhir extends SDKResource {\n constructor(config: OystehrConfig) {\n super(config);\n }\n #baseUrlThunk(): string {\n return this.config.services?.['fhirApiUrl'] ?? 'https://fhir-api.zapehr.com';\n }\n /**\n * Performs a FHIR search and returns the results as a Bundle resource\n * @param options FHIR resource type and FHIR search parameters\n * @param request optional OystehrClientRequest object\n * @returns FHIR Bundle resource\n */\n search = ext.search;\n /**\n * Performs an iterative FHIR search over initial request and following \"next\" urls,\n * collecting all pages into a single Bundle.\n * @param params FHIR search parameters plus optional pageSize that will overwrite _count in params\n * @param request optional OystehrClientRequest object\n * @returns FHIR Bundle resource that contains all entries across all pages. Bundle-level metadata\n * (id, meta, total, etc.) is taken from the first page.\n */\n searchAndGetAllPages = ext.searchAndGetAllPages;\n create = ext.create;\n get = ext.get;\n update = ext.update;\n patch = ext.patch;\n delete = ext.delete;\n getAsyncJob = ext.getAsyncJob;\n waitForAsyncJob = ext.waitForAsyncJob;\n waitForAsyncBulkOutput = ext.waitForAsyncBulkOutput;\n waitForAsyncBulkBundle = ext.waitForAsyncBulkBundle;\n cancelAsyncJob = ext.cancelAsyncJob;\n history = ext.history;\n batch = ext.batch;\n transaction = ext.transaction;\n generateFriendlyPatientId = ext.generateFriendlyPatientId;\n formatAddress = ext.formatAddress;\n formatHumanName = ext.formatHumanName;\n}\n"],"names":["SDKResource","ext.search","ext.searchAndGetAllPages","ext.create","ext.get","ext.update","ext.patch","ext.delete","ext.getAsyncJob","ext.waitForAsyncJob","ext.waitForAsyncBulkOutput","ext.waitForAsyncBulkBundle","ext.cancelAsyncJob","ext.history","ext.batch","ext.transaction","ext.generateFriendlyPatientId","ext.formatAddress","ext.formatHumanName"],"mappings":";;;;;AAAA;AAMM,MAAO,IAAK,SAAQA,kBAAW,CAAA;AACnC,IAAA,WAAA,CAAY,MAAqB,EAAA;QAC/B,KAAK,CAAC,MAAM,CAAC;IACf;IACA,aAAa,GAAA;QACX,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,GAAG,YAAY,CAAC,IAAI,6BAA6B;IAC9E;AACA;;;;;AAKG;AACH,IAAA,MAAM,GAAGC,cAAU;AACnB;;;;;;;AAOG;AACH,IAAA,oBAAoB,GAAGC,4BAAwB;AAC/C,IAAA,MAAM,GAAGC,cAAU;AACnB,IAAA,GAAG,GAAGC,WAAO;AACb,IAAA,MAAM,GAAGC,cAAU;AACnB,IAAA,KAAK,GAAGC,aAAS;AACjB,IAAA,MAAM,GAAGC,cAAU;AACnB,IAAA,WAAW,GAAGC,mBAAe;AAC7B,IAAA,eAAe,GAAGC,uBAAmB;AACrC,IAAA,sBAAsB,GAAGC,8BAA0B;AACnD,IAAA,sBAAsB,GAAGC,8BAA0B;AACnD,IAAA,cAAc,GAAGC,sBAAkB;AACnC,IAAA,OAAO,GAAGC,eAAW;AACrB,IAAA,KAAK,GAAGC,aAAS;AACjB,IAAA,WAAW,GAAGC,mBAAe;AAC7B,IAAA,yBAAyB,GAAGC,iCAA6B;AACzD,IAAA,aAAa,GAAGC,qBAAiB;AACjC,IAAA,eAAe,GAAGC,uBAAmB;AACtC;;;;"}
|
|
@@ -11,14 +11,25 @@ export declare class Fhir extends SDKResource {
|
|
|
11
11
|
* @returns FHIR Bundle resource
|
|
12
12
|
*/
|
|
13
13
|
search: typeof ext.search;
|
|
14
|
+
/**
|
|
15
|
+
* Performs an iterative FHIR search over initial request and following "next" urls,
|
|
16
|
+
* collecting all pages into a single Bundle.
|
|
17
|
+
* @param params FHIR search parameters plus optional pageSize that will overwrite _count in params
|
|
18
|
+
* @param request optional OystehrClientRequest object
|
|
19
|
+
* @returns FHIR Bundle resource that contains all entries across all pages. Bundle-level metadata
|
|
20
|
+
* (id, meta, total, etc.) is taken from the first page.
|
|
21
|
+
*/
|
|
22
|
+
searchAndGetAllPages: typeof ext.searchAndGetAllPages;
|
|
14
23
|
create: typeof ext.create;
|
|
15
24
|
get: typeof ext.get;
|
|
16
|
-
getAsyncJob: typeof ext.getAsyncJob;
|
|
17
|
-
waitForAsyncJob: typeof ext.waitForAsyncJob;
|
|
18
|
-
cancelAsyncJob: typeof ext.cancelAsyncJob;
|
|
19
25
|
update: typeof ext.update;
|
|
20
26
|
patch: typeof ext.patch;
|
|
21
27
|
delete: typeof ext.delete;
|
|
28
|
+
getAsyncJob: typeof ext.getAsyncJob;
|
|
29
|
+
waitForAsyncJob: typeof ext.waitForAsyncJob;
|
|
30
|
+
waitForAsyncBulkOutput: typeof ext.waitForAsyncBulkOutput;
|
|
31
|
+
waitForAsyncBulkBundle: typeof ext.waitForAsyncBulkBundle;
|
|
32
|
+
cancelAsyncJob: typeof ext.cancelAsyncJob;
|
|
22
33
|
history: typeof ext.history;
|
|
23
34
|
batch: typeof ext.batch;
|
|
24
35
|
transaction: typeof ext.transaction;
|
|
@@ -12,7 +12,7 @@ export interface ZambdaCreateParams {
|
|
|
12
12
|
/**
|
|
13
13
|
* The runtime to use for the Zambda Function.
|
|
14
14
|
*/
|
|
15
|
-
runtime: '
|
|
15
|
+
runtime: 'nodejs22.x' | 'nodejs24.x' | 'python3.13' | 'python3.12' | 'java21' | 'dotnet8' | 'ruby3.3';
|
|
16
16
|
/**
|
|
17
17
|
* The amount of memory in MB to allocate to the Zambda Function. If not specified, a system default (1024MB) will be used. Min: 128MB, Max: 10240MB.
|
|
18
18
|
*/
|
|
@@ -12,7 +12,7 @@ export interface ZambdaUpdateParams {
|
|
|
12
12
|
/**
|
|
13
13
|
* The runtime to use for the Zambda Function.
|
|
14
14
|
*/
|
|
15
|
-
runtime?: '
|
|
15
|
+
runtime?: 'nodejs22.x' | 'nodejs24.x' | 'python3.13' | 'python3.12' | 'java21' | 'dotnet8' | 'ruby3.3';
|
|
16
16
|
/**
|
|
17
17
|
* The amount of memory in MB to allocate to the Zambda Function. If not specified, a system default (1024MB) will be used. Min: 128MB, Max: 10240MB.
|
|
18
18
|
*/
|
|
@@ -93,6 +93,19 @@ export interface BatchInputPostRequest<F extends FhirResource> extends BatchInpu
|
|
|
93
93
|
method: 'POST';
|
|
94
94
|
resource: F;
|
|
95
95
|
fullUrl?: string;
|
|
96
|
+
/**
|
|
97
|
+
* Perform a FHIR conditional create for this entry using the bundle entry's `ifNoneExist`
|
|
98
|
+
* field. The value is a FHIR search query that identifies whether a matching resource already
|
|
99
|
+
* exists: if no resource matches, the resource is created; if exactly one matches, no resource
|
|
100
|
+
* is created and the existing one is returned; if more than one matches, the entry fails with a
|
|
101
|
+
* 412 Precondition Failed error.
|
|
102
|
+
*
|
|
103
|
+
* Accepts either a raw search query string (e.g. `'identifier=http://acme.org|1234'`) or an
|
|
104
|
+
* array of SearchParam objects (e.g. `[{ name: 'identifier', value: 'http://acme.org|1234' }]`).
|
|
105
|
+
*
|
|
106
|
+
* @see https://www.hl7.org/fhir/http.html#cond-update
|
|
107
|
+
*/
|
|
108
|
+
ifNoneExist?: string | SearchParam[];
|
|
96
109
|
}
|
|
97
110
|
/**
|
|
98
111
|
* A batch POST to a `_search` endpoint (e.g. `Patient/_search`). Search parameters
|
|
@@ -167,6 +180,13 @@ export interface FhirAsyncJobCompletedBulk {
|
|
|
167
180
|
mode: 'bulk';
|
|
168
181
|
manifest: FhirAsyncBulkManifest;
|
|
169
182
|
}
|
|
183
|
+
export interface FhirAsyncBulkOutputFileResult<T extends FhirResource = FhirResource> extends FhirAsyncBulkOutputFile {
|
|
184
|
+
resources: T[];
|
|
185
|
+
}
|
|
186
|
+
export interface FhirAsyncBulkOutputResult<T extends FhirResource = FhirResource> {
|
|
187
|
+
manifest: FhirAsyncBulkManifest;
|
|
188
|
+
output: FhirAsyncBulkOutputFileResult<T>[];
|
|
189
|
+
}
|
|
170
190
|
export interface FhirAsyncJobExpired {
|
|
171
191
|
status: 410;
|
|
172
192
|
}
|
|
@@ -32,6 +32,11 @@ export interface OystehrClientRequest {
|
|
|
32
32
|
}
|
|
33
33
|
interface InternalClientRequest extends OystehrClientRequest {
|
|
34
34
|
ifMatch?: string;
|
|
35
|
+
/**
|
|
36
|
+
* Internal-only: the value of the 'If-None-Exist' header, used for FHIR
|
|
37
|
+
* conditional creates. A FHIR search query string (e.g. "identifier=sys|123").
|
|
38
|
+
*/
|
|
39
|
+
ifNoneExist?: string;
|
|
35
40
|
/**
|
|
36
41
|
* Internal-only: returns raw response metadata ({ status, headers, body }) instead of throwing on non-2xx statuses.
|
|
37
42
|
*/
|
|
@@ -184,9 +184,13 @@ function isInternalClientRequest(request) {
|
|
|
184
184
|
('contentType' in request && request.contentType?.split('/').length === 2) ||
|
|
185
185
|
'requestId' in request ||
|
|
186
186
|
('ifMatch' in request && request.ifMatch.startsWith('W/"')) ||
|
|
187
|
+
'ifNoneExist' in request ||
|
|
187
188
|
'mode' in request ||
|
|
188
189
|
'rawResponse' in request);
|
|
189
190
|
}
|
|
191
|
+
function isResourcePayload(params) {
|
|
192
|
+
return typeof params.resourceType === 'string' && params.resourceType.length > 0;
|
|
193
|
+
}
|
|
190
194
|
function getPreferHeaderFromMode(mode) {
|
|
191
195
|
if (mode === 'async-bundle' || mode === 'async-bulk') {
|
|
192
196
|
return 'respond-async';
|
|
@@ -286,7 +290,7 @@ function fetcher(baseUrlThunk, configThunk, loggerThunk, path, methodParam) {
|
|
|
286
290
|
}
|
|
287
291
|
: {}, {
|
|
288
292
|
'content-type': requestCtx?.contentType ?? 'application/json',
|
|
289
|
-
}, preferHeader ? { Prefer: preferHeader } : {}, accessToken ? { Authorization: `Bearer ${accessToken}` } : {}, requestCtx?.ifMatch ? { 'If-Match': requestCtx.ifMatch } : {}, { 'x-oystehr-request-id': requestCtx?.requestId });
|
|
293
|
+
}, preferHeader ? { Prefer: preferHeader } : {}, accessToken ? { Authorization: `Bearer ${accessToken}` } : {}, requestCtx?.ifMatch ? { 'If-Match': requestCtx.ifMatch } : {}, requestCtx?.ifNoneExist ? { 'If-None-Exist': requestCtx.ifNoneExist } : {}, { 'x-oystehr-request-id': requestCtx?.requestId });
|
|
290
294
|
const retryConfig = {
|
|
291
295
|
retries: config.retry?.retries ?? 3,
|
|
292
296
|
jitter: config.retry?.jitter ?? 20,
|
|
@@ -477,12 +481,15 @@ function addParamsToSearch(params, search) {
|
|
|
477
481
|
}
|
|
478
482
|
}
|
|
479
483
|
function extractParamsAndRequest(params, request) {
|
|
480
|
-
const
|
|
484
|
+
const shouldUseFirstArgAsRequest = !!params &&
|
|
485
|
+
!request &&
|
|
486
|
+
!Array.isArray(params) &&
|
|
487
|
+
isInternalClientRequest(params) &&
|
|
488
|
+
!isResourcePayload(params);
|
|
489
|
+
const providedParams = shouldUseFirstArgAsRequest
|
|
481
490
|
? {}
|
|
482
491
|
: params ?? {};
|
|
483
|
-
const requestCtx =
|
|
484
|
-
? params
|
|
485
|
-
: request;
|
|
492
|
+
const requestCtx = shouldUseFirstArgAsRequest ? params : request;
|
|
486
493
|
return [providedParams, requestCtx];
|
|
487
494
|
}
|
|
488
495
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sources":["../../../src/client/client.ts"],"sourcesContent":["import { v4 as uuidv4, validate as uuidValidate } from 'uuid';\nimport { OystehrConfig } from '../config';\nimport { OystehrFHIRError, OystehrSdkError } from '../errors';\nimport { Logger } from '../logger';\nimport {\n FhirAsyncBulkManifest,\n FhirAsyncCompletionBundle,\n FhirAsyncJobHandle,\n FhirAsyncJobStatus,\n FhirBundle,\n FhirResource,\n FhirResponseMode,\n OperationOutcome,\n} from '../resources/types';\n\ntype HttpMethod = 'get' | 'put' | 'post' | 'delete' | 'options' | 'head' | 'patch' | 'trace';\nexport const defaultProjectApiUrl = 'https://project-api.zapehr.com/v1';\nconst defaultFhirApiUrl = 'https://fhir-api.zapehr.com';\nconst STATUS_CODES_TO_RETRY = [408, 429, 500, 502, 503, 504];\nconst ERROR_CODES_TO_RETRY = [\n 'ECONNRESET',\n 'ECONNREFUSED',\n 'EPIPE',\n 'ETIMEDOUT',\n 'UND_ERR_CONNECT_TIMEOUT',\n 'UND_ERR_HEADERS_TIMEOUT',\n 'UND_ERR_HEADERS_TIMEOUT',\n 'UND_ERR_SOCKET',\n];\n\n/**\n * Optional parameter that can be passed to the client methods. It allows\n * overriding the access token or project ID, and setting various headers,\n * such as 'Content-Type'.\n */\nexport interface OystehrClientRequest {\n /**\n * The access token to use for the request. If not provided, the access token from `oystehr.init()` will be used.\n */\n accessToken?: string;\n /**\n * The project ID to use for the request. If not provided, the project ID from `oystehr.init()` will be used.\n */\n projectId?: string;\n /**\n * The value of the 'Content-Type' header to use for the request.\n */\n contentType?: string;\n /**\n * Unique identifier for this request.\n */\n requestId?: string;\n /**\n * Optional execution mode for FHIR requests that support async behavior.\n * Defaults to `sync` when omitted.\n */\n mode?: FhirResponseMode;\n}\n\ninterface InternalClientRequest extends OystehrClientRequest {\n ifMatch?: string;\n /**\n * Internal-only: returns raw response metadata ({ status, headers, body }) instead of throwing on non-2xx statuses.\n */\n rawResponse?: boolean;\n}\n\ntype FhirData<T extends FhirResource> = T | T[] | FhirBundle<T>;\nexport type FhirFetcherResponse<T extends FhirData<FhirResource> = any> = T;\n\nexport class SDKResource {\n protected readonly config: OystehrConfig;\n protected readonly logger: Logger;\n constructor(config: OystehrConfig) {\n this.config = config;\n this.logger = new Logger({\n level: this.config.logLevel,\n });\n }\n\n protected request(path: string, method: string, baseUrlThunk: () => string): FetcherFunction {\n return async (params: any, request?: InternalClientRequest): Promise<FetcherResponse> => {\n const configThunk = (): OystehrConfig => this.config;\n const loggerThunk = (): Logger => this.logger;\n try {\n // must await here to catch\n return await fetcher(baseUrlThunk, configThunk, loggerThunk, path, method)(params, request);\n } catch (err: any) {\n const error = err as { message: string; code: number; cause?: unknown };\n this.logger.error(error.message, { code: error.code, cause: error.cause });\n throw new OystehrSdkError({ message: error.message, code: error.code, cause: error.cause });\n }\n };\n }\n\n protected fhirRequest<T = FhirResource>(\n path: string,\n method: string\n ): {\n (params: any, request: InternalClientRequest & { rawResponse: true }, requestMode?: FhirResponseMode): Promise<\n RawFetcherResponse<T>\n >;\n (params: any, request?: InternalClientRequest, requestMode?: FhirResponseMode): Promise<T>;\n } {\n return async (params: any, request?: InternalClientRequest, requestMode?: FhirResponseMode): Promise<any> => {\n try {\n const baseUrlThunk = (): string => this.config.services?.fhirApiUrl ?? defaultFhirApiUrl;\n const configThunk = (): OystehrConfig => this.config;\n const loggerThunk = (): Logger => this.logger;\n // must await here to catch\n return await fetcher(baseUrlThunk, configThunk, loggerThunk, path, method)(params, request, requestMode);\n } catch (err: unknown) {\n // FHIR API error messages are JSON strings\n const fullError = err as { message: string | Record<string, any>; code: number; cause?: unknown };\n if (typeof fullError.message === 'string') {\n throw new OystehrSdkError({\n message: fullError.message,\n code: fullError.code,\n cause: fullError.cause,\n });\n }\n throw new OystehrFHIRError({\n error: fullError.message as OperationOutcome,\n code: fullError.code,\n });\n }\n };\n }\n\n protected async startAsyncJob(\n path: string,\n method: string,\n params: Record<string, unknown>,\n requestMode: FhirResponseMode,\n request?: InternalClientRequest\n ): Promise<FhirAsyncJobHandle> {\n const mode = requestMode === 'async-bulk' ? 'bulk' : 'bundle';\n const asyncPath = requestMode === 'async-bulk' ? this.appendBulkOutputFormat(path) : path;\n\n const raw = await this.fhirRequest(asyncPath, method)(\n params,\n {\n ...request,\n rawResponse: true,\n },\n requestMode\n );\n\n if (raw.status !== 202) {\n throw new OystehrSdkError({\n message: `Expected start async job to return 202 Accepted, received ${raw.status}`,\n code: raw.status,\n });\n }\n\n const contentLocation = this.readHeader(raw.headers, 'content-location');\n if (!contentLocation) {\n throw new OystehrSdkError({\n message: 'Start Async job response missing Content-Location header',\n code: 500,\n });\n }\n\n const jobId = this.parseAsyncJobId(contentLocation);\n if (!jobId) {\n throw new OystehrSdkError({\n message: `Could not parse async job id from Content-Location: ${contentLocation}`,\n code: 500,\n });\n }\n\n return { jobId, contentLocation, mode };\n }\n\n protected async fetchAsyncJobStatus<T extends FhirResource>(\n jobId: string,\n request?: OystehrClientRequest\n ): Promise<FhirAsyncJobStatus<T>> {\n const raw = await this.fhirRequest(`/async-job/${jobId}`, 'GET')(\n {},\n {\n ...request,\n rawResponse: true,\n }\n );\n\n if (raw.status === 202) {\n return {\n status: 202,\n xProgress: this.readHeader(raw.headers, 'x-progress'),\n retryAfter: this.readHeader(raw.headers, 'retry-after'),\n };\n }\n\n if (raw.status === 410) {\n return { status: 410 };\n }\n\n if (raw.status === 404) {\n return { status: 404 };\n }\n\n if (raw.status === 200) {\n if (this.isBulkManifest(raw.body)) {\n return {\n status: 200,\n mode: 'bulk',\n manifest: raw.body,\n };\n }\n\n const bundle = raw.body as FhirAsyncCompletionBundle<T>;\n if (bundle?.resourceType === 'Bundle' && bundle?.type === 'batch-response') {\n const entry0 = bundle.entry?.[0];\n const interactionStatus = entry0?.response?.status;\n const resource = entry0?.resource;\n const outcome = entry0?.response?.outcome;\n return {\n status: 200,\n mode: 'bundle',\n bundle,\n interactionStatus,\n resource,\n outcome,\n };\n }\n\n return {\n status: 200,\n body: raw.body,\n };\n }\n\n return {\n status: raw.status,\n body: raw.body,\n };\n }\n\n private readHeader(headers: Record<string, string>, name: string): string | undefined {\n const direct = headers[name];\n if (direct != null) {\n return direct;\n }\n\n const lower = name.toLowerCase();\n const key = Object.keys(headers).find((h) => h.toLowerCase() === lower);\n return key ? headers[key] : undefined;\n }\n\n private parseAsyncJobId(contentLocation: string): string | undefined {\n const segments = contentLocation.split('/').filter(Boolean);\n const asyncJobIndex = segments.lastIndexOf('async-job');\n if (asyncJobIndex < 0 || asyncJobIndex + 1 >= segments.length) {\n return undefined;\n }\n\n return segments[asyncJobIndex + 1];\n }\n\n private appendBulkOutputFormat(path: string): string {\n const separator = path.includes('?') ? '&' : '?';\n return `${path}${separator}_outputFormat=${encodeURIComponent('application/fhir+ndjson')}`;\n }\n\n private isBulkManifest(body: unknown): body is FhirAsyncBulkManifest {\n if (body == null || typeof body !== 'object') {\n return false;\n }\n\n const maybe = body as Record<string, unknown>;\n return (\n typeof maybe.transactionTime === 'string' &&\n typeof maybe.request === 'string' &&\n typeof maybe.requiresAccessToken === 'boolean' &&\n Array.isArray(maybe.output) &&\n Array.isArray(maybe.error)\n );\n }\n}\n\nexport type FetcherError = { message: string; code: number };\nexport type FetcherResponse = any;\nexport type RawFetcherResponse<T = unknown> = {\n status: number;\n headers: Record<string, string>;\n body: T | null;\n};\nexport type FetcherFunction = (\n params?: Record<string, any> | [any] | InternalClientRequest,\n request?: InternalClientRequest,\n requestMode?: FhirResponseMode\n) => Promise<FetcherResponse>;\n\nfunction isInternalClientRequest(request: Record<string, any>): request is InternalClientRequest {\n return (\n 'accessToken' in request ||\n ('projectId' in request && uuidValidate(request.projectId)) ||\n ('contentType' in request && request.contentType?.split('/').length === 2) ||\n 'requestId' in request ||\n ('ifMatch' in request && request.ifMatch.startsWith('W/\"')) ||\n 'mode' in request ||\n 'rawResponse' in request\n );\n}\n\nfunction getPreferHeaderFromMode(mode: FhirResponseMode | undefined): string | undefined {\n if (mode === 'async-bundle' || mode === 'async-bulk') {\n return 'respond-async';\n }\n return undefined;\n}\n\n/**\n * Parse XML response in format <response><status>...</status><output>...</output></response>\n */\nfunction parseXmlResponse(xmlString: string): Record<string, unknown> | null {\n try {\n // Extract status\n const statusMatch = xmlString.match(/<status>(\\d+)<\\/status>/);\n const status = statusMatch ? parseInt(statusMatch[1], 10) : null;\n\n // Extract output - everything between <output> and </output>\n const outputMatch = xmlString.match(/<output>([\\s\\S]*?)<\\/output>/);\n const output = outputMatch ? outputMatch[1] : null;\n\n if (status === null || output === null) {\n return null;\n }\n\n return { status, output };\n } catch (_err) {\n return null;\n }\n}\n\nfunction fetcher(\n baseUrlThunk: () => string,\n configThunk: () => OystehrConfig,\n loggerThunk: () => Logger,\n path: string,\n methodParam: string\n): FetcherFunction {\n return async (\n params?: Record<string, unknown> | [any] | InternalClientRequest,\n request?: InternalClientRequest,\n requestMode?: FhirResponseMode\n ): Promise<FetcherResponse> => {\n // this function supports multiple signatures. fetcher(baseUrl, path, method)(params, request) or fetcher(baseUrl, path, method)(request)\n // or fetcher(baseUrl, path, method)(params) or fetcher(baseUrl, path, method)(). the types for this are handled by Client<Path, Methods>\n // and this is the backend implementation behind it. the heuristic we're using is that if the first param is an object with an accessToken\n // and there is no second param, assume the first one is the request object instead\n // eslint-disable-next-line prefer-const\n let [providedParams, requestCtx] = extractParamsAndRequest(params, request);\n requestCtx ??= {};\n requestCtx.requestId ??= uuidv4();\n const config = configThunk();\n const logger = loggerThunk();\n const method = methodParam.toLowerCase() as HttpMethod;\n logger.debug('Beginning fetch', {\n method,\n path,\n requestId: requestCtx?.requestId,\n });\n const fetchImpl = config.fetch ?? fetch;\n const accessToken = requestCtx?.accessToken ?? config.accessToken;\n const projectId = requestCtx?.projectId ?? config.projectId;\n let finalPath = path;\n let finalParams = providedParams;\n if (!Array.isArray(providedParams)) {\n const [subbedPath, addlParams] = subParamsInPath(path, providedParams);\n finalPath = subbedPath;\n finalParams = addlParams;\n }\n logger.debug('Substituted parameters in path', {\n method,\n path,\n requestId: requestCtx?.requestId,\n });\n finalPath = finalPath.replace(/^\\//, ''); // remove leading slash\n const baseUrlEvaluated = baseUrlThunk();\n const fullBaseUrl = baseUrlEvaluated.endsWith('/') ? baseUrlEvaluated : baseUrlEvaluated + '/';\n const url = new URL(finalPath, fullBaseUrl);\n let body: any;\n\n if (Array.isArray(finalParams)) {\n body = JSON.stringify(finalParams);\n } else if (Object.keys(finalParams).length) {\n if (method === 'get') {\n addParamsToSearch(finalParams, url.searchParams);\n } else if (requestCtx?.contentType === 'application/x-www-form-urlencoded') {\n const search = new URLSearchParams();\n addParamsToSearch(finalParams, search);\n body = search.toString();\n } else {\n body = JSON.stringify(finalParams);\n }\n } else {\n // override for rpc call\n if (requestCtx?.contentType !== 'application/x-www-form-urlencoded' && method === 'post') {\n body = '{}';\n }\n }\n logger.debug('Prepared request body', {\n method,\n path,\n requestId: requestCtx?.requestId,\n });\n\n const preferHeader = getPreferHeaderFromMode(requestMode);\n\n const headers: Record<string, string> = Object.assign(\n projectId\n ? {\n 'x-zapehr-project-id': projectId,\n 'x-oystehr-project-id': projectId,\n }\n : {},\n {\n 'content-type': requestCtx?.contentType ?? 'application/json',\n },\n preferHeader ? { Prefer: preferHeader } : {},\n accessToken ? { Authorization: `Bearer ${accessToken}` } : {},\n requestCtx?.ifMatch ? { 'If-Match': requestCtx.ifMatch } : {},\n { 'x-oystehr-request-id': requestCtx?.requestId }\n );\n const retryConfig: ConstructedRetryConfig = {\n retries: config.retry?.retries ?? 3,\n jitter: config.retry?.jitter ?? 20,\n delay: config.retry?.delay ?? 100,\n onRetry: config.retry?.onRetry,\n // Using array instead of set because the length is too short for uniqueness to be important\n retryOn: [...(config.retry?.retryOn ?? []), ...STATUS_CODES_TO_RETRY],\n };\n retryConfig.retryOn.push(...STATUS_CODES_TO_RETRY);\n return retry(async () => {\n logger.info('Request start', {\n method,\n url,\n requestId: requestCtx?.requestId,\n });\n const now = Date.now();\n const response = await fetchImpl(\n new Request(url, {\n method: method.toUpperCase(),\n body,\n headers,\n })\n );\n logger.info('Request end', {\n method,\n url,\n duration: Date.now() - now,\n requestId: requestCtx?.requestId,\n });\n const responseBody = response.body ? await response.text() : null;\n let responseJson: Record<string, unknown> | null;\n const contentType = response.headers.get('content-type');\n try {\n if (\n responseBody &&\n (contentType?.includes('application/json') || contentType?.includes('application/fhir+json'))\n ) {\n logger.time('Deserialized JSON response', {\n method,\n url,\n requestId: requestCtx?.requestId,\n });\n responseJson = JSON.parse(responseBody);\n logger.timeEnd('Deserialized JSON response', {\n method,\n url,\n requestId: requestCtx?.requestId,\n });\n } else if (responseBody && (contentType?.includes('application/xml') || contentType?.includes('text/xml'))) {\n // Parse XML response into { status, output } structure\n logger.time('Deserialized XML response', {\n method,\n url,\n requestId: requestCtx?.requestId,\n });\n responseJson = parseXmlResponse(responseBody);\n logger.timeEnd('Deserialized XML response', {\n method,\n url,\n requestId: requestCtx?.requestId,\n });\n } else {\n responseJson = null;\n }\n } catch (_err) {\n // ignore JSON.parse errors\n responseJson = null;\n }\n logger.debug('Deserialized response', {\n method,\n url,\n requestId: requestCtx?.requestId,\n });\n if (requestCtx?.rawResponse) {\n const headersRecord: Record<string, string> = {};\n response.headers.forEach((value, key) => {\n headersRecord[key] = value;\n });\n return {\n status: response.status,\n headers: headersRecord,\n body: responseJson ?? responseBody,\n } as RawFetcherResponse;\n }\n const isError = !response.ok || response.status >= 400;\n if (isError) {\n const errObj = {\n message:\n (typeof responseJson?.output === 'string'\n ? responseJson.output // XML error case - output is XML string\n : (responseJson?.output as Record<string, unknown>)?.message) ?? // official zambda output format (JSON)\n responseJson?.message ?? // normal endpoint output format\n responseJson ?? // parsable json\n responseBody ?? // raw response\n response.statusText, // fallback to status text\n code:\n (responseJson?.output as Record<string, unknown>)?.code ?? // official zambda output format\n responseJson?.code ?? // normal endpoint output format\n response.status, // fallback to status code\n response,\n };\n throw errObj;\n }\n return responseJson;\n }, retryConfig);\n };\n}\n\ntype ConstructedRetryConfig = Omit<NonNullable<OystehrConfig['retry']>, 'retryOn'> & {\n jitter: NonNullable<NonNullable<OystehrConfig['retry']>['jitter']>;\n delay: NonNullable<NonNullable<OystehrConfig['retry']>['delay']>;\n retryOn: NonNullable<NonNullable<OystehrConfig['retry']>['retryOn']>;\n};\nasync function retry<T>(work: (attempt: number) => Promise<T>, config: ConstructedRetryConfig): Promise<T> {\n let lastErr;\n for (const attempt of Array.from({ length: (config.retries ?? 0) + 1 }, (_, index) => index)) {\n try {\n return await work(attempt);\n } catch (e: any) {\n let isRetryable = false;\n if ('response' in e) {\n // error from API\n const err = e as FetcherError;\n isRetryable = config.retryOn.includes(err.code);\n // Removes response\n lastErr = { message: e.message, code: e.code };\n } else {\n lastErr = e;\n // error from fetch\n if ('code' in e && typeof e.code === 'string') {\n const err = e as { code: string };\n isRetryable = ERROR_CODES_TO_RETRY.includes(err.code);\n }\n }\n if (!isRetryable) {\n break;\n }\n const jitter = Math.floor(Math.random() * (config.jitter + 1));\n await new Promise((resolve) => setTimeout(resolve, config.delay + jitter));\n if (config.onRetry && attempt !== (config.retries ?? 0)) {\n config.onRetry(attempt + 1);\n }\n }\n }\n throw lastErr;\n}\n\n/**\n * Substitutes params in a path and returns the path with params substituted and any unused params.\n *\n * Uses the property names in the params object to determine the param to substitute in the path.\n *\n * @param path JSON API resource URI\n * @param params all params provided to the client method\n * @returns resource URI with params substituted and any unused params\n */\nfunction subParamsInPath(path: string, params: Record<string, unknown>): [string, Record<string, string>] {\n const unusedParams = { ...params };\n // capture everything of the form `{paramName}` and replace with the value of `params[paramName]`\n const subbedPath = path.replace(/\\{([^}]+)\\}/g, (_, paramName) => {\n delete unusedParams[paramName];\n // override for path params that are paths, indicated by a `+` at the end\n if (paramName.match(/^.*\\+$/)) {\n return params[paramName] + '';\n }\n // error if param value is empty\n if (!params[paramName] || params[paramName] === '') {\n throw new OystehrSdkError({ message: `Required path parameter is an empty string: ${paramName}`, code: 400 });\n }\n // encode search params\n if (params[paramName]) {\n return encodeURIComponent(params[paramName] + ''); // coerce to string\n }\n return '';\n });\n\n const unusedKeys = Object.keys(unusedParams);\n const addlParams = unusedKeys.length\n ? unusedKeys.reduce((acc, key) => ({ ...acc, [key]: unusedParams[key] }), {})\n : {};\n return [subbedPath, addlParams];\n}\n\n/**\n * Adds params to a URLSearchParams object in such a way as to preserve array values.\n * @param params params\n * @param search URLSearchParams object\n */\nexport function addParamsToSearch(params: Record<string, unknown>, search: URLSearchParams): void {\n for (const [key, value] of Object.entries(params)) {\n if (Array.isArray(value)) {\n value.forEach((v) => v !== null && v !== undefined && search.append(key, v as string));\n continue;\n }\n if (value !== null && value !== undefined) {\n search.append(key, value as string);\n }\n }\n}\n\nexport function extractParamsAndRequest(\n params?: Record<string, unknown> | [any] | InternalClientRequest,\n request?: InternalClientRequest\n): [Record<string, unknown>, InternalClientRequest | undefined] {\n const providedParams: Record<string, unknown> | [any] =\n !!params && !request && !Array.isArray(params) && isInternalClientRequest(params)\n ? {}\n : (params as Record<string, unknown>) ?? {};\n const requestCtx =\n !!params && !request && !Array.isArray(params) && isInternalClientRequest(params)\n ? (params as InternalClientRequest)\n : request;\n return [providedParams, requestCtx];\n}\n"],"names":["uuidValidate","uuidv4"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"client.js","sources":["../../../src/client/client.ts"],"sourcesContent":["import { v4 as uuidv4, validate as uuidValidate } from 'uuid';\nimport { OystehrConfig } from '../config';\nimport { OystehrFHIRError, OystehrSdkError } from '../errors';\nimport { Logger } from '../logger';\nimport {\n FhirAsyncBulkManifest,\n FhirAsyncCompletionBundle,\n FhirAsyncJobHandle,\n FhirAsyncJobStatus,\n FhirBundle,\n FhirResource,\n FhirResponseMode,\n OperationOutcome,\n} from '../resources/types';\n\ntype HttpMethod = 'get' | 'put' | 'post' | 'delete' | 'options' | 'head' | 'patch' | 'trace';\nexport const defaultProjectApiUrl = 'https://project-api.zapehr.com/v1';\nconst defaultFhirApiUrl = 'https://fhir-api.zapehr.com';\nconst STATUS_CODES_TO_RETRY = [408, 429, 500, 502, 503, 504];\nconst ERROR_CODES_TO_RETRY = [\n 'ECONNRESET',\n 'ECONNREFUSED',\n 'EPIPE',\n 'ETIMEDOUT',\n 'UND_ERR_CONNECT_TIMEOUT',\n 'UND_ERR_HEADERS_TIMEOUT',\n 'UND_ERR_HEADERS_TIMEOUT',\n 'UND_ERR_SOCKET',\n];\n\n/**\n * Optional parameter that can be passed to the client methods. It allows\n * overriding the access token or project ID, and setting various headers,\n * such as 'Content-Type'.\n */\nexport interface OystehrClientRequest {\n /**\n * The access token to use for the request. If not provided, the access token from `oystehr.init()` will be used.\n */\n accessToken?: string;\n /**\n * The project ID to use for the request. If not provided, the project ID from `oystehr.init()` will be used.\n */\n projectId?: string;\n /**\n * The value of the 'Content-Type' header to use for the request.\n */\n contentType?: string;\n /**\n * Unique identifier for this request.\n */\n requestId?: string;\n /**\n * Optional execution mode for FHIR requests that support async behavior.\n * Defaults to `sync` when omitted.\n */\n mode?: FhirResponseMode;\n}\n\ninterface InternalClientRequest extends OystehrClientRequest {\n ifMatch?: string;\n /**\n * Internal-only: the value of the 'If-None-Exist' header, used for FHIR\n * conditional creates. A FHIR search query string (e.g. \"identifier=sys|123\").\n */\n ifNoneExist?: string;\n /**\n * Internal-only: returns raw response metadata ({ status, headers, body }) instead of throwing on non-2xx statuses.\n */\n rawResponse?: boolean;\n}\n\ntype FhirData<T extends FhirResource> = T | T[] | FhirBundle<T>;\nexport type FhirFetcherResponse<T extends FhirData<FhirResource> = any> = T;\n\nexport class SDKResource {\n protected readonly config: OystehrConfig;\n protected readonly logger: Logger;\n constructor(config: OystehrConfig) {\n this.config = config;\n this.logger = new Logger({\n level: this.config.logLevel,\n });\n }\n\n protected request(path: string, method: string, baseUrlThunk: () => string): FetcherFunction {\n return async (params: any, request?: InternalClientRequest): Promise<FetcherResponse> => {\n const configThunk = (): OystehrConfig => this.config;\n const loggerThunk = (): Logger => this.logger;\n try {\n // must await here to catch\n return await fetcher(baseUrlThunk, configThunk, loggerThunk, path, method)(params, request);\n } catch (err: any) {\n const error = err as { message: string; code: number; cause?: unknown };\n this.logger.error(error.message, { code: error.code, cause: error.cause });\n throw new OystehrSdkError({ message: error.message, code: error.code, cause: error.cause });\n }\n };\n }\n\n protected fhirRequest<T = FhirResource>(\n path: string,\n method: string\n ): {\n (params: any, request: InternalClientRequest & { rawResponse: true }, requestMode?: FhirResponseMode): Promise<\n RawFetcherResponse<T>\n >;\n (params: any, request?: InternalClientRequest, requestMode?: FhirResponseMode): Promise<T>;\n } {\n return async (params: any, request?: InternalClientRequest, requestMode?: FhirResponseMode): Promise<any> => {\n try {\n const baseUrlThunk = (): string => this.config.services?.fhirApiUrl ?? defaultFhirApiUrl;\n const configThunk = (): OystehrConfig => this.config;\n const loggerThunk = (): Logger => this.logger;\n // must await here to catch\n return await fetcher(baseUrlThunk, configThunk, loggerThunk, path, method)(params, request, requestMode);\n } catch (err: unknown) {\n // FHIR API error messages are JSON strings\n const fullError = err as { message: string | Record<string, any>; code: number; cause?: unknown };\n if (typeof fullError.message === 'string') {\n throw new OystehrSdkError({\n message: fullError.message,\n code: fullError.code,\n cause: fullError.cause,\n });\n }\n throw new OystehrFHIRError({\n error: fullError.message as OperationOutcome,\n code: fullError.code,\n });\n }\n };\n }\n\n protected async startAsyncJob(\n path: string,\n method: string,\n params: Record<string, unknown>,\n requestMode: FhirResponseMode,\n request?: InternalClientRequest\n ): Promise<FhirAsyncJobHandle> {\n const mode = requestMode === 'async-bulk' ? 'bulk' : 'bundle';\n const asyncPath = requestMode === 'async-bulk' ? this.appendBulkOutputFormat(path) : path;\n\n const raw = await this.fhirRequest(asyncPath, method)(\n params,\n {\n ...request,\n rawResponse: true,\n },\n requestMode\n );\n\n if (raw.status !== 202) {\n throw new OystehrSdkError({\n message: `Expected start async job to return 202 Accepted, received ${raw.status}`,\n code: raw.status,\n });\n }\n\n const contentLocation = this.readHeader(raw.headers, 'content-location');\n if (!contentLocation) {\n throw new OystehrSdkError({\n message: 'Start Async job response missing Content-Location header',\n code: 500,\n });\n }\n\n const jobId = this.parseAsyncJobId(contentLocation);\n if (!jobId) {\n throw new OystehrSdkError({\n message: `Could not parse async job id from Content-Location: ${contentLocation}`,\n code: 500,\n });\n }\n\n return { jobId, contentLocation, mode };\n }\n\n protected async fetchAsyncJobStatus<T extends FhirResource>(\n jobId: string,\n request?: OystehrClientRequest\n ): Promise<FhirAsyncJobStatus<T>> {\n const raw = await this.fhirRequest(`/async-job/${jobId}`, 'GET')(\n {},\n {\n ...request,\n rawResponse: true,\n }\n );\n\n if (raw.status === 202) {\n return {\n status: 202,\n xProgress: this.readHeader(raw.headers, 'x-progress'),\n retryAfter: this.readHeader(raw.headers, 'retry-after'),\n };\n }\n\n if (raw.status === 410) {\n return { status: 410 };\n }\n\n if (raw.status === 404) {\n return { status: 404 };\n }\n\n if (raw.status === 200) {\n if (this.isBulkManifest(raw.body)) {\n return {\n status: 200,\n mode: 'bulk',\n manifest: raw.body,\n };\n }\n\n const bundle = raw.body as FhirAsyncCompletionBundle<T>;\n if (bundle?.resourceType === 'Bundle' && bundle?.type === 'batch-response') {\n const entry0 = bundle.entry?.[0];\n const interactionStatus = entry0?.response?.status;\n const resource = entry0?.resource;\n const outcome = entry0?.response?.outcome;\n return {\n status: 200,\n mode: 'bundle',\n bundle,\n interactionStatus,\n resource,\n outcome,\n };\n }\n\n return {\n status: 200,\n body: raw.body,\n };\n }\n\n return {\n status: raw.status,\n body: raw.body,\n };\n }\n\n private readHeader(headers: Record<string, string>, name: string): string | undefined {\n const direct = headers[name];\n if (direct != null) {\n return direct;\n }\n\n const lower = name.toLowerCase();\n const key = Object.keys(headers).find((h) => h.toLowerCase() === lower);\n return key ? headers[key] : undefined;\n }\n\n private parseAsyncJobId(contentLocation: string): string | undefined {\n const segments = contentLocation.split('/').filter(Boolean);\n const asyncJobIndex = segments.lastIndexOf('async-job');\n if (asyncJobIndex < 0 || asyncJobIndex + 1 >= segments.length) {\n return undefined;\n }\n\n return segments[asyncJobIndex + 1];\n }\n\n private appendBulkOutputFormat(path: string): string {\n const separator = path.includes('?') ? '&' : '?';\n return `${path}${separator}_outputFormat=${encodeURIComponent('application/fhir+ndjson')}`;\n }\n\n private isBulkManifest(body: unknown): body is FhirAsyncBulkManifest {\n if (body == null || typeof body !== 'object') {\n return false;\n }\n\n const maybe = body as Record<string, unknown>;\n return (\n typeof maybe.transactionTime === 'string' &&\n typeof maybe.request === 'string' &&\n typeof maybe.requiresAccessToken === 'boolean' &&\n Array.isArray(maybe.output) &&\n Array.isArray(maybe.error)\n );\n }\n}\n\nexport type FetcherError = { message: string; code: number };\nexport type FetcherResponse = any;\nexport type RawFetcherResponse<T = unknown> = {\n status: number;\n headers: Record<string, string>;\n body: T | null;\n};\nexport type FetcherFunction = (\n params?: Record<string, any> | [any] | InternalClientRequest,\n request?: InternalClientRequest,\n requestMode?: FhirResponseMode\n) => Promise<FetcherResponse>;\n\nfunction isInternalClientRequest(request: Record<string, any>): request is InternalClientRequest {\n return (\n 'accessToken' in request ||\n ('projectId' in request && uuidValidate(request.projectId)) ||\n ('contentType' in request && request.contentType?.split('/').length === 2) ||\n 'requestId' in request ||\n ('ifMatch' in request && request.ifMatch.startsWith('W/\"')) ||\n 'ifNoneExist' in request ||\n 'mode' in request ||\n 'rawResponse' in request\n );\n}\n\nfunction isResourcePayload(params: Record<string, unknown>): boolean {\n return typeof params.resourceType === 'string' && params.resourceType.length > 0;\n}\n\nfunction getPreferHeaderFromMode(mode: FhirResponseMode | undefined): string | undefined {\n if (mode === 'async-bundle' || mode === 'async-bulk') {\n return 'respond-async';\n }\n return undefined;\n}\n\n/**\n * Parse XML response in format <response><status>...</status><output>...</output></response>\n */\nfunction parseXmlResponse(xmlString: string): Record<string, unknown> | null {\n try {\n // Extract status\n const statusMatch = xmlString.match(/<status>(\\d+)<\\/status>/);\n const status = statusMatch ? parseInt(statusMatch[1], 10) : null;\n\n // Extract output - everything between <output> and </output>\n const outputMatch = xmlString.match(/<output>([\\s\\S]*?)<\\/output>/);\n const output = outputMatch ? outputMatch[1] : null;\n\n if (status === null || output === null) {\n return null;\n }\n\n return { status, output };\n } catch (_err) {\n return null;\n }\n}\n\nfunction fetcher(\n baseUrlThunk: () => string,\n configThunk: () => OystehrConfig,\n loggerThunk: () => Logger,\n path: string,\n methodParam: string\n): FetcherFunction {\n return async (\n params?: Record<string, unknown> | [any] | InternalClientRequest,\n request?: InternalClientRequest,\n requestMode?: FhirResponseMode\n ): Promise<FetcherResponse> => {\n // this function supports multiple signatures. fetcher(baseUrl, path, method)(params, request) or fetcher(baseUrl, path, method)(request)\n // or fetcher(baseUrl, path, method)(params) or fetcher(baseUrl, path, method)(). the types for this are handled by Client<Path, Methods>\n // and this is the backend implementation behind it. the heuristic we're using is that if the first param is an object with an accessToken\n // and there is no second param, assume the first one is the request object instead\n // eslint-disable-next-line prefer-const\n let [providedParams, requestCtx] = extractParamsAndRequest(params, request);\n requestCtx ??= {};\n requestCtx.requestId ??= uuidv4();\n const config = configThunk();\n const logger = loggerThunk();\n const method = methodParam.toLowerCase() as HttpMethod;\n logger.debug('Beginning fetch', {\n method,\n path,\n requestId: requestCtx?.requestId,\n });\n const fetchImpl = config.fetch ?? fetch;\n const accessToken = requestCtx?.accessToken ?? config.accessToken;\n const projectId = requestCtx?.projectId ?? config.projectId;\n let finalPath = path;\n let finalParams = providedParams;\n if (!Array.isArray(providedParams)) {\n const [subbedPath, addlParams] = subParamsInPath(path, providedParams);\n finalPath = subbedPath;\n finalParams = addlParams;\n }\n logger.debug('Substituted parameters in path', {\n method,\n path,\n requestId: requestCtx?.requestId,\n });\n finalPath = finalPath.replace(/^\\//, ''); // remove leading slash\n const baseUrlEvaluated = baseUrlThunk();\n const fullBaseUrl = baseUrlEvaluated.endsWith('/') ? baseUrlEvaluated : baseUrlEvaluated + '/';\n const url = new URL(finalPath, fullBaseUrl);\n let body: any;\n\n if (Array.isArray(finalParams)) {\n body = JSON.stringify(finalParams);\n } else if (Object.keys(finalParams).length) {\n if (method === 'get') {\n addParamsToSearch(finalParams, url.searchParams);\n } else if (requestCtx?.contentType === 'application/x-www-form-urlencoded') {\n const search = new URLSearchParams();\n addParamsToSearch(finalParams, search);\n body = search.toString();\n } else {\n body = JSON.stringify(finalParams);\n }\n } else {\n // override for rpc call\n if (requestCtx?.contentType !== 'application/x-www-form-urlencoded' && method === 'post') {\n body = '{}';\n }\n }\n logger.debug('Prepared request body', {\n method,\n path,\n requestId: requestCtx?.requestId,\n });\n\n const preferHeader = getPreferHeaderFromMode(requestMode);\n\n const headers: Record<string, string> = Object.assign(\n projectId\n ? {\n 'x-zapehr-project-id': projectId,\n 'x-oystehr-project-id': projectId,\n }\n : {},\n {\n 'content-type': requestCtx?.contentType ?? 'application/json',\n },\n preferHeader ? { Prefer: preferHeader } : {},\n accessToken ? { Authorization: `Bearer ${accessToken}` } : {},\n requestCtx?.ifMatch ? { 'If-Match': requestCtx.ifMatch } : {},\n requestCtx?.ifNoneExist ? { 'If-None-Exist': requestCtx.ifNoneExist } : {},\n { 'x-oystehr-request-id': requestCtx?.requestId }\n );\n const retryConfig: ConstructedRetryConfig = {\n retries: config.retry?.retries ?? 3,\n jitter: config.retry?.jitter ?? 20,\n delay: config.retry?.delay ?? 100,\n onRetry: config.retry?.onRetry,\n // Using array instead of set because the length is too short for uniqueness to be important\n retryOn: [...(config.retry?.retryOn ?? []), ...STATUS_CODES_TO_RETRY],\n };\n retryConfig.retryOn.push(...STATUS_CODES_TO_RETRY);\n return retry(async () => {\n logger.info('Request start', {\n method,\n url,\n requestId: requestCtx?.requestId,\n });\n const now = Date.now();\n const response = await fetchImpl(\n new Request(url, {\n method: method.toUpperCase(),\n body,\n headers,\n })\n );\n logger.info('Request end', {\n method,\n url,\n duration: Date.now() - now,\n requestId: requestCtx?.requestId,\n });\n const responseBody = response.body ? await response.text() : null;\n let responseJson: Record<string, unknown> | null;\n const contentType = response.headers.get('content-type');\n try {\n if (\n responseBody &&\n (contentType?.includes('application/json') || contentType?.includes('application/fhir+json'))\n ) {\n logger.time('Deserialized JSON response', {\n method,\n url,\n requestId: requestCtx?.requestId,\n });\n responseJson = JSON.parse(responseBody);\n logger.timeEnd('Deserialized JSON response', {\n method,\n url,\n requestId: requestCtx?.requestId,\n });\n } else if (responseBody && (contentType?.includes('application/xml') || contentType?.includes('text/xml'))) {\n // Parse XML response into { status, output } structure\n logger.time('Deserialized XML response', {\n method,\n url,\n requestId: requestCtx?.requestId,\n });\n responseJson = parseXmlResponse(responseBody);\n logger.timeEnd('Deserialized XML response', {\n method,\n url,\n requestId: requestCtx?.requestId,\n });\n } else {\n responseJson = null;\n }\n } catch (_err) {\n // ignore JSON.parse errors\n responseJson = null;\n }\n logger.debug('Deserialized response', {\n method,\n url,\n requestId: requestCtx?.requestId,\n });\n if (requestCtx?.rawResponse) {\n const headersRecord: Record<string, string> = {};\n response.headers.forEach((value, key) => {\n headersRecord[key] = value;\n });\n return {\n status: response.status,\n headers: headersRecord,\n body: responseJson ?? responseBody,\n } as RawFetcherResponse;\n }\n const isError = !response.ok || response.status >= 400;\n if (isError) {\n const errObj = {\n message:\n (typeof responseJson?.output === 'string'\n ? responseJson.output // XML error case - output is XML string\n : (responseJson?.output as Record<string, unknown>)?.message) ?? // official zambda output format (JSON)\n responseJson?.message ?? // normal endpoint output format\n responseJson ?? // parsable json\n responseBody ?? // raw response\n response.statusText, // fallback to status text\n code:\n (responseJson?.output as Record<string, unknown>)?.code ?? // official zambda output format\n responseJson?.code ?? // normal endpoint output format\n response.status, // fallback to status code\n response,\n };\n throw errObj;\n }\n return responseJson;\n }, retryConfig);\n };\n}\n\ntype ConstructedRetryConfig = Omit<NonNullable<OystehrConfig['retry']>, 'retryOn'> & {\n jitter: NonNullable<NonNullable<OystehrConfig['retry']>['jitter']>;\n delay: NonNullable<NonNullable<OystehrConfig['retry']>['delay']>;\n retryOn: NonNullable<NonNullable<OystehrConfig['retry']>['retryOn']>;\n};\nasync function retry<T>(work: (attempt: number) => Promise<T>, config: ConstructedRetryConfig): Promise<T> {\n let lastErr;\n for (const attempt of Array.from({ length: (config.retries ?? 0) + 1 }, (_, index) => index)) {\n try {\n return await work(attempt);\n } catch (e: any) {\n let isRetryable = false;\n if ('response' in e) {\n // error from API\n const err = e as FetcherError;\n isRetryable = config.retryOn.includes(err.code);\n // Removes response\n lastErr = { message: e.message, code: e.code };\n } else {\n lastErr = e;\n // error from fetch\n if ('code' in e && typeof e.code === 'string') {\n const err = e as { code: string };\n isRetryable = ERROR_CODES_TO_RETRY.includes(err.code);\n }\n }\n if (!isRetryable) {\n break;\n }\n const jitter = Math.floor(Math.random() * (config.jitter + 1));\n await new Promise((resolve) => setTimeout(resolve, config.delay + jitter));\n if (config.onRetry && attempt !== (config.retries ?? 0)) {\n config.onRetry(attempt + 1);\n }\n }\n }\n throw lastErr;\n}\n\n/**\n * Substitutes params in a path and returns the path with params substituted and any unused params.\n *\n * Uses the property names in the params object to determine the param to substitute in the path.\n *\n * @param path JSON API resource URI\n * @param params all params provided to the client method\n * @returns resource URI with params substituted and any unused params\n */\nfunction subParamsInPath(path: string, params: Record<string, unknown>): [string, Record<string, string>] {\n const unusedParams = { ...params };\n // capture everything of the form `{paramName}` and replace with the value of `params[paramName]`\n const subbedPath = path.replace(/\\{([^}]+)\\}/g, (_, paramName) => {\n delete unusedParams[paramName];\n // override for path params that are paths, indicated by a `+` at the end\n if (paramName.match(/^.*\\+$/)) {\n return params[paramName] + '';\n }\n // error if param value is empty\n if (!params[paramName] || params[paramName] === '') {\n throw new OystehrSdkError({ message: `Required path parameter is an empty string: ${paramName}`, code: 400 });\n }\n // encode search params\n if (params[paramName]) {\n return encodeURIComponent(params[paramName] + ''); // coerce to string\n }\n return '';\n });\n\n const unusedKeys = Object.keys(unusedParams);\n const addlParams = unusedKeys.length\n ? unusedKeys.reduce((acc, key) => ({ ...acc, [key]: unusedParams[key] }), {})\n : {};\n return [subbedPath, addlParams];\n}\n\n/**\n * Adds params to a URLSearchParams object in such a way as to preserve array values.\n * @param params params\n * @param search URLSearchParams object\n */\nexport function addParamsToSearch(params: Record<string, unknown>, search: URLSearchParams): void {\n for (const [key, value] of Object.entries(params)) {\n if (Array.isArray(value)) {\n value.forEach((v) => v !== null && v !== undefined && search.append(key, v as string));\n continue;\n }\n if (value !== null && value !== undefined) {\n search.append(key, value as string);\n }\n }\n}\n\nexport function extractParamsAndRequest(\n params?: Record<string, unknown> | [any] | InternalClientRequest,\n request?: InternalClientRequest\n): [Record<string, unknown>, InternalClientRequest | undefined] {\n const shouldUseFirstArgAsRequest =\n !!params &&\n !request &&\n !Array.isArray(params) &&\n isInternalClientRequest(params) &&\n !isResourcePayload(params as Record<string, unknown>);\n\n const providedParams: Record<string, unknown> | [any] = shouldUseFirstArgAsRequest\n ? {}\n : (params as Record<string, unknown>) ?? {};\n const requestCtx = shouldUseFirstArgAsRequest ? (params as InternalClientRequest) : request;\n return [providedParams, requestCtx];\n}\n"],"names":["uuidValidate","uuidv4"],"mappings":"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"}
|