UNPKG

next-video

Version:

A React component for adding video to your Next.js application. It extends both the video element and your Next app with features for automatic video optimization.

93 lines (92 loc) 2.61 kB
import { ReadStream, createReadStream } from "node:fs"; import fs from "node:fs/promises"; import { fetch as uFetch } from "undici"; import { put } from "@vercel/blob"; import chalk from "chalk"; import { updateAsset } from "../../assets.js"; import { createAssetKey } from "../../utils/provider.js"; import { isRemote } from "../../utils/utils.js"; import log from "../../utils/logger.js"; const config = { runtime: "edge" }; async function uploadLocalFile(asset) { const filePath = asset.originalFilePath; if (!filePath) { log.error("No filePath provided for asset."); console.error(asset); return; } if (isRemote(filePath)) { return uploadRequestedFile(asset); } if (asset.status === "ready") { return; } else if (asset.status === "uploading") { log.info(log.label("Resuming upload:"), filePath); } await updateAsset(filePath, { status: "uploading" }); const fileStats = await fs.stat(filePath); const stream = createReadStream(filePath); return putAsset(filePath, fileStats.size, stream); } async function uploadRequestedFile(asset) { const filePath = asset.originalFilePath; if (!filePath) { log.error("No URL provided for asset."); console.error(asset); return; } if (asset.status === "ready") { return; } await updateAsset(filePath, { status: "uploading" }); const response = await uFetch(filePath); const size = Number(response.headers.get("content-length")); const stream = response.body; if (!stream) { log.error("Error fetching the requested file:", filePath); return; } return putAsset(filePath, size, stream); } async function putAsset(filePath, size, stream) { log.info(log.label("Uploading file:"), `${filePath} (${size} bytes)`); let key; let blob; try { key = await createAssetKey(filePath, "vercel-blob"); blob = await put(key, stream, { access: "public" }); if (stream instanceof ReadStream) { stream.close(); } } catch (e) { log.error("Error uploading to Vercel Blob"); console.error(e); return; } log.success(log.label("File uploaded:"), `${filePath} (${size} bytes)`); log.space(chalk.gray(">"), log.label("URL:"), blob.url); const updatedAsset = await updateAsset(filePath, { status: "ready", providerMetadata: { "vercel-blob": { key, url: blob.url, contentType: blob.contentType } } }); const url = updatedAsset.sources?.[0].src; log.space(chalk.gray(">"), log.label("URL:"), url); return updatedAsset; } export { config, uploadLocalFile, uploadRequestedFile };