diff --git a/js/app/components/settings/backup-settings.tsx b/js/app/components/settings/backup-settings.tsx index 2ee6b0ce..d5b11ba2 100644 --- a/js/app/components/settings/backup-settings.tsx +++ b/js/app/components/settings/backup-settings.tsx @@ -3,7 +3,6 @@ import { Loader, MenuContainer, MenuGroup, - MenuInfo, MenuItem, MenuLabel, MenuSeparator, @@ -31,7 +30,6 @@ interface ValidationErrors { bucket?: string; accessKey?: string; secretKey?: string; - requestedSecondsPerSegment?: string; } function validateS3Config( @@ -101,8 +99,6 @@ export function BackupSettings() { const [validationErrors, setValidationErrors] = useState( {}, ); - const [requestedSecondsPerSegment, setRequestedSecondsPerSegment] = - useState("20"); const [loading, setLoading] = useState(true); const [saving, setSaving] = useState(false); const isCensored = config.secretKey === "***"; @@ -115,21 +111,6 @@ export function BackupSettings() { setFullUrl(buildS3Url(config, showPassword)); }, [showPassword]); - useEffect(() => { - const num = parseInt(requestedSecondsPerSegment, 10); - if (isNaN(num) || num < 1 || num > 60) { - setValidationErrors((prev) => ({ - ...prev, - requestedSecondsPerSegment: t("backup-error-invalid-segment-duration"), - })); - } else { - setValidationErrors((prev) => { - const { requestedSecondsPerSegment, ...rest } = prev; - return rest; - }); - } - }, [requestedSecondsPerSegment]); - const loadStorage = async () => { if (!agent) return; @@ -143,9 +124,6 @@ export function BackupSettings() { if (parsed) { setConfig(parsed); setFullUrl(buildS3Url(parsed, showPassword)); - setRequestedSecondsPerSegment( - String(response.data.storage.requestedSecondsPerSegment), - ); } } } catch (error: any) { @@ -218,10 +196,7 @@ export function BackupSettings() { const realUrl = `s3+https://${config.accessKey}:${config.secretKey}@${config.endpoint}/${config.bucket}`; const payload: { url?: string; - requestedSecondsPerSegment: number; - } = { - requestedSecondsPerSegment: parseInt(requestedSecondsPerSegment, 10), - }; + } = {}; if (config.secretKey !== "***") { if (realUrl !== originalUrl) { @@ -417,28 +392,6 @@ export function BackupSettings() { - - - - {t("requested-seconds-per-segment")} - - - - - - - Max: 60 | -| `isActive` | `boolean` | ✅ | Whether backup storage is currently active. | | +| Name | Type | Req'd | Description | Constraints | +| ---------- | --------- | ----- | --------------------------------------------------------------------------------------------- | ----------- | +| `url` | `string` | ✅ | S3 storage URL with masked secret key in format: s3+https://ACCESS_KEY:\*\*\*@endpoint/bucket | | +| `isActive` | `boolean` | ✅ | Whether backup storage is currently active. | | --- @@ -179,18 +178,12 @@ S3 storage configuration for backups. "storage": { "type": "object", "description": "S3 storage configuration for backups.", - "required": ["url", "requestedSecondsPerSegment", "isActive"], + "required": ["url", "isActive"], "properties": { "url": { "type": "string", "description": "S3 storage URL with masked secret key in format: s3+https://ACCESS_KEY:***@endpoint/bucket" }, - "requestedSecondsPerSegment": { - "type": "integer", - "minimum": 1, - "maximum": 60, - "description": "Requested duration for each HLS segment in seconds." - }, "isActive": { "type": "boolean", "description": "Whether backup storage is currently active." diff --git a/js/docs/src/content/docs/lex-reference/server/place-stream-server-upsertstorage.md b/js/docs/src/content/docs/lex-reference/server/place-stream-server-upsertstorage.md index 64e17be2..33801ac3 100644 --- a/js/docs/src/content/docs/lex-reference/server/place-stream-server-upsertstorage.md +++ b/js/docs/src/content/docs/lex-reference/server/place-stream-server-upsertstorage.md @@ -24,11 +24,10 @@ Create or update S3 storage configuration for backups. **Schema Type:** `object` -| Name | Type | Req'd | Description | Constraints | -| ---------------------------- | --------- | ----- | -------------------------------------------------------------------------- | ----------------------------------- | -| `url` | `string` | ❌ | S3 storage URL in format: s3+https://ACCESS_KEY:SECRET_KEY@endpoint/bucket | | -| `requestedSecondsPerSegment` | `integer` | ❌ | Requested duration for each HLS segment in seconds. | Min: 1
Max: 60
Default: `6` | -| `isActive` | `boolean` | ❌ | Whether backup storage is currently active. | | +| Name | Type | Req'd | Description | Constraints | +| ---------- | --------- | ----- | -------------------------------------------------------------------------- | ----------- | +| `url` | `string` | ❌ | S3 storage URL in format: s3+https://ACCESS_KEY:SECRET_KEY@endpoint/bucket | | +| `isActive` | `boolean` | ❌ | Whether backup storage is currently active. | | **Output:** @@ -72,13 +71,6 @@ Create or update S3 storage configuration for backups. "type": "string", "description": "S3 storage URL in format: s3+https://ACCESS_KEY:SECRET_KEY@endpoint/bucket" }, - "requestedSecondsPerSegment": { - "type": "integer", - "minimum": 1, - "maximum": 60, - "default": 6, - "description": "Requested duration for each HLS segment in seconds." - }, "isActive": { "type": "boolean", "description": "Whether backup storage is currently active." diff --git a/lexicons/place/stream/server/defs.json b/lexicons/place/stream/server/defs.json index c6cabc2f..364f4d69 100644 --- a/lexicons/place/stream/server/defs.json +++ b/lexicons/place/stream/server/defs.json @@ -102,18 +102,12 @@ "storage": { "type": "object", "description": "S3 storage configuration for backups.", - "required": ["url", "requestedSecondsPerSegment", "isActive"], + "required": ["url", "isActive"], "properties": { "url": { "type": "string", "description": "S3 storage URL with masked secret key in format: s3+https://ACCESS_KEY:***@endpoint/bucket" }, - "requestedSecondsPerSegment": { - "type": "integer", - "minimum": 1, - "maximum": 60, - "description": "Requested duration for each HLS segment in seconds." - }, "isActive": { "type": "boolean", "description": "Whether backup storage is currently active." diff --git a/lexicons/place/stream/server/upsertStorage.json b/lexicons/place/stream/server/upsertStorage.json index 9efde530..13514bfa 100644 --- a/lexicons/place/stream/server/upsertStorage.json +++ b/lexicons/place/stream/server/upsertStorage.json @@ -15,13 +15,6 @@ "type": "string", "description": "S3 storage URL in format: s3+https://ACCESS_KEY:SECRET_KEY@endpoint/bucket" }, - "requestedSecondsPerSegment": { - "type": "integer", - "minimum": 1, - "maximum": 60, - "default": 6, - "description": "Requested duration for each HLS segment in seconds." - }, "isActive": { "type": "boolean", "description": "Whether backup storage is currently active." diff --git a/pkg/spxrpc/storage.go b/pkg/spxrpc/storage.go index e57ed502..8573b3a1 100644 --- a/pkg/spxrpc/storage.go +++ b/pkg/spxrpc/storage.go @@ -54,9 +54,6 @@ func (s *Server) handlePlaceStreamServerUpsertStorage(ctx context.Context, input if input.IsActive == nil && existing != nil { storage.IsActive = existing.IsActive } - if input.RequestedSecondsPerSegment == nil && existing != nil { - storage.RequestedSecondsPerSegment = existing.RequestedSecondsPerSegment - } err := s.statefulDB.UpsertStorage(storage) if err != nil { diff --git a/pkg/statedb/storage.go b/pkg/statedb/storage.go index 35ecaca4..17117d15 100644 --- a/pkg/statedb/storage.go +++ b/pkg/statedb/storage.go @@ -11,13 +11,12 @@ import ( // Storage represents S3 storage configuration for a user type Storage struct { - ID string `gorm:"column:id;primarykey"` - IsActive bool `gorm:"column:is_active;default:true"` - UserDID string `gorm:"column:user_did;not null;unique"` - URL string `gorm:"column:url;not null"` - RequestedSecondsPerSegment int `gorm:"column:requested_seconds_per_segment;default:6"` - CreatedAt time.Time `gorm:"column:created_at"` - UpdatedAt time.Time `gorm:"column:updated_at"` + ID string `gorm:"column:id;primarykey"` + IsActive bool `gorm:"column:is_active;default:true"` + UserDID string `gorm:"column:user_did;not null;unique"` + URL string `gorm:"column:url;not null"` + CreatedAt time.Time `gorm:"column:created_at"` + UpdatedAt time.Time `gorm:"column:updated_at"` } func (s *Storage) TableName() string { @@ -37,11 +36,12 @@ func (state *StatefulDB) UpsertStorage(storage *Storage) error { var existing Storage err := state.DB.Where("user_did = ?", storage.UserDID).First(&existing).Error - if err == nil { + switch err { + case nil: storage.ID = existing.ID storage.CreatedAt = existing.CreatedAt return state.DB.Save(storage).Error - } else if err == gorm.ErrRecordNotFound { + case gorm.ErrRecordNotFound: return state.DB.Create(storage).Error } @@ -63,17 +63,12 @@ func (state *StatefulDB) DeleteStorage(userDID string) error { func (s *Storage) ToLexicon() *streamplace.ServerDefs_Storage { return &streamplace.ServerDefs_Storage{ - IsActive: s.IsActive, - Url: maskSecretKey(s.URL), - RequestedSecondsPerSegment: int64(s.RequestedSecondsPerSegment), + IsActive: s.IsActive, + Url: maskSecretKey(s.URL), } } func StorageFromLexiconInput(input *streamplace.ServerUpsertStorage_Input, userDID string) *Storage { - requestedSeconds := 6 - if input.RequestedSecondsPerSegment != nil { - requestedSeconds = int(*input.RequestedSecondsPerSegment) - } var url string if input.Url != nil { @@ -81,10 +76,9 @@ func StorageFromLexiconInput(input *streamplace.ServerUpsertStorage_Input, userD } storage := &Storage{ - UserDID: userDID, - URL: url, - RequestedSecondsPerSegment: requestedSeconds, - IsActive: true, + UserDID: userDID, + URL: url, + IsActive: true, } if input.IsActive != nil { diff --git a/pkg/streamplace/serverdefs.go b/pkg/streamplace/serverdefs.go index 894f23bc..fcb5d3d6 100644 --- a/pkg/streamplace/serverdefs.go +++ b/pkg/streamplace/serverdefs.go @@ -18,8 +18,6 @@ type ServerDefs_RewriteRule struct { type ServerDefs_Storage struct { // isActive: Whether backup storage is currently active. IsActive bool `json:"isActive" cborgen:"isActive"` - // requestedSecondsPerSegment: Requested duration for each HLS segment in seconds. - RequestedSecondsPerSegment int64 `json:"requestedSecondsPerSegment" cborgen:"requestedSecondsPerSegment"` // url: S3 storage URL with masked secret key in format: s3+https://ACCESS_KEY:***@endpoint/bucket Url string `json:"url" cborgen:"url"` } diff --git a/pkg/streamplace/serverupsertStorage.go b/pkg/streamplace/serverupsertStorage.go index d26025fc..aa1e6315 100644 --- a/pkg/streamplace/serverupsertStorage.go +++ b/pkg/streamplace/serverupsertStorage.go @@ -14,8 +14,6 @@ import ( type ServerUpsertStorage_Input struct { // isActive: Whether backup storage is currently active. IsActive *bool `json:"isActive,omitempty" cborgen:"isActive,omitempty"` - // requestedSecondsPerSegment: Requested duration for each HLS segment in seconds. - RequestedSecondsPerSegment *int64 `json:"requestedSecondsPerSegment,omitempty" cborgen:"requestedSecondsPerSegment,omitempty"` // url: S3 storage URL in format: s3+https://ACCESS_KEY:SECRET_KEY@endpoint/bucket Url *string `json:"url,omitempty" cborgen:"url,omitempty"` }