+ doesUploadSessionExist (uploadId: string) {
+ return this.exists('resumable-upload-' + uploadId)
+ }
+
+ async getUploadSession (uploadId: string) {
+ const value = await this.getValue('resumable-upload-' + uploadId)
+
+ return value
+ ? JSON.parse(value)
+ : ''
+ }
+
+ deleteUploadSession (uploadId: string) {
+ return this.deleteKey('resumable-upload-' + uploadId)
+ }
+
+ /* ************ AP resource unavailability ************ */
+
+ async addAPUnavailability (url: string) {
+ const key = this.generateAPUnavailabilityKey(url)
+
+ const value = await this.increment(key)
+ await this.setExpiration(key, AP_CLEANER.PERIOD * 2)
+
+ return value
+ }
+
+ /* ************ Keys generation ************ */
+
+ private generateLocalVideoViewsKeys (videoId: number): { setKey: string, videoKey: string }
+ private generateLocalVideoViewsKeys (): { setKey: string }
+ private generateLocalVideoViewsKeys (videoId?: number) {
+ return { setKey: `local-video-views-buffer`, videoKey: `local-video-views-buffer-${videoId}` }
+ }
+
+ private generateLocalVideoViewerKeys (ip: string, videoId: number): { setKey: string, viewerKey: string }
+ private generateLocalVideoViewerKeys (): { setKey: string }
+ private generateLocalVideoViewerKeys (ip?: string, videoId?: number) {
+ return { setKey: `local-video-viewer-stats-keys`, viewerKey: `local-video-viewer-stats-${ip}-${videoId}` }
+ }
+
+ private generateVideoViewStatsKeys (options: { videoId?: number, hour?: number }) {
+ const hour = exists(options.hour)
+ ? options.hour
+ : new Date().getHours()
+
+ return { setKey: `videos-view-h${hour}`, videoKey: `video-view-${options.videoId}-h${hour}` }