123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778 |
- import { LRUCache } from 'lru-cache'
- import { LRU_CACHE } from '@server/initializers/constants.js'
- import { MUserAccountUrl } from '@server/types/models/index.js'
- import { pick } from '@peertube/peertube-core-utils'
- import { buildUUID } from '@peertube/peertube-node-utils'
- // ---------------------------------------------------------------------------
- // Create temporary tokens that can be used as URL query parameters to access video static files
- // ---------------------------------------------------------------------------
- class VideoTokensManager {
- private static instance: VideoTokensManager
- private readonly lruCache = new LRUCache<string, { videoUUID: string, user?: MUserAccountUrl }>({
- max: LRU_CACHE.VIDEO_TOKENS.MAX_SIZE,
- ttl: LRU_CACHE.VIDEO_TOKENS.TTL
- })
- private constructor () {}
- createForAuthUser (options: {
- user: MUserAccountUrl
- videoUUID: string
- }) {
- const { token, expires } = this.generateVideoToken()
- this.lruCache.set(token, pick(options, [ 'user', 'videoUUID' ]))
- return { token, expires }
- }
- createForPasswordProtectedVideo (options: {
- videoUUID: string
- }) {
- const { token, expires } = this.generateVideoToken()
- this.lruCache.set(token, pick(options, [ 'videoUUID' ]))
- return { token, expires }
- }
- hasToken (options: {
- token: string
- videoUUID: string
- }) {
- const value = this.lruCache.get(options.token)
- if (!value) return false
- return value.videoUUID === options.videoUUID
- }
- getUserFromToken (options: {
- token: string
- }) {
- const value = this.lruCache.get(options.token)
- if (!value) return undefined
- return value.user
- }
- static get Instance () {
- return this.instance || (this.instance = new this())
- }
- private generateVideoToken () {
- const token = buildUUID()
- const expires = new Date(new Date().getTime() + LRU_CACHE.VIDEO_TOKENS.TTL)
- return { token, expires }
- }
- }
- // ---------------------------------------------------------------------------
- export {
- VideoTokensManager
- }
|