@leonardo-ai/sdk 4.14.2 → 4.15.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/README.md +104 -7
- package/core.d.ts +10 -0
- package/core.d.ts.map +1 -0
- package/core.js +17 -0
- package/core.js.map +1 -0
- package/docs/sdks/dataset/README.md +169 -7
- package/docs/sdks/elements/README.md +33 -1
- package/docs/sdks/image/README.md +132 -7
- package/docs/sdks/initimages/README.md +136 -6
- package/docs/sdks/leonardo/README.md +1 -5
- package/docs/sdks/models/README.md +135 -6
- package/docs/sdks/motion/README.md +34 -4
- package/docs/sdks/pricingcalculator/README.md +34 -2
- package/docs/sdks/prompt/README.md +67 -2
- package/docs/sdks/realtimecanvas/README.md +133 -21
- package/docs/sdks/texture/README.md +67 -4
- package/docs/sdks/threedmodelassets/README.md +67 -4
- package/docs/sdks/user/README.md +33 -1
- package/docs/sdks/variation/README.md +166 -10
- package/funcs/datasetCreateDataset.d.ts +15 -0
- package/funcs/datasetCreateDataset.d.ts.map +1 -0
- package/funcs/datasetCreateDataset.js +101 -0
- package/funcs/datasetCreateDataset.js.map +1 -0
- package/funcs/datasetDeleteDatasetById.d.ts +15 -0
- package/funcs/datasetDeleteDatasetById.d.ts.map +1 -0
- package/funcs/datasetDeleteDatasetById.js +103 -0
- package/funcs/datasetDeleteDatasetById.js.map +1 -0
- package/funcs/datasetGetDatasetById.d.ts +15 -0
- package/funcs/datasetGetDatasetById.d.ts.map +1 -0
- package/funcs/datasetGetDatasetById.js +105 -0
- package/funcs/datasetGetDatasetById.js.map +1 -0
- package/funcs/datasetUploadDatasetImage.d.ts +15 -0
- package/funcs/datasetUploadDatasetImage.d.ts.map +1 -0
- package/funcs/datasetUploadDatasetImage.js +108 -0
- package/funcs/datasetUploadDatasetImage.js.map +1 -0
- package/funcs/datasetUploadDatasetImageFromGen.d.ts +15 -0
- package/funcs/datasetUploadDatasetImageFromGen.d.ts.map +1 -0
- package/funcs/datasetUploadDatasetImageFromGen.js +108 -0
- package/funcs/datasetUploadDatasetImageFromGen.js.map +1 -0
- package/funcs/elementsListElements.d.ts +15 -0
- package/funcs/elementsListElements.d.ts.map +1 -0
- package/funcs/elementsListElements.js +90 -0
- package/funcs/elementsListElements.js.map +1 -0
- package/funcs/imageCreateGeneration.d.ts +15 -0
- package/funcs/imageCreateGeneration.d.ts.map +1 -0
- package/funcs/imageCreateGeneration.js +99 -0
- package/funcs/imageCreateGeneration.js.map +1 -0
- package/funcs/imageDeleteGenerationById.d.ts +15 -0
- package/funcs/imageDeleteGenerationById.d.ts.map +1 -0
- package/funcs/imageDeleteGenerationById.js +103 -0
- package/funcs/imageDeleteGenerationById.js.map +1 -0
- package/funcs/imageGetGenerationById.d.ts +15 -0
- package/funcs/imageGetGenerationById.d.ts.map +1 -0
- package/funcs/imageGetGenerationById.js +103 -0
- package/funcs/imageGetGenerationById.js.map +1 -0
- package/funcs/imageGetGenerationsByUserId.d.ts +15 -0
- package/funcs/imageGetGenerationsByUserId.d.ts.map +1 -0
- package/funcs/imageGetGenerationsByUserId.js +113 -0
- package/funcs/imageGetGenerationsByUserId.js.map +1 -0
- package/funcs/initImagesDeleteInitImageById.d.ts +15 -0
- package/funcs/initImagesDeleteInitImageById.d.ts.map +1 -0
- package/funcs/initImagesDeleteInitImageById.js +103 -0
- package/funcs/initImagesDeleteInitImageById.js.map +1 -0
- package/funcs/initImagesGetInitImageById.d.ts +15 -0
- package/funcs/initImagesGetInitImageById.d.ts.map +1 -0
- package/funcs/initImagesGetInitImageById.js +103 -0
- package/funcs/initImagesGetInitImageById.js.map +1 -0
- package/funcs/initImagesUploadCanvasInitImage.d.ts +15 -0
- package/funcs/initImagesUploadCanvasInitImage.d.ts.map +1 -0
- package/funcs/initImagesUploadCanvasInitImage.js +99 -0
- package/funcs/initImagesUploadCanvasInitImage.js.map +1 -0
- package/funcs/initImagesUploadInitImage.d.ts +15 -0
- package/funcs/initImagesUploadInitImage.d.ts.map +1 -0
- package/funcs/initImagesUploadInitImage.js +101 -0
- package/funcs/initImagesUploadInitImage.js.map +1 -0
- package/funcs/modelsCreateModel.d.ts +15 -0
- package/funcs/modelsCreateModel.d.ts.map +1 -0
- package/funcs/modelsCreateModel.js +101 -0
- package/funcs/modelsCreateModel.js.map +1 -0
- package/funcs/modelsDeleteModelById.d.ts +15 -0
- package/funcs/modelsDeleteModelById.d.ts.map +1 -0
- package/funcs/modelsDeleteModelById.js +105 -0
- package/funcs/modelsDeleteModelById.js.map +1 -0
- package/funcs/modelsGetModelById.d.ts +15 -0
- package/funcs/modelsGetModelById.d.ts.map +1 -0
- package/funcs/modelsGetModelById.js +105 -0
- package/funcs/modelsGetModelById.js.map +1 -0
- package/funcs/modelsListPlatformModels.d.ts +15 -0
- package/funcs/modelsListPlatformModels.d.ts.map +1 -0
- package/funcs/modelsListPlatformModels.js +88 -0
- package/funcs/modelsListPlatformModels.js.map +1 -0
- package/funcs/motionCreateSVDMotionGeneration.d.ts +15 -0
- package/funcs/motionCreateSVDMotionGeneration.d.ts.map +1 -0
- package/funcs/motionCreateSVDMotionGeneration.js +99 -0
- package/funcs/motionCreateSVDMotionGeneration.js.map +1 -0
- package/funcs/pricingCalculatorPricingCalculator.d.ts +15 -0
- package/funcs/pricingCalculatorPricingCalculator.d.ts.map +1 -0
- package/funcs/pricingCalculatorPricingCalculator.js +99 -0
- package/funcs/pricingCalculatorPricingCalculator.js.map +1 -0
- package/funcs/promptPromptImprove.d.ts +15 -0
- package/funcs/promptPromptImprove.d.ts.map +1 -0
- package/funcs/promptPromptImprove.js +101 -0
- package/funcs/promptPromptImprove.js.map +1 -0
- package/funcs/promptPromptRandom.d.ts +15 -0
- package/funcs/promptPromptRandom.d.ts.map +1 -0
- package/funcs/promptPromptRandom.js +90 -0
- package/funcs/promptPromptRandom.js.map +1 -0
- package/funcs/realtimeCanvasCreateLCMGeneration.d.ts +15 -0
- package/funcs/realtimeCanvasCreateLCMGeneration.d.ts.map +1 -0
- package/funcs/realtimeCanvasCreateLCMGeneration.js +99 -0
- package/funcs/realtimeCanvasCreateLCMGeneration.js.map +1 -0
- package/funcs/realtimeCanvasPerformAlchemyUpscaleLCM.d.ts +15 -0
- package/funcs/realtimeCanvasPerformAlchemyUpscaleLCM.d.ts.map +1 -0
- package/funcs/realtimeCanvasPerformAlchemyUpscaleLCM.js +99 -0
- package/funcs/realtimeCanvasPerformAlchemyUpscaleLCM.js.map +1 -0
- package/funcs/realtimeCanvasPerformInpaintingLCM.d.ts +15 -0
- package/funcs/realtimeCanvasPerformInpaintingLCM.d.ts.map +1 -0
- package/funcs/realtimeCanvasPerformInpaintingLCM.js +99 -0
- package/funcs/realtimeCanvasPerformInpaintingLCM.js.map +1 -0
- package/funcs/realtimeCanvasPerformInstantRefine.d.ts +15 -0
- package/funcs/realtimeCanvasPerformInstantRefine.d.ts.map +1 -0
- package/funcs/realtimeCanvasPerformInstantRefine.js +99 -0
- package/funcs/realtimeCanvasPerformInstantRefine.js.map +1 -0
- package/funcs/textureCreateTextureGeneration.d.ts +15 -0
- package/funcs/textureCreateTextureGeneration.d.ts.map +1 -0
- package/funcs/textureCreateTextureGeneration.js +99 -0
- package/funcs/textureCreateTextureGeneration.js.map +1 -0
- package/funcs/textureDeleteTextureGenerationById.d.ts +15 -0
- package/funcs/textureDeleteTextureGenerationById.d.ts.map +1 -0
- package/funcs/textureDeleteTextureGenerationById.js +107 -0
- package/funcs/textureDeleteTextureGenerationById.js.map +1 -0
- package/funcs/threeDModelAssetsDelete3DModelById.d.ts +15 -0
- package/funcs/threeDModelAssetsDelete3DModelById.d.ts.map +1 -0
- package/funcs/threeDModelAssetsDelete3DModelById.js +105 -0
- package/funcs/threeDModelAssetsDelete3DModelById.js.map +1 -0
- package/funcs/threeDModelAssetsUploadModelAsset.d.ts +15 -0
- package/funcs/threeDModelAssetsUploadModelAsset.d.ts.map +1 -0
- package/funcs/threeDModelAssetsUploadModelAsset.js +99 -0
- package/funcs/threeDModelAssetsUploadModelAsset.js.map +1 -0
- package/funcs/userGetUserSelf.d.ts +15 -0
- package/funcs/userGetUserSelf.d.ts.map +1 -0
- package/funcs/userGetUserSelf.js +90 -0
- package/funcs/userGetUserSelf.js.map +1 -0
- package/funcs/variationCreateUniversalUpscalerJob.d.ts +15 -0
- package/funcs/variationCreateUniversalUpscalerJob.d.ts.map +1 -0
- package/funcs/variationCreateUniversalUpscalerJob.js +99 -0
- package/funcs/variationCreateUniversalUpscalerJob.js.map +1 -0
- package/funcs/variationCreateVariationNoBG.d.ts +15 -0
- package/funcs/variationCreateVariationNoBG.d.ts.map +1 -0
- package/funcs/variationCreateVariationNoBG.js +99 -0
- package/funcs/variationCreateVariationNoBG.js.map +1 -0
- package/funcs/variationCreateVariationUnzoom.d.ts +15 -0
- package/funcs/variationCreateVariationUnzoom.d.ts.map +1 -0
- package/funcs/variationCreateVariationUnzoom.js +99 -0
- package/funcs/variationCreateVariationUnzoom.js.map +1 -0
- package/funcs/variationCreateVariationUpscale.d.ts +15 -0
- package/funcs/variationCreateVariationUpscale.d.ts.map +1 -0
- package/funcs/variationCreateVariationUpscale.js +99 -0
- package/funcs/variationCreateVariationUpscale.js.map +1 -0
- package/funcs/variationGetVariationById.d.ts +15 -0
- package/funcs/variationGetVariationById.d.ts.map +1 -0
- package/funcs/variationGetVariationById.js +103 -0
- package/funcs/variationGetVariationById.js.map +1 -0
- package/index.d.ts +1 -0
- package/index.d.ts.map +1 -1
- package/index.js +14 -0
- package/index.js.map +1 -1
- package/lib/config.d.ts +5 -3
- package/lib/config.d.ts.map +1 -1
- package/lib/config.js +3 -3
- package/lib/config.js.map +1 -1
- package/lib/dlv.d.ts +14 -0
- package/lib/dlv.d.ts.map +1 -0
- package/lib/dlv.js +50 -0
- package/lib/dlv.js.map +1 -0
- package/lib/files.d.ts +12 -0
- package/lib/files.d.ts.map +1 -0
- package/lib/files.js +52 -0
- package/lib/files.js.map +1 -0
- package/lib/http.d.ts +11 -52
- package/lib/http.d.ts.map +1 -1
- package/lib/http.js +49 -173
- package/lib/http.js.map +1 -1
- package/lib/logger.d.ts +6 -0
- package/lib/logger.d.ts.map +1 -0
- package/lib/logger.js +6 -0
- package/lib/logger.js.map +1 -0
- package/lib/matchers.d.ts +64 -0
- package/lib/matchers.d.ts.map +1 -0
- package/lib/matchers.js +206 -0
- package/lib/matchers.js.map +1 -0
- package/lib/retries.d.ts.map +1 -1
- package/lib/retries.js +2 -28
- package/lib/retries.js.map +1 -1
- package/lib/schemas.d.ts +8 -0
- package/lib/schemas.d.ts.map +1 -1
- package/lib/schemas.js +16 -1
- package/lib/schemas.js.map +1 -1
- package/lib/sdks.d.ts +14 -16
- package/lib/sdks.d.ts.map +1 -1
- package/lib/sdks.js +144 -27
- package/lib/sdks.js.map +1 -1
- package/lib/security.d.ts +7 -1
- package/lib/security.d.ts.map +1 -1
- package/lib/security.js +13 -1
- package/lib/security.js.map +1 -1
- package/package.json +2 -1
- package/sdk/dataset.d.ts +0 -3
- package/sdk/dataset.d.ts.map +1 -1
- package/sdk/dataset.js +11 -332
- package/sdk/dataset.js.map +1 -1
- package/sdk/elements.d.ts +0 -3
- package/sdk/elements.d.ts.map +1 -1
- package/sdk/elements.js +3 -93
- package/sdk/elements.js.map +1 -1
- package/sdk/image.d.ts +0 -3
- package/sdk/image.d.ts.map +1 -1
- package/sdk/image.js +9 -273
- package/sdk/image.js.map +1 -1
- package/sdk/initimages.d.ts +0 -3
- package/sdk/initimages.d.ts.map +1 -1
- package/sdk/initimages.js +9 -261
- package/sdk/initimages.js.map +1 -1
- package/sdk/models/errors/httpclienterrors.d.ts +44 -0
- package/sdk/models/errors/httpclienterrors.d.ts.map +1 -0
- package/sdk/models/errors/httpclienterrors.js +78 -0
- package/sdk/models/errors/httpclienterrors.js.map +1 -0
- package/sdk/models/errors/index.d.ts +1 -0
- package/sdk/models/errors/index.d.ts.map +1 -1
- package/sdk/models/errors/index.js +1 -0
- package/sdk/models/errors/index.js.map +1 -1
- package/sdk/models/errors/sdkvalidationerror.d.ts +4 -1
- package/sdk/models/errors/sdkvalidationerror.d.ts.map +1 -1
- package/sdk/models/errors/sdkvalidationerror.js +3 -5
- package/sdk/models/errors/sdkvalidationerror.js.map +1 -1
- package/sdk/models/operations/pricingcalculator.d.ts +5 -0
- package/sdk/models/operations/pricingcalculator.d.ts.map +1 -1
- package/sdk/models/operations/pricingcalculator.js +2 -0
- package/sdk/models/operations/pricingcalculator.js.map +1 -1
- package/sdk/models.d.ts +0 -3
- package/sdk/models.d.ts.map +1 -1
- package/sdk/models.js +9 -256
- package/sdk/models.js.map +1 -1
- package/sdk/motion.d.ts +0 -3
- package/sdk/motion.d.ts.map +1 -1
- package/sdk/motion.js +3 -102
- package/sdk/motion.js.map +1 -1
- package/sdk/pricingcalculator.d.ts +0 -3
- package/sdk/pricingcalculator.d.ts.map +1 -1
- package/sdk/pricingcalculator.js +3 -100
- package/sdk/pricingcalculator.js.map +1 -1
- package/sdk/prompt.d.ts +0 -3
- package/sdk/prompt.d.ts.map +1 -1
- package/sdk/prompt.js +5 -146
- package/sdk/prompt.js.map +1 -1
- package/sdk/realtimecanvas.d.ts +0 -3
- package/sdk/realtimecanvas.d.ts.map +1 -1
- package/sdk/realtimecanvas.js +9 -253
- package/sdk/realtimecanvas.js.map +1 -1
- package/sdk/sdk.d.ts +0 -3
- package/sdk/sdk.d.ts.map +1 -1
- package/sdk/sdk.js +0 -23
- package/sdk/sdk.js.map +1 -1
- package/sdk/texture.d.ts +0 -3
- package/sdk/texture.d.ts.map +1 -1
- package/sdk/texture.js +5 -159
- package/sdk/texture.js.map +1 -1
- package/sdk/threedmodelassets.d.ts +0 -3
- package/sdk/threedmodelassets.d.ts.map +1 -1
- package/sdk/threedmodelassets.js +5 -157
- package/sdk/threedmodelassets.js.map +1 -1
- package/sdk/types/constdatetime.d.ts +3 -0
- package/sdk/types/constdatetime.d.ts.map +1 -0
- package/sdk/types/constdatetime.js +37 -0
- package/sdk/types/constdatetime.js.map +1 -0
- package/sdk/types/fp.d.ts +31 -0
- package/sdk/types/fp.d.ts.map +1 -0
- package/sdk/types/fp.js +38 -0
- package/sdk/types/fp.js.map +1 -0
- package/sdk/types/index.d.ts +1 -0
- package/sdk/types/index.d.ts.map +1 -1
- package/sdk/types/operations.d.ts +22 -8
- package/sdk/types/operations.d.ts.map +1 -1
- package/sdk/types/operations.js +64 -2
- package/sdk/types/operations.js.map +1 -1
- package/sdk/types/streams.d.ts +2 -0
- package/sdk/types/streams.d.ts.map +1 -0
- package/sdk/types/streams.js +19 -0
- package/sdk/types/streams.js.map +1 -0
- package/sdk/user.d.ts +0 -3
- package/sdk/user.d.ts.map +1 -1
- package/sdk/user.js +3 -93
- package/sdk/user.js.map +1 -1
- package/sdk/variation.d.ts +0 -3
- package/sdk/variation.d.ts.map +1 -1
- package/sdk/variation.js +11 -310
- package/sdk/variation.js.map +1 -1
- package/src/core.ts +13 -0
- package/src/funcs/datasetCreateDataset.ts +127 -0
- package/src/funcs/datasetDeleteDatasetById.ts +133 -0
- package/src/funcs/datasetGetDatasetById.ts +132 -0
- package/src/funcs/datasetUploadDatasetImage.ts +139 -0
- package/src/funcs/datasetUploadDatasetImageFromGen.ts +139 -0
- package/src/funcs/elementsListElements.ts +109 -0
- package/src/funcs/imageCreateGeneration.ts +128 -0
- package/src/funcs/imageDeleteGenerationById.ts +133 -0
- package/src/funcs/imageGetGenerationById.ts +133 -0
- package/src/funcs/imageGetGenerationsByUserId.ts +149 -0
- package/src/funcs/initImagesDeleteInitImageById.ts +133 -0
- package/src/funcs/initImagesGetInitImageById.ts +133 -0
- package/src/funcs/initImagesUploadCanvasInitImage.ts +128 -0
- package/src/funcs/initImagesUploadInitImage.ts +127 -0
- package/src/funcs/modelsCreateModel.ts +127 -0
- package/src/funcs/modelsDeleteModelById.ts +132 -0
- package/src/funcs/modelsGetModelById.ts +132 -0
- package/src/funcs/modelsListPlatformModels.ts +110 -0
- package/src/funcs/motionCreateSVDMotionGeneration.ts +129 -0
- package/src/funcs/pricingCalculatorPricingCalculator.ts +128 -0
- package/src/funcs/promptPromptImprove.ts +127 -0
- package/src/funcs/promptPromptRandom.ts +109 -0
- package/src/funcs/realtimeCanvasCreateLCMGeneration.ts +129 -0
- package/src/funcs/realtimeCanvasPerformAlchemyUpscaleLCM.ts +129 -0
- package/src/funcs/realtimeCanvasPerformInpaintingLCM.ts +129 -0
- package/src/funcs/realtimeCanvasPerformInstantRefine.ts +129 -0
- package/src/funcs/textureCreateTextureGeneration.ts +129 -0
- package/src/funcs/textureDeleteTextureGenerationById.ts +137 -0
- package/src/funcs/threeDModelAssetsDelete3DModelById.ts +136 -0
- package/src/funcs/threeDModelAssetsUploadModelAsset.ts +128 -0
- package/src/funcs/userGetUserSelf.ts +109 -0
- package/src/funcs/variationCreateUniversalUpscalerJob.ts +128 -0
- package/src/funcs/variationCreateVariationNoBG.ts +128 -0
- package/src/funcs/variationCreateVariationUnzoom.ts +129 -0
- package/src/funcs/variationCreateVariationUpscale.ts +129 -0
- package/src/funcs/variationGetVariationById.ts +133 -0
- package/src/index.ts +1 -0
- package/src/lib/config.ts +5 -3
- package/src/lib/dlv.ts +53 -0
- package/src/lib/files.ts +58 -0
- package/src/lib/http.ts +255 -438
- package/src/lib/logger.ts +9 -0
- package/src/lib/matchers.ts +305 -0
- package/src/lib/retries.ts +2 -41
- package/src/lib/schemas.ts +18 -0
- package/src/lib/sdks.ts +194 -35
- package/src/lib/security.ts +22 -1
- package/src/sdk/dataset.ts +11 -389
- package/src/sdk/elements.ts +3 -84
- package/src/sdk/image.ts +9 -319
- package/src/sdk/initimages.ts +9 -303
- package/src/sdk/models/errors/httpclienterrors.ts +62 -0
- package/src/sdk/models/errors/index.ts +1 -0
- package/src/sdk/models/errors/sdkvalidationerror.ts +8 -6
- package/src/sdk/models/operations/pricingcalculator.ts +7 -0
- package/src/sdk/models.ts +9 -292
- package/src/sdk/motion.ts +3 -103
- package/src/sdk/pricingcalculator.ts +3 -99
- package/src/sdk/prompt.ts +5 -152
- package/src/sdk/realtimecanvas.ts +9 -305
- package/src/sdk/sdk.ts +0 -29
- package/src/sdk/texture.ts +5 -175
- package/src/sdk/threedmodelassets.ts +5 -171
- package/src/sdk/types/constdatetime.ts +15 -0
- package/src/sdk/types/fp.ts +50 -0
- package/src/sdk/types/index.ts +1 -0
- package/src/sdk/types/operations.ts +81 -7
- package/src/sdk/types/streams.ts +21 -0
- package/src/sdk/user.ts +3 -84
- package/src/sdk/variation.ts +11 -374
package/src/lib/http.ts
CHANGED
|
@@ -2,40 +2,38 @@
|
|
|
2
2
|
* Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
export type Fetcher = (input: RequestInfo | URL, init?: RequestInit) => Promise<Response>;
|
|
5
|
+
export type Fetcher = (
|
|
6
|
+
input: RequestInfo | URL,
|
|
7
|
+
init?: RequestInit,
|
|
8
|
+
) => Promise<Response>;
|
|
11
9
|
|
|
12
10
|
export type Awaitable<T> = T | Promise<T>;
|
|
13
11
|
|
|
14
12
|
const DEFAULT_FETCHER: Fetcher = (input, init) => {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
13
|
+
// If input is a Request and init is undefined, Bun will discard the method,
|
|
14
|
+
// headers, body and other options that were set on the request object.
|
|
15
|
+
// Node.js and browers would ignore an undefined init value. This check is
|
|
16
|
+
// therefore needed for interop with Bun.
|
|
17
|
+
if (init == null) {
|
|
18
|
+
return fetch(input);
|
|
19
|
+
} else {
|
|
20
|
+
return fetch(input, init);
|
|
21
|
+
}
|
|
24
22
|
};
|
|
25
23
|
|
|
26
24
|
export type RequestInput = {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
25
|
+
/**
|
|
26
|
+
* The URL the request will use.
|
|
27
|
+
*/
|
|
28
|
+
url: URL;
|
|
29
|
+
/**
|
|
30
|
+
* Options used to create a [`Request`](https://developer.mozilla.org/en-US/docs/Web/API/Request/Request).
|
|
31
|
+
*/
|
|
32
|
+
options?: RequestInit | undefined;
|
|
35
33
|
};
|
|
36
34
|
|
|
37
35
|
export interface HTTPClientOptions {
|
|
38
|
-
|
|
36
|
+
fetcher?: Fetcher;
|
|
39
37
|
}
|
|
40
38
|
|
|
41
39
|
export type BeforeRequestHook = (req: Request) => Awaitable<Request | void>;
|
|
@@ -43,114 +41,114 @@ export type RequestErrorHook = (err: unknown, req: Request) => Awaitable<void>;
|
|
|
43
41
|
export type ResponseHook = (res: Response, req: Request) => Awaitable<void>;
|
|
44
42
|
|
|
45
43
|
export class HTTPClient {
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
44
|
+
private fetcher: Fetcher;
|
|
45
|
+
private requestHooks: BeforeRequestHook[] = [];
|
|
46
|
+
private requestErrorHooks: RequestErrorHook[] = [];
|
|
47
|
+
private responseHooks: ResponseHook[] = [];
|
|
48
|
+
|
|
49
|
+
constructor(private options: HTTPClientOptions = {}) {
|
|
50
|
+
this.fetcher = options.fetcher || DEFAULT_FETCHER;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
async request(request: Request): Promise<Response> {
|
|
54
|
+
let req = request;
|
|
55
|
+
for (const hook of this.requestHooks) {
|
|
56
|
+
const nextRequest = await hook(req);
|
|
57
|
+
if (nextRequest) {
|
|
58
|
+
req = nextRequest;
|
|
59
|
+
}
|
|
53
60
|
}
|
|
54
61
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
for (const hook of this.responseHooks) {
|
|
68
|
-
await hook(res, req);
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
return res;
|
|
72
|
-
} catch (err) {
|
|
73
|
-
for (const hook of this.requestErrorHooks) {
|
|
74
|
-
await hook(err, req);
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
throw err;
|
|
78
|
-
}
|
|
79
|
-
}
|
|
62
|
+
try {
|
|
63
|
+
const res = await this.fetcher(req);
|
|
64
|
+
|
|
65
|
+
for (const hook of this.responseHooks) {
|
|
66
|
+
await hook(res, req);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
return res;
|
|
70
|
+
} catch (err) {
|
|
71
|
+
for (const hook of this.requestErrorHooks) {
|
|
72
|
+
await hook(err, req);
|
|
73
|
+
}
|
|
80
74
|
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
75
|
+
throw err;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Registers a hook that is called before a request is made. The hook function
|
|
81
|
+
* can mutate the request or return a new request. This may be useful to add
|
|
82
|
+
* additional information to request such as request IDs and tracing headers.
|
|
83
|
+
*/
|
|
84
|
+
addHook(hook: "beforeRequest", fn: BeforeRequestHook): this;
|
|
85
|
+
/**
|
|
86
|
+
* Registers a hook that is called when a request cannot be made due to a
|
|
87
|
+
* network error.
|
|
88
|
+
*/
|
|
89
|
+
addHook(hook: "requestError", fn: RequestErrorHook): this;
|
|
90
|
+
/**
|
|
91
|
+
* Registers a hook that is called when a response has been received from the
|
|
92
|
+
* server.
|
|
93
|
+
*/
|
|
94
|
+
addHook(hook: "response", fn: ResponseHook): this;
|
|
95
|
+
addHook(
|
|
96
|
+
...args:
|
|
97
|
+
| [hook: "beforeRequest", fn: BeforeRequestHook]
|
|
98
|
+
| [hook: "requestError", fn: RequestErrorHook]
|
|
99
|
+
| [hook: "response", fn: ResponseHook]
|
|
100
|
+
) {
|
|
101
|
+
if (args[0] === "beforeRequest") {
|
|
102
|
+
this.requestHooks.push(args[1]);
|
|
103
|
+
} else if (args[0] === "requestError") {
|
|
104
|
+
this.requestErrorHooks.push(args[1]);
|
|
105
|
+
} else if (args[0] === "response") {
|
|
106
|
+
this.responseHooks.push(args[1]);
|
|
107
|
+
} else {
|
|
108
|
+
throw new Error(`Invalid hook type: ${args[0]}`);
|
|
109
|
+
}
|
|
110
|
+
return this;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/** Removes a hook that was previously registered with `addHook`. */
|
|
114
|
+
removeHook(hook: "beforeRequest", fn: BeforeRequestHook): this;
|
|
115
|
+
/** Removes a hook that was previously registered with `addHook`. */
|
|
116
|
+
removeHook(hook: "requestError", fn: RequestErrorHook): this;
|
|
117
|
+
/** Removes a hook that was previously registered with `addHook`. */
|
|
118
|
+
removeHook(hook: "response", fn: ResponseHook): this;
|
|
119
|
+
removeHook(
|
|
120
|
+
...args:
|
|
121
|
+
| [hook: "beforeRequest", fn: BeforeRequestHook]
|
|
122
|
+
| [hook: "requestError", fn: RequestErrorHook]
|
|
123
|
+
| [hook: "response", fn: ResponseHook]
|
|
124
|
+
): this {
|
|
125
|
+
let target: unknown[];
|
|
126
|
+
if (args[0] === "beforeRequest") {
|
|
127
|
+
target = this.requestHooks;
|
|
128
|
+
} else if (args[0] === "requestError") {
|
|
129
|
+
target = this.requestErrorHooks;
|
|
130
|
+
} else if (args[0] === "response") {
|
|
131
|
+
target = this.responseHooks;
|
|
132
|
+
} else {
|
|
133
|
+
throw new Error(`Invalid hook type: ${args[0]}`);
|
|
113
134
|
}
|
|
114
135
|
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
removeHook(hook: "requestError", fn: RequestErrorHook): this;
|
|
119
|
-
/** Removes a hook that was previously registered with `addHook`. */
|
|
120
|
-
removeHook(hook: "response", fn: ResponseHook): this;
|
|
121
|
-
removeHook(
|
|
122
|
-
...args:
|
|
123
|
-
| [hook: "beforeRequest", fn: BeforeRequestHook]
|
|
124
|
-
| [hook: "requestError", fn: RequestErrorHook]
|
|
125
|
-
| [hook: "response", fn: ResponseHook]
|
|
126
|
-
): this {
|
|
127
|
-
let target: unknown[];
|
|
128
|
-
if (args[0] === "beforeRequest") {
|
|
129
|
-
target = this.requestHooks;
|
|
130
|
-
} else if (args[0] === "requestError") {
|
|
131
|
-
target = this.requestErrorHooks;
|
|
132
|
-
} else if (args[0] === "response") {
|
|
133
|
-
target = this.responseHooks;
|
|
134
|
-
} else {
|
|
135
|
-
throw new Error(`Invalid hook type: ${args[0]}`);
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
const index = target.findIndex((v) => v === args[1]);
|
|
139
|
-
if (index >= 0) {
|
|
140
|
-
target.splice(index, 1);
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
return this;
|
|
136
|
+
const index = target.findIndex((v) => v === args[1]);
|
|
137
|
+
if (index >= 0) {
|
|
138
|
+
target.splice(index, 1);
|
|
144
139
|
}
|
|
145
140
|
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
child.requestHooks = this.requestHooks.slice();
|
|
149
|
-
child.requestErrorHooks = this.requestErrorHooks.slice();
|
|
150
|
-
child.responseHooks = this.responseHooks.slice();
|
|
141
|
+
return this;
|
|
142
|
+
}
|
|
151
143
|
|
|
152
|
-
|
|
153
|
-
|
|
144
|
+
clone(): HTTPClient {
|
|
145
|
+
const child = new HTTPClient(this.options);
|
|
146
|
+
child.requestHooks = this.requestHooks.slice();
|
|
147
|
+
child.requestErrorHooks = this.requestErrorHooks.slice();
|
|
148
|
+
child.responseHooks = this.responseHooks.slice();
|
|
149
|
+
|
|
150
|
+
return child;
|
|
151
|
+
}
|
|
154
152
|
}
|
|
155
153
|
|
|
156
154
|
export type StatusCodePredicate = number | string | (number | string)[];
|
|
@@ -159,348 +157,167 @@ export type StatusCodePredicate = number | string | (number | string)[];
|
|
|
159
157
|
// segments in a media type string.
|
|
160
158
|
const mediaParamSeparator = /\s*;\s*/g;
|
|
161
159
|
|
|
162
|
-
function matchContentType(response: Response, pattern: string): boolean {
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
160
|
+
export function matchContentType(response: Response, pattern: string): boolean {
|
|
161
|
+
// `*` is a special case which means anything is acceptable.
|
|
162
|
+
if (pattern === "*") {
|
|
163
|
+
return true;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
let contentType =
|
|
167
|
+
response.headers.get("content-type")?.trim() || "application/octet-stream";
|
|
168
|
+
contentType = contentType.toLowerCase();
|
|
169
|
+
|
|
170
|
+
const wantParts = pattern.toLowerCase().trim().split(mediaParamSeparator);
|
|
171
|
+
const [wantType = "", ...wantParams] = wantParts;
|
|
172
|
+
|
|
173
|
+
if (wantType.split("/").length !== 2) {
|
|
174
|
+
return false;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
const gotParts = contentType.split(mediaParamSeparator);
|
|
178
|
+
const [gotType = "", ...gotParams] = gotParts;
|
|
179
|
+
|
|
180
|
+
const [type = "", subtype = ""] = gotType.split("/");
|
|
181
|
+
if (!type || !subtype) {
|
|
182
|
+
return false;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
if (
|
|
186
|
+
wantType !== "*/*" &&
|
|
187
|
+
gotType !== wantType &&
|
|
188
|
+
`${type}/*` !== wantType &&
|
|
189
|
+
`*/${subtype}` !== wantType
|
|
190
|
+
) {
|
|
191
|
+
return false;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
if (gotParams.length < wantParams.length) {
|
|
195
|
+
return false;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
const params = new Set(gotParams);
|
|
199
|
+
for (const wantParam of wantParams) {
|
|
200
|
+
if (!params.has(wantParam)) {
|
|
201
|
+
return false;
|
|
166
202
|
}
|
|
203
|
+
}
|
|
167
204
|
|
|
168
|
-
|
|
169
|
-
|
|
205
|
+
return true;
|
|
206
|
+
}
|
|
170
207
|
|
|
171
|
-
|
|
172
|
-
const [wantType = "", ...wantParams] = wantParts;
|
|
208
|
+
const codeRangeRE = new RegExp("^[0-9]xx$", "i");
|
|
173
209
|
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
210
|
+
export function matchStatusCode(
|
|
211
|
+
response: Response,
|
|
212
|
+
codes: StatusCodePredicate,
|
|
213
|
+
): boolean {
|
|
214
|
+
const actual = `${response.status}`;
|
|
215
|
+
const expectedCodes = Array.isArray(codes) ? codes : [codes];
|
|
216
|
+
if (!expectedCodes.length) {
|
|
217
|
+
return false;
|
|
218
|
+
}
|
|
177
219
|
|
|
178
|
-
|
|
179
|
-
const
|
|
220
|
+
return expectedCodes.some((ec) => {
|
|
221
|
+
const code = `${ec}`;
|
|
180
222
|
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
return false;
|
|
223
|
+
if (code === "default") {
|
|
224
|
+
return true;
|
|
184
225
|
}
|
|
185
226
|
|
|
186
|
-
if (
|
|
187
|
-
|
|
188
|
-
gotType !== wantType &&
|
|
189
|
-
`${type}/*` !== wantType &&
|
|
190
|
-
`*/${subtype}` !== wantType
|
|
191
|
-
) {
|
|
192
|
-
return false;
|
|
227
|
+
if (!codeRangeRE.test(`${code}`)) {
|
|
228
|
+
return code === actual;
|
|
193
229
|
}
|
|
194
230
|
|
|
195
|
-
|
|
196
|
-
|
|
231
|
+
const expectFamily = code.charAt(0);
|
|
232
|
+
if (!expectFamily) {
|
|
233
|
+
throw new Error("Invalid status code range");
|
|
197
234
|
}
|
|
198
235
|
|
|
199
|
-
const
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
return false;
|
|
203
|
-
}
|
|
236
|
+
const actualFamily = actual.charAt(0);
|
|
237
|
+
if (!actualFamily) {
|
|
238
|
+
throw new Error(`Invalid response status code: ${actual}`);
|
|
204
239
|
}
|
|
205
240
|
|
|
206
|
-
return
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
const codeRangeRE = new RegExp("^[0-9]xx$", "i");
|
|
210
|
-
|
|
211
|
-
export function matchStatusCode(response: Response, codes: StatusCodePredicate): boolean {
|
|
212
|
-
const actual = `${response.status}`;
|
|
213
|
-
const expectedCodes = Array.isArray(codes) ? codes : [codes];
|
|
214
|
-
if (!expectedCodes.length) {
|
|
215
|
-
return false;
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
return expectedCodes.some((ec) => {
|
|
219
|
-
const code = `${ec}`;
|
|
220
|
-
|
|
221
|
-
if (code === "default") {
|
|
222
|
-
return true;
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
if (!codeRangeRE.test(`${code}`)) {
|
|
226
|
-
return code === actual;
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
const expectFamily = code.charAt(0);
|
|
230
|
-
if (!expectFamily) {
|
|
231
|
-
throw new Error("Invalid status code range");
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
const actualFamily = actual.charAt(0);
|
|
235
|
-
if (!actualFamily) {
|
|
236
|
-
throw new Error(`Invalid response status code: ${actual}`);
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
return actualFamily === expectFamily;
|
|
240
|
-
});
|
|
241
|
+
return actualFamily === expectFamily;
|
|
242
|
+
});
|
|
241
243
|
}
|
|
242
244
|
|
|
243
245
|
export function matchResponse(
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
246
|
+
response: Response,
|
|
247
|
+
code: StatusCodePredicate,
|
|
248
|
+
contentTypePattern: string,
|
|
247
249
|
): boolean {
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
export function unpackHeaders(headers: Headers): Record<string, string[]> {
|
|
253
|
-
const out: Record<string, string[]> = {};
|
|
254
|
-
|
|
255
|
-
for (const [k, v] of headers.entries()) {
|
|
256
|
-
out[k] = v.split(headerValRE);
|
|
257
|
-
}
|
|
258
|
-
|
|
259
|
-
return out;
|
|
250
|
+
return (
|
|
251
|
+
matchStatusCode(response, code) &&
|
|
252
|
+
matchContentType(response, contentTypePattern)
|
|
253
|
+
);
|
|
260
254
|
}
|
|
261
255
|
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
256
|
+
/**
|
|
257
|
+
* Uses various heurisitics to determine if an error is a connection error.
|
|
258
|
+
*/
|
|
259
|
+
export function isConnectionError(err: unknown): boolean {
|
|
260
|
+
if (typeof err !== "object" || err == null) {
|
|
261
|
+
return false;
|
|
262
|
+
}
|
|
265
263
|
|
|
266
|
-
|
|
264
|
+
// Covers fetch in Deno as well
|
|
265
|
+
const isBrowserErr =
|
|
266
|
+
err instanceof TypeError &&
|
|
267
|
+
err.message.toLowerCase().startsWith("failed to fetch");
|
|
267
268
|
|
|
268
|
-
const
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
rawBytes: "application/octet-stream",
|
|
272
|
-
rawStream: "application/octet-stream",
|
|
273
|
-
text: "text/plain",
|
|
274
|
-
void: "",
|
|
275
|
-
fail: "",
|
|
276
|
-
};
|
|
269
|
+
const isNodeErr =
|
|
270
|
+
err instanceof TypeError &&
|
|
271
|
+
err.message.toLowerCase().startsWith("fetch failed");
|
|
277
272
|
|
|
278
|
-
|
|
279
|
-
method: SerializationMethod;
|
|
280
|
-
codes: StatusCodePredicate;
|
|
281
|
-
ctype: string;
|
|
282
|
-
schema: ResponseMatcherSchema<Result | Error>;
|
|
283
|
-
hdrs: boolean;
|
|
284
|
-
key: string | undefined;
|
|
285
|
-
err: boolean;
|
|
286
|
-
fail: boolean;
|
|
287
|
-
sseSentinel?: string | undefined;
|
|
288
|
-
};
|
|
273
|
+
const isBunErr = "name" in err && err.name === "ConnectionError";
|
|
289
274
|
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
hdrs?: boolean;
|
|
295
|
-
/** A value for an SSE event's data field that indicates a stream should be terminated. */
|
|
296
|
-
sseSentinel?: string;
|
|
297
|
-
} & (
|
|
298
|
-
| {
|
|
299
|
-
/** The result key to store the deserialized value into. */
|
|
300
|
-
key?: string;
|
|
301
|
-
fail?: never;
|
|
302
|
-
err?: never;
|
|
303
|
-
}
|
|
304
|
-
| {
|
|
305
|
-
/** Indicates the matched response must throw the built-in error. */
|
|
306
|
-
fail: true;
|
|
307
|
-
key?: never;
|
|
308
|
-
err?: never;
|
|
309
|
-
}
|
|
310
|
-
| {
|
|
311
|
-
/** Indicates the matched response is a custom error. */
|
|
312
|
-
err: true;
|
|
313
|
-
key?: never;
|
|
314
|
-
fail?: never;
|
|
315
|
-
}
|
|
316
|
-
);
|
|
317
|
-
|
|
318
|
-
export class ResponseMatcher<Result> {
|
|
319
|
-
private predicates: ResponsePredicateMatch<Result>[] = [];
|
|
320
|
-
|
|
321
|
-
#any<T extends Result | Error>(
|
|
322
|
-
method: SerializationMethod,
|
|
323
|
-
codes: StatusCodePredicate,
|
|
324
|
-
schema: ResponseMatcherSchema<T>,
|
|
325
|
-
opts?: ResponsePredicateOptions
|
|
326
|
-
) {
|
|
327
|
-
const ctype = opts?.ctype || defaultContentTypes[method];
|
|
328
|
-
const hdrs = !!opts?.hdrs;
|
|
329
|
-
const key = opts?.key;
|
|
330
|
-
const err = !!opts?.err;
|
|
331
|
-
const fail = !!opts?.fail;
|
|
332
|
-
const sseSentinel = opts?.sseSentinel;
|
|
333
|
-
this.predicates.push({
|
|
334
|
-
method,
|
|
335
|
-
codes,
|
|
336
|
-
ctype,
|
|
337
|
-
schema,
|
|
338
|
-
hdrs,
|
|
339
|
-
key,
|
|
340
|
-
err,
|
|
341
|
-
fail,
|
|
342
|
-
sseSentinel,
|
|
343
|
-
});
|
|
344
|
-
return this;
|
|
345
|
-
}
|
|
275
|
+
const isGenericErr =
|
|
276
|
+
"code" in err &&
|
|
277
|
+
typeof err.code === "string" &&
|
|
278
|
+
err.code.toLowerCase() === "econnreset";
|
|
346
279
|
|
|
347
|
-
|
|
348
|
-
codes: StatusCodePredicate,
|
|
349
|
-
schema: ResponseMatcherSchema<T>,
|
|
350
|
-
opts?: ResponsePredicateOptions
|
|
351
|
-
): this {
|
|
352
|
-
return this.#any("json", codes, schema, opts);
|
|
353
|
-
}
|
|
354
|
-
bytes<T extends Result | Error>(
|
|
355
|
-
codes: StatusCodePredicate,
|
|
356
|
-
schema: ResponseMatcherSchema<T>,
|
|
357
|
-
opts?: ResponsePredicateOptions
|
|
358
|
-
): this {
|
|
359
|
-
return this.#any("rawBytes", codes, schema, opts);
|
|
360
|
-
}
|
|
361
|
-
stream<T extends Result | Error>(
|
|
362
|
-
codes: StatusCodePredicate,
|
|
363
|
-
schema: ResponseMatcherSchema<T>,
|
|
364
|
-
opts?: ResponsePredicateOptions
|
|
365
|
-
): this {
|
|
366
|
-
return this.#any("rawStream", codes, schema, opts);
|
|
367
|
-
}
|
|
368
|
-
text<T extends Result | Error>(
|
|
369
|
-
codes: StatusCodePredicate,
|
|
370
|
-
schema: ResponseMatcherSchema<T>,
|
|
371
|
-
opts?: ResponsePredicateOptions
|
|
372
|
-
): this {
|
|
373
|
-
return this.#any("text", codes, schema, opts);
|
|
374
|
-
}
|
|
375
|
-
sse<T extends Result | Error>(
|
|
376
|
-
codes: StatusCodePredicate,
|
|
377
|
-
schema: ResponseMatcherSchema<T>,
|
|
378
|
-
opts?: Omit<ResponsePredicateOptions, "err" | "fail">
|
|
379
|
-
): this {
|
|
380
|
-
return this.#any("sse", codes, schema, opts);
|
|
381
|
-
}
|
|
382
|
-
void<T extends Result | Error>(
|
|
383
|
-
codes: StatusCodePredicate,
|
|
384
|
-
schema: ResponseMatcherSchema<T>,
|
|
385
|
-
opts?: Pick<ResponsePredicateOptions, "hdrs">
|
|
386
|
-
): this {
|
|
387
|
-
return this.#any("void", codes, schema, opts);
|
|
388
|
-
}
|
|
389
|
-
fail(codes: StatusCodePredicate): this {
|
|
390
|
-
return this.#any("fail", codes, znever(), { fail: true });
|
|
391
|
-
}
|
|
392
|
-
|
|
393
|
-
async match(
|
|
394
|
-
response: Response,
|
|
395
|
-
// envelope
|
|
396
|
-
options?: {
|
|
397
|
-
resultKey?: string;
|
|
398
|
-
extraFields?: Record<string, unknown>;
|
|
399
|
-
}
|
|
400
|
-
): Promise<[result: Result, rawData: unknown]> {
|
|
401
|
-
let pred: ResponsePredicateMatch<Result> | undefined;
|
|
402
|
-
for (const predicate of this.predicates) {
|
|
403
|
-
const { codes, ctype } = predicate;
|
|
404
|
-
if (ctype && matchResponse(response, codes, ctype)) {
|
|
405
|
-
pred = predicate;
|
|
406
|
-
break;
|
|
407
|
-
} else if (!ctype && matchStatusCode(response, codes)) {
|
|
408
|
-
pred = predicate;
|
|
409
|
-
break;
|
|
410
|
-
}
|
|
411
|
-
}
|
|
412
|
-
if (pred == null) {
|
|
413
|
-
const responseBody = await response.text();
|
|
414
|
-
throw new SDKError(
|
|
415
|
-
"Unexpected API response status or content-type",
|
|
416
|
-
response,
|
|
417
|
-
responseBody
|
|
418
|
-
);
|
|
419
|
-
}
|
|
420
|
-
|
|
421
|
-
const { method, schema } = pred;
|
|
422
|
-
|
|
423
|
-
let raw: unknown;
|
|
424
|
-
switch (method) {
|
|
425
|
-
case "json":
|
|
426
|
-
raw = await response.json();
|
|
427
|
-
break;
|
|
428
|
-
case "rawBytes":
|
|
429
|
-
raw = await response.arrayBuffer();
|
|
430
|
-
break;
|
|
431
|
-
case "rawStream":
|
|
432
|
-
raw = response.body;
|
|
433
|
-
break;
|
|
434
|
-
case "text":
|
|
435
|
-
raw = await response.text();
|
|
436
|
-
break;
|
|
437
|
-
case "sse":
|
|
438
|
-
raw = response.body;
|
|
439
|
-
break;
|
|
440
|
-
case "void":
|
|
441
|
-
raw = await discardResponseBody(response);
|
|
442
|
-
break;
|
|
443
|
-
case "fail":
|
|
444
|
-
raw = await response.text();
|
|
445
|
-
break;
|
|
446
|
-
default:
|
|
447
|
-
method satisfies never;
|
|
448
|
-
throw new Error(`Unsupported response type: ${method}`);
|
|
449
|
-
}
|
|
450
|
-
|
|
451
|
-
const resultKey = pred.key || options?.resultKey;
|
|
452
|
-
let data: unknown;
|
|
453
|
-
if (pred.fail) {
|
|
454
|
-
throw new SDKError("API error occurred", response, typeof raw === "string" ? raw : "");
|
|
455
|
-
} else if (pred.err) {
|
|
456
|
-
data = {
|
|
457
|
-
...options?.extraFields,
|
|
458
|
-
...(pred.hdrs ? { Headers: unpackHeaders(response.headers) } : null),
|
|
459
|
-
...(isPlainObject(raw) ? raw : null),
|
|
460
|
-
};
|
|
461
|
-
} else if (resultKey) {
|
|
462
|
-
data = {
|
|
463
|
-
...options?.extraFields,
|
|
464
|
-
...(pred.hdrs ? { Headers: unpackHeaders(response.headers) } : null),
|
|
465
|
-
[resultKey]: raw,
|
|
466
|
-
};
|
|
467
|
-
} else {
|
|
468
|
-
data = {
|
|
469
|
-
...options?.extraFields,
|
|
470
|
-
...(pred.hdrs ? { Headers: unpackHeaders(response.headers) } : null),
|
|
471
|
-
};
|
|
472
|
-
}
|
|
473
|
-
|
|
474
|
-
const parser = "inboundSchema" in schema ? schema.inboundSchema : schema;
|
|
475
|
-
const body = parse(data, (v: unknown) => parser.parse(v), "Response validation failed");
|
|
476
|
-
|
|
477
|
-
if (body instanceof Error) {
|
|
478
|
-
throw body;
|
|
479
|
-
}
|
|
480
|
-
|
|
481
|
-
return [body, raw];
|
|
482
|
-
}
|
|
280
|
+
return isBrowserErr || isNodeErr || isGenericErr || isBunErr;
|
|
483
281
|
}
|
|
484
282
|
|
|
485
283
|
/**
|
|
486
|
-
*
|
|
487
|
-
*
|
|
488
|
-
* To learn why this is need, see the undici docs:
|
|
489
|
-
* https://undici.nodejs.org/#/?id=garbage-collection
|
|
284
|
+
* Uses various heurisitics to determine if an error is a timeout error.
|
|
490
285
|
*/
|
|
491
|
-
export
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
286
|
+
export function isTimeoutError(err: unknown): boolean {
|
|
287
|
+
if (typeof err !== "object" || err == null) {
|
|
288
|
+
return false;
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
// Fetch in browser, Node.js, Bun, Deno
|
|
292
|
+
const isNative = "name" in err && err.name === "TimeoutError";
|
|
293
|
+
const isLegacyNative = "code" in err && err.code === 23;
|
|
294
|
+
|
|
295
|
+
// Node.js HTTP client and Axios
|
|
296
|
+
const isGenericErr =
|
|
297
|
+
"code" in err &&
|
|
298
|
+
typeof err.code === "string" &&
|
|
299
|
+
err.code.toLowerCase() === "econnaborted";
|
|
300
|
+
|
|
301
|
+
return isNative || isLegacyNative || isGenericErr;
|
|
302
|
+
}
|
|
496
303
|
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
304
|
+
/**
|
|
305
|
+
* Uses various heurisitics to determine if an error is a abort error.
|
|
306
|
+
*/
|
|
307
|
+
export function isAbortError(err: unknown): boolean {
|
|
308
|
+
if (typeof err !== "object" || err == null) {
|
|
309
|
+
return false;
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
// Fetch in browser, Node.js, Bun, Deno
|
|
313
|
+
const isNative = "name" in err && err.name === "AbortError";
|
|
314
|
+
const isLegacyNative = "code" in err && err.code === 20;
|
|
315
|
+
|
|
316
|
+
// Node.js HTTP client and Axios
|
|
317
|
+
const isGenericErr =
|
|
318
|
+
"code" in err &&
|
|
319
|
+
typeof err.code === "string" &&
|
|
320
|
+
err.code.toLowerCase() === "econnaborted";
|
|
321
|
+
|
|
322
|
+
return isNative || isLegacyNative || isGenericErr;
|
|
506
323
|
}
|