@meshy-ai/cli 0.2.0 → 0.3.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/.env.example +8 -2
- package/README.md +342 -108
- package/dist/client/endpoints/animation-catalog.d.ts +37 -0
- package/dist/client/endpoints/animation-catalog.d.ts.map +1 -0
- package/dist/client/endpoints/animation-catalog.js +55 -0
- package/dist/client/endpoints/animation-catalog.js.map +1 -0
- package/dist/client/endpoints/balance.d.ts +5 -0
- package/dist/client/endpoints/balance.d.ts.map +1 -1
- package/dist/client/endpoints/balance.js +5 -1
- package/dist/client/endpoints/balance.js.map +1 -1
- package/dist/client/endpoints/base.d.ts +41 -7
- package/dist/client/endpoints/base.d.ts.map +1 -1
- package/dist/client/endpoints/base.js +61 -40
- package/dist/client/endpoints/base.js.map +1 -1
- package/dist/client/endpoints/showcases.d.ts +31 -0
- package/dist/client/endpoints/showcases.d.ts.map +1 -0
- package/dist/client/endpoints/showcases.js +49 -0
- package/dist/client/endpoints/showcases.js.map +1 -0
- package/dist/client/errors.d.ts +1 -0
- package/dist/client/errors.d.ts.map +1 -1
- package/dist/client/errors.js +1 -1
- package/dist/client/errors.js.map +1 -1
- package/dist/client/index.d.ts +47 -38
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +89 -120
- package/dist/client/index.js.map +1 -1
- package/dist/client/resource-registry.d.ts +97 -0
- package/dist/client/resource-registry.d.ts.map +1 -0
- package/dist/client/resource-registry.js +157 -0
- package/dist/client/resource-registry.js.map +1 -0
- package/dist/client/transport.d.ts +99 -0
- package/dist/client/transport.d.ts.map +1 -0
- package/dist/client/transport.js +320 -0
- package/dist/client/transport.js.map +1 -0
- package/dist/client/types.d.ts +17 -6
- package/dist/client/types.d.ts.map +1 -1
- package/dist/client/types.js +28 -6
- package/dist/client/types.js.map +1 -1
- package/dist/cmd/animation-catalog.d.ts +26 -0
- package/dist/cmd/animation-catalog.d.ts.map +1 -0
- package/dist/cmd/animation-catalog.js +80 -0
- package/dist/cmd/animation-catalog.js.map +1 -0
- package/dist/cmd/api.d.ts +3 -2
- package/dist/cmd/api.d.ts.map +1 -1
- package/dist/cmd/api.js +22 -8
- package/dist/cmd/api.js.map +1 -1
- package/dist/cmd/auth.d.ts.map +1 -1
- package/dist/cmd/auth.js +5 -0
- package/dist/cmd/auth.js.map +1 -1
- package/dist/cmd/balance.d.ts.map +1 -1
- package/dist/cmd/balance.js +10 -6
- package/dist/cmd/balance.js.map +1 -1
- package/dist/cmd/creative-lab.d.ts +26 -0
- package/dist/cmd/creative-lab.d.ts.map +1 -0
- package/dist/cmd/creative-lab.js +256 -0
- package/dist/cmd/creative-lab.js.map +1 -0
- package/dist/cmd/delete.d.ts.map +1 -1
- package/dist/cmd/delete.js +6 -7
- package/dist/cmd/delete.js.map +1 -1
- package/dist/cmd/doctor.d.ts +23 -0
- package/dist/cmd/doctor.d.ts.map +1 -0
- package/dist/cmd/doctor.js +61 -0
- package/dist/cmd/doctor.js.map +1 -0
- package/dist/cmd/download.d.ts +17 -0
- package/dist/cmd/download.d.ts.map +1 -0
- package/dist/cmd/download.js +436 -0
- package/dist/cmd/download.js.map +1 -0
- package/dist/cmd/inspect.d.ts +63 -0
- package/dist/cmd/inspect.d.ts.map +1 -0
- package/dist/cmd/inspect.js +179 -0
- package/dist/cmd/inspect.js.map +1 -0
- package/dist/cmd/make.d.ts +13 -3
- package/dist/cmd/make.d.ts.map +1 -1
- package/dist/cmd/make.js +240 -36
- package/dist/cmd/make.js.map +1 -1
- package/dist/cmd/mesh.d.ts +13 -0
- package/dist/cmd/mesh.d.ts.map +1 -0
- package/dist/cmd/mesh.js +67 -0
- package/dist/cmd/mesh.js.map +1 -0
- package/dist/cmd/project.d.ts +16 -0
- package/dist/cmd/project.d.ts.map +1 -0
- package/dist/cmd/project.js +136 -0
- package/dist/cmd/project.js.map +1 -0
- package/dist/cmd/resources.d.ts +5 -0
- package/dist/cmd/resources.d.ts.map +1 -1
- package/dist/cmd/resources.js +38 -10
- package/dist/cmd/resources.js.map +1 -1
- package/dist/cmd/showcases.d.ts +10 -0
- package/dist/cmd/showcases.d.ts.map +1 -0
- package/dist/cmd/showcases.js +63 -0
- package/dist/cmd/showcases.js.map +1 -0
- package/dist/cmd/slicer.d.ts +12 -0
- package/dist/cmd/slicer.d.ts.map +1 -0
- package/dist/cmd/slicer.js +46 -0
- package/dist/cmd/slicer.js.map +1 -0
- package/dist/cmd/uv-unwrap.d.ts +16 -0
- package/dist/cmd/uv-unwrap.d.ts.map +1 -0
- package/dist/cmd/uv-unwrap.js +52 -0
- package/dist/cmd/uv-unwrap.js.map +1 -0
- package/dist/index.d.ts +13 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +141 -8
- package/dist/index.js.map +1 -1
- package/dist/internal/artifacts.d.ts +97 -0
- package/dist/internal/artifacts.d.ts.map +1 -0
- package/dist/internal/artifacts.js +280 -0
- package/dist/internal/artifacts.js.map +1 -0
- package/dist/internal/atomic-file.d.ts +39 -0
- package/dist/internal/atomic-file.d.ts.map +1 -0
- package/dist/internal/atomic-file.js +160 -0
- package/dist/internal/atomic-file.js.map +1 -0
- package/dist/internal/command-helpers.d.ts +46 -0
- package/dist/internal/command-helpers.d.ts.map +1 -0
- package/dist/internal/command-helpers.js +61 -0
- package/dist/internal/command-helpers.js.map +1 -0
- package/dist/internal/config.d.ts +48 -5
- package/dist/internal/config.d.ts.map +1 -1
- package/dist/internal/config.js +95 -6
- package/dist/internal/config.js.map +1 -1
- package/dist/internal/context.d.ts +25 -0
- package/dist/internal/context.d.ts.map +1 -0
- package/dist/internal/context.js +37 -0
- package/dist/internal/context.js.map +1 -0
- package/dist/internal/credentials.d.ts +11 -0
- package/dist/internal/credentials.d.ts.map +1 -1
- package/dist/internal/credentials.js +2 -0
- package/dist/internal/credentials.js.map +1 -1
- package/dist/internal/doctor.d.ts +94 -0
- package/dist/internal/doctor.d.ts.map +1 -0
- package/dist/internal/doctor.js +280 -0
- package/dist/internal/doctor.js.map +1 -0
- package/dist/internal/download.d.ts +147 -13
- package/dist/internal/download.d.ts.map +1 -1
- package/dist/internal/download.js +735 -142
- package/dist/internal/download.js.map +1 -1
- package/dist/internal/env-file.d.ts +29 -0
- package/dist/internal/env-file.d.ts.map +1 -0
- package/dist/internal/env-file.js +95 -0
- package/dist/internal/env-file.js.map +1 -0
- package/dist/internal/errors.d.ts +74 -1
- package/dist/internal/errors.d.ts.map +1 -1
- package/dist/internal/errors.js +173 -1
- package/dist/internal/errors.js.map +1 -1
- package/dist/internal/file-input.d.ts +52 -12
- package/dist/internal/file-input.d.ts.map +1 -1
- package/dist/internal/file-input.js +162 -33
- package/dist/internal/file-input.js.map +1 -1
- package/dist/internal/global-options.d.ts +6 -4
- package/dist/internal/global-options.d.ts.map +1 -1
- package/dist/internal/global-options.js +19 -4
- package/dist/internal/global-options.js.map +1 -1
- package/dist/internal/inspect.d.ts +67 -0
- package/dist/internal/inspect.d.ts.map +1 -0
- package/dist/internal/inspect.js +111 -0
- package/dist/internal/inspect.js.map +1 -0
- package/dist/internal/lock.d.ts +19 -0
- package/dist/internal/lock.d.ts.map +1 -0
- package/dist/internal/lock.js +66 -0
- package/dist/internal/lock.js.map +1 -0
- package/dist/internal/material-links.d.ts +115 -0
- package/dist/internal/material-links.d.ts.map +1 -0
- package/dist/internal/material-links.js +577 -0
- package/dist/internal/material-links.js.map +1 -0
- package/dist/internal/obj-transform.d.ts +115 -0
- package/dist/internal/obj-transform.d.ts.map +1 -0
- package/dist/internal/obj-transform.js +649 -0
- package/dist/internal/obj-transform.js.map +1 -0
- package/dist/internal/operation-store.d.ts +123 -0
- package/dist/internal/operation-store.d.ts.map +1 -0
- package/dist/internal/operation-store.js +229 -0
- package/dist/internal/operation-store.js.map +1 -0
- package/dist/internal/output.d.ts +20 -2
- package/dist/internal/output.d.ts.map +1 -1
- package/dist/internal/output.js +32 -4
- package/dist/internal/output.js.map +1 -1
- package/dist/internal/paths.d.ts +89 -0
- package/dist/internal/paths.d.ts.map +1 -0
- package/dist/internal/paths.js +168 -0
- package/dist/internal/paths.js.map +1 -0
- package/dist/internal/payload.d.ts +15 -0
- package/dist/internal/payload.d.ts.map +1 -1
- package/dist/internal/payload.js +50 -3
- package/dist/internal/payload.js.map +1 -1
- package/dist/internal/poll.d.ts +30 -4
- package/dist/internal/poll.d.ts.map +1 -1
- package/dist/internal/poll.js +99 -16
- package/dist/internal/poll.js.map +1 -1
- package/dist/internal/project-store.d.ts +197 -0
- package/dist/internal/project-store.d.ts.map +1 -0
- package/dist/internal/project-store.js +467 -0
- package/dist/internal/project-store.js.map +1 -0
- package/dist/internal/result.d.ts +50 -0
- package/dist/internal/result.d.ts.map +1 -0
- package/dist/internal/result.js +41 -0
- package/dist/internal/result.js.map +1 -0
- package/dist/internal/runtime.d.ts +35 -5
- package/dist/internal/runtime.d.ts.map +1 -1
- package/dist/internal/runtime.js +68 -18
- package/dist/internal/runtime.js.map +1 -1
- package/dist/internal/slicers.d.ts +117 -0
- package/dist/internal/slicers.d.ts.map +1 -0
- package/dist/internal/slicers.js +314 -0
- package/dist/internal/slicers.js.map +1 -0
- package/dist/internal/stream.d.ts +58 -0
- package/dist/internal/stream.d.ts.map +1 -0
- package/dist/internal/stream.js +280 -0
- package/dist/internal/stream.js.map +1 -0
- package/dist/internal/task-command.d.ts +128 -11
- package/dist/internal/task-command.d.ts.map +1 -1
- package/dist/internal/task-command.js +991 -111
- package/dist/internal/task-command.js.map +1 -1
- package/dist/internal/task-view.d.ts +56 -0
- package/dist/internal/task-view.d.ts.map +1 -0
- package/dist/internal/task-view.js +95 -0
- package/dist/internal/task-view.js.map +1 -0
- package/dist/internal/update-notifier.d.ts +5 -1
- package/dist/internal/update-notifier.d.ts.map +1 -1
- package/dist/internal/update-notifier.js +7 -3
- package/dist/internal/update-notifier.js.map +1 -1
- package/dist/root.d.ts +10 -0
- package/dist/root.d.ts.map +1 -1
- package/dist/root.js +75 -10
- package/dist/root.js.map +1 -1
- package/package.json +3 -2
- package/skills/meshy-cli/SKILL.md +140 -59
- package/dist/client/endpoints/analyze-printability.d.ts +0 -5
- package/dist/client/endpoints/analyze-printability.d.ts.map +0 -1
- package/dist/client/endpoints/analyze-printability.js +0 -7
- package/dist/client/endpoints/analyze-printability.js.map +0 -1
- package/dist/client/endpoints/animate.d.ts +0 -6
- package/dist/client/endpoints/animate.d.ts.map +0 -1
- package/dist/client/endpoints/animate.js +0 -8
- package/dist/client/endpoints/animate.js.map +0 -1
- package/dist/client/endpoints/convert.d.ts +0 -5
- package/dist/client/endpoints/convert.d.ts.map +0 -1
- package/dist/client/endpoints/convert.js +0 -7
- package/dist/client/endpoints/convert.js.map +0 -1
- package/dist/client/endpoints/image-to-3d.d.ts +0 -5
- package/dist/client/endpoints/image-to-3d.d.ts.map +0 -1
- package/dist/client/endpoints/image-to-3d.js +0 -7
- package/dist/client/endpoints/image-to-3d.js.map +0 -1
- package/dist/client/endpoints/image-to-image.d.ts +0 -5
- package/dist/client/endpoints/image-to-image.d.ts.map +0 -1
- package/dist/client/endpoints/image-to-image.js +0 -7
- package/dist/client/endpoints/image-to-image.js.map +0 -1
- package/dist/client/endpoints/multi-color-print.d.ts +0 -5
- package/dist/client/endpoints/multi-color-print.d.ts.map +0 -1
- package/dist/client/endpoints/multi-color-print.js +0 -7
- package/dist/client/endpoints/multi-color-print.js.map +0 -1
- package/dist/client/endpoints/multi-image-to-3d.d.ts +0 -5
- package/dist/client/endpoints/multi-image-to-3d.d.ts.map +0 -1
- package/dist/client/endpoints/multi-image-to-3d.js +0 -7
- package/dist/client/endpoints/multi-image-to-3d.js.map +0 -1
- package/dist/client/endpoints/remesh.d.ts +0 -5
- package/dist/client/endpoints/remesh.d.ts.map +0 -1
- package/dist/client/endpoints/remesh.js +0 -7
- package/dist/client/endpoints/remesh.js.map +0 -1
- package/dist/client/endpoints/repair-printability.d.ts +0 -5
- package/dist/client/endpoints/repair-printability.d.ts.map +0 -1
- package/dist/client/endpoints/repair-printability.js +0 -7
- package/dist/client/endpoints/repair-printability.js.map +0 -1
- package/dist/client/endpoints/resize.d.ts +0 -5
- package/dist/client/endpoints/resize.d.ts.map +0 -1
- package/dist/client/endpoints/resize.js +0 -7
- package/dist/client/endpoints/resize.js.map +0 -1
- package/dist/client/endpoints/retexture.d.ts +0 -5
- package/dist/client/endpoints/retexture.d.ts.map +0 -1
- package/dist/client/endpoints/retexture.js +0 -7
- package/dist/client/endpoints/retexture.js.map +0 -1
- package/dist/client/endpoints/rigging.d.ts +0 -6
- package/dist/client/endpoints/rigging.d.ts.map +0 -1
- package/dist/client/endpoints/rigging.js +0 -8
- package/dist/client/endpoints/rigging.js.map +0 -1
- package/dist/client/endpoints/text-to-3d.d.ts +0 -6
- package/dist/client/endpoints/text-to-3d.d.ts.map +0 -1
- package/dist/client/endpoints/text-to-3d.js +0 -8
- package/dist/client/endpoints/text-to-3d.js.map +0 -1
- package/dist/client/endpoints/text-to-image.d.ts +0 -5
- package/dist/client/endpoints/text-to-image.d.ts.map +0 -1
- package/dist/client/endpoints/text-to-image.js +0 -7
- package/dist/client/endpoints/text-to-image.js.map +0 -1
- package/dist/client/endpoints/text-to-motion.d.ts +0 -6
- package/dist/client/endpoints/text-to-motion.d.ts.map +0 -1
- package/dist/client/endpoints/text-to-motion.js +0 -8
- package/dist/client/endpoints/text-to-motion.js.map +0 -1
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resource registry — the single source for what the CLI can call.
|
|
3
|
+
*
|
|
4
|
+
* Every task resource (the 16 first-class endpoints plus the 4 × 2 Creative
|
|
5
|
+
* Lab stages) is described once: command path, API family, relative path,
|
|
6
|
+
* supported verbs, billing class and the payload fields that carry media.
|
|
7
|
+
* Commands, the `resources` index, payload normalisation and the transport
|
|
8
|
+
* all read from here; nothing else hard-codes a path.
|
|
9
|
+
*
|
|
10
|
+
* docs/skill-parity/endpoint-contracts.json documents the same data and
|
|
11
|
+
* tests/resource-registry.test.ts fails when the two drift apart.
|
|
12
|
+
*/
|
|
13
|
+
const ALL_VERBS = { create: true, get: true, list: true, delete: true, stream: true };
|
|
14
|
+
const image = (path, many = false, formats) => formats ? { path, kind: "image", many, formats } : { path, kind: "image", many };
|
|
15
|
+
const model = (path, formats) => formats ? { path, kind: "model", many: false, formats } : { path, kind: "model", many: false };
|
|
16
|
+
function v1(id, relativePath, opts) {
|
|
17
|
+
return {
|
|
18
|
+
id,
|
|
19
|
+
commandPath: [id],
|
|
20
|
+
base: "v1",
|
|
21
|
+
relativePath,
|
|
22
|
+
legacyEndpoint: `/openapi/v1${relativePath}`,
|
|
23
|
+
supports: ALL_VERBS,
|
|
24
|
+
mediaFields: opts.mediaFields ?? [],
|
|
25
|
+
taskTypes: opts.taskTypes,
|
|
26
|
+
billing: { create: opts.billing ?? "may-charge" },
|
|
27
|
+
automaticRetry: false,
|
|
28
|
+
summary: opts.summary,
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
export const CREATIVE_LAB_PRODUCTS = ["figure", "lamp", "keychain", "fridge-magnet"];
|
|
32
|
+
export const CREATIVE_LAB_STAGES = ["prototype", "build"];
|
|
33
|
+
const CREATIVE_LAB_IMAGE_FORMATS = ["jpg", "jpeg", "png", "webp"];
|
|
34
|
+
function creativeLab(product, stage, summary) {
|
|
35
|
+
const relativePath = `/${product}/v1/${stage}`;
|
|
36
|
+
return {
|
|
37
|
+
id: `creative-lab.${product}.${stage}`,
|
|
38
|
+
commandPath: ["creative-lab", product, stage],
|
|
39
|
+
base: "creative-lab",
|
|
40
|
+
relativePath,
|
|
41
|
+
legacyEndpoint: `/openapi/creative-lab${relativePath}`,
|
|
42
|
+
supports: ALL_VERBS,
|
|
43
|
+
mediaFields: stage === "prototype" ? [image("image_url", false, CREATIVE_LAB_IMAGE_FORMATS)] : [],
|
|
44
|
+
taskTypes: [`creative-lab-${product}-${stage}`],
|
|
45
|
+
billing: { create: "may-charge" },
|
|
46
|
+
automaticRetry: false,
|
|
47
|
+
creativeLab: { product, stage },
|
|
48
|
+
summary,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
export const TASK_RESOURCES = [
|
|
52
|
+
{
|
|
53
|
+
id: "text-to-3d",
|
|
54
|
+
commandPath: ["text-to-3d"],
|
|
55
|
+
base: "v2",
|
|
56
|
+
relativePath: "/text-to-3d",
|
|
57
|
+
legacyEndpoint: "/openapi/v2/text-to-3d",
|
|
58
|
+
supports: ALL_VERBS,
|
|
59
|
+
mediaFields: [image("texture_image_url")],
|
|
60
|
+
taskTypes: ["text-to-3d-preview", "text-to-3d-refine"],
|
|
61
|
+
billing: { create: "may-charge" },
|
|
62
|
+
automaticRetry: false,
|
|
63
|
+
summary: "two-stage 3D generation from text (preview → refine)",
|
|
64
|
+
},
|
|
65
|
+
v1("image-to-3d", "/image-to-3d", { mediaFields: [image("image_url")], taskTypes: ["image-to-3d"], summary: "3D from a single image (standard or smart-topology low-poly)" }),
|
|
66
|
+
v1("multi-image-to-3d", "/multi-image-to-3d", { mediaFields: [image("image_urls", true)], taskTypes: ["multi-image-to-3d"], summary: "3D from multiple views (beta; prefer image-to-3d)" }),
|
|
67
|
+
v1("remesh", "/remesh", { mediaFields: [model("model_url")], taskTypes: ["remesh"], summary: "retopologize / change polycount" }),
|
|
68
|
+
v1("convert", "/convert", { mediaFields: [model("model_url")], taskTypes: ["convert"], summary: "change file format only" }),
|
|
69
|
+
v1("resize", "/resize", { mediaFields: [model("model_url")], taskTypes: ["resize"], summary: "resize to real-world dimensions" }),
|
|
70
|
+
v1("rigging", "/rigging", { mediaFields: [model("model_url", ["glb"]), image("texture_image_url")], taskTypes: ["rig"], summary: "rig a humanoid mesh (+ bundled walk/run animations)" }),
|
|
71
|
+
v1("animate", "/animations", { taskTypes: ["animation"], summary: "apply an animation clip to a rigged mesh" }),
|
|
72
|
+
v1("retexture", "/retexture", { mediaFields: [model("model_url"), image("image_style_url"), image("multiview_image_urls", true)], taskTypes: ["retexture"], summary: "regenerate textures" }),
|
|
73
|
+
v1("text-to-image", "/text-to-image", { taskTypes: ["text-to-image"], summary: "2D image generation" }),
|
|
74
|
+
v1("text-to-motion", "/text-to-motion", { taskTypes: ["text-to-motion"], summary: "generate a standalone skeletal motion clip from text" }),
|
|
75
|
+
v1("image-to-image", "/image-to-image", { mediaFields: [image("reference_image_urls", true)], taskTypes: ["image-to-image"], summary: "2D image editing" }),
|
|
76
|
+
v1("multi-color-print", "/print/multi-color", { mediaFields: [model("model_url")], taskTypes: ["print-multi-color"], summary: "color-separated 3D print output" }),
|
|
77
|
+
v1("analyze-printability", "/print/analyze", { mediaFields: [model("model_url")], taskTypes: ["print-analyze"], billing: "none", summary: "inspect a model for 3D-printing issues (free)" }),
|
|
78
|
+
v1("repair-printability", "/print/repair", { mediaFields: [model("model_url")], taskTypes: ["print-repair"], summary: "fix non-watertight / non-manifold geometry" }),
|
|
79
|
+
v1("uv-unwrap", "/uv-unwrap", { mediaFields: [model("model_url", ["glb"])], taskTypes: ["uv-unwrap"], summary: "generate fresh UVs for a GLB (≤40k faces) — a UV white model for external texturing" }),
|
|
80
|
+
creativeLab("figure", "prototype", "Creative Lab figure: photo → styled concept image"),
|
|
81
|
+
creativeLab("figure", "build", "Creative Lab figure: prototype → textured GLB/OBJ/MTL"),
|
|
82
|
+
creativeLab("lamp", "prototype", "Creative Lab lamp: photo → concept image + lampshade GLB"),
|
|
83
|
+
creativeLab("lamp", "build", "Creative Lab lamp: prototype → lamp_stl/base_stl or bundle_zip"),
|
|
84
|
+
creativeLab("keychain", "prototype", "Creative Lab keychain: photo → styled concept image"),
|
|
85
|
+
creativeLab("keychain", "build", "Creative Lab keychain: prototype → relief GLB / OBJ bundle (zip) / zip"),
|
|
86
|
+
creativeLab("fridge-magnet", "prototype", "Creative Lab fridge magnet: photo → styled concept image"),
|
|
87
|
+
creativeLab("fridge-magnet", "build", "Creative Lab fridge magnet: prototype → relief GLB / OBJ bundle (zip) / zip"),
|
|
88
|
+
];
|
|
89
|
+
const BY_ID = new Map(TASK_RESOURCES.map((d) => [d.id, d]));
|
|
90
|
+
export function findTaskResource(id) {
|
|
91
|
+
return BY_ID.get(id);
|
|
92
|
+
}
|
|
93
|
+
export function requireTaskResource(id) {
|
|
94
|
+
const d = BY_ID.get(id);
|
|
95
|
+
if (!d)
|
|
96
|
+
throw new Error(`unknown task resource '${id}'`);
|
|
97
|
+
return d;
|
|
98
|
+
}
|
|
99
|
+
export function taskResourceByCommandPath(path) {
|
|
100
|
+
return TASK_RESOURCES.find((d) => d.commandPath.length === path.length && d.commandPath.every((p, i) => p === path[i]));
|
|
101
|
+
}
|
|
102
|
+
/** Resolve a Creative Lab descriptor from user-supplied tokens without ever building a path from them. */
|
|
103
|
+
export function creativeLabResource(product, stage) {
|
|
104
|
+
if (!CREATIVE_LAB_PRODUCTS.includes(product))
|
|
105
|
+
return undefined;
|
|
106
|
+
if (!CREATIVE_LAB_STAGES.includes(stage))
|
|
107
|
+
return undefined;
|
|
108
|
+
return BY_ID.get(`creative-lab.${product}.${stage}`);
|
|
109
|
+
}
|
|
110
|
+
/** Resource ids that map 1:1 onto a top-level command (used by the legacy `--resource` flag and the index). */
|
|
111
|
+
export const TOP_LEVEL_TASK_RESOURCE_IDS = TASK_RESOURCES.filter((d) => d.commandPath.length === 1).map((d) => d.id);
|
|
112
|
+
export const QUERY_RESOURCES = [
|
|
113
|
+
{ id: "balance", commandPath: ["balance"], base: "v1", method: "GET", relativePath: "/balance", auth: "bearer", billing: "none", summary: "remaining credit balance" },
|
|
114
|
+
{ id: "animation-catalog", commandPath: ["animation-catalog", "list"], base: "public-web", method: "GET", relativePath: "/animations/resources", auth: "none", billing: "none", summary: "public animation library (action ids); no key needed" },
|
|
115
|
+
{ id: "showcases", commandPath: ["showcases", "list"], base: "v1", method: "GET", relativePath: "/showcases", auth: "bearer", billing: "may-charge", summary: "Enterprise community showcases (every request is billed)" },
|
|
116
|
+
];
|
|
117
|
+
export const LOCAL_TOOLS = [
|
|
118
|
+
{ id: "download", commandPath: ["download"], summary: "download selected assets of a task (from a saved task JSON, a URL or the API)" },
|
|
119
|
+
{ id: "project", commandPath: ["project"], summary: "meshy_output project folders: init | record | show | list | rebuild-index" },
|
|
120
|
+
{ id: "inspect.faces", commandPath: ["inspect", "faces"], summary: "face-count gate: pass | fail | unknown" },
|
|
121
|
+
{ id: "mesh.prepare-print", commandPath: ["mesh", "prepare-print"], summary: "OBJ Y-up → Z-up, scale to a target height, centre, bottom at Z=0" },
|
|
122
|
+
{ id: "slicer", commandPath: ["slicer"], summary: "detect installed slicers | open a file in one" },
|
|
123
|
+
{ id: "doctor", commandPath: ["doctor"], summary: "local environment diagnosis (no network by default)" },
|
|
124
|
+
{ id: "delete", commandPath: ["delete"], summary: "delete any task, whatever its resource" },
|
|
125
|
+
];
|
|
126
|
+
/** The v1 `resources` index: every task resource, query and local tool. */
|
|
127
|
+
export function resourceIndex() {
|
|
128
|
+
const verbsOf = (s) => ["create", "get", "list", "wait", "stream", "delete"]
|
|
129
|
+
.filter((v) => (v === "wait" ? s.get : s[v]))
|
|
130
|
+
.map((v) => v);
|
|
131
|
+
const tasks = TASK_RESOURCES.map((d) => ({
|
|
132
|
+
name: d.id,
|
|
133
|
+
kind: "task",
|
|
134
|
+
command: `meshy ${d.commandPath.join(" ")}`,
|
|
135
|
+
summary: d.summary,
|
|
136
|
+
endpoint: d.legacyEndpoint,
|
|
137
|
+
verbs: verbsOf(d.supports),
|
|
138
|
+
}));
|
|
139
|
+
const queries = QUERY_RESOURCES.map((q) => ({
|
|
140
|
+
name: q.id,
|
|
141
|
+
kind: "query",
|
|
142
|
+
command: `meshy ${q.commandPath.join(" ")}`,
|
|
143
|
+
summary: q.summary,
|
|
144
|
+
endpoint: q.base === "public-web" ? `/web/public${q.relativePath}` : `/openapi/v1${q.relativePath}`,
|
|
145
|
+
verbs: null,
|
|
146
|
+
}));
|
|
147
|
+
const locals = LOCAL_TOOLS.map((l) => ({
|
|
148
|
+
name: l.id,
|
|
149
|
+
kind: "local",
|
|
150
|
+
command: `meshy ${l.commandPath.join(" ")}`,
|
|
151
|
+
summary: l.summary,
|
|
152
|
+
endpoint: null,
|
|
153
|
+
verbs: null,
|
|
154
|
+
}));
|
|
155
|
+
return [...tasks, ...queries, ...locals];
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=resource-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resource-registry.js","sourceRoot":"","sources":["../../src/client/resource-registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP transport with explicit boundaries.
|
|
3
|
+
*
|
|
4
|
+
* createAuthenticatedTransport — one API family (v1 / v2 / creative-lab):
|
|
5
|
+
* the bearer credential is attached only to paths that resolve inside that
|
|
6
|
+
* family's base URL. Absolute URLs are accepted only when they are the
|
|
7
|
+
* same origin *and* under the base path; scheme-relative, userinfo,
|
|
8
|
+
* foreign schemes and `..` segments are refused before any request.
|
|
9
|
+
* Redirects are never followed with a credential.
|
|
10
|
+
* createPublicTransport — no credential ever (catalog, media preflight,
|
|
11
|
+
* asset downloads).
|
|
12
|
+
*
|
|
13
|
+
* `requestJson` keeps the deadline armed until the body is fully read — a slow
|
|
14
|
+
* body counts against the timeout, unlike a fetcher that clears its timer as
|
|
15
|
+
* soon as headers arrive. `openStream` hands back the response plus an
|
|
16
|
+
* explicit `close()`; the caller owns idle/total deadlines from there.
|
|
17
|
+
*
|
|
18
|
+
* Failures carry a `phase` so callers can tell "the request never left"
|
|
19
|
+
* (connect) from "it may have been processed" (request/response/body), which
|
|
20
|
+
* is the whole difference between not_submitted and submission_unknown.
|
|
21
|
+
*/
|
|
22
|
+
import { MeshyApiError } from "./errors.js";
|
|
23
|
+
export type TransportPhase = "validate" | "connect" | "request" | "response" | "body" | "timeout" | "aborted";
|
|
24
|
+
export declare class TransportError extends MeshyApiError {
|
|
25
|
+
readonly phase: TransportPhase;
|
|
26
|
+
readonly errno?: string;
|
|
27
|
+
constructor(params: {
|
|
28
|
+
message: string;
|
|
29
|
+
phase: TransportPhase;
|
|
30
|
+
path?: string;
|
|
31
|
+
errno?: string;
|
|
32
|
+
credentialKind?: "oauth" | "api_key";
|
|
33
|
+
cause?: unknown;
|
|
34
|
+
});
|
|
35
|
+
/** True when there is transport-level evidence the request never reached a server. */
|
|
36
|
+
get neverSent(): boolean;
|
|
37
|
+
}
|
|
38
|
+
export interface JsonResponse {
|
|
39
|
+
status: number;
|
|
40
|
+
headers: Headers;
|
|
41
|
+
/** Parsed body, or null for an empty body. */
|
|
42
|
+
json: unknown;
|
|
43
|
+
/** Raw text as received. */
|
|
44
|
+
text: string;
|
|
45
|
+
requestId: string | null;
|
|
46
|
+
}
|
|
47
|
+
export interface RequestOptions {
|
|
48
|
+
body?: unknown;
|
|
49
|
+
query?: Record<string, string | number | boolean | undefined | null>;
|
|
50
|
+
headers?: Record<string, string>;
|
|
51
|
+
signal?: AbortSignal;
|
|
52
|
+
/** Overrides the transport default (covers headers + body). */
|
|
53
|
+
timeoutMs?: number;
|
|
54
|
+
/** Cap on the response body; exceeding it is a protocol failure, never a truncation. */
|
|
55
|
+
maxBodyBytes?: number;
|
|
56
|
+
}
|
|
57
|
+
export interface StreamHandle {
|
|
58
|
+
response: Response;
|
|
59
|
+
/** Abort the underlying request and release the body reader. Idempotent. */
|
|
60
|
+
close(): void;
|
|
61
|
+
signal: AbortSignal;
|
|
62
|
+
}
|
|
63
|
+
export interface Transport {
|
|
64
|
+
readonly baseUrl: string;
|
|
65
|
+
readonly authenticated: boolean;
|
|
66
|
+
requestJson(method: string, path: string, opts?: RequestOptions): Promise<JsonResponse>;
|
|
67
|
+
/** Legacy-style fetch: validates the path, attaches auth, throws MeshyApiError on non-2xx. Body reading is the caller's. */
|
|
68
|
+
fetchRaw(path: string, init?: RequestInit & {
|
|
69
|
+
timeoutMs?: number;
|
|
70
|
+
}): Promise<Response>;
|
|
71
|
+
openStream(path: string, opts?: {
|
|
72
|
+
signal?: AbortSignal;
|
|
73
|
+
headers?: Record<string, string>;
|
|
74
|
+
connectTimeoutMs?: number;
|
|
75
|
+
}): Promise<StreamHandle>;
|
|
76
|
+
}
|
|
77
|
+
export interface TransportConfig {
|
|
78
|
+
baseUrl: string;
|
|
79
|
+
apiKey?: string;
|
|
80
|
+
credentialKind?: "oauth" | "api_key";
|
|
81
|
+
readTimeoutMs: number;
|
|
82
|
+
fetchImpl?: typeof fetch;
|
|
83
|
+
userAgent?: string;
|
|
84
|
+
defaultMaxBodyBytes?: number;
|
|
85
|
+
}
|
|
86
|
+
export declare const DEFAULT_MAX_JSON_BODY_BYTES: number;
|
|
87
|
+
/**
|
|
88
|
+
* Resolve a caller path against the base. Only two shapes are accepted:
|
|
89
|
+
* - a relative path starting with a single "/" (no `..` segments), or
|
|
90
|
+
* - an absolute http(s) URL with the same origin whose path starts with the
|
|
91
|
+
* base path (an explicitly same-family URL, e.g. one the API returned).
|
|
92
|
+
*/
|
|
93
|
+
export declare function resolveApiUrl(baseUrl: string, path: string): URL;
|
|
94
|
+
export declare function createTransport(cfg: TransportConfig): Transport;
|
|
95
|
+
export declare function createAuthenticatedTransport(cfg: TransportConfig & {
|
|
96
|
+
apiKey: string;
|
|
97
|
+
}): Transport;
|
|
98
|
+
export declare function createPublicTransport(cfg: Omit<TransportConfig, "apiKey" | "credentialKind">): Transport;
|
|
99
|
+
//# sourceMappingURL=transport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../src/client/transport.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,320 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP transport with explicit boundaries.
|
|
3
|
+
*
|
|
4
|
+
* createAuthenticatedTransport — one API family (v1 / v2 / creative-lab):
|
|
5
|
+
* the bearer credential is attached only to paths that resolve inside that
|
|
6
|
+
* family's base URL. Absolute URLs are accepted only when they are the
|
|
7
|
+
* same origin *and* under the base path; scheme-relative, userinfo,
|
|
8
|
+
* foreign schemes and `..` segments are refused before any request.
|
|
9
|
+
* Redirects are never followed with a credential.
|
|
10
|
+
* createPublicTransport — no credential ever (catalog, media preflight,
|
|
11
|
+
* asset downloads).
|
|
12
|
+
*
|
|
13
|
+
* `requestJson` keeps the deadline armed until the body is fully read — a slow
|
|
14
|
+
* body counts against the timeout, unlike a fetcher that clears its timer as
|
|
15
|
+
* soon as headers arrive. `openStream` hands back the response plus an
|
|
16
|
+
* explicit `close()`; the caller owns idle/total deadlines from there.
|
|
17
|
+
*
|
|
18
|
+
* Failures carry a `phase` so callers can tell "the request never left"
|
|
19
|
+
* (connect) from "it may have been processed" (request/response/body), which
|
|
20
|
+
* is the whole difference between not_submitted and submission_unknown.
|
|
21
|
+
*/
|
|
22
|
+
import { mapHttpError, MeshyApiError } from "./errors.js";
|
|
23
|
+
import { logger } from "../internal/logger.js";
|
|
24
|
+
import { USER_AGENT } from "../internal/user-agent.js";
|
|
25
|
+
export class TransportError extends MeshyApiError {
|
|
26
|
+
phase;
|
|
27
|
+
errno;
|
|
28
|
+
constructor(params) {
|
|
29
|
+
super({ message: params.message, status: 0, code: "network", path: params.path, credentialKind: params.credentialKind });
|
|
30
|
+
this.name = "TransportError";
|
|
31
|
+
this.phase = params.phase;
|
|
32
|
+
this.errno = params.errno;
|
|
33
|
+
if (params.cause !== undefined)
|
|
34
|
+
this.cause = params.cause;
|
|
35
|
+
}
|
|
36
|
+
/** True when there is transport-level evidence the request never reached a server. */
|
|
37
|
+
get neverSent() {
|
|
38
|
+
return this.phase === "validate" || this.phase === "connect";
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
export const DEFAULT_MAX_JSON_BODY_BYTES = 16 * 1024 * 1024;
|
|
42
|
+
function stripTrail(s) {
|
|
43
|
+
return s.replace(/\/+$/, "");
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Resolve a caller path against the base. Only two shapes are accepted:
|
|
47
|
+
* - a relative path starting with a single "/" (no `..` segments), or
|
|
48
|
+
* - an absolute http(s) URL with the same origin whose path starts with the
|
|
49
|
+
* base path (an explicitly same-family URL, e.g. one the API returned).
|
|
50
|
+
*/
|
|
51
|
+
export function resolveApiUrl(baseUrl, path) {
|
|
52
|
+
const base = new URL(`${stripTrail(baseUrl)}/`);
|
|
53
|
+
if (/^[a-z][a-z0-9+.-]*:/i.test(path) || path.startsWith("//")) {
|
|
54
|
+
let target;
|
|
55
|
+
try {
|
|
56
|
+
target = new URL(path);
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
throw new TransportError({ message: `invalid URL: ${path}`, phase: "validate", path });
|
|
60
|
+
}
|
|
61
|
+
if (target.protocol !== "http:" && target.protocol !== "https:") {
|
|
62
|
+
throw new TransportError({ message: `refusing ${target.protocol} URL for an API request`, phase: "validate", path });
|
|
63
|
+
}
|
|
64
|
+
if (target.username || target.password) {
|
|
65
|
+
throw new TransportError({ message: "refusing URL with embedded credentials", phase: "validate", path });
|
|
66
|
+
}
|
|
67
|
+
if (target.origin !== base.origin || !target.pathname.startsWith(base.pathname.replace(/\/$/, ""))) {
|
|
68
|
+
throw new TransportError({
|
|
69
|
+
message: `refusing to send this API family's credential to ${target.origin}${target.pathname}; it is outside ${stripTrail(baseUrl)}`,
|
|
70
|
+
phase: "validate",
|
|
71
|
+
path,
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
return target;
|
|
75
|
+
}
|
|
76
|
+
if (!path.startsWith("/"))
|
|
77
|
+
path = `/${path}`;
|
|
78
|
+
const segments = path.split("?")[0].split("/");
|
|
79
|
+
if (segments.some((s) => s === "..")) {
|
|
80
|
+
throw new TransportError({ message: `refusing path with '..' segment: ${path}`, phase: "validate", path });
|
|
81
|
+
}
|
|
82
|
+
// URL() would treat a leading "//" as scheme-relative — already rejected above.
|
|
83
|
+
const target = new URL(`.${path}`, base);
|
|
84
|
+
if (target.origin !== base.origin || !target.pathname.startsWith(base.pathname.replace(/\/$/, ""))) {
|
|
85
|
+
throw new TransportError({ message: `path ${path} escapes the API base`, phase: "validate", path });
|
|
86
|
+
}
|
|
87
|
+
return target;
|
|
88
|
+
}
|
|
89
|
+
function errnoOf(err) {
|
|
90
|
+
const e = err;
|
|
91
|
+
const code = e?.cause?.code ?? e?.code;
|
|
92
|
+
return typeof code === "string" ? code : undefined;
|
|
93
|
+
}
|
|
94
|
+
const CONNECT_ERRNOS = new Set(["ECONNREFUSED", "ENOTFOUND", "EAI_AGAIN", "EHOSTUNREACH", "ENETUNREACH", "UND_ERR_CONNECT_TIMEOUT", "ERR_TLS_CERT_ALTNAME_INVALID", "CERT_HAS_EXPIRED", "DEPTH_ZERO_SELF_SIGNED_CERT", "UNABLE_TO_VERIFY_LEAF_SIGNATURE", "SELF_SIGNED_CERT_IN_CHAIN"]);
|
|
95
|
+
function classifyFetchFailure(err, phase) {
|
|
96
|
+
const errno = errnoOf(err);
|
|
97
|
+
if (errno && CONNECT_ERRNOS.has(errno))
|
|
98
|
+
return "connect";
|
|
99
|
+
return phase;
|
|
100
|
+
}
|
|
101
|
+
function combineSignals(...signals) {
|
|
102
|
+
const present = signals.filter((s) => Boolean(s));
|
|
103
|
+
if (present.length === 0)
|
|
104
|
+
return undefined;
|
|
105
|
+
if (present.length === 1)
|
|
106
|
+
return present[0];
|
|
107
|
+
return AbortSignal.any(present);
|
|
108
|
+
}
|
|
109
|
+
export function createTransport(cfg) {
|
|
110
|
+
const baseUrl = stripTrail(cfg.baseUrl);
|
|
111
|
+
const authenticated = Boolean(cfg.apiKey);
|
|
112
|
+
const userAgent = cfg.userAgent ?? USER_AGENT;
|
|
113
|
+
const maxBody = cfg.defaultMaxBodyBytes ?? DEFAULT_MAX_JSON_BODY_BYTES;
|
|
114
|
+
function headersFor(extra) {
|
|
115
|
+
const headers = new Headers(extra);
|
|
116
|
+
if (cfg.apiKey)
|
|
117
|
+
headers.set("Authorization", `Bearer ${cfg.apiKey}`);
|
|
118
|
+
else
|
|
119
|
+
headers.delete("Authorization");
|
|
120
|
+
headers.delete("Cookie");
|
|
121
|
+
headers.set("User-Agent", userAgent);
|
|
122
|
+
if (!headers.has("Accept"))
|
|
123
|
+
headers.set("Accept", "application/json");
|
|
124
|
+
return headers;
|
|
125
|
+
}
|
|
126
|
+
async function doFetch(url, init, timeoutMs, externalSignal, path) {
|
|
127
|
+
const controller = new AbortController();
|
|
128
|
+
const timer = setTimeout(() => controller.abort(new Error(`request timed out after ${timeoutMs}ms`)), timeoutMs);
|
|
129
|
+
const signal = combineSignals(controller.signal, externalSignal);
|
|
130
|
+
const release = () => clearTimeout(timer);
|
|
131
|
+
const fetchImpl = cfg.fetchImpl ?? globalThis.fetch;
|
|
132
|
+
try {
|
|
133
|
+
logger.debug(`HTTP ${init.method ?? "GET"} ${url.href}`);
|
|
134
|
+
const resp = await fetchImpl(url, { ...init, signal, redirect: "manual" });
|
|
135
|
+
logger.debug(`HTTP ${resp.status} ${url.href}`);
|
|
136
|
+
return { resp, release, timeoutSignal: controller.signal };
|
|
137
|
+
}
|
|
138
|
+
catch (err) {
|
|
139
|
+
release();
|
|
140
|
+
throw wrapFetchError(err, "request", path, externalSignal, controller.signal, timeoutMs);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
function wrapFetchError(err, phase, path, externalSignal, timeoutSignal, timeoutMs) {
|
|
144
|
+
if (externalSignal?.aborted) {
|
|
145
|
+
return new TransportError({ message: `request to ${path} aborted`, phase: "aborted", path, cause: err, credentialKind: cfg.credentialKind });
|
|
146
|
+
}
|
|
147
|
+
if (timeoutSignal.aborted) {
|
|
148
|
+
return new TransportError({ message: `request to ${path} timed out after ${timeoutMs}ms`, phase: "timeout", path, cause: err, credentialKind: cfg.credentialKind });
|
|
149
|
+
}
|
|
150
|
+
const errno = errnoOf(err);
|
|
151
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
152
|
+
return new TransportError({
|
|
153
|
+
message: `network error calling ${path}: ${msg}${errno ? ` (${errno})` : ""}`,
|
|
154
|
+
phase: classifyFetchFailure(err, phase),
|
|
155
|
+
path,
|
|
156
|
+
errno,
|
|
157
|
+
cause: err,
|
|
158
|
+
credentialKind: cfg.credentialKind,
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
function refuseRedirect(resp, path) {
|
|
162
|
+
if (resp.status >= 300 && resp.status < 400) {
|
|
163
|
+
throw new TransportError({
|
|
164
|
+
message: `refusing to follow HTTP ${resp.status} redirect from ${path} (redirects are never followed with an API credential)`,
|
|
165
|
+
phase: "response",
|
|
166
|
+
path,
|
|
167
|
+
credentialKind: cfg.credentialKind,
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
async function readBodyWithin(resp, cap, path, externalSignal, timeoutSignal, timeoutMs) {
|
|
172
|
+
if (!resp.body)
|
|
173
|
+
return "";
|
|
174
|
+
const reader = resp.body.getReader();
|
|
175
|
+
const chunks = [];
|
|
176
|
+
let total = 0;
|
|
177
|
+
try {
|
|
178
|
+
for (;;) {
|
|
179
|
+
const { done, value } = await reader.read();
|
|
180
|
+
if (done)
|
|
181
|
+
break;
|
|
182
|
+
if (value) {
|
|
183
|
+
total += value.byteLength;
|
|
184
|
+
if (total > cap) {
|
|
185
|
+
await reader.cancel().catch(() => undefined);
|
|
186
|
+
throw new MeshyApiError({ message: `response body from ${path} exceeds ${cap} bytes`, status: resp.status, code: "server", path });
|
|
187
|
+
}
|
|
188
|
+
chunks.push(value);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
catch (err) {
|
|
193
|
+
if (err instanceof MeshyApiError)
|
|
194
|
+
throw err;
|
|
195
|
+
throw wrapFetchError(err, "body", path, externalSignal, timeoutSignal, timeoutMs);
|
|
196
|
+
}
|
|
197
|
+
const buf = Buffer.concat(chunks.map((c) => Buffer.from(c.buffer, c.byteOffset, c.byteLength)), total);
|
|
198
|
+
return buf.toString("utf8");
|
|
199
|
+
}
|
|
200
|
+
const transport = {
|
|
201
|
+
baseUrl,
|
|
202
|
+
authenticated,
|
|
203
|
+
async requestJson(method, path, opts = {}) {
|
|
204
|
+
const url = resolveApiUrl(baseUrl, path);
|
|
205
|
+
if (opts.query) {
|
|
206
|
+
for (const [k, v] of Object.entries(opts.query)) {
|
|
207
|
+
if (v === undefined || v === null)
|
|
208
|
+
continue;
|
|
209
|
+
url.searchParams.set(k, String(v));
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
const headers = headersFor(opts.headers);
|
|
213
|
+
const init = { method };
|
|
214
|
+
if (opts.body !== undefined) {
|
|
215
|
+
headers.set("Content-Type", "application/json");
|
|
216
|
+
init.body = JSON.stringify(opts.body);
|
|
217
|
+
}
|
|
218
|
+
init.headers = headers;
|
|
219
|
+
const timeoutMs = opts.timeoutMs ?? cfg.readTimeoutMs;
|
|
220
|
+
const { resp, release, timeoutSignal } = await doFetch(url, init, timeoutMs, opts.signal, path);
|
|
221
|
+
try {
|
|
222
|
+
refuseRedirect(resp, path);
|
|
223
|
+
if (!resp.ok) {
|
|
224
|
+
// mapHttpError reads the body itself; it is small (an error message).
|
|
225
|
+
throw await mapHttpError(resp, path, cfg.credentialKind);
|
|
226
|
+
}
|
|
227
|
+
const text = await readBodyWithin(resp, opts.maxBodyBytes ?? maxBody, path, opts.signal, timeoutSignal, timeoutMs);
|
|
228
|
+
let json = null;
|
|
229
|
+
if (text.trim().length > 0) {
|
|
230
|
+
try {
|
|
231
|
+
json = JSON.parse(text);
|
|
232
|
+
}
|
|
233
|
+
catch (err) {
|
|
234
|
+
throw new MeshyApiError({
|
|
235
|
+
message: `invalid JSON in response from ${path}: ${err instanceof Error ? err.message : String(err)}`,
|
|
236
|
+
status: resp.status,
|
|
237
|
+
code: "server",
|
|
238
|
+
path,
|
|
239
|
+
body: text.slice(0, 200),
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
return { status: resp.status, headers: resp.headers, json, text, requestId: resp.headers.get("x-request-id") };
|
|
244
|
+
}
|
|
245
|
+
finally {
|
|
246
|
+
release();
|
|
247
|
+
}
|
|
248
|
+
},
|
|
249
|
+
async fetchRaw(path, init = {}) {
|
|
250
|
+
const url = resolveApiUrl(baseUrl, path);
|
|
251
|
+
const headers = headersFor(init.headers);
|
|
252
|
+
const timeoutMs = init.timeoutMs ?? cfg.readTimeoutMs;
|
|
253
|
+
const { resp, release } = await doFetch(url, { ...init, headers }, timeoutMs, init.signal ?? undefined, path);
|
|
254
|
+
try {
|
|
255
|
+
refuseRedirect(resp, path);
|
|
256
|
+
if (!resp.ok)
|
|
257
|
+
throw await mapHttpError(resp, path, cfg.credentialKind);
|
|
258
|
+
// The caller reads the body; give it the whole remaining budget by
|
|
259
|
+
// leaving the timer armed until the body is consumed or GC'd.
|
|
260
|
+
const body = resp.body;
|
|
261
|
+
if (!body) {
|
|
262
|
+
release();
|
|
263
|
+
return resp;
|
|
264
|
+
}
|
|
265
|
+
const watched = new Response(body.pipeThrough(new TransformStream({
|
|
266
|
+
flush() {
|
|
267
|
+
release();
|
|
268
|
+
},
|
|
269
|
+
})), { status: resp.status, statusText: resp.statusText, headers: resp.headers });
|
|
270
|
+
return watched;
|
|
271
|
+
}
|
|
272
|
+
catch (err) {
|
|
273
|
+
release();
|
|
274
|
+
throw err;
|
|
275
|
+
}
|
|
276
|
+
},
|
|
277
|
+
async openStream(path, opts = {}) {
|
|
278
|
+
const url = resolveApiUrl(baseUrl, path);
|
|
279
|
+
const headers = headersFor({ Accept: "text/event-stream", ...(opts.headers ?? {}) });
|
|
280
|
+
const controller = new AbortController();
|
|
281
|
+
const signal = combineSignals(controller.signal, opts.signal);
|
|
282
|
+
const connectTimeoutMs = opts.connectTimeoutMs ?? cfg.readTimeoutMs;
|
|
283
|
+
const connectTimer = setTimeout(() => controller.abort(new Error(`stream connect timed out after ${connectTimeoutMs}ms`)), connectTimeoutMs);
|
|
284
|
+
const fetchImpl = cfg.fetchImpl ?? globalThis.fetch;
|
|
285
|
+
let resp;
|
|
286
|
+
try {
|
|
287
|
+
logger.debug(`HTTP GET (stream) ${url.href}`);
|
|
288
|
+
resp = await fetchImpl(url, { method: "GET", headers, signal, redirect: "manual" });
|
|
289
|
+
}
|
|
290
|
+
catch (err) {
|
|
291
|
+
clearTimeout(connectTimer);
|
|
292
|
+
throw wrapFetchError(err, "request", path, opts.signal, controller.signal, connectTimeoutMs);
|
|
293
|
+
}
|
|
294
|
+
clearTimeout(connectTimer);
|
|
295
|
+
const close = () => {
|
|
296
|
+
if (!controller.signal.aborted)
|
|
297
|
+
controller.abort(new Error("stream closed by client"));
|
|
298
|
+
resp.body?.cancel().catch(() => undefined);
|
|
299
|
+
};
|
|
300
|
+
try {
|
|
301
|
+
refuseRedirect(resp, path);
|
|
302
|
+
if (!resp.ok)
|
|
303
|
+
throw await mapHttpError(resp, path, cfg.credentialKind);
|
|
304
|
+
}
|
|
305
|
+
catch (err) {
|
|
306
|
+
close();
|
|
307
|
+
throw err;
|
|
308
|
+
}
|
|
309
|
+
return { response: resp, close, signal };
|
|
310
|
+
},
|
|
311
|
+
};
|
|
312
|
+
return transport;
|
|
313
|
+
}
|
|
314
|
+
export function createAuthenticatedTransport(cfg) {
|
|
315
|
+
return createTransport(cfg);
|
|
316
|
+
}
|
|
317
|
+
export function createPublicTransport(cfg) {
|
|
318
|
+
return createTransport({ ...cfg, apiKey: undefined, credentialKind: undefined });
|
|
319
|
+
}
|
|
320
|
+
//# sourceMappingURL=transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport.js","sourceRoot":"","sources":["../../src/client/transport.ts"],"names":[],"mappings":"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"}
|