@planqk/planqk-service-sdk 2.1.1 → 2.2.0
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/.gitlab-ci.yml +8 -39
- package/README-node.md +16 -12
- package/README.md +30 -41
- package/dist/sdk/Client.d.ts +10 -4
- package/dist/sdk/Client.js +46 -4
- package/dist/sdk/api/index.d.ts +2 -3
- package/dist/sdk/api/index.js +2 -3
- package/dist/sdk/api/resources/index.d.ts +2 -2
- package/dist/sdk/api/resources/index.js +2 -2
- package/dist/sdk/api/resources/serviceApi/client/Client.d.ts +41 -55
- package/dist/sdk/api/resources/serviceApi/client/Client.js +131 -227
- package/dist/sdk/api/resources/serviceApi/index.d.ts +2 -2
- package/dist/sdk/api/resources/serviceApi/index.js +2 -2
- package/dist/sdk/api/resources/serviceApi/types/GetResultResponse.d.ts +13 -3
- package/dist/sdk/api/resources/serviceApi/types/index.d.ts +1 -4
- package/dist/sdk/api/resources/serviceApi/types/index.js +1 -4
- package/dist/sdk/api/types/ServiceExecution.d.ts +12 -2
- package/dist/sdk/api/types/ServiceExecution.js +12 -0
- package/dist/sdk/api/types/index.d.ts +2 -6
- package/dist/sdk/api/types/index.js +2 -6
- package/dist/sdk/core/auth/BasicAuth.js +3 -3
- package/dist/sdk/core/auth/index.d.ts +2 -2
- package/dist/sdk/core/auth/index.js +4 -4
- package/dist/sdk/core/base64.d.ts +2 -0
- package/dist/sdk/core/base64.js +26 -0
- package/dist/sdk/core/fetcher/APIResponse.d.ts +10 -0
- package/dist/sdk/core/fetcher/BinaryResponse.d.ts +20 -0
- package/dist/sdk/core/fetcher/BinaryResponse.js +17 -0
- package/dist/sdk/core/fetcher/Fetcher.d.ts +5 -4
- package/dist/sdk/core/fetcher/Fetcher.js +41 -22
- package/dist/sdk/core/fetcher/Headers.d.ts +2 -0
- package/dist/sdk/core/fetcher/Headers.js +85 -0
- package/dist/sdk/core/fetcher/HttpResponsePromise.d.ts +58 -0
- package/dist/sdk/core/fetcher/HttpResponsePromise.js +94 -0
- package/dist/sdk/core/fetcher/RawResponse.d.ts +29 -0
- package/dist/sdk/core/fetcher/RawResponse.js +44 -0
- package/dist/sdk/core/fetcher/ResponseWithBody.d.ts +4 -0
- package/dist/sdk/core/fetcher/ResponseWithBody.js +6 -0
- package/dist/sdk/core/fetcher/createRequestUrl.d.ts +1 -1
- package/dist/sdk/core/fetcher/createRequestUrl.js +3 -7
- package/dist/sdk/core/fetcher/getErrorResponseBody.d.ts +1 -0
- package/dist/sdk/core/fetcher/getErrorResponseBody.js +32 -0
- package/dist/sdk/core/fetcher/getFetchFn.d.ts +1 -4
- package/dist/sdk/core/fetcher/getFetchFn.js +1 -52
- package/dist/sdk/core/fetcher/getRequestBody.js +2 -1
- package/dist/sdk/core/fetcher/getResponseBody.js +34 -30
- package/dist/sdk/core/fetcher/index.d.ts +9 -5
- package/dist/sdk/core/fetcher/index.js +13 -7
- package/dist/sdk/core/fetcher/makeRequest.js +3 -3
- package/dist/sdk/core/fetcher/requestWithRetries.js +14 -5
- package/dist/sdk/core/headers.d.ts +3 -0
- package/dist/sdk/core/headers.js +29 -0
- package/dist/sdk/core/index.d.ts +5 -3
- package/dist/sdk/core/index.js +28 -3
- package/dist/sdk/core/json.d.ts +15 -0
- package/dist/sdk/core/json.js +24 -0
- package/dist/sdk/core/runtime/index.d.ts +1 -1
- package/dist/sdk/core/runtime/index.js +2 -2
- package/dist/sdk/core/runtime/runtime.d.ts +1 -1
- package/dist/sdk/core/runtime/runtime.js +49 -40
- package/dist/sdk/core/url/index.d.ts +2 -0
- package/dist/sdk/core/url/index.js +7 -0
- package/dist/sdk/core/url/join.d.ts +1 -0
- package/dist/sdk/core/url/join.js +49 -0
- package/dist/sdk/core/url/qs.d.ts +6 -0
- package/dist/sdk/core/url/qs.js +67 -0
- package/dist/sdk/errors/PlanqkServiceApiError.d.ts +4 -1
- package/dist/sdk/errors/PlanqkServiceApiError.js +7 -8
- package/dist/sdk/errors/PlanqkServiceApiTimeoutError.d.ts +1 -1
- package/dist/sdk/errors/PlanqkServiceApiTimeoutError.js +2 -2
- package/dist/sdk/errors/index.d.ts +2 -2
- package/dist/sdk/errors/index.js +4 -4
- package/dist/sdk/index.d.ts +4 -4
- package/dist/sdk/index.js +9 -9
- package/fern/fern.config.json +1 -1
- package/fern/generators.yml +2 -2
- package/fern/openapi/openapi.yml +41 -131
- package/notebooks/python-sdk.ipynb +1 -1
- package/package.json +2 -3
- package/planqk/service/_version.py +1 -1
- package/pyproject.toml +1 -1
- package/src/index.test.ts +29 -16
- package/src/sdk/Client.ts +27 -7
- package/src/sdk/api/index.ts +2 -3
- package/src/sdk/api/resources/index.ts +2 -2
- package/src/sdk/api/resources/serviceApi/client/Client.ts +223 -250
- package/src/sdk/api/resources/serviceApi/index.ts +2 -2
- package/src/sdk/api/resources/serviceApi/types/GetResultResponse.ts +15 -3
- package/src/sdk/api/resources/serviceApi/types/index.ts +1 -4
- package/src/sdk/api/types/ServiceExecution.ts +13 -3
- package/src/sdk/api/types/index.ts +2 -6
- package/src/sdk/core/auth/BasicAuth.ts +3 -3
- package/src/sdk/core/auth/index.ts +2 -2
- package/src/sdk/core/base64.ts +27 -0
- package/src/sdk/core/fetcher/APIResponse.ts +11 -0
- package/src/sdk/core/fetcher/BinaryResponse.ts +36 -0
- package/src/sdk/core/fetcher/Fetcher.ts +46 -26
- package/src/sdk/core/fetcher/Headers.ts +93 -0
- package/src/sdk/core/fetcher/HttpResponsePromise.ts +116 -0
- package/src/sdk/core/fetcher/RawResponse.ts +61 -0
- package/src/sdk/core/fetcher/ResponseWithBody.ts +7 -0
- package/src/sdk/core/fetcher/createRequestUrl.ts +4 -8
- package/src/sdk/core/fetcher/getErrorResponseBody.ts +32 -0
- package/src/sdk/core/fetcher/getFetchFn.ts +2 -24
- package/src/sdk/core/fetcher/getRequestBody.ts +3 -1
- package/src/sdk/core/fetcher/getResponseBody.ts +38 -27
- package/src/sdk/core/fetcher/index.ts +9 -5
- package/src/sdk/core/fetcher/makeRequest.ts +2 -2
- package/src/sdk/core/fetcher/requestWithRetries.ts +18 -6
- package/src/sdk/core/fetcher/signals.ts +1 -1
- package/src/sdk/core/headers.ts +35 -0
- package/src/sdk/core/index.ts +5 -3
- package/src/sdk/core/json.ts +27 -0
- package/src/sdk/core/runtime/index.ts +1 -1
- package/src/sdk/core/runtime/runtime.ts +60 -53
- package/src/sdk/core/url/index.ts +2 -0
- package/src/sdk/core/url/join.ts +55 -0
- package/src/sdk/core/url/qs.ts +74 -0
- package/src/sdk/errors/PlanqkServiceApiError.ts +21 -11
- package/src/sdk/errors/PlanqkServiceApiTimeoutError.ts +2 -2
- package/src/sdk/errors/index.ts +2 -2
- package/src/sdk/index.ts +4 -4
- package/dist/sdk/api/errors/BadRequestError.d.ts +0 -7
- package/dist/sdk/api/errors/BadRequestError.js +0 -51
- package/dist/sdk/api/errors/ForbiddenError.d.ts +0 -7
- package/dist/sdk/api/errors/ForbiddenError.js +0 -51
- package/dist/sdk/api/errors/InternalServerError.d.ts +0 -7
- package/dist/sdk/api/errors/InternalServerError.js +0 -51
- package/dist/sdk/api/errors/NotFoundError.d.ts +0 -7
- package/dist/sdk/api/errors/NotFoundError.js +0 -51
- package/dist/sdk/api/errors/UnauthorizedError.d.ts +0 -7
- package/dist/sdk/api/errors/UnauthorizedError.js +0 -51
- package/dist/sdk/api/errors/index.d.ts +0 -5
- package/dist/sdk/api/errors/index.js +0 -21
- package/dist/sdk/api/resources/serviceApi/types/GetResultResponseEmbedded.d.ts +0 -7
- package/dist/sdk/api/resources/serviceApi/types/GetResultResponseEmbedded.js +0 -5
- package/dist/sdk/api/resources/serviceApi/types/GetResultResponseLinks.d.ts +0 -7
- package/dist/sdk/api/resources/serviceApi/types/GetResultResponseLinks.js +0 -5
- package/dist/sdk/api/resources/serviceApi/types/HealthCheckResponse.d.ts +0 -7
- package/dist/sdk/api/resources/serviceApi/types/HealthCheckResponse.js +0 -5
- package/dist/sdk/api/types/InputData.d.ts +0 -4
- package/dist/sdk/api/types/InputData.js +0 -5
- package/dist/sdk/api/types/InputDataRef.d.ts +0 -8
- package/dist/sdk/api/types/InputDataRef.js +0 -5
- package/dist/sdk/api/types/InputParams.d.ts +0 -4
- package/dist/sdk/api/types/InputParams.js +0 -5
- package/dist/sdk/api/types/ServiceExecutionStatus.d.ts +0 -12
- package/dist/sdk/api/types/ServiceExecutionStatus.js +0 -14
- package/dist/sdk/core/fetcher/stream-wrappers/Node18UniversalStreamWrapper.d.ts +0 -30
- package/dist/sdk/core/fetcher/stream-wrappers/Node18UniversalStreamWrapper.js +0 -232
- package/dist/sdk/core/fetcher/stream-wrappers/NodePre18StreamWrapper.d.ts +0 -21
- package/dist/sdk/core/fetcher/stream-wrappers/NodePre18StreamWrapper.js +0 -91
- package/dist/sdk/core/fetcher/stream-wrappers/UndiciStreamWrapper.d.ts +0 -31
- package/dist/sdk/core/fetcher/stream-wrappers/UndiciStreamWrapper.js +0 -214
- package/dist/sdk/core/fetcher/stream-wrappers/chooseStreamWrapper.d.ts +0 -18
- package/dist/sdk/core/fetcher/stream-wrappers/chooseStreamWrapper.js +0 -48
- package/src/sdk/api/errors/BadRequestError.ts +0 -16
- package/src/sdk/api/errors/ForbiddenError.ts +0 -16
- package/src/sdk/api/errors/InternalServerError.ts +0 -16
- package/src/sdk/api/errors/NotFoundError.ts +0 -16
- package/src/sdk/api/errors/UnauthorizedError.ts +0 -16
- package/src/sdk/api/errors/index.ts +0 -5
- package/src/sdk/api/resources/serviceApi/types/GetResultResponseEmbedded.ts +0 -9
- package/src/sdk/api/resources/serviceApi/types/GetResultResponseLinks.ts +0 -9
- package/src/sdk/api/resources/serviceApi/types/HealthCheckResponse.ts +0 -8
- package/src/sdk/api/types/InputData.ts +0 -5
- package/src/sdk/api/types/InputDataRef.ts +0 -9
- package/src/sdk/api/types/InputParams.ts +0 -5
- package/src/sdk/api/types/ServiceExecutionStatus.ts +0 -14
- package/src/sdk/core/fetcher/stream-wrappers/Node18UniversalStreamWrapper.ts +0 -252
- package/src/sdk/core/fetcher/stream-wrappers/NodePre18StreamWrapper.ts +0 -106
- package/src/sdk/core/fetcher/stream-wrappers/UndiciStreamWrapper.ts +0 -239
- package/src/sdk/core/fetcher/stream-wrappers/chooseStreamWrapper.ts +0 -33
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export * from "./types";
|
|
2
|
-
export * from "./client";
|
|
1
|
+
export * from "./types/index.js";
|
|
2
|
+
export * from "./client/index.js";
|
|
@@ -2,9 +2,21 @@
|
|
|
2
2
|
* This file was auto-generated by Fern from our API Definition.
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
|
-
import * as PlanqkServiceApi from "../../../index";
|
|
5
|
+
import * as PlanqkServiceApi from "../../../index.js";
|
|
6
6
|
|
|
7
7
|
export interface GetResultResponse {
|
|
8
|
-
_links?:
|
|
9
|
-
_embedded?:
|
|
8
|
+
_links?: GetResultResponse.Links;
|
|
9
|
+
_embedded?: GetResultResponse.Embedded;
|
|
10
|
+
/** Accepts any additional properties */
|
|
11
|
+
[key: string]: any;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export namespace GetResultResponse {
|
|
15
|
+
export interface Links {
|
|
16
|
+
status?: PlanqkServiceApi.HalLink;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export interface Embedded {
|
|
20
|
+
status?: PlanqkServiceApi.ServiceExecution;
|
|
21
|
+
}
|
|
10
22
|
}
|
|
@@ -2,12 +2,22 @@
|
|
|
2
2
|
* This file was auto-generated by Fern from our API Definition.
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
|
-
import * as PlanqkServiceApi from "../index";
|
|
6
|
-
|
|
7
5
|
export interface ServiceExecution {
|
|
8
6
|
id?: string;
|
|
9
|
-
status?:
|
|
7
|
+
status?: ServiceExecution.Status;
|
|
10
8
|
createdAt?: string;
|
|
11
9
|
startedAt?: string;
|
|
12
10
|
endedAt?: string;
|
|
13
11
|
}
|
|
12
|
+
|
|
13
|
+
export namespace ServiceExecution {
|
|
14
|
+
export type Status = "UNKNOWN" | "PENDING" | "RUNNING" | "SUCCEEDED" | "CANCELLED" | "FAILED";
|
|
15
|
+
export const Status = {
|
|
16
|
+
Unknown: "UNKNOWN",
|
|
17
|
+
Pending: "PENDING",
|
|
18
|
+
Running: "RUNNING",
|
|
19
|
+
Succeeded: "SUCCEEDED",
|
|
20
|
+
Cancelled: "CANCELLED",
|
|
21
|
+
Failed: "FAILED",
|
|
22
|
+
} as const;
|
|
23
|
+
}
|
|
@@ -1,6 +1,2 @@
|
|
|
1
|
-
export * from "./
|
|
2
|
-
export * from "./
|
|
3
|
-
export * from "./InputDataRef";
|
|
4
|
-
export * from "./ServiceExecutionStatus";
|
|
5
|
-
export * from "./ServiceExecution";
|
|
6
|
-
export * from "./HalLink";
|
|
1
|
+
export * from "./ServiceExecution.js";
|
|
2
|
+
export * from "./HalLink.js";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { base64Decode, base64Encode } from "../base64.js";
|
|
2
2
|
|
|
3
3
|
export interface BasicAuth {
|
|
4
4
|
username: string;
|
|
@@ -12,12 +12,12 @@ export const BasicAuth = {
|
|
|
12
12
|
if (basicAuth == null) {
|
|
13
13
|
return undefined;
|
|
14
14
|
}
|
|
15
|
-
const token =
|
|
15
|
+
const token = base64Encode(`${basicAuth.username}:${basicAuth.password}`);
|
|
16
16
|
return `Basic ${token}`;
|
|
17
17
|
},
|
|
18
18
|
fromAuthorizationHeader: (header: string): BasicAuth => {
|
|
19
19
|
const credentials = header.replace(BASIC_AUTH_HEADER_PREFIX, "");
|
|
20
|
-
const decoded =
|
|
20
|
+
const decoded = base64Decode(credentials);
|
|
21
21
|
const [username, password] = decoded.split(":", 2);
|
|
22
22
|
|
|
23
23
|
if (username == null || password == null) {
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { BasicAuth } from "./BasicAuth";
|
|
2
|
-
export { BearerToken } from "./BearerToken";
|
|
1
|
+
export { BasicAuth } from "./BasicAuth.js";
|
|
2
|
+
export { BearerToken } from "./BearerToken.js";
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
function base64ToBytes(base64: string): Uint8Array {
|
|
2
|
+
const binString = atob(base64);
|
|
3
|
+
return Uint8Array.from(binString, (m) => m.codePointAt(0)!);
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
function bytesToBase64(bytes: Uint8Array): string {
|
|
7
|
+
const binString = String.fromCodePoint(...bytes);
|
|
8
|
+
return btoa(binString);
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export function base64Encode(input: string): string {
|
|
12
|
+
if (typeof Buffer !== "undefined") {
|
|
13
|
+
return Buffer.from(input, "utf8").toString("base64");
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
const bytes = new TextEncoder().encode(input);
|
|
17
|
+
return bytesToBase64(bytes);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export function base64Decode(input: string): string {
|
|
21
|
+
if (typeof Buffer !== "undefined") {
|
|
22
|
+
return Buffer.from(input, "base64").toString("utf8");
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
const bytes = base64ToBytes(input);
|
|
26
|
+
return new TextDecoder().decode(bytes);
|
|
27
|
+
}
|
|
@@ -1,12 +1,23 @@
|
|
|
1
|
+
import { RawResponse } from "./RawResponse.js";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* The response of an API call.
|
|
5
|
+
* It is a successful response or a failed response.
|
|
6
|
+
*/
|
|
1
7
|
export type APIResponse<Success, Failure> = SuccessfulResponse<Success> | FailedResponse<Failure>;
|
|
2
8
|
|
|
3
9
|
export interface SuccessfulResponse<T> {
|
|
4
10
|
ok: true;
|
|
5
11
|
body: T;
|
|
12
|
+
/**
|
|
13
|
+
* @deprecated Use `rawResponse` instead
|
|
14
|
+
*/
|
|
6
15
|
headers?: Record<string, any>;
|
|
16
|
+
rawResponse: RawResponse;
|
|
7
17
|
}
|
|
8
18
|
|
|
9
19
|
export interface FailedResponse<T> {
|
|
10
20
|
ok: false;
|
|
11
21
|
error: T;
|
|
22
|
+
rawResponse: RawResponse;
|
|
12
23
|
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { ResponseWithBody } from "./ResponseWithBody.js";
|
|
2
|
+
|
|
3
|
+
export type BinaryResponse = {
|
|
4
|
+
/** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/bodyUsed) */
|
|
5
|
+
bodyUsed: boolean;
|
|
6
|
+
/**
|
|
7
|
+
* Returns a ReadableStream of the response body.
|
|
8
|
+
* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/body)
|
|
9
|
+
*/
|
|
10
|
+
stream: () => ReadableStream<Uint8Array>;
|
|
11
|
+
/** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/arrayBuffer) */
|
|
12
|
+
arrayBuffer: () => Promise<ArrayBuffer>;
|
|
13
|
+
/** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/blob) */
|
|
14
|
+
blob: () => Promise<Blob>;
|
|
15
|
+
/**
|
|
16
|
+
* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/bytes)
|
|
17
|
+
* Some versions of the Fetch API may not support this method.
|
|
18
|
+
*/
|
|
19
|
+
bytes?(): Promise<Uint8Array>;
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
export function getBinaryResponse(response: ResponseWithBody): BinaryResponse {
|
|
23
|
+
const binaryResponse: BinaryResponse = {
|
|
24
|
+
get bodyUsed() {
|
|
25
|
+
return response.bodyUsed;
|
|
26
|
+
},
|
|
27
|
+
stream: () => response.body,
|
|
28
|
+
arrayBuffer: response.arrayBuffer.bind(response),
|
|
29
|
+
blob: response.blob.bind(response),
|
|
30
|
+
};
|
|
31
|
+
if ("bytes" in response && typeof response.bytes === "function") {
|
|
32
|
+
binaryResponse.bytes = response.bytes.bind(response);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
return binaryResponse;
|
|
36
|
+
}
|
|
@@ -1,10 +1,14 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
1
|
+
import { toJson } from "../json.js";
|
|
2
|
+
import { APIResponse } from "./APIResponse.js";
|
|
3
|
+
import { abortRawResponse, toRawResponse, unknownRawResponse } from "./RawResponse.js";
|
|
4
|
+
import { Supplier } from "./Supplier.js";
|
|
5
|
+
import { createRequestUrl } from "./createRequestUrl.js";
|
|
6
|
+
import { getErrorResponseBody } from "./getErrorResponseBody.js";
|
|
7
|
+
import { getFetchFn } from "./getFetchFn.js";
|
|
8
|
+
import { getRequestBody } from "./getRequestBody.js";
|
|
9
|
+
import { getResponseBody } from "./getResponseBody.js";
|
|
10
|
+
import { makeRequest } from "./makeRequest.js";
|
|
11
|
+
import { requestWithRetries } from "./requestWithRetries.js";
|
|
8
12
|
|
|
9
13
|
export type FetchFunction = <R = unknown>(args: Fetcher.Args) => Promise<APIResponse<R, Fetcher.Error>>;
|
|
10
14
|
|
|
@@ -13,15 +17,15 @@ export declare namespace Fetcher {
|
|
|
13
17
|
url: string;
|
|
14
18
|
method: string;
|
|
15
19
|
contentType?: string;
|
|
16
|
-
headers?: Record<string, string | undefined>;
|
|
17
|
-
queryParameters?: Record<string, string | string[] | object | object[]>;
|
|
20
|
+
headers?: Record<string, string | Supplier<string | undefined> | undefined>;
|
|
21
|
+
queryParameters?: Record<string, string | string[] | object | object[] | null>;
|
|
18
22
|
body?: unknown;
|
|
19
23
|
timeoutMs?: number;
|
|
20
24
|
maxRetries?: number;
|
|
21
25
|
withCredentials?: boolean;
|
|
22
26
|
abortSignal?: AbortSignal;
|
|
23
27
|
requestType?: "json" | "file" | "bytes";
|
|
24
|
-
responseType?: "json" | "blob" | "sse" | "streaming" | "text";
|
|
28
|
+
responseType?: "json" | "blob" | "sse" | "streaming" | "text" | "arrayBuffer" | "binary-response";
|
|
25
29
|
duplex?: "half";
|
|
26
30
|
}
|
|
27
31
|
|
|
@@ -49,22 +53,33 @@ export declare namespace Fetcher {
|
|
|
49
53
|
}
|
|
50
54
|
}
|
|
51
55
|
|
|
52
|
-
|
|
53
|
-
const
|
|
56
|
+
async function getHeaders(args: Fetcher.Args): Promise<Record<string, string>> {
|
|
57
|
+
const newHeaders: Record<string, string> = {};
|
|
54
58
|
if (args.body !== undefined && args.contentType != null) {
|
|
55
|
-
|
|
59
|
+
newHeaders["Content-Type"] = args.contentType;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
if (args.headers == null) {
|
|
63
|
+
return newHeaders;
|
|
56
64
|
}
|
|
57
65
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
66
|
+
for (const [key, value] of Object.entries(args.headers)) {
|
|
67
|
+
const result = await Supplier.get(value);
|
|
68
|
+
if (typeof result === "string") {
|
|
69
|
+
newHeaders[key] = result;
|
|
70
|
+
continue;
|
|
63
71
|
}
|
|
72
|
+
if (result == null) {
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
newHeaders[key] = `${result}`;
|
|
64
76
|
}
|
|
77
|
+
return newHeaders;
|
|
78
|
+
}
|
|
65
79
|
|
|
80
|
+
export async function fetcherImpl<R = unknown>(args: Fetcher.Args): Promise<APIResponse<R, Fetcher.Error>> {
|
|
66
81
|
const url = createRequestUrl(args.url, args.queryParameters);
|
|
67
|
-
|
|
82
|
+
const requestBody: BodyInit | undefined = await getRequestBody({
|
|
68
83
|
body: args.body,
|
|
69
84
|
type: args.requestType === "json" ? "json" : "other",
|
|
70
85
|
});
|
|
@@ -77,22 +92,22 @@ export async function fetcherImpl<R = unknown>(args: Fetcher.Args): Promise<APIR
|
|
|
77
92
|
fetchFn,
|
|
78
93
|
url,
|
|
79
94
|
args.method,
|
|
80
|
-
|
|
95
|
+
await getHeaders(args),
|
|
81
96
|
requestBody,
|
|
82
97
|
args.timeoutMs,
|
|
83
98
|
args.abortSignal,
|
|
84
99
|
args.withCredentials,
|
|
85
|
-
args.duplex
|
|
100
|
+
args.duplex,
|
|
86
101
|
),
|
|
87
|
-
args.maxRetries
|
|
102
|
+
args.maxRetries,
|
|
88
103
|
);
|
|
89
|
-
let responseBody = await getResponseBody(response, args.responseType);
|
|
90
104
|
|
|
91
105
|
if (response.status >= 200 && response.status < 400) {
|
|
92
106
|
return {
|
|
93
107
|
ok: true,
|
|
94
|
-
body:
|
|
108
|
+
body: (await getResponseBody(response, args.responseType)) as R,
|
|
95
109
|
headers: response.headers,
|
|
110
|
+
rawResponse: toRawResponse(response),
|
|
96
111
|
};
|
|
97
112
|
} else {
|
|
98
113
|
return {
|
|
@@ -100,8 +115,9 @@ export async function fetcherImpl<R = unknown>(args: Fetcher.Args): Promise<APIR
|
|
|
100
115
|
error: {
|
|
101
116
|
reason: "status-code",
|
|
102
117
|
statusCode: response.status,
|
|
103
|
-
body:
|
|
118
|
+
body: await getErrorResponseBody(response),
|
|
104
119
|
},
|
|
120
|
+
rawResponse: toRawResponse(response),
|
|
105
121
|
};
|
|
106
122
|
}
|
|
107
123
|
} catch (error) {
|
|
@@ -112,6 +128,7 @@ export async function fetcherImpl<R = unknown>(args: Fetcher.Args): Promise<APIR
|
|
|
112
128
|
reason: "unknown",
|
|
113
129
|
errorMessage: "The user aborted a request",
|
|
114
130
|
},
|
|
131
|
+
rawResponse: abortRawResponse,
|
|
115
132
|
};
|
|
116
133
|
} else if (error instanceof Error && error.name === "AbortError") {
|
|
117
134
|
return {
|
|
@@ -119,6 +136,7 @@ export async function fetcherImpl<R = unknown>(args: Fetcher.Args): Promise<APIR
|
|
|
119
136
|
error: {
|
|
120
137
|
reason: "timeout",
|
|
121
138
|
},
|
|
139
|
+
rawResponse: abortRawResponse,
|
|
122
140
|
};
|
|
123
141
|
} else if (error instanceof Error) {
|
|
124
142
|
return {
|
|
@@ -127,6 +145,7 @@ export async function fetcherImpl<R = unknown>(args: Fetcher.Args): Promise<APIR
|
|
|
127
145
|
reason: "unknown",
|
|
128
146
|
errorMessage: error.message,
|
|
129
147
|
},
|
|
148
|
+
rawResponse: unknownRawResponse,
|
|
130
149
|
};
|
|
131
150
|
}
|
|
132
151
|
|
|
@@ -134,8 +153,9 @@ export async function fetcherImpl<R = unknown>(args: Fetcher.Args): Promise<APIR
|
|
|
134
153
|
ok: false,
|
|
135
154
|
error: {
|
|
136
155
|
reason: "unknown",
|
|
137
|
-
errorMessage:
|
|
156
|
+
errorMessage: toJson(error),
|
|
138
157
|
},
|
|
158
|
+
rawResponse: unknownRawResponse,
|
|
139
159
|
};
|
|
140
160
|
}
|
|
141
161
|
}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
let Headers: typeof globalThis.Headers;
|
|
2
|
+
|
|
3
|
+
if (typeof globalThis.Headers !== "undefined") {
|
|
4
|
+
Headers = globalThis.Headers;
|
|
5
|
+
} else {
|
|
6
|
+
Headers = class Headers implements Headers {
|
|
7
|
+
private headers: Map<string, string[]>;
|
|
8
|
+
|
|
9
|
+
constructor(init?: HeadersInit) {
|
|
10
|
+
this.headers = new Map();
|
|
11
|
+
|
|
12
|
+
if (init) {
|
|
13
|
+
if (init instanceof Headers) {
|
|
14
|
+
init.forEach((value, key) => this.append(key, value));
|
|
15
|
+
} else if (Array.isArray(init)) {
|
|
16
|
+
for (const [key, value] of init) {
|
|
17
|
+
if (typeof key === "string" && typeof value === "string") {
|
|
18
|
+
this.append(key, value);
|
|
19
|
+
} else {
|
|
20
|
+
throw new TypeError("Each header entry must be a [string, string] tuple");
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
} else {
|
|
24
|
+
for (const [key, value] of Object.entries(init)) {
|
|
25
|
+
if (typeof value === "string") {
|
|
26
|
+
this.append(key, value);
|
|
27
|
+
} else {
|
|
28
|
+
throw new TypeError("Header values must be strings");
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
append(name: string, value: string): void {
|
|
36
|
+
const key = name.toLowerCase();
|
|
37
|
+
const existing = this.headers.get(key) || [];
|
|
38
|
+
this.headers.set(key, [...existing, value]);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
delete(name: string): void {
|
|
42
|
+
const key = name.toLowerCase();
|
|
43
|
+
this.headers.delete(key);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
get(name: string): string | null {
|
|
47
|
+
const key = name.toLowerCase();
|
|
48
|
+
const values = this.headers.get(key);
|
|
49
|
+
return values ? values.join(", ") : null;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
has(name: string): boolean {
|
|
53
|
+
const key = name.toLowerCase();
|
|
54
|
+
return this.headers.has(key);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
set(name: string, value: string): void {
|
|
58
|
+
const key = name.toLowerCase();
|
|
59
|
+
this.headers.set(key, [value]);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
forEach(callbackfn: (value: string, key: string, parent: Headers) => void, thisArg?: unknown): void {
|
|
63
|
+
const boundCallback = thisArg ? callbackfn.bind(thisArg) : callbackfn;
|
|
64
|
+
this.headers.forEach((values, key) => boundCallback(values.join(", "), key, this));
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
getSetCookie(): string[] {
|
|
68
|
+
return this.headers.get("set-cookie") || [];
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
*entries(): HeadersIterator<[string, string]> {
|
|
72
|
+
for (const [key, values] of this.headers.entries()) {
|
|
73
|
+
yield [key, values.join(", ")];
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
*keys(): HeadersIterator<string> {
|
|
78
|
+
yield* this.headers.keys();
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
*values(): HeadersIterator<string> {
|
|
82
|
+
for (const values of this.headers.values()) {
|
|
83
|
+
yield values.join(", ");
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
[Symbol.iterator](): HeadersIterator<[string, string]> {
|
|
88
|
+
return this.entries();
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
export { Headers };
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { WithRawResponse } from "./RawResponse.js";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* A promise that returns the parsed response and lets you retrieve the raw response too.
|
|
5
|
+
*/
|
|
6
|
+
export class HttpResponsePromise<T> extends Promise<T> {
|
|
7
|
+
private innerPromise: Promise<WithRawResponse<T>>;
|
|
8
|
+
private unwrappedPromise: Promise<T> | undefined;
|
|
9
|
+
|
|
10
|
+
private constructor(promise: Promise<WithRawResponse<T>>) {
|
|
11
|
+
// Initialize with a no-op to avoid premature parsing
|
|
12
|
+
super((resolve) => {
|
|
13
|
+
resolve(undefined as unknown as T);
|
|
14
|
+
});
|
|
15
|
+
this.innerPromise = promise;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Creates an `HttpResponsePromise` from a function that returns a promise.
|
|
20
|
+
*
|
|
21
|
+
* @param fn - A function that returns a promise resolving to a `WithRawResponse` object.
|
|
22
|
+
* @param args - Arguments to pass to the function.
|
|
23
|
+
* @returns An `HttpResponsePromise` instance.
|
|
24
|
+
*/
|
|
25
|
+
public static fromFunction<F extends (...args: never[]) => Promise<WithRawResponse<T>>, T>(
|
|
26
|
+
fn: F,
|
|
27
|
+
...args: Parameters<F>
|
|
28
|
+
): HttpResponsePromise<T> {
|
|
29
|
+
return new HttpResponsePromise<T>(fn(...args));
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Creates a function that returns an `HttpResponsePromise` from a function that returns a promise.
|
|
34
|
+
*
|
|
35
|
+
* @param fn - A function that returns a promise resolving to a `WithRawResponse` object.
|
|
36
|
+
* @returns A function that returns an `HttpResponsePromise` instance.
|
|
37
|
+
*/
|
|
38
|
+
public static interceptFunction<
|
|
39
|
+
F extends (...args: never[]) => Promise<WithRawResponse<T>>,
|
|
40
|
+
T = Awaited<ReturnType<F>>["data"],
|
|
41
|
+
>(fn: F): (...args: Parameters<F>) => HttpResponsePromise<T> {
|
|
42
|
+
return (...args: Parameters<F>): HttpResponsePromise<T> => {
|
|
43
|
+
return HttpResponsePromise.fromPromise<T>(fn(...args));
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Creates an `HttpResponsePromise` from an existing promise.
|
|
49
|
+
*
|
|
50
|
+
* @param promise - A promise resolving to a `WithRawResponse` object.
|
|
51
|
+
* @returns An `HttpResponsePromise` instance.
|
|
52
|
+
*/
|
|
53
|
+
public static fromPromise<T>(promise: Promise<WithRawResponse<T>>): HttpResponsePromise<T> {
|
|
54
|
+
return new HttpResponsePromise<T>(promise);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Creates an `HttpResponsePromise` from an executor function.
|
|
59
|
+
*
|
|
60
|
+
* @param executor - A function that takes resolve and reject callbacks to create a promise.
|
|
61
|
+
* @returns An `HttpResponsePromise` instance.
|
|
62
|
+
*/
|
|
63
|
+
public static fromExecutor<T>(
|
|
64
|
+
executor: (resolve: (value: WithRawResponse<T>) => void, reject: (reason?: unknown) => void) => void,
|
|
65
|
+
): HttpResponsePromise<T> {
|
|
66
|
+
const promise = new Promise<WithRawResponse<T>>(executor);
|
|
67
|
+
return new HttpResponsePromise<T>(promise);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Creates an `HttpResponsePromise` from a resolved result.
|
|
72
|
+
*
|
|
73
|
+
* @param result - A `WithRawResponse` object to resolve immediately.
|
|
74
|
+
* @returns An `HttpResponsePromise` instance.
|
|
75
|
+
*/
|
|
76
|
+
public static fromResult<T>(result: WithRawResponse<T>): HttpResponsePromise<T> {
|
|
77
|
+
const promise = Promise.resolve(result);
|
|
78
|
+
return new HttpResponsePromise<T>(promise);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
private unwrap(): Promise<T> {
|
|
82
|
+
if (!this.unwrappedPromise) {
|
|
83
|
+
this.unwrappedPromise = this.innerPromise.then(({ data }) => data);
|
|
84
|
+
}
|
|
85
|
+
return this.unwrappedPromise;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/** @inheritdoc */
|
|
89
|
+
public override then<TResult1 = T, TResult2 = never>(
|
|
90
|
+
onfulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | null,
|
|
91
|
+
onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | null,
|
|
92
|
+
): Promise<TResult1 | TResult2> {
|
|
93
|
+
return this.unwrap().then(onfulfilled, onrejected);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/** @inheritdoc */
|
|
97
|
+
public override catch<TResult = never>(
|
|
98
|
+
onrejected?: ((reason: unknown) => TResult | PromiseLike<TResult>) | null,
|
|
99
|
+
): Promise<T | TResult> {
|
|
100
|
+
return this.unwrap().catch(onrejected);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/** @inheritdoc */
|
|
104
|
+
public override finally(onfinally?: (() => void) | null): Promise<T> {
|
|
105
|
+
return this.unwrap().finally(onfinally);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Retrieves the data and raw response.
|
|
110
|
+
*
|
|
111
|
+
* @returns A promise resolving to a `WithRawResponse` object.
|
|
112
|
+
*/
|
|
113
|
+
public async withRawResponse(): Promise<WithRawResponse<T>> {
|
|
114
|
+
return await this.innerPromise;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { Headers } from "./Headers.js";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* The raw response from the fetch call excluding the body.
|
|
5
|
+
*/
|
|
6
|
+
export type RawResponse = Omit<
|
|
7
|
+
{
|
|
8
|
+
[K in keyof Response as Response[K] extends Function ? never : K]: Response[K]; // strips out functions
|
|
9
|
+
},
|
|
10
|
+
"ok" | "body" | "bodyUsed"
|
|
11
|
+
>; // strips out body and bodyUsed
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* A raw response indicating that the request was aborted.
|
|
15
|
+
*/
|
|
16
|
+
export const abortRawResponse: RawResponse = {
|
|
17
|
+
headers: new Headers(),
|
|
18
|
+
redirected: false,
|
|
19
|
+
status: 499,
|
|
20
|
+
statusText: "Client Closed Request",
|
|
21
|
+
type: "error",
|
|
22
|
+
url: "",
|
|
23
|
+
} as const;
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* A raw response indicating an unknown error.
|
|
27
|
+
*/
|
|
28
|
+
export const unknownRawResponse: RawResponse = {
|
|
29
|
+
headers: new Headers(),
|
|
30
|
+
redirected: false,
|
|
31
|
+
status: 0,
|
|
32
|
+
statusText: "Unknown Error",
|
|
33
|
+
type: "error",
|
|
34
|
+
url: "",
|
|
35
|
+
} as const;
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Converts a `RawResponse` object into a `RawResponse` by extracting its properties,
|
|
39
|
+
* excluding the `body` and `bodyUsed` fields.
|
|
40
|
+
*
|
|
41
|
+
* @param response - The `RawResponse` object to convert.
|
|
42
|
+
* @returns A `RawResponse` object containing the extracted properties of the input response.
|
|
43
|
+
*/
|
|
44
|
+
export function toRawResponse(response: Response): RawResponse {
|
|
45
|
+
return {
|
|
46
|
+
headers: response.headers,
|
|
47
|
+
redirected: response.redirected,
|
|
48
|
+
status: response.status,
|
|
49
|
+
statusText: response.statusText,
|
|
50
|
+
type: response.type,
|
|
51
|
+
url: response.url,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Creates a `RawResponse` from a standard `Response` object.
|
|
57
|
+
*/
|
|
58
|
+
export interface WithRawResponse<T> {
|
|
59
|
+
readonly data: T;
|
|
60
|
+
readonly rawResponse: RawResponse;
|
|
61
|
+
}
|
|
@@ -1,10 +1,6 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { toQueryString } from "../url/qs.js";
|
|
2
2
|
|
|
3
|
-
export function createRequestUrl(
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
): string {
|
|
7
|
-
return Object.keys(queryParameters ?? {}).length > 0
|
|
8
|
-
? `${baseUrl}?${qs.stringify(queryParameters, { arrayFormat: "repeat" })}`
|
|
9
|
-
: baseUrl;
|
|
3
|
+
export function createRequestUrl(baseUrl: string, queryParameters?: Record<string, unknown>): string {
|
|
4
|
+
const queryString = toQueryString(queryParameters, { arrayFormat: "repeat" });
|
|
5
|
+
return queryString ? `${baseUrl}?${queryString}` : baseUrl;
|
|
10
6
|
}
|