nuxt-media-library 0.0.44

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.
Files changed (164) hide show
  1. package/README.md +243 -0
  2. package/dist/module.d.mts +31 -0
  3. package/dist/module.d.ts +31 -0
  4. package/dist/module.json +9 -0
  5. package/dist/module.mjs +118 -0
  6. package/dist/runtime/components/MLAssetManager/AssetActivity.d.vue.ts +6 -0
  7. package/dist/runtime/components/MLAssetManager/AssetActivity.vue +13 -0
  8. package/dist/runtime/components/MLAssetManager/AssetActivity.vue.d.ts +6 -0
  9. package/dist/runtime/components/MLAssetManager/AssetCard.d.vue.ts +14 -0
  10. package/dist/runtime/components/MLAssetManager/AssetCard.vue +100 -0
  11. package/dist/runtime/components/MLAssetManager/AssetCard.vue.d.ts +14 -0
  12. package/dist/runtime/components/MLAssetManager/AssetDetail.d.vue.ts +14 -0
  13. package/dist/runtime/components/MLAssetManager/AssetDetail.vue +156 -0
  14. package/dist/runtime/components/MLAssetManager/AssetDetail.vue.d.ts +14 -0
  15. package/dist/runtime/components/MLAssetManager/AssetList.d.vue.ts +15 -0
  16. package/dist/runtime/components/MLAssetManager/AssetList.vue +41 -0
  17. package/dist/runtime/components/MLAssetManager/AssetList.vue.d.ts +15 -0
  18. package/dist/runtime/components/MLAssetManager/AssetOverview.d.vue.ts +8 -0
  19. package/dist/runtime/components/MLAssetManager/AssetOverview.vue +321 -0
  20. package/dist/runtime/components/MLAssetManager/AssetOverview.vue.d.ts +8 -0
  21. package/dist/runtime/components/MLAssetManager/AssetPreview.d.vue.ts +10 -0
  22. package/dist/runtime/components/MLAssetManager/AssetPreview.vue +18 -0
  23. package/dist/runtime/components/MLAssetManager/AssetPreview.vue.d.ts +10 -0
  24. package/dist/runtime/components/MLAssetManager/AssetPreviewAudio.d.vue.ts +9 -0
  25. package/dist/runtime/components/MLAssetManager/AssetPreviewAudio.vue +21 -0
  26. package/dist/runtime/components/MLAssetManager/AssetPreviewAudio.vue.d.ts +9 -0
  27. package/dist/runtime/components/MLAssetManager/AssetPreviewDocument.d.vue.ts +9 -0
  28. package/dist/runtime/components/MLAssetManager/AssetPreviewDocument.vue +39 -0
  29. package/dist/runtime/components/MLAssetManager/AssetPreviewDocument.vue.d.ts +9 -0
  30. package/dist/runtime/components/MLAssetManager/AssetPreviewFallback.d.vue.ts +7 -0
  31. package/dist/runtime/components/MLAssetManager/AssetPreviewFallback.vue +41 -0
  32. package/dist/runtime/components/MLAssetManager/AssetPreviewFallback.vue.d.ts +7 -0
  33. package/dist/runtime/components/MLAssetManager/AssetPreviewImage.d.vue.ts +9 -0
  34. package/dist/runtime/components/MLAssetManager/AssetPreviewImage.vue +30 -0
  35. package/dist/runtime/components/MLAssetManager/AssetPreviewImage.vue.d.ts +9 -0
  36. package/dist/runtime/components/MLAssetManager/AssetPreviewSidebar.d.vue.ts +15 -0
  37. package/dist/runtime/components/MLAssetManager/AssetPreviewSidebar.vue +69 -0
  38. package/dist/runtime/components/MLAssetManager/AssetPreviewSidebar.vue.d.ts +15 -0
  39. package/dist/runtime/components/MLAssetManager/AssetPreviewVideo.d.vue.ts +9 -0
  40. package/dist/runtime/components/MLAssetManager/AssetPreviewVideo.vue +148 -0
  41. package/dist/runtime/components/MLAssetManager/AssetPreviewVideo.vue.d.ts +9 -0
  42. package/dist/runtime/components/MLAssetManager/AssetRenditions.d.vue.ts +8 -0
  43. package/dist/runtime/components/MLAssetManager/AssetRenditions.vue +148 -0
  44. package/dist/runtime/components/MLAssetManager/AssetRenditions.vue.d.ts +8 -0
  45. package/dist/runtime/components/MLAssetManager/Processing.d.vue.ts +8 -0
  46. package/dist/runtime/components/MLAssetManager/Processing.vue +84 -0
  47. package/dist/runtime/components/MLAssetManager/Processing.vue.d.ts +8 -0
  48. package/dist/runtime/components/MLAssetManager/SlotCard.d.vue.ts +17 -0
  49. package/dist/runtime/components/MLAssetManager/SlotCard.vue +94 -0
  50. package/dist/runtime/components/MLAssetManager/SlotCard.vue.d.ts +17 -0
  51. package/dist/runtime/components/MLAssetManager/Widget.d.vue.ts +14 -0
  52. package/dist/runtime/components/MLAssetManager/Widget.vue +328 -0
  53. package/dist/runtime/components/MLAssetManager/Widget.vue.d.ts +14 -0
  54. package/dist/runtime/components/MLPreviewProvider.d.vue.ts +31 -0
  55. package/dist/runtime/components/MLPreviewProvider.vue +51 -0
  56. package/dist/runtime/components/MLPreviewProvider.vue.d.ts +31 -0
  57. package/dist/runtime/components/MLProcessing/Forms/ConfigureStepModal.d.vue.ts +13 -0
  58. package/dist/runtime/components/MLProcessing/Forms/ConfigureStepModal.vue +47 -0
  59. package/dist/runtime/components/MLProcessing/Forms/ConfigureStepModal.vue.d.ts +13 -0
  60. package/dist/runtime/components/MLProcessing/Forms/FramePicker.d.vue.ts +11 -0
  61. package/dist/runtime/components/MLProcessing/Forms/FramePicker.vue +162 -0
  62. package/dist/runtime/components/MLProcessing/Forms/FramePicker.vue.d.ts +11 -0
  63. package/dist/runtime/components/MLProcessing/Forms/StepOptionsForm.d.vue.ts +14 -0
  64. package/dist/runtime/components/MLProcessing/Forms/StepOptionsForm.vue +113 -0
  65. package/dist/runtime/components/MLProcessing/Forms/StepOptionsForm.vue.d.ts +14 -0
  66. package/dist/runtime/components/MLProcessing/Pipeline.d.vue.ts +15 -0
  67. package/dist/runtime/components/MLProcessing/Pipeline.vue +178 -0
  68. package/dist/runtime/components/MLProcessing/Pipeline.vue.d.ts +15 -0
  69. package/dist/runtime/components/MLProcessing/PipelineStepItem.d.vue.ts +20 -0
  70. package/dist/runtime/components/MLProcessing/PipelineStepItem.vue +309 -0
  71. package/dist/runtime/components/MLProcessing/PipelineStepItem.vue.d.ts +20 -0
  72. package/dist/runtime/components/MLProcessing/ProgressBar.d.vue.ts +9 -0
  73. package/dist/runtime/components/MLProcessing/ProgressBar.vue +27 -0
  74. package/dist/runtime/components/MLProcessing/ProgressBar.vue.d.ts +9 -0
  75. package/dist/runtime/components/MLProcessing/StepLayout.d.vue.ts +31 -0
  76. package/dist/runtime/components/MLProcessing/StepLayout.vue +36 -0
  77. package/dist/runtime/components/MLProcessing/StepLayout.vue.d.ts +31 -0
  78. package/dist/runtime/components/MLProcessing/Stepper.d.vue.ts +16 -0
  79. package/dist/runtime/components/MLProcessing/Stepper.vue +87 -0
  80. package/dist/runtime/components/MLProcessing/Stepper.vue.d.ts +16 -0
  81. package/dist/runtime/components/MLProcessing/StepperItem.d.vue.ts +16 -0
  82. package/dist/runtime/components/MLProcessing/StepperItem.vue +150 -0
  83. package/dist/runtime/components/MLProcessing/StepperItem.vue.d.ts +16 -0
  84. package/dist/runtime/components/MLProcessing/TopBar.d.vue.ts +21 -0
  85. package/dist/runtime/components/MLProcessing/TopBar.vue +46 -0
  86. package/dist/runtime/components/MLProcessing/TopBar.vue.d.ts +21 -0
  87. package/dist/runtime/components/MLUploader/ButtonUploader.d.vue.ts +55 -0
  88. package/dist/runtime/components/MLUploader/ButtonUploader.vue +211 -0
  89. package/dist/runtime/components/MLUploader/ButtonUploader.vue.d.ts +55 -0
  90. package/dist/runtime/components/MLUploader/Item.d.vue.ts +34 -0
  91. package/dist/runtime/components/MLUploader/Item.vue +242 -0
  92. package/dist/runtime/components/MLUploader/Item.vue.d.ts +34 -0
  93. package/dist/runtime/components/MLUploader/PolicyPopover.d.vue.ts +7 -0
  94. package/dist/runtime/components/MLUploader/PolicyPopover.vue +160 -0
  95. package/dist/runtime/components/MLUploader/PolicyPopover.vue.d.ts +7 -0
  96. package/dist/runtime/components/MLUploader/Widget.d.vue.ts +44 -0
  97. package/dist/runtime/components/MLUploader/Widget.vue +251 -0
  98. package/dist/runtime/components/MLUploader/Widget.vue.d.ts +44 -0
  99. package/dist/runtime/composables/resourcePolicy/mimeUtils.d.ts +4 -0
  100. package/dist/runtime/composables/resourcePolicy/mimeUtils.js +71 -0
  101. package/dist/runtime/composables/resourcePolicy/useMLResourcePolicy.d.ts +17 -0
  102. package/dist/runtime/composables/resourcePolicy/useMLResourcePolicy.js +150 -0
  103. package/dist/runtime/composables/useElapsedTimer.d.ts +13 -0
  104. package/dist/runtime/composables/useElapsedTimer.js +46 -0
  105. package/dist/runtime/composables/useMLAssetLibrary.d.ts +31 -0
  106. package/dist/runtime/composables/useMLAssetLibrary.js +53 -0
  107. package/dist/runtime/composables/useMLAssetManager.d.ts +30 -0
  108. package/dist/runtime/composables/useMLAssetManager.js +229 -0
  109. package/dist/runtime/composables/useMLAssetManagerPreview.d.ts +28 -0
  110. package/dist/runtime/composables/useMLAssetManagerPreview.js +232 -0
  111. package/dist/runtime/composables/useMLAssetPreview.d.ts +23 -0
  112. package/dist/runtime/composables/useMLAssetPreview.js +153 -0
  113. package/dist/runtime/composables/useMLChunkUploader.d.ts +9 -0
  114. package/dist/runtime/composables/useMLChunkUploader.js +22 -0
  115. package/dist/runtime/composables/useMLProcessingPipeline.d.ts +38 -0
  116. package/dist/runtime/composables/useMLProcessingPipeline.js +258 -0
  117. package/dist/runtime/composables/useMLProcessingStatus.d.ts +34 -0
  118. package/dist/runtime/composables/useMLProcessingStatus.js +100 -0
  119. package/dist/runtime/composables/useMLProcessingStepper.d.ts +32 -0
  120. package/dist/runtime/composables/useMLProcessingStepper.js +280 -0
  121. package/dist/runtime/composables/useMLProcessingStrategies.d.ts +7 -0
  122. package/dist/runtime/composables/useMLProcessingStrategies.js +47 -0
  123. package/dist/runtime/composables/useMLRepeater.d.ts +5 -0
  124. package/dist/runtime/composables/useMLRepeater.js +11 -0
  125. package/dist/runtime/css/index.css +1 -0
  126. package/dist/runtime/index.d.ts +13 -0
  127. package/dist/runtime/index.js +13 -0
  128. package/dist/runtime/plugins/asset-direcetive-client.d.ts +2 -0
  129. package/dist/runtime/plugins/asset-direcetive-client.js +64 -0
  130. package/dist/runtime/plugins/config.d.ts +13 -0
  131. package/dist/runtime/plugins/config.js +23 -0
  132. package/dist/runtime/schemas/resource-policy.schema.d.ts +607 -0
  133. package/dist/runtime/schemas/resource-policy.schema.js +117 -0
  134. package/dist/runtime/server/assets-proxy.d.ts +2 -0
  135. package/dist/runtime/server/assets-proxy.js +81 -0
  136. package/dist/runtime/server/create-ml-proxy.d.ts +47 -0
  137. package/dist/runtime/server/create-ml-proxy.js +232 -0
  138. package/dist/runtime/server/delivery-proxy.d.ts +2 -0
  139. package/dist/runtime/server/delivery-proxy.js +74 -0
  140. package/dist/runtime/server/index.d.ts +2 -0
  141. package/dist/runtime/server/index.js +1 -0
  142. package/dist/runtime/server/processing-proxy.d.ts +2 -0
  143. package/dist/runtime/server/processing-proxy.js +55 -0
  144. package/dist/runtime/server/resource-policy-proxy.d.ts +2 -0
  145. package/dist/runtime/server/resource-policy-proxy.js +80 -0
  146. package/dist/runtime/server/tsconfig.json +0 -0
  147. package/dist/runtime/server/uploads-proxy.d.ts +2 -0
  148. package/dist/runtime/server/uploads-proxy.js +99 -0
  149. package/dist/runtime/types/asset.d.ts +174 -0
  150. package/dist/runtime/types/asset.js +7 -0
  151. package/dist/runtime/types/preview.d.ts +20 -0
  152. package/dist/runtime/types/preview.js +0 -0
  153. package/dist/runtime/types/resourcePolicy.d.ts +77 -0
  154. package/dist/runtime/types/resourcePolicy.js +25 -0
  155. package/dist/runtime/types/uploader.d.ts +71 -0
  156. package/dist/runtime/types/uploader.js +0 -0
  157. package/dist/runtime/utils/uploader/checksum.d.ts +21 -0
  158. package/dist/runtime/utils/uploader/checksum.js +23 -0
  159. package/dist/runtime/utils/uploader/chunking.d.ts +8 -0
  160. package/dist/runtime/utils/uploader/chunking.js +21 -0
  161. package/dist/runtime/utils/uploader/uploader.d.ts +20 -0
  162. package/dist/runtime/utils/uploader/uploader.js +206 -0
  163. package/dist/types.d.mts +11 -0
  164. package/package.json +81 -0
@@ -0,0 +1,117 @@
1
+ import { AssetKind, Visibility, ResourcePolicySchemaMode } from "../types/resourcePolicy.js";
2
+ const enumVisibility = Object.values(Visibility);
3
+ const enumAssetKind = Object.values(AssetKind);
4
+ export const FileConstraintsJsonSchema = {
5
+ type: "object",
6
+ additionalProperties: false,
7
+ required: ["allowed_mime_types"],
8
+ properties: {
9
+ allowed_mime_types: { type: "array", items: { type: "string" }, minItems: 1 },
10
+ max_size_bytes: { type: ["integer", "null"] },
11
+ min_size_bytes: { type: ["integer", "null"] },
12
+ allow_multiple: { type: "boolean" }
13
+ }
14
+ };
15
+ export const PermissionRequirementsJsonSchema = {
16
+ type: "object",
17
+ additionalProperties: false,
18
+ properties: {
19
+ required_permissions: { type: "array", items: { type: "string" } },
20
+ allow_anonymous: { type: "boolean" }
21
+ }
22
+ };
23
+ export const StorageConfigJsonSchema = {
24
+ type: "object",
25
+ additionalProperties: false,
26
+ properties: {
27
+ storage_class: { type: "string" },
28
+ visibility: { type: "string" }
29
+ }
30
+ };
31
+ export const ProcessingConfigJsonSchema = {
32
+ type: "object",
33
+ additionalProperties: false,
34
+ required: ["auto_process"],
35
+ properties: {
36
+ auto_process: { type: "boolean" },
37
+ step_options: { type: ["object", "null"], additionalProperties: true }
38
+ }
39
+ };
40
+ export const CreateResourcePolicyJsonSchema = {
41
+ $schema: "http://json-schema.org/draft-07/schema#",
42
+ title: "CreateResourcePolicyRequest",
43
+ type: "object",
44
+ additionalProperties: false,
45
+ required: [
46
+ "resource_type",
47
+ "file_constraints",
48
+ "processing_config",
49
+ "kind",
50
+ "visibility"
51
+ ],
52
+ properties: {
53
+ resource_type: { type: "string", minLength: 1 },
54
+ collection_name: { type: ["string", "null"] },
55
+ file_constraints: FileConstraintsJsonSchema,
56
+ permission_requirements: PermissionRequirementsJsonSchema,
57
+ processing_config: ProcessingConfigJsonSchema,
58
+ kind: { type: "string", enum: enumAssetKind },
59
+ visibility: { type: "string", enum: enumVisibility }
60
+ }
61
+ };
62
+ export const UpdateResourcePolicyJsonSchema = {
63
+ $schema: "http://json-schema.org/draft-07/schema#",
64
+ title: "UpdateResourcePolicyRequest",
65
+ type: "object",
66
+ additionalProperties: false,
67
+ properties: {
68
+ file_constraints: { anyOf: [FileConstraintsJsonSchema, { type: "null" }] },
69
+ permission_requirements: { anyOf: [PermissionRequirementsJsonSchema, { type: "null" }] },
70
+ processing_config: { anyOf: [ProcessingConfigJsonSchema, { type: "null" }] },
71
+ kind: { anyOf: [{ type: "string", enum: enumAssetKind }, { type: "null" }] },
72
+ visibility: { anyOf: [{ type: "string", enum: enumVisibility }, { type: "null" }] },
73
+ is_active: { type: ["boolean", "null"] }
74
+ }
75
+ };
76
+ export const ResourcePolicyResponseJsonSchema = {
77
+ $schema: "http://json-schema.org/draft-07/schema#",
78
+ title: "ResourcePolicyResponse",
79
+ type: "object",
80
+ additionalProperties: false,
81
+ required: [
82
+ "id",
83
+ "tenant_id",
84
+ "resource_type",
85
+ "collection_name",
86
+ "file_constraints",
87
+ "permission_requirements",
88
+ "processing_config",
89
+ "kind",
90
+ "visibility",
91
+ "is_active",
92
+ "version",
93
+ "created_at",
94
+ "updated_at"
95
+ ],
96
+ properties: {
97
+ id: { type: "string" },
98
+ tenant_id: { type: "string" },
99
+ resource_type: { type: "string" },
100
+ collection_name: { type: ["string", "null"] },
101
+ file_constraints: FileConstraintsJsonSchema,
102
+ permission_requirements: PermissionRequirementsJsonSchema,
103
+ processing_config: ProcessingConfigJsonSchema,
104
+ storage_config: StorageConfigJsonSchema,
105
+ kind: { type: "string", enum: enumAssetKind },
106
+ visibility: { type: "string", enum: enumVisibility },
107
+ is_active: { type: "boolean" },
108
+ version: { type: "integer" },
109
+ created_at: { type: "string" },
110
+ updated_at: { type: "string" }
111
+ }
112
+ };
113
+ export function getResourcePolicyJsonSchema(mode) {
114
+ if (mode === ResourcePolicySchemaMode.Update) return UpdateResourcePolicyJsonSchema;
115
+ if (mode === ResourcePolicySchemaMode.Response) return ResourcePolicyResponseJsonSchema;
116
+ return CreateResourcePolicyJsonSchema;
117
+ }
@@ -0,0 +1,2 @@
1
+ declare const _default: import("h3").EventHandler<import("h3").EventHandlerRequest, Promise<any>>;
2
+ export default _default;
@@ -0,0 +1,81 @@
1
+ import { createError, defineEventHandler, getRequestHeaders, getRequestURL, proxyRequest } from "h3";
2
+ import { useRuntimeConfig } from "#imports";
3
+ const normalizeHeaders = (headers) => {
4
+ if (!headers) return {};
5
+ return typeof headers === "function" ? headers() : headers;
6
+ };
7
+ export default defineEventHandler(async (event) => {
8
+ try {
9
+ const config = useRuntimeConfig();
10
+ const baseURL = config.mediaLibrary?.baseURL;
11
+ const routes = config.mediaLibrary?.routes;
12
+ if (!baseURL) {
13
+ throw createError({ statusCode: 500, statusMessage: "mediaLibrary.baseURL is required for assets proxying." });
14
+ }
15
+ try {
16
+ const parsed = new URL(baseURL);
17
+ if (parsed.protocol !== "http:" && parsed.protocol !== "https:") {
18
+ throw new Error("Invalid protocol");
19
+ }
20
+ } catch {
21
+ throw createError({ statusCode: 500, statusMessage: "mediaLibrary.baseURL must be an absolute http(s) URL." });
22
+ }
23
+ const reqUrl = getRequestURL(event);
24
+ const path = reqUrl.pathname;
25
+ const prefix = "/api/media-library/manage/assets";
26
+ if (!path.startsWith(prefix)) {
27
+ throw createError({ statusCode: 404, statusMessage: "Not found" });
28
+ }
29
+ const rest = path.slice(prefix.length);
30
+ const method = event.node.req.method || "GET";
31
+ const trimmedRest = rest.replace(/\/+$/, "");
32
+ const isCollection = trimmedRest === "";
33
+ const isResolve = trimmedRest === "/resolve";
34
+ const isItem = /^\/[^/]+$/.test(trimmedRest) && !isResolve;
35
+ const subResourceMatch = trimmedRest.match(/^\/[^/]+\/(renditions)$/);
36
+ const isSubResource = subResourceMatch !== null;
37
+ if (!isCollection && !isResolve && !isItem && !isSubResource) {
38
+ throw createError({ statusCode: 404, statusMessage: "Not found" });
39
+ }
40
+ if (isCollection && method !== "GET") {
41
+ throw createError({ statusCode: 405, statusMessage: "Method Not Allowed" });
42
+ }
43
+ if (isResolve && method !== "POST") {
44
+ throw createError({ statusCode: 405, statusMessage: "Method Not Allowed" });
45
+ }
46
+ if (isItem && !["GET", "PATCH", "DELETE"].includes(method)) {
47
+ throw createError({ statusCode: 405, statusMessage: "Method Not Allowed" });
48
+ }
49
+ if (isSubResource && method !== "GET") {
50
+ throw createError({ statusCode: 405, statusMessage: "Method Not Allowed" });
51
+ }
52
+ const assetsBase = routes?.assets || "/manage/assets";
53
+ const upstreamPath = `${assetsBase}${trimmedRest}`;
54
+ const normalizedBase = baseURL.endsWith("/") ? baseURL : `${baseURL}/`;
55
+ const upstreamUrl = new URL(`.${upstreamPath}`, normalizedBase);
56
+ const incoming = new URLSearchParams(reqUrl.search);
57
+ incoming.forEach((value, key) => {
58
+ upstreamUrl.searchParams.append(key, value);
59
+ });
60
+ const forwardedHeaders = { ...getRequestHeaders(event) };
61
+ const extraHeaders = normalizeHeaders(config.mediaLibrary?.headers);
62
+ const proxyHeaders = { ...forwardedHeaders, ...extraHeaders };
63
+ delete proxyHeaders.connection;
64
+ delete proxyHeaders["transfer-encoding"];
65
+ delete proxyHeaders["keep-alive"];
66
+ delete proxyHeaders.upgrade;
67
+ delete proxyHeaders.expect;
68
+ delete proxyHeaders.host;
69
+ const result = await proxyRequest(event, upstreamUrl.toString(), {
70
+ headers: proxyHeaders,
71
+ streamRequest: true
72
+ });
73
+ if (event.node.res.statusCode >= 400) {
74
+ console.error(`[media-library] assets-proxy upstream responded ${event.node.res.statusCode} for ${method} ${upstreamUrl.toString()}`);
75
+ }
76
+ return result;
77
+ } catch (err) {
78
+ console.error("[media-library] assets-proxy error:", err);
79
+ throw err;
80
+ }
81
+ });
@@ -0,0 +1,47 @@
1
+ import type { H3Event } from 'h3';
2
+ export type MLProxyType = 'assets' | 'uploads' | 'delivery' | 'processing' | 'resource-policy';
3
+ export interface MLProxyOptions {
4
+ /**
5
+ * Per-request header factory. Receives the H3 event and the incoming
6
+ * request headers so you can inject auth tokens, tenant IDs, etc.
7
+ * Returned headers are merged on top of the static `mediaLibrary.headers`
8
+ * from runtimeConfig.
9
+ */
10
+ requestHeaders?: (event: H3Event, incoming: Record<string, string>) => Record<string, string> | Promise<Record<string, string>>;
11
+ }
12
+ /**
13
+ * Create a Nitro event handler that replicates one of the media library's
14
+ * built-in proxy handlers with optional per-request header injection.
15
+ *
16
+ * Register it in a consumer server route that shadows the module's default
17
+ * handler (consumer app routes take priority over module routes):
18
+ *
19
+ * @example
20
+ * // server/api/media-library/manage/assets/[...].ts
21
+ * import { createMLProxy } from '@fritill-team/nuxt-media-library/server'
22
+ * import { getAccessToken } from '~/server/utils/session'
23
+ *
24
+ * export default createMLProxy('assets', {
25
+ * requestHeaders: async (event) => ({
26
+ * Authorization: `Bearer ${await getAccessToken(event)}`,
27
+ * }),
28
+ * })
29
+ */
30
+ /**
31
+ * Create a single catch-all Nitro event handler that covers all media library
32
+ * proxy routes. Register it at `server/api/media-library/[...].ts` to shadow
33
+ * every built-in proxy with one file and one shared requestHeaders factory.
34
+ *
35
+ * @example
36
+ * // server/api/media-library/[...].ts
37
+ * import { createMLCatchAllProxy } from '@fritill-team/nuxt-media-library/server'
38
+ * import { getAccessToken } from '~/server/utils/session'
39
+ *
40
+ * export default createMLCatchAllProxy({
41
+ * requestHeaders: async (event) => ({
42
+ * Authorization: `Bearer ${await getAccessToken(event)}`,
43
+ * }),
44
+ * })
45
+ */
46
+ export declare function createMLCatchAllProxy(options?: MLProxyOptions): import("h3").EventHandler<import("h3").EventHandlerRequest, Promise<any>>;
47
+ export declare function createMLProxy(type: MLProxyType, options?: MLProxyOptions): import("h3").EventHandler<import("h3").EventHandlerRequest, Promise<any>>;
@@ -0,0 +1,232 @@
1
+ import { createError, defineEventHandler, getRequestHeaders, getRequestURL, proxyRequest, readRawBody } from "h3";
2
+ import { useRuntimeConfig } from "#imports";
3
+ const HOP_BY_HOP = ["connection", "transfer-encoding", "keep-alive", "upgrade", "expect", "host"];
4
+ function stripHopByHop(headers) {
5
+ return Object.fromEntries(Object.entries(headers).filter(([k]) => !HOP_BY_HOP.includes(k)));
6
+ }
7
+ async function buildProxyHeaders(event, staticHeaders, requestHeadersFn) {
8
+ const incoming = getRequestHeaders(event);
9
+ const dynamic = requestHeadersFn ? await requestHeadersFn(event, incoming) : {};
10
+ return stripHopByHop({ ...incoming, ...staticHeaders, ...dynamic });
11
+ }
12
+ function buildUpstreamUrl(baseURL, upstreamPath, search) {
13
+ const base = baseURL.endsWith("/") ? baseURL : `${baseURL}/`;
14
+ const url = new URL(`.${upstreamPath}`, base);
15
+ new URLSearchParams(search).forEach((v, k) => url.searchParams.append(k, v));
16
+ return url;
17
+ }
18
+ function validateBaseURL(baseURL, name) {
19
+ if (!baseURL) {
20
+ throw createError({ statusCode: 500, statusMessage: `mediaLibrary.baseURL is required for ${name} proxying.` });
21
+ }
22
+ try {
23
+ const { protocol } = new URL(baseURL);
24
+ if (protocol !== "http:" && protocol !== "https:") throw new Error("Invalid protocol");
25
+ } catch {
26
+ throw createError({ statusCode: 500, statusMessage: "mediaLibrary.baseURL must be an absolute http(s) URL." });
27
+ }
28
+ return baseURL;
29
+ }
30
+ function resolveRoute(route, params) {
31
+ return route.replace(/:(\w+)/g, (_, key) => {
32
+ const value = params[key];
33
+ return value === void 0 ? "" : String(value);
34
+ });
35
+ }
36
+ async function handleAssetsProxy(event, baseURL, staticHeaders, assetsBase, requestHeadersFn) {
37
+ const reqUrl = getRequestURL(event);
38
+ const prefix = "/api/media-library/manage/assets";
39
+ const rest = reqUrl.pathname.slice(prefix.length);
40
+ const method = event.node.req.method || "GET";
41
+ const trimmedRest = rest.replace(/\/+$/, "");
42
+ const isCollection = trimmedRest === "";
43
+ const isResolve = trimmedRest === "/resolve";
44
+ const isItem = /^\/[^/]+$/.test(trimmedRest) && !isResolve;
45
+ const isSubResource = /^\/[^/]+\/renditions$/.test(trimmedRest);
46
+ if (!isCollection && !isResolve && !isItem && !isSubResource) {
47
+ throw createError({ statusCode: 404, statusMessage: "Not found" });
48
+ }
49
+ if (isCollection && method !== "GET") throw createError({ statusCode: 405, statusMessage: "Method Not Allowed" });
50
+ if (isResolve && method !== "POST") throw createError({ statusCode: 405, statusMessage: "Method Not Allowed" });
51
+ if (isItem && !["GET", "PATCH", "DELETE"].includes(method)) throw createError({ statusCode: 405, statusMessage: "Method Not Allowed" });
52
+ if (isSubResource && method !== "GET") throw createError({ statusCode: 405, statusMessage: "Method Not Allowed" });
53
+ const upstreamUrl = buildUpstreamUrl(baseURL, `${assetsBase}${trimmedRest}`, reqUrl.search);
54
+ const headers = await buildProxyHeaders(event, staticHeaders, requestHeadersFn);
55
+ const result = await proxyRequest(event, upstreamUrl.toString(), { headers, streamRequest: true });
56
+ if (event.node.res.statusCode >= 400) {
57
+ console.error(`[media-library] assets-proxy upstream responded ${event.node.res.statusCode} for ${method} ${upstreamUrl}`);
58
+ }
59
+ return result;
60
+ }
61
+ async function handleUploadsProxy(event, baseURL, staticHeaders, routes, requestHeadersFn) {
62
+ const reqUrl = getRequestURL(event);
63
+ const prefix = "/api/media-library/manage/uploads";
64
+ const rest = reqUrl.pathname.slice(prefix.length);
65
+ const method = event.node.req.method || "GET";
66
+ let upstreamPath = "";
67
+ if (rest === "/sessions" || rest === "/sessions/") {
68
+ if (method !== "POST") throw createError({ statusCode: 405, statusMessage: "Method Not Allowed" });
69
+ upstreamPath = routes.createSession;
70
+ } else {
71
+ const partMatch = rest.match(/^\/sessions\/([^/]+)\/parts\/([^/]+)$/);
72
+ const finalizeMatch = rest.match(/^\/sessions\/([^/]+)\/finalize$/);
73
+ const abortMatch = rest.match(/^\/sessions\/([^/]+)\/abort$/);
74
+ const sessionMatch = rest.match(/^\/sessions\/([^/]+)$/);
75
+ if (partMatch) {
76
+ if (method !== "PUT") throw createError({ statusCode: 405, statusMessage: "Method Not Allowed" });
77
+ upstreamPath = resolveRoute(routes.uploadPart, { id: partMatch[1], part: partMatch[2] });
78
+ } else if (finalizeMatch) {
79
+ if (method !== "POST") throw createError({ statusCode: 405, statusMessage: "Method Not Allowed" });
80
+ upstreamPath = resolveRoute(routes.finalize, { id: finalizeMatch[1] });
81
+ } else if (abortMatch && routes.abort) {
82
+ if (method !== "DELETE") throw createError({ statusCode: 405, statusMessage: "Method Not Allowed" });
83
+ upstreamPath = resolveRoute(routes.abort, { id: abortMatch[1] });
84
+ } else if (sessionMatch) {
85
+ if (method !== "GET") throw createError({ statusCode: 405, statusMessage: "Method Not Allowed" });
86
+ upstreamPath = resolveRoute(routes.getSession, { id: sessionMatch[1] });
87
+ }
88
+ }
89
+ if (!upstreamPath) throw createError({ statusCode: 404, statusMessage: "Unknown upload route" });
90
+ const upstreamUrl = buildUpstreamUrl(baseURL, upstreamPath, reqUrl.search);
91
+ const headers = await buildProxyHeaders(event, staticHeaders, requestHeadersFn);
92
+ const result = await proxyRequest(event, upstreamUrl.toString(), { headers, streamRequest: true });
93
+ if (event.node.res.statusCode >= 400) {
94
+ console.error(`[media-library] uploads-proxy upstream responded ${event.node.res.statusCode} for ${method} ${upstreamUrl}`);
95
+ }
96
+ return result;
97
+ }
98
+ async function handleDeliveryProxy(event, baseURL, staticHeaders, requestHeadersFn) {
99
+ const reqUrl = getRequestURL(event);
100
+ const prefix = "/api/media-library/delivery";
101
+ const rest = reqUrl.pathname.slice(prefix.length);
102
+ const method = event.node.req.method || "GET";
103
+ const trimmedRest = rest.replace(/\/+$/, "");
104
+ const isCollection = /^\/assets$/.test(trimmedRest);
105
+ const isResolve = /^\/assets\/resolve$/.test(trimmedRest);
106
+ const isItem = /^\/assets\/[^/]+$/.test(trimmedRest) && !isResolve;
107
+ if (!isCollection && !isResolve && !isItem) throw createError({ statusCode: 404, statusMessage: "Not found" });
108
+ if (isCollection && method !== "GET") throw createError({ statusCode: 405, statusMessage: "Method Not Allowed" });
109
+ if (isResolve && method !== "POST") throw createError({ statusCode: 405, statusMessage: "Method Not Allowed" });
110
+ if (isItem && method !== "GET") throw createError({ statusCode: 405, statusMessage: "Method Not Allowed" });
111
+ const upstreamUrl = buildUpstreamUrl(baseURL, `/delivery${trimmedRest}`, reqUrl.search);
112
+ const headers = await buildProxyHeaders(event, staticHeaders, requestHeadersFn);
113
+ const result = await proxyRequest(event, upstreamUrl.toString(), { headers, streamRequest: true });
114
+ if (event.node.res.statusCode >= 400) {
115
+ console.error(`[media-library] delivery-proxy upstream responded ${event.node.res.statusCode} for ${method} ${upstreamUrl}`);
116
+ }
117
+ return result;
118
+ }
119
+ async function handleProcessingProxy(event, baseURL, staticHeaders, requestHeadersFn) {
120
+ const reqUrl = getRequestURL(event);
121
+ const prefix = "/api/media-library/manage/processing";
122
+ const rest = reqUrl.pathname.slice(prefix.length);
123
+ const method = event.node.req.method || "GET";
124
+ const allowed = /^\/stream$/.test(rest) && method === "GET" || /^\/assets\/[^/]+\/stream$/.test(rest) && method === "GET" || /^\/assets\/[^/]+\/tasks$/.test(rest) && method === "GET" || /^\/assets\/[^/]+\/process$/.test(rest) && method === "POST" || /^\/tasks\/[^/]+\/retry$/.test(rest) && method === "POST" || /^\/tasks\/[^/]+\/configure$/.test(rest) && method === "POST" || /^\/processors$/.test(rest) && method === "GET";
125
+ if (!allowed) throw createError({ statusCode: 404, statusMessage: "Not found" });
126
+ const upstreamUrl = buildUpstreamUrl(baseURL, `/manage/processing${rest}`, reqUrl.search);
127
+ const headers = await buildProxyHeaders(event, staticHeaders, requestHeadersFn);
128
+ const hasBody = method !== "GET" && method !== "HEAD";
129
+ const body = hasBody ? await readRawBody(event, false) : void 0;
130
+ return proxyRequest(event, upstreamUrl.toString(), {
131
+ headers,
132
+ ...body !== void 0 ? { body } : {}
133
+ });
134
+ }
135
+ async function handleResourcePolicyProxy(event, baseURL, staticHeaders, requestHeadersFn) {
136
+ const reqUrl = getRequestURL(event);
137
+ const prefix = "/api/media-library/manage/resource-policies";
138
+ const rest = reqUrl.pathname.slice(prefix.length);
139
+ const method = event.node.req.method || "GET";
140
+ const trimmedRest = rest.replace(/\/+$/, "");
141
+ const isCollection = trimmedRest === "";
142
+ const isSchema = trimmedRest === "/schema";
143
+ const isPipelineSteps = trimmedRest === "/pipelines/available-steps";
144
+ const isItem = !isSchema && !isPipelineSteps && /^\/[^/]+$/.test(trimmedRest);
145
+ if (!isCollection && !isSchema && !isPipelineSteps && !isItem) {
146
+ throw createError({ statusCode: 404, statusMessage: "Not found" });
147
+ }
148
+ const isDev = import.meta.dev;
149
+ const writeMethods = ["POST", "PUT", "DELETE"];
150
+ if (isSchema && method !== "GET") throw createError({ statusCode: 405, statusMessage: "Method Not Allowed" });
151
+ if (isPipelineSteps && method !== "GET") throw createError({ statusCode: 405, statusMessage: "Method Not Allowed" });
152
+ if (isCollection && method !== "GET" && !(isDev && method === "POST")) throw createError({ statusCode: 405, statusMessage: "Method Not Allowed" });
153
+ if (isItem && method !== "GET" && !(isDev && writeMethods.includes(method))) throw createError({ statusCode: 405, statusMessage: "Method Not Allowed" });
154
+ const upstreamUrl = buildUpstreamUrl(baseURL, `/manage/resource-policies${trimmedRest}`, reqUrl.search);
155
+ const headers = await buildProxyHeaders(event, staticHeaders, requestHeadersFn);
156
+ const result = await proxyRequest(event, upstreamUrl.toString(), { headers, streamRequest: true });
157
+ if (event.node.res.statusCode >= 400) {
158
+ console.error(`[media-library] resource-policy-proxy upstream responded ${event.node.res.statusCode} for ${method} ${upstreamUrl}`);
159
+ }
160
+ return result;
161
+ }
162
+ function resolveMLProxyType(pathname) {
163
+ if (pathname.startsWith("/api/media-library/delivery/")) return { type: "delivery" };
164
+ if (pathname.startsWith("/api/media-library/manage/assets")) return { type: "assets" };
165
+ if (pathname.startsWith("/api/media-library/manage/uploads/")) return { type: "uploads" };
166
+ if (pathname.startsWith("/api/media-library/manage/processing/")) return { type: "processing" };
167
+ if (pathname.startsWith("/api/media-library/manage/resource-policies")) return { type: "resource-policy" };
168
+ return null;
169
+ }
170
+ export function createMLCatchAllProxy(options) {
171
+ return defineEventHandler(async (event) => {
172
+ const pathname = getRequestURL(event).pathname;
173
+ const resolved = resolveMLProxyType(pathname);
174
+ if (!resolved) throw createError({ statusCode: 404, statusMessage: "Not found" });
175
+ const config = useRuntimeConfig();
176
+ const mlConfig = config.mediaLibrary ?? {};
177
+ const baseURL = validateBaseURL(mlConfig.baseURL, resolved.type);
178
+ const staticHeaders = mlConfig.headers && typeof mlConfig.headers === "object" && !Array.isArray(mlConfig.headers) ? mlConfig.headers : {};
179
+ switch (resolved.type) {
180
+ case "assets":
181
+ return handleAssetsProxy(
182
+ event,
183
+ baseURL,
184
+ staticHeaders,
185
+ mlConfig.routes?.assets || "/manage/assets",
186
+ options?.requestHeaders
187
+ );
188
+ case "uploads":
189
+ return handleUploadsProxy(event, baseURL, staticHeaders, mlConfig.routes, options?.requestHeaders);
190
+ case "delivery":
191
+ return handleDeliveryProxy(event, baseURL, staticHeaders, options?.requestHeaders);
192
+ case "processing":
193
+ return handleProcessingProxy(event, baseURL, staticHeaders, options?.requestHeaders);
194
+ case "resource-policy":
195
+ return handleResourcePolicyProxy(event, baseURL, staticHeaders, options?.requestHeaders);
196
+ }
197
+ });
198
+ }
199
+ export function createMLProxy(type, options) {
200
+ return defineEventHandler(async (event) => {
201
+ const config = useRuntimeConfig();
202
+ const mlConfig = config.mediaLibrary ?? {};
203
+ const baseURL = validateBaseURL(mlConfig.baseURL, type);
204
+ const staticHeaders = mlConfig.headers && typeof mlConfig.headers === "object" && !Array.isArray(mlConfig.headers) ? mlConfig.headers : {};
205
+ switch (type) {
206
+ case "assets":
207
+ return handleAssetsProxy(
208
+ event,
209
+ baseURL,
210
+ staticHeaders,
211
+ mlConfig.routes?.assets || "/manage/assets",
212
+ options?.requestHeaders
213
+ );
214
+ case "uploads":
215
+ return handleUploadsProxy(
216
+ event,
217
+ baseURL,
218
+ staticHeaders,
219
+ mlConfig.routes,
220
+ options?.requestHeaders
221
+ );
222
+ case "delivery":
223
+ return handleDeliveryProxy(event, baseURL, staticHeaders, options?.requestHeaders);
224
+ case "processing":
225
+ return handleProcessingProxy(event, baseURL, staticHeaders, options?.requestHeaders);
226
+ case "resource-policy":
227
+ return handleResourcePolicyProxy(event, baseURL, staticHeaders, options?.requestHeaders);
228
+ default:
229
+ throw createError({ statusCode: 500, statusMessage: `Unknown MLProxy type: ${type}` });
230
+ }
231
+ });
232
+ }
@@ -0,0 +1,2 @@
1
+ declare const _default: import("h3").EventHandler<import("h3").EventHandlerRequest, Promise<any>>;
2
+ export default _default;
@@ -0,0 +1,74 @@
1
+ import { createError, defineEventHandler, getRequestHeaders, getRequestURL, proxyRequest } from "h3";
2
+ import { useRuntimeConfig } from "#imports";
3
+ const normalizeHeaders = (headers) => {
4
+ if (!headers) return {};
5
+ return typeof headers === "function" ? headers() : headers;
6
+ };
7
+ export default defineEventHandler(async (event) => {
8
+ try {
9
+ const config = useRuntimeConfig();
10
+ const baseURL = config.mediaLibrary?.baseURL;
11
+ if (!baseURL) {
12
+ throw createError({ statusCode: 500, statusMessage: "mediaLibrary.baseURL is required for delivery proxying." });
13
+ }
14
+ try {
15
+ const parsed = new URL(baseURL);
16
+ if (parsed.protocol !== "http:" && parsed.protocol !== "https:") {
17
+ throw new Error("Invalid protocol");
18
+ }
19
+ } catch {
20
+ throw createError({ statusCode: 500, statusMessage: "mediaLibrary.baseURL must be an absolute http(s) URL." });
21
+ }
22
+ const reqUrl = getRequestURL(event);
23
+ const path = reqUrl.pathname;
24
+ const prefix = "/api/media-library/delivery";
25
+ if (!path.startsWith(prefix)) {
26
+ throw createError({ statusCode: 404, statusMessage: "Not found" });
27
+ }
28
+ const rest = path.slice(prefix.length);
29
+ const method = event.node.req.method || "GET";
30
+ const trimmedRest = rest.replace(/\/+$/, "");
31
+ const isCollection = /^\/assets$/.test(trimmedRest);
32
+ const isResolve = /^\/assets\/resolve$/.test(trimmedRest);
33
+ const isItem = /^\/assets\/[^/]+$/.test(trimmedRest) && !isResolve;
34
+ if (!isCollection && !isResolve && !isItem) {
35
+ throw createError({ statusCode: 404, statusMessage: "Not found" });
36
+ }
37
+ if (isCollection && method !== "GET") {
38
+ throw createError({ statusCode: 405, statusMessage: "Method Not Allowed" });
39
+ }
40
+ if (isResolve && method !== "POST") {
41
+ throw createError({ statusCode: 405, statusMessage: "Method Not Allowed" });
42
+ }
43
+ if (isItem && method !== "GET") {
44
+ throw createError({ statusCode: 405, statusMessage: "Method Not Allowed" });
45
+ }
46
+ const upstreamPath = `/delivery${trimmedRest}`;
47
+ const normalizedBase = baseURL.endsWith("/") ? baseURL : `${baseURL}/`;
48
+ const upstreamUrl = new URL(`.${upstreamPath}`, normalizedBase);
49
+ const incoming = new URLSearchParams(reqUrl.search);
50
+ incoming.forEach((value, key) => {
51
+ upstreamUrl.searchParams.append(key, value);
52
+ });
53
+ const forwardedHeaders = { ...getRequestHeaders(event) };
54
+ const extraHeaders = normalizeHeaders(config.mediaLibrary?.headers);
55
+ const proxyHeaders = { ...forwardedHeaders, ...extraHeaders };
56
+ delete proxyHeaders.connection;
57
+ delete proxyHeaders["transfer-encoding"];
58
+ delete proxyHeaders["keep-alive"];
59
+ delete proxyHeaders.upgrade;
60
+ delete proxyHeaders.expect;
61
+ delete proxyHeaders.host;
62
+ const result = await proxyRequest(event, upstreamUrl.toString(), {
63
+ headers: proxyHeaders,
64
+ streamRequest: true
65
+ });
66
+ if (event.node.res.statusCode >= 400) {
67
+ console.error(`[media-library] delivery-proxy upstream responded ${event.node.res.statusCode} for ${method} ${upstreamUrl.toString()}`);
68
+ }
69
+ return result;
70
+ } catch (err) {
71
+ console.error("[media-library] delivery-proxy error:", err);
72
+ throw err;
73
+ }
74
+ });
@@ -0,0 +1,2 @@
1
+ export { createMLProxy, createMLCatchAllProxy } from './create-ml-proxy.js';
2
+ export type { MLProxyType, MLProxyOptions } from './create-ml-proxy.js';
@@ -0,0 +1 @@
1
+ export { createMLProxy, createMLCatchAllProxy } from "./create-ml-proxy.js";
@@ -0,0 +1,2 @@
1
+ declare const _default: import("h3").EventHandler<import("h3").EventHandlerRequest, Promise<any>>;
2
+ export default _default;
@@ -0,0 +1,55 @@
1
+ import { createError, defineEventHandler, getRequestHeaders, getRequestURL, proxyRequest, readRawBody } from "h3";
2
+ import { useRuntimeConfig } from "#imports";
3
+ const normalizeHeaders = (headers) => {
4
+ if (!headers) return {};
5
+ return typeof headers === "function" ? headers() : headers;
6
+ };
7
+ export default defineEventHandler(async (event) => {
8
+ const config = useRuntimeConfig();
9
+ const baseURL = config.mediaLibrary?.baseURL;
10
+ if (!baseURL) {
11
+ throw createError({ statusCode: 500, statusMessage: "mediaLibrary.baseURL is required for processing proxying." });
12
+ }
13
+ try {
14
+ const parsed = new URL(baseURL);
15
+ if (parsed.protocol !== "http:" && parsed.protocol !== "https:") {
16
+ throw new Error("Invalid protocol");
17
+ }
18
+ } catch {
19
+ throw createError({ statusCode: 500, statusMessage: "mediaLibrary.baseURL must be an absolute http(s) URL." });
20
+ }
21
+ const reqUrl = getRequestURL(event);
22
+ const path = reqUrl.pathname;
23
+ const prefix = "/api/media-library/manage/processing";
24
+ if (!path.startsWith(prefix)) {
25
+ throw createError({ statusCode: 404, statusMessage: "Not found" });
26
+ }
27
+ const rest = path.slice(prefix.length);
28
+ const method = event.node.req.method || "GET";
29
+ const allowed = /^\/stream$/.test(rest) && method === "GET" || /^\/assets\/[^/]+\/stream$/.test(rest) && method === "GET" || /^\/assets\/[^/]+\/tasks$/.test(rest) && method === "GET" || /^\/assets\/[^/]+\/process$/.test(rest) && method === "POST" || /^\/tasks\/[^/]+\/retry$/.test(rest) && method === "POST" || /^\/tasks\/[^/]+\/configure$/.test(rest) && method === "POST" || /^\/processors$/.test(rest) && method === "GET";
30
+ if (!allowed) {
31
+ throw createError({ statusCode: 404, statusMessage: "Not found" });
32
+ }
33
+ const upstreamPath = `/manage/processing${rest}`;
34
+ const normalizedBase = baseURL.endsWith("/") ? baseURL : `${baseURL}/`;
35
+ const upstreamUrl = new URL(`.${upstreamPath}`, normalizedBase);
36
+ const incoming = new URLSearchParams(reqUrl.search);
37
+ incoming.forEach((value, key) => {
38
+ upstreamUrl.searchParams.append(key, value);
39
+ });
40
+ const forwardedHeaders = { ...getRequestHeaders(event) };
41
+ const extraHeaders = normalizeHeaders(config.mediaLibrary?.headers);
42
+ const proxyHeaders = { ...forwardedHeaders, ...extraHeaders };
43
+ delete proxyHeaders.connection;
44
+ delete proxyHeaders["transfer-encoding"];
45
+ delete proxyHeaders["keep-alive"];
46
+ delete proxyHeaders.upgrade;
47
+ delete proxyHeaders.expect;
48
+ delete proxyHeaders.host;
49
+ const hasBody = method !== "GET" && method !== "HEAD";
50
+ const body = hasBody ? await readRawBody(event, false) : void 0;
51
+ return proxyRequest(event, upstreamUrl.toString(), {
52
+ headers: proxyHeaders,
53
+ ...body !== void 0 ? { body } : {}
54
+ });
55
+ });
@@ -0,0 +1,2 @@
1
+ declare const _default: import("h3").EventHandler<import("h3").EventHandlerRequest, Promise<any>>;
2
+ export default _default;