BranchManagement.utils.ts 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. import {
  2. DISK_LIMITS,
  3. DISK_PRICING,
  4. DiskType,
  5. PLAN_DETAILS,
  6. } from '../DiskManagement/ui/DiskManagement.constants'
  7. import { DiskAttributesData } from '@/data/config/disk-attributes-query'
  8. import { DesiredInstanceSize, instanceSizeSpecs } from '@/data/projects/new-project.constants'
  9. import { estimateRestoreTimeFromSizeGb } from '@/lib/restore-estimate'
  10. // Ref: https://supabase.com/docs/guides/platform/compute-and-disk
  11. const maxDiskForCompute = new Map([
  12. [10, instanceSizeSpecs.micro],
  13. [50, instanceSizeSpecs.small],
  14. [100, instanceSizeSpecs.medium],
  15. [200, instanceSizeSpecs.large],
  16. [500, instanceSizeSpecs.xlarge],
  17. [1_000, instanceSizeSpecs['2xlarge']],
  18. [2_000, instanceSizeSpecs['4xlarge']],
  19. [4_000, instanceSizeSpecs['8xlarge']],
  20. [6_000, instanceSizeSpecs['12xlarge']],
  21. [10_000, instanceSizeSpecs['16xlarge']],
  22. ])
  23. export const estimateComputeSize = (
  24. projectDiskSize: number,
  25. branchComputeSize?: DesiredInstanceSize
  26. ) => {
  27. if (branchComputeSize) {
  28. return instanceSizeSpecs[branchComputeSize]
  29. }
  30. // Fallback to estimating based on volume size
  31. for (const [disk, compute] of maxDiskForCompute) {
  32. if (projectDiskSize <= disk) {
  33. return compute
  34. }
  35. }
  36. return instanceSizeSpecs['24xlarge']
  37. }
  38. export const estimateDiskCost = (disk: DiskAttributesData['attributes']) => {
  39. const diskType = disk.type as DiskType
  40. const pricing = DISK_PRICING[diskType]
  41. const includedGB = PLAN_DETAILS['pro'].includedDiskGB[diskType]
  42. const priceSize = Math.max(disk.size_gb - includedGB, 0) * pricing.storage
  43. const includedIOPS = DISK_LIMITS[diskType].includedIops
  44. const priceIOPS = Math.max(disk.iops - includedIOPS, 0) * pricing.iops
  45. const priceThroughput =
  46. diskType === DiskType.GP3 && 'throughput_mbps' in disk
  47. ? Math.max(disk.throughput_mbps - DISK_LIMITS[DiskType.GP3].includedThroughput, 0) *
  48. DISK_PRICING[DiskType.GP3].throughput
  49. : 0
  50. return {
  51. total: priceSize + priceIOPS + priceThroughput,
  52. size: priceSize,
  53. iops: priceIOPS,
  54. throughput: priceThroughput,
  55. }
  56. }
  57. export const estimateRestoreTime = (disk: DiskAttributesData['attributes']) => {
  58. return estimateRestoreTimeFromSizeGb(disk.size_gb)
  59. }