PeerTube/server/core/lib/object-storage/pre-signed-urls.ts

96 lines
3.2 KiB
TypeScript
Raw Normal View History

import { CONFIG } from '@server/initializers/config.js'
2024-02-12 10:47:52 +01:00
import { MStreamingPlaylistVideo, MUserExport, MVideoFile } from '@server/types/models/index.js'
import { MVideoSource } from '@server/types/models/video/video-source.js'
import {
generateHLSObjectStorageKey,
generateOriginalVideoObjectStorageKey,
generateUserExportObjectStorageKey,
generateWebVideoObjectStorageKey
} from './keys.js'
import { buildKey, getClient } from './shared/index.js'
import { getObjectStoragePublicFileUrl } from './urls.js'
2023-06-06 11:14:13 +02:00
export async function generateWebVideoPresignedUrl (options: {
2023-06-06 11:14:13 +02:00
file: MVideoFile
downloadFilename: string
}) {
const { file, downloadFilename } = options
2024-02-12 10:47:52 +01:00
const url = await generatePresignedUrl({
bucket: CONFIG.OBJECT_STORAGE.WEB_VIDEOS.BUCKET_NAME,
key: buildKey(generateWebVideoObjectStorageKey(file.filename), CONFIG.OBJECT_STORAGE.WEB_VIDEOS),
downloadFilename
2023-06-06 11:14:13 +02:00
})
return getObjectStoragePublicFileUrl(url, CONFIG.OBJECT_STORAGE.WEB_VIDEOS)
2023-06-06 11:14:13 +02:00
}
export async function generateHLSFilePresignedUrl (options: {
2023-06-06 11:14:13 +02:00
streamingPlaylist: MStreamingPlaylistVideo
file: MVideoFile
downloadFilename: string
}) {
const { streamingPlaylist, file, downloadFilename } = options
2024-02-12 10:47:52 +01:00
const url = await generatePresignedUrl({
bucket: CONFIG.OBJECT_STORAGE.STREAMING_PLAYLISTS.BUCKET_NAME,
key: buildKey(generateHLSObjectStorageKey(streamingPlaylist, file.filename), CONFIG.OBJECT_STORAGE.STREAMING_PLAYLISTS),
downloadFilename
})
return getObjectStoragePublicFileUrl(url, CONFIG.OBJECT_STORAGE.STREAMING_PLAYLISTS)
2024-02-12 10:47:52 +01:00
}
export async function generateUserExportPresignedUrl (options: {
userExport: MUserExport
downloadFilename: string
}) {
const { userExport, downloadFilename } = options
const url = await generatePresignedUrl({
bucket: CONFIG.OBJECT_STORAGE.USER_EXPORTS.BUCKET_NAME,
key: buildKey(generateUserExportObjectStorageKey(userExport.filename), CONFIG.OBJECT_STORAGE.USER_EXPORTS),
downloadFilename
})
return getObjectStoragePublicFileUrl(url, CONFIG.OBJECT_STORAGE.USER_EXPORTS)
}
export async function generateOriginalFilePresignedUrl (options: {
videoSource: MVideoSource
downloadFilename: string
}) {
const { videoSource, downloadFilename } = options
const url = await generatePresignedUrl({
bucket: CONFIG.OBJECT_STORAGE.ORIGINAL_VIDEO_FILES.BUCKET_NAME,
key: buildKey(generateOriginalVideoObjectStorageKey(videoSource.keptOriginalFilename), CONFIG.OBJECT_STORAGE.ORIGINAL_VIDEO_FILES),
downloadFilename
})
return getObjectStoragePublicFileUrl(url, CONFIG.OBJECT_STORAGE.ORIGINAL_VIDEO_FILES)
2024-02-12 10:47:52 +01:00
}
// ---------------------------------------------------------------------------
// Private
// ---------------------------------------------------------------------------
async function generatePresignedUrl (options: {
bucket: string
key: string
downloadFilename: string
}) {
const { bucket, downloadFilename, key } = options
2023-06-06 11:14:13 +02:00
const { GetObjectCommand } = await import('@aws-sdk/client-s3')
const { getSignedUrl } = await import('@aws-sdk/s3-request-presigner')
2023-06-06 11:14:13 +02:00
const command = new GetObjectCommand({
2024-02-12 10:47:52 +01:00
Bucket: bucket,
Key: key,
2024-01-12 14:07:54 +01:00
ResponseContentDisposition: `attachment; filename="${encodeURI(downloadFilename)}"`
2023-06-06 11:14:13 +02:00
})
2024-02-12 10:47:52 +01:00
return getSignedUrl(await getClient(), command, { expiresIn: 3600 * 24 })
2023-06-06 11:14:13 +02:00
}