@kontent-ai/core-sdk 11.0.1 → 11.0.2
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/http/http.service.js +155 -135
- package/dist/http/http.service.js.map +1 -1
- package/dist/models/error.models.d.ts +3 -3
- package/dist/public_api.d.ts +1 -1
- package/dist/sdk-info.js +1 -1
- package/dist/utils/header.utils.js.map +1 -1
- package/lib/http/http.service.ts +177 -147
- package/lib/models/error.models.ts +3 -3
- package/lib/public_api.ts +1 -0
- package/lib/utils/header.utils.ts +3 -3
- package/package.json +1 -1
|
@@ -3,154 +3,174 @@ import { isNotUndefined } from "../utils/core.utils.js";
|
|
|
3
3
|
import { getErrorMessage } from "../utils/error.utils.js";
|
|
4
4
|
import { getSdkIdHeader } from "../utils/header.utils.js";
|
|
5
5
|
import { runWithRetryAsync, toRequiredRetryStrategyOptions } from "../utils/retry.utils.js";
|
|
6
|
-
import { tryCatch } from "../utils/try.utils.js";
|
|
6
|
+
import { tryCatch, tryCatchAsync } from "../utils/try.utils.js";
|
|
7
7
|
import { getDefaultHttpAdapter } from "./http.adapter.js";
|
|
8
8
|
export function getDefaultHttpService(config) {
|
|
9
|
-
const
|
|
10
|
-
const
|
|
11
|
-
|
|
12
|
-
return
|
|
9
|
+
const withUnknownErrorHandlingAsync = async ({ url, funcAsync, }) => {
|
|
10
|
+
const { success, data, error } = await tryCatchAsync(funcAsync);
|
|
11
|
+
if (success) {
|
|
12
|
+
return data;
|
|
13
|
+
}
|
|
14
|
+
return {
|
|
15
|
+
success: false,
|
|
16
|
+
error: {
|
|
17
|
+
reason: "unknown",
|
|
18
|
+
message: "Unknown error. See the error object for more details.",
|
|
19
|
+
url: url,
|
|
20
|
+
originalError: error,
|
|
21
|
+
},
|
|
13
22
|
};
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
23
|
+
};
|
|
24
|
+
const resolveRequestAsync = async ({ options, resolveDataAsync, }) => {
|
|
25
|
+
return await withUnknownErrorHandlingAsync({
|
|
26
|
+
url: options.url,
|
|
27
|
+
funcAsync: async () => {
|
|
28
|
+
const adapter = config?.adapter ?? getDefaultHttpAdapter();
|
|
29
|
+
const getCombinedRequestHeaders = () => {
|
|
30
|
+
return getRequestHeaders([...(config?.requestHeaders ?? []), ...(options.requestHeaders ?? [])], options.body);
|
|
19
31
|
};
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
32
|
+
const getRequestBody = () => {
|
|
33
|
+
if (options.body === null) {
|
|
34
|
+
return {
|
|
35
|
+
success: true,
|
|
36
|
+
data: null,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
if (options.body instanceof Blob) {
|
|
40
|
+
return {
|
|
41
|
+
success: true,
|
|
42
|
+
data: options.body,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
const { success, data: parsedBody, error } = tryCatch(() => JSON.stringify(options.body));
|
|
46
|
+
if (!success) {
|
|
47
|
+
return {
|
|
48
|
+
success: false,
|
|
49
|
+
error: {
|
|
50
|
+
message: "Failed to stringify body of request.",
|
|
51
|
+
url: options.url,
|
|
52
|
+
reason: "invalidBody",
|
|
53
|
+
originalError: error,
|
|
54
|
+
},
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
return {
|
|
58
|
+
success: true,
|
|
59
|
+
data: parsedBody,
|
|
60
|
+
};
|
|
25
61
|
};
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
62
|
+
const getUrl = () => {
|
|
63
|
+
const { success, data: parsedUrl, error } = tryCatch(() => new URL(options.url));
|
|
64
|
+
if (!success) {
|
|
65
|
+
return {
|
|
66
|
+
success: false,
|
|
67
|
+
error: {
|
|
68
|
+
message: `Failed to parse url '${options.url}'.`,
|
|
69
|
+
url: options.url,
|
|
70
|
+
reason: "invalidUrl",
|
|
71
|
+
originalError: error,
|
|
72
|
+
},
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
return {
|
|
76
|
+
success: true,
|
|
77
|
+
data: parsedUrl,
|
|
78
|
+
};
|
|
37
79
|
};
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
};
|
|
43
|
-
};
|
|
44
|
-
const getUrl = () => {
|
|
45
|
-
const { success, data: parsedUrl, error } = tryCatch(() => new URL(options.url));
|
|
46
|
-
if (!success) {
|
|
47
|
-
return {
|
|
48
|
-
success: false,
|
|
49
|
-
error: {
|
|
50
|
-
message: `Failed to parse url '${options.url}'.`,
|
|
80
|
+
const requestHeaders = getCombinedRequestHeaders();
|
|
81
|
+
const retryStrategyOptions = toRequiredRetryStrategyOptions(config?.retryStrategy);
|
|
82
|
+
const withRetryAsync = async (funcAsync) => {
|
|
83
|
+
return await runWithRetryAsync({
|
|
51
84
|
url: options.url,
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
85
|
+
retryStrategyOptions,
|
|
86
|
+
retryAttempt: 0,
|
|
87
|
+
requestHeaders,
|
|
88
|
+
method: options.method,
|
|
89
|
+
funcAsync: async () => {
|
|
90
|
+
return await funcAsync();
|
|
91
|
+
},
|
|
92
|
+
});
|
|
55
93
|
};
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
if (!urlParsedSuccess) {
|
|
78
|
-
return {
|
|
79
|
-
success: false,
|
|
80
|
-
error: urlError,
|
|
81
|
-
};
|
|
82
|
-
}
|
|
83
|
-
const { success: requestBodyParsedSuccess, data: requestBody, error: requestBodyError } = getRequestBody();
|
|
84
|
-
if (!requestBodyParsedSuccess) {
|
|
85
|
-
return {
|
|
86
|
-
success: false,
|
|
87
|
-
error: requestBodyError,
|
|
88
|
-
};
|
|
89
|
-
}
|
|
90
|
-
const getResponseAsync = async () => {
|
|
91
|
-
return await adapter.requestAsync({
|
|
92
|
-
url: parsedUrl.toString(),
|
|
93
|
-
method: options.method,
|
|
94
|
-
requestHeaders,
|
|
95
|
-
body: requestBody,
|
|
96
|
-
});
|
|
97
|
-
};
|
|
98
|
-
const getErrorForInvalidResponseAsync = async (response) => {
|
|
99
|
-
const sharedErrorData = {
|
|
100
|
-
message: getErrorMessage({
|
|
101
|
-
url: options.url,
|
|
102
|
-
adapterResponse: response,
|
|
103
|
-
method: options.method,
|
|
104
|
-
}),
|
|
105
|
-
url: options.url,
|
|
106
|
-
};
|
|
107
|
-
if (response.status === 404) {
|
|
108
|
-
const error = {
|
|
109
|
-
...sharedErrorData,
|
|
110
|
-
reason: "notFound",
|
|
111
|
-
isValidResponse: response.isValidResponse,
|
|
112
|
-
responseHeaders: response.responseHeaders,
|
|
113
|
-
status: 404,
|
|
114
|
-
statusText: response.statusText,
|
|
115
|
-
kontentErrorResponse: await getKontentErrorDataAsync(response),
|
|
94
|
+
const { success: urlParsedSuccess, data: parsedUrl, error: urlError } = getUrl();
|
|
95
|
+
if (!urlParsedSuccess) {
|
|
96
|
+
return {
|
|
97
|
+
success: false,
|
|
98
|
+
error: urlError,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
const { success: requestBodyParsedSuccess, data: requestBody, error: requestBodyError } = getRequestBody();
|
|
102
|
+
if (!requestBodyParsedSuccess) {
|
|
103
|
+
return {
|
|
104
|
+
success: false,
|
|
105
|
+
error: requestBodyError,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
const getResponseAsync = async () => {
|
|
109
|
+
return await adapter.requestAsync({
|
|
110
|
+
url: parsedUrl.toString(),
|
|
111
|
+
method: options.method,
|
|
112
|
+
requestHeaders,
|
|
113
|
+
body: requestBody,
|
|
114
|
+
});
|
|
116
115
|
};
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
body: options.body,
|
|
142
|
-
method: options.method,
|
|
143
|
-
adapterResponse: {
|
|
116
|
+
const getErrorForInvalidResponseAsync = async (response) => {
|
|
117
|
+
const sharedErrorData = {
|
|
118
|
+
message: getErrorMessage({
|
|
119
|
+
url: options.url,
|
|
120
|
+
adapterResponse: response,
|
|
121
|
+
method: options.method,
|
|
122
|
+
}),
|
|
123
|
+
url: options.url,
|
|
124
|
+
};
|
|
125
|
+
if (response.status === 404) {
|
|
126
|
+
const error = {
|
|
127
|
+
...sharedErrorData,
|
|
128
|
+
reason: "notFound",
|
|
129
|
+
isValidResponse: response.isValidResponse,
|
|
130
|
+
responseHeaders: response.responseHeaders,
|
|
131
|
+
status: 404,
|
|
132
|
+
statusText: response.statusText,
|
|
133
|
+
kontentErrorResponse: await getKontentErrorDataAsync(response),
|
|
134
|
+
};
|
|
135
|
+
return error;
|
|
136
|
+
}
|
|
137
|
+
const error = {
|
|
138
|
+
...sharedErrorData,
|
|
139
|
+
reason: "invalidResponse",
|
|
144
140
|
isValidResponse: response.isValidResponse,
|
|
145
141
|
responseHeaders: response.responseHeaders,
|
|
146
142
|
status: response.status,
|
|
147
143
|
statusText: response.statusText,
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
144
|
+
kontentErrorResponse: await getKontentErrorDataAsync(response),
|
|
145
|
+
};
|
|
146
|
+
return error;
|
|
147
|
+
};
|
|
148
|
+
const resolveResponseAsync = async (response) => {
|
|
149
|
+
if (!response.isValidResponse) {
|
|
150
|
+
return {
|
|
151
|
+
success: false,
|
|
152
|
+
error: await getErrorForInvalidResponseAsync(response),
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
return {
|
|
156
|
+
success: true,
|
|
157
|
+
response: {
|
|
158
|
+
data: await resolveDataAsync(response),
|
|
159
|
+
body: options.body,
|
|
160
|
+
method: options.method,
|
|
161
|
+
adapterResponse: {
|
|
162
|
+
isValidResponse: response.isValidResponse,
|
|
163
|
+
responseHeaders: response.responseHeaders,
|
|
164
|
+
status: response.status,
|
|
165
|
+
statusText: response.statusText,
|
|
166
|
+
},
|
|
167
|
+
requestHeaders: requestHeaders,
|
|
168
|
+
},
|
|
169
|
+
};
|
|
170
|
+
};
|
|
171
|
+
return await withRetryAsync(async () => await resolveResponseAsync(await getResponseAsync()));
|
|
172
|
+
},
|
|
173
|
+
});
|
|
154
174
|
};
|
|
155
175
|
return {
|
|
156
176
|
requestAsync: async (options) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.service.js","sourceRoot":"","sources":["../../lib/http/http.service.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,8BAA8B,EAAE,MAAM,yBAAyB,CAAC;AAC5F,OAAO,EAAe,QAAQ,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"http.service.js","sourceRoot":"","sources":["../../lib/http/http.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,11 +6,11 @@ export type CoreSdkErrorDetails<TReason extends ErrorReason = ErrorReason> = (De
|
|
|
6
6
|
} & Pick<AdapterResponse<HttpServiceStatus>, "isValidResponse" | "responseHeaders" | "status" | "statusText">> | Details<"notFound", {
|
|
7
7
|
readonly kontentErrorResponse: KontentErrorResponseData | undefined;
|
|
8
8
|
} & Pick<AdapterResponse<404>, "isValidResponse" | "responseHeaders" | "status" | "statusText">> | Details<"invalidBody", {
|
|
9
|
-
readonly
|
|
9
|
+
readonly originalError: unknown;
|
|
10
10
|
}> | Details<"invalidUrl", {
|
|
11
|
-
readonly
|
|
11
|
+
readonly originalError: unknown;
|
|
12
12
|
}> | Details<"unknown", {
|
|
13
|
-
readonly
|
|
13
|
+
readonly originalError: unknown;
|
|
14
14
|
}>) & {
|
|
15
15
|
readonly reason: TReason;
|
|
16
16
|
};
|
package/dist/public_api.d.ts
CHANGED
|
@@ -5,7 +5,7 @@ export { toRequiredRetryStrategyOptions } from "./utils/retry.utils.js";
|
|
|
5
5
|
export { tryCatch, tryCatchAsync } from "./utils/try.utils.js";
|
|
6
6
|
export { isKontent404Error } from "./utils/error.utils.js";
|
|
7
7
|
export type { AdapterRequestOptions, AdapterResponse, DefaultHttpServiceConfig, DownloadFileRequestOptions, ExecuteRequestOptions, HttpAdapter, HttpResponse, HttpService, HttpServiceStatus, UploadFileRequestOptions, } from "./http/http.models.js";
|
|
8
|
-
export type { Header, HttpMethod, RetryStrategyOptions, SDKInfo, } from "./models/core.models.js";
|
|
8
|
+
export type { Header, HttpMethod, RetryStrategyOptions, SDKInfo, CommonHeaderNames, } from "./models/core.models.js";
|
|
9
9
|
export type { CoreSdkError, ErrorReason, CoreSdkErrorDetails, } from "./models/error.models.js";
|
|
10
10
|
export type { JsonArray, JsonObject, JsonValue } from "./models/json.models.js";
|
|
11
11
|
export type { EmptyObject, Override, Prettify } from "./models/utility.models.js";
|
package/dist/sdk-info.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"header.utils.js","sourceRoot":"","sources":["../../lib/utils/header.utils.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,cAAc,CAAC,IAAa;IAC3C,OAAO;QACN,IAAI,EAAE,
|
|
1
|
+
{"version":3,"file":"header.utils.js","sourceRoot":"","sources":["../../lib/utils/header.utils.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,cAAc,CAAC,IAAa;IAC3C,OAAO;QACN,IAAI,EAAE,YAAwC;QAC9C,KAAK,EAAE,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,OAAO,EAAE;KAClD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,OAA0B;IAClE,MAAM,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,KAAM,aAA0C,CAAC,WAAW,EAAE,CAAC,CAAC;IAE3I,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACvB,OAAO,SAAS,CAAC;IAClB,CAAC;IAED,MAAM,WAAW,GAAG,CAAC,gBAAgB,CAAC,KAAK,CAAC;IAE5C,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,WAAW,CAAC,EAAE,CAAC;QACxC,OAAO,SAAS,CAAC;IAClB,CAAC;IAED,OAAO,WAAW,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,OAAgB;IAC5C,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;QAC3D,IAAI,EAAE,GAAG;QACT,KAAK,EAAE,KAAK;KACZ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,OAA0B;IACxD,OAAO,OAAO,CAAC,MAAM,CAAU,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAClD,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;QAC1C,OAAO,OAAO,CAAC;IAChB,CAAC,EAAE,IAAI,OAAO,EAAE,CAAC,CAAC;AACnB,CAAC"}
|
package/lib/http/http.service.ts
CHANGED
|
@@ -6,7 +6,7 @@ import { isNotUndefined } from "../utils/core.utils.js";
|
|
|
6
6
|
import { getErrorMessage } from "../utils/error.utils.js";
|
|
7
7
|
import { getSdkIdHeader } from "../utils/header.utils.js";
|
|
8
8
|
import { runWithRetryAsync, toRequiredRetryStrategyOptions } from "../utils/retry.utils.js";
|
|
9
|
-
import { type Result, tryCatch } from "../utils/try.utils.js";
|
|
9
|
+
import { type Result, tryCatch, tryCatchAsync } from "../utils/try.utils.js";
|
|
10
10
|
import { getDefaultHttpAdapter } from "./http.adapter.js";
|
|
11
11
|
import type {
|
|
12
12
|
AdapterResponse,
|
|
@@ -19,6 +19,29 @@ import type {
|
|
|
19
19
|
} from "./http.models.js";
|
|
20
20
|
|
|
21
21
|
export function getDefaultHttpService(config?: DefaultHttpServiceConfig): HttpService {
|
|
22
|
+
const withUnknownErrorHandlingAsync = async <TResponseData extends JsonValue | Blob, TBodyData extends JsonValue | Blob>({
|
|
23
|
+
url,
|
|
24
|
+
funcAsync,
|
|
25
|
+
}: { readonly url: string; readonly funcAsync: () => Promise<HttpResponse<TResponseData, TBodyData>> }): Promise<
|
|
26
|
+
HttpResponse<TResponseData, TBodyData>
|
|
27
|
+
> => {
|
|
28
|
+
const { success, data, error } = await tryCatchAsync(funcAsync);
|
|
29
|
+
|
|
30
|
+
if (success) {
|
|
31
|
+
return data;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
return {
|
|
35
|
+
success: false,
|
|
36
|
+
error: {
|
|
37
|
+
reason: "unknown",
|
|
38
|
+
message: "Unknown error. See the error object for more details.",
|
|
39
|
+
url: url,
|
|
40
|
+
originalError: error,
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
};
|
|
44
|
+
|
|
22
45
|
const resolveRequestAsync = async <TResponseData extends JsonValue | Blob, TBodyData extends JsonValue | Blob>({
|
|
23
46
|
options,
|
|
24
47
|
resolveDataAsync,
|
|
@@ -26,174 +49,181 @@ export function getDefaultHttpService(config?: DefaultHttpServiceConfig): HttpSe
|
|
|
26
49
|
readonly options: ExecuteRequestOptions<TBodyData>;
|
|
27
50
|
readonly resolveDataAsync: (response: AdapterResponse) => Promise<TResponseData>;
|
|
28
51
|
}): Promise<HttpResponse<TResponseData, TBodyData>> => {
|
|
29
|
-
|
|
52
|
+
return await withUnknownErrorHandlingAsync({
|
|
53
|
+
url: options.url,
|
|
54
|
+
funcAsync: async () => {
|
|
55
|
+
const adapter = config?.adapter ?? getDefaultHttpAdapter();
|
|
30
56
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
};
|
|
34
|
-
|
|
35
|
-
const getRequestBody = (): Result<string | Blob | null, CoreSdkError> => {
|
|
36
|
-
if (options.body === null) {
|
|
37
|
-
return {
|
|
38
|
-
success: true,
|
|
39
|
-
data: null,
|
|
57
|
+
const getCombinedRequestHeaders = (): readonly Header[] => {
|
|
58
|
+
return getRequestHeaders([...(config?.requestHeaders ?? []), ...(options.requestHeaders ?? [])], options.body);
|
|
40
59
|
};
|
|
41
|
-
}
|
|
42
60
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
61
|
+
const getRequestBody = (): Result<string | Blob | null, CoreSdkError> => {
|
|
62
|
+
if (options.body === null) {
|
|
63
|
+
return {
|
|
64
|
+
success: true,
|
|
65
|
+
data: null,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
if (options.body instanceof Blob) {
|
|
70
|
+
return {
|
|
71
|
+
success: true,
|
|
72
|
+
data: options.body,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
const { success, data: parsedBody, error } = tryCatch(() => JSON.stringify(options.body));
|
|
77
|
+
|
|
78
|
+
if (!success) {
|
|
79
|
+
return {
|
|
80
|
+
success: false,
|
|
81
|
+
error: {
|
|
82
|
+
message: "Failed to stringify body of request.",
|
|
83
|
+
url: options.url,
|
|
84
|
+
reason: "invalidBody",
|
|
85
|
+
originalError: error,
|
|
86
|
+
},
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
return {
|
|
91
|
+
success: true,
|
|
92
|
+
data: parsedBody,
|
|
93
|
+
};
|
|
47
94
|
};
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
const { success, data: parsedBody, error } = tryCatch(() => JSON.stringify(options.body));
|
|
51
95
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
96
|
+
const getUrl = (): Result<URL, CoreSdkError> => {
|
|
97
|
+
const { success, data: parsedUrl, error } = tryCatch(() => new URL(options.url));
|
|
98
|
+
|
|
99
|
+
if (!success) {
|
|
100
|
+
return {
|
|
101
|
+
success: false,
|
|
102
|
+
error: {
|
|
103
|
+
message: `Failed to parse url '${options.url}'.`,
|
|
104
|
+
url: options.url,
|
|
105
|
+
reason: "invalidUrl",
|
|
106
|
+
originalError: error,
|
|
107
|
+
},
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
return {
|
|
112
|
+
success: true,
|
|
113
|
+
data: parsedUrl,
|
|
114
|
+
};
|
|
61
115
|
};
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
return {
|
|
65
|
-
success: true,
|
|
66
|
-
data: parsedBody,
|
|
67
|
-
};
|
|
68
|
-
};
|
|
69
116
|
|
|
70
|
-
|
|
71
|
-
|
|
117
|
+
const requestHeaders = getCombinedRequestHeaders();
|
|
118
|
+
const retryStrategyOptions: Required<RetryStrategyOptions> = toRequiredRetryStrategyOptions(config?.retryStrategy);
|
|
72
119
|
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
message: `Failed to parse url '${options.url}'.`,
|
|
120
|
+
const withRetryAsync = async (
|
|
121
|
+
funcAsync: () => Promise<HttpResponse<TResponseData, TBodyData>>,
|
|
122
|
+
): Promise<HttpResponse<TResponseData, TBodyData>> => {
|
|
123
|
+
return await runWithRetryAsync({
|
|
78
124
|
url: options.url,
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
125
|
+
retryStrategyOptions,
|
|
126
|
+
retryAttempt: 0,
|
|
127
|
+
requestHeaders,
|
|
128
|
+
method: options.method,
|
|
129
|
+
funcAsync: async () => {
|
|
130
|
+
return await funcAsync();
|
|
131
|
+
},
|
|
132
|
+
});
|
|
82
133
|
};
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
return {
|
|
86
|
-
success: true,
|
|
87
|
-
data: parsedUrl,
|
|
88
|
-
};
|
|
89
|
-
};
|
|
90
|
-
|
|
91
|
-
const requestHeaders = getCombinedRequestHeaders();
|
|
92
|
-
const retryStrategyOptions: Required<RetryStrategyOptions> = toRequiredRetryStrategyOptions(config?.retryStrategy);
|
|
93
|
-
|
|
94
|
-
const withRetryAsync = async (funcAsync: () => Promise<HttpResponse<TResponseData, TBodyData>>): Promise<HttpResponse<TResponseData, TBodyData>> => {
|
|
95
|
-
return await runWithRetryAsync({
|
|
96
|
-
url: options.url,
|
|
97
|
-
retryStrategyOptions,
|
|
98
|
-
retryAttempt: 0,
|
|
99
|
-
requestHeaders,
|
|
100
|
-
method: options.method,
|
|
101
|
-
funcAsync: async () => {
|
|
102
|
-
return await funcAsync();
|
|
103
|
-
},
|
|
104
|
-
});
|
|
105
|
-
};
|
|
106
|
-
|
|
107
|
-
const { success: urlParsedSuccess, data: parsedUrl, error: urlError } = getUrl();
|
|
108
|
-
|
|
109
|
-
if (!urlParsedSuccess) {
|
|
110
|
-
return {
|
|
111
|
-
success: false,
|
|
112
|
-
error: urlError,
|
|
113
|
-
};
|
|
114
|
-
}
|
|
115
134
|
|
|
116
|
-
|
|
135
|
+
const { success: urlParsedSuccess, data: parsedUrl, error: urlError } = getUrl();
|
|
117
136
|
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
137
|
+
if (!urlParsedSuccess) {
|
|
138
|
+
return {
|
|
139
|
+
success: false,
|
|
140
|
+
error: urlError,
|
|
141
|
+
};
|
|
142
|
+
}
|
|
124
143
|
|
|
125
|
-
|
|
126
|
-
return await adapter.requestAsync({
|
|
127
|
-
url: parsedUrl.toString(),
|
|
128
|
-
method: options.method,
|
|
129
|
-
requestHeaders,
|
|
130
|
-
body: requestBody,
|
|
131
|
-
});
|
|
132
|
-
};
|
|
144
|
+
const { success: requestBodyParsedSuccess, data: requestBody, error: requestBodyError } = getRequestBody();
|
|
133
145
|
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
}),
|
|
141
|
-
url: options.url,
|
|
142
|
-
};
|
|
146
|
+
if (!requestBodyParsedSuccess) {
|
|
147
|
+
return {
|
|
148
|
+
success: false,
|
|
149
|
+
error: requestBodyError,
|
|
150
|
+
};
|
|
151
|
+
}
|
|
143
152
|
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
statusText: response.statusText,
|
|
152
|
-
kontentErrorResponse: await getKontentErrorDataAsync(response),
|
|
153
|
+
const getResponseAsync = async (): Promise<AdapterResponse> => {
|
|
154
|
+
return await adapter.requestAsync({
|
|
155
|
+
url: parsedUrl.toString(),
|
|
156
|
+
method: options.method,
|
|
157
|
+
requestHeaders,
|
|
158
|
+
body: requestBody,
|
|
159
|
+
});
|
|
153
160
|
};
|
|
154
161
|
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
data: await resolveDataAsync(response),
|
|
183
|
-
body: options.body,
|
|
184
|
-
method: options.method,
|
|
185
|
-
adapterResponse: {
|
|
162
|
+
const getErrorForInvalidResponseAsync = async (response: AdapterResponse): Promise<CoreSdkError> => {
|
|
163
|
+
const sharedErrorData: Pick<CoreSdkError, "message" | "url"> = {
|
|
164
|
+
message: getErrorMessage({
|
|
165
|
+
url: options.url,
|
|
166
|
+
adapterResponse: response,
|
|
167
|
+
method: options.method,
|
|
168
|
+
}),
|
|
169
|
+
url: options.url,
|
|
170
|
+
};
|
|
171
|
+
|
|
172
|
+
if (response.status === 404) {
|
|
173
|
+
const error: CoreSdkError<"notFound"> = {
|
|
174
|
+
...sharedErrorData,
|
|
175
|
+
reason: "notFound",
|
|
176
|
+
isValidResponse: response.isValidResponse,
|
|
177
|
+
responseHeaders: response.responseHeaders,
|
|
178
|
+
status: 404,
|
|
179
|
+
statusText: response.statusText,
|
|
180
|
+
kontentErrorResponse: await getKontentErrorDataAsync(response),
|
|
181
|
+
};
|
|
182
|
+
|
|
183
|
+
return error;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
const error: CoreSdkError<"invalidResponse"> = {
|
|
187
|
+
...sharedErrorData,
|
|
188
|
+
reason: "invalidResponse",
|
|
186
189
|
isValidResponse: response.isValidResponse,
|
|
187
190
|
responseHeaders: response.responseHeaders,
|
|
188
191
|
status: response.status,
|
|
189
192
|
statusText: response.statusText,
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
193
|
+
kontentErrorResponse: await getKontentErrorDataAsync(response),
|
|
194
|
+
};
|
|
195
|
+
|
|
196
|
+
return error;
|
|
197
|
+
};
|
|
198
|
+
|
|
199
|
+
const resolveResponseAsync = async (response: AdapterResponse): Promise<HttpResponse<TResponseData, TBodyData>> => {
|
|
200
|
+
if (!response.isValidResponse) {
|
|
201
|
+
return {
|
|
202
|
+
success: false,
|
|
203
|
+
error: await getErrorForInvalidResponseAsync(response),
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
return {
|
|
208
|
+
success: true,
|
|
209
|
+
response: {
|
|
210
|
+
data: await resolveDataAsync(response),
|
|
211
|
+
body: options.body,
|
|
212
|
+
method: options.method,
|
|
213
|
+
adapterResponse: {
|
|
214
|
+
isValidResponse: response.isValidResponse,
|
|
215
|
+
responseHeaders: response.responseHeaders,
|
|
216
|
+
status: response.status,
|
|
217
|
+
statusText: response.statusText,
|
|
218
|
+
},
|
|
219
|
+
requestHeaders: requestHeaders,
|
|
220
|
+
},
|
|
221
|
+
};
|
|
222
|
+
};
|
|
195
223
|
|
|
196
|
-
|
|
224
|
+
return await withRetryAsync(async () => await resolveResponseAsync(await getResponseAsync()));
|
|
225
|
+
},
|
|
226
|
+
});
|
|
197
227
|
};
|
|
198
228
|
|
|
199
229
|
return {
|
|
@@ -19,19 +19,19 @@ export type CoreSdkErrorDetails<TReason extends ErrorReason = ErrorReason> = (
|
|
|
19
19
|
| Details<
|
|
20
20
|
"invalidBody",
|
|
21
21
|
{
|
|
22
|
-
readonly
|
|
22
|
+
readonly originalError: unknown;
|
|
23
23
|
}
|
|
24
24
|
>
|
|
25
25
|
| Details<
|
|
26
26
|
"invalidUrl",
|
|
27
27
|
{
|
|
28
|
-
readonly
|
|
28
|
+
readonly originalError: unknown;
|
|
29
29
|
}
|
|
30
30
|
>
|
|
31
31
|
| Details<
|
|
32
32
|
"unknown",
|
|
33
33
|
{
|
|
34
|
-
readonly
|
|
34
|
+
readonly originalError: unknown;
|
|
35
35
|
}
|
|
36
36
|
>
|
|
37
37
|
) & {
|
package/lib/public_api.ts
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
import type { Header, SDKInfo } from "../models/core.models.js";
|
|
1
|
+
import type { CommonHeaderNames, Header, SDKInfo } from "../models/core.models.js";
|
|
2
2
|
|
|
3
3
|
export function getSdkIdHeader(info: SDKInfo): Header {
|
|
4
4
|
return {
|
|
5
|
-
name: "X-KC-SDKID",
|
|
5
|
+
name: "X-KC-SDKID" satisfies CommonHeaderNames,
|
|
6
6
|
value: `${info.host};${info.name};${info.version}`,
|
|
7
7
|
};
|
|
8
8
|
}
|
|
9
9
|
|
|
10
10
|
export function getRetryAfterHeaderValue(headers: readonly Header[]): number | undefined {
|
|
11
|
-
const retryAfterHeader = headers.find((header) => header.name.toLowerCase() === "Retry-After".toLowerCase());
|
|
11
|
+
const retryAfterHeader = headers.find((header) => header.name.toLowerCase() === ("Retry-After" satisfies CommonHeaderNames).toLowerCase());
|
|
12
12
|
|
|
13
13
|
if (!retryAfterHeader) {
|
|
14
14
|
return undefined;
|