mirror of
https://github.com/rustfs/console.git
synced 2026-08-28 19:47:21 +08:00
425 lines
11 KiB
TypeScript
425 lines
11 KiB
TypeScript
"use client"
|
|
|
|
import { useCallback } from "react"
|
|
import {
|
|
CreateBucketCommand,
|
|
DeleteBucketCommand,
|
|
DeleteBucketCorsCommand,
|
|
GetBucketEncryptionCommand,
|
|
GetBucketCorsCommand,
|
|
GetBucketLifecycleConfigurationCommand,
|
|
GetBucketPolicyCommand,
|
|
GetBucketPolicyStatusCommand,
|
|
GetBucketReplicationCommand,
|
|
GetBucketTaggingCommand,
|
|
GetBucketVersioningCommand,
|
|
GetObjectLockConfigurationCommand,
|
|
GetObjectRetentionCommand,
|
|
HeadBucketCommand,
|
|
ListBucketsCommand,
|
|
type ListBucketsCommandOutput,
|
|
PutBucketCorsCommand,
|
|
PutBucketEncryptionCommand,
|
|
PutBucketLifecycleConfigurationCommand,
|
|
PutBucketPolicyCommand,
|
|
PutBucketReplicationCommand,
|
|
PutBucketTaggingCommand,
|
|
PutBucketVersioningCommand,
|
|
PutObjectLockConfigurationCommand,
|
|
PutObjectRetentionCommand,
|
|
DeleteBucketTaggingCommand,
|
|
DeleteBucketEncryptionCommand,
|
|
DeleteBucketLifecycleCommand,
|
|
DeleteBucketPolicyCommand,
|
|
DeleteBucketReplicationCommand,
|
|
PutBucketNotificationConfigurationCommand,
|
|
GetBucketNotificationConfigurationCommand,
|
|
MFADelete,
|
|
BucketVersioningStatus,
|
|
type S3Client,
|
|
} from "@aws-sdk/client-s3"
|
|
import { useS3 } from "@/contexts/s3-context"
|
|
import { useApi } from "@/contexts/api-context"
|
|
|
|
const BUCKETS_CACHE_DURATION = 10000
|
|
let listBucketsCache: ListBucketsCommandOutput | null = null
|
|
let listBucketsCacheTime = 0
|
|
let listBucketsPromise: Promise<ListBucketsCommandOutput> | null = null
|
|
let listBucketsClient: S3Client | null = null
|
|
|
|
const invalidateBucketsCache = () => {
|
|
listBucketsCache = null
|
|
listBucketsCacheTime = 0
|
|
}
|
|
|
|
const ensureBucketsClient = (client: S3Client) => {
|
|
if (listBucketsClient !== client) {
|
|
listBucketsClient = client
|
|
listBucketsCache = null
|
|
listBucketsCacheTime = 0
|
|
listBucketsPromise = null
|
|
}
|
|
}
|
|
|
|
export function useBucket() {
|
|
const client = useS3()
|
|
const api = useApi()
|
|
|
|
const listBuckets = useCallback(
|
|
async (options?: { force?: boolean }) => {
|
|
ensureBucketsClient(client)
|
|
|
|
if (options?.force) {
|
|
invalidateBucketsCache()
|
|
}
|
|
|
|
const now = Date.now()
|
|
if (!options?.force && listBucketsCache && now - listBucketsCacheTime < BUCKETS_CACHE_DURATION) {
|
|
return listBucketsCache
|
|
}
|
|
|
|
if (listBucketsPromise) {
|
|
return listBucketsPromise
|
|
}
|
|
|
|
listBucketsPromise = client.send(new ListBucketsCommand({})) as Promise<ListBucketsCommandOutput>
|
|
try {
|
|
const result = await listBucketsPromise
|
|
listBucketsCache = result
|
|
listBucketsCacheTime = Date.now()
|
|
return result
|
|
} finally {
|
|
listBucketsPromise = null
|
|
}
|
|
},
|
|
[client],
|
|
)
|
|
|
|
const createBucket = useCallback(
|
|
async (params: { Bucket: string; ObjectLockEnabledForBucket?: boolean }) => {
|
|
const result = await client.send(new CreateBucketCommand(params))
|
|
invalidateBucketsCache()
|
|
return result
|
|
},
|
|
[client],
|
|
)
|
|
|
|
const headBucket = useCallback(
|
|
async (bucket: string) => {
|
|
return client.send(new HeadBucketCommand({ Bucket: bucket }))
|
|
},
|
|
[client],
|
|
)
|
|
|
|
const deleteBucket = useCallback(
|
|
async (bucket: string) => {
|
|
const result = await client.send(new DeleteBucketCommand({ Bucket: bucket }))
|
|
invalidateBucketsCache()
|
|
return result
|
|
},
|
|
[client],
|
|
)
|
|
|
|
const getBucketTagging = useCallback(
|
|
async (bucket: string) => {
|
|
return client.send(new GetBucketTaggingCommand({ Bucket: bucket }))
|
|
},
|
|
[client],
|
|
)
|
|
|
|
const putBucketTagging = useCallback(
|
|
async (bucket: string, tagging: unknown) => {
|
|
return client.send(
|
|
new PutBucketTaggingCommand({
|
|
Bucket: bucket,
|
|
Tagging: tagging as never,
|
|
}),
|
|
)
|
|
},
|
|
[client],
|
|
)
|
|
|
|
const deleteBucketTagging = useCallback(
|
|
async (bucket: string) => {
|
|
return client.send(new DeleteBucketTaggingCommand({ Bucket: bucket }))
|
|
},
|
|
[client],
|
|
)
|
|
|
|
const putBucketVersioning = useCallback(
|
|
async (bucket: string, status: string) => {
|
|
return client.send(
|
|
new PutBucketVersioningCommand({
|
|
Bucket: bucket,
|
|
VersioningConfiguration: {
|
|
Status: status === "Enabled" ? BucketVersioningStatus.Enabled : BucketVersioningStatus.Suspended,
|
|
MFADelete: MFADelete.Enabled,
|
|
},
|
|
}),
|
|
)
|
|
},
|
|
[client],
|
|
)
|
|
|
|
const getBucketVersioning = useCallback(
|
|
async (bucket: string) => {
|
|
return client.send(new GetBucketVersioningCommand({ Bucket: bucket }))
|
|
},
|
|
[client],
|
|
)
|
|
|
|
const getBucketPolicy = useCallback(
|
|
async (bucket: string) => {
|
|
return client.send(new GetBucketPolicyCommand({ Bucket: bucket }))
|
|
},
|
|
[client],
|
|
)
|
|
|
|
const getBucketPolicyStatus = useCallback(
|
|
async (bucket: string) => {
|
|
return client.send(new GetBucketPolicyStatusCommand({ Bucket: bucket }))
|
|
},
|
|
[client],
|
|
)
|
|
|
|
const putBucketPolicy = useCallback(
|
|
async (bucket: string, policy: string) => {
|
|
return client.send(new PutBucketPolicyCommand({ Bucket: bucket, Policy: policy }))
|
|
},
|
|
[client],
|
|
)
|
|
|
|
const deleteBucketPolicy = useCallback(
|
|
async (bucket: string) => {
|
|
return client.send(new DeleteBucketPolicyCommand({ Bucket: bucket }))
|
|
},
|
|
[client],
|
|
)
|
|
|
|
const getObjectLockConfiguration = useCallback(
|
|
async (bucket: string) => {
|
|
return client.send(new GetObjectLockConfigurationCommand({ Bucket: bucket }))
|
|
},
|
|
[client],
|
|
)
|
|
|
|
const putObjectLockConfiguration = useCallback(
|
|
async (bucket: string, objectLockConfiguration: unknown) => {
|
|
return client.send(
|
|
new PutObjectLockConfigurationCommand({
|
|
Bucket: bucket,
|
|
ObjectLockConfiguration: objectLockConfiguration as never,
|
|
}),
|
|
)
|
|
},
|
|
[client],
|
|
)
|
|
|
|
const getBucketLifecycleConfiguration = useCallback(
|
|
async (bucket: string) => {
|
|
return client.send(new GetBucketLifecycleConfigurationCommand({ Bucket: bucket }))
|
|
},
|
|
[client],
|
|
)
|
|
|
|
const putBucketLifecycleConfiguration = useCallback(
|
|
async (bucket: string, lifecycleConfiguration: unknown) => {
|
|
return client.send(
|
|
new PutBucketLifecycleConfigurationCommand({
|
|
Bucket: bucket,
|
|
LifecycleConfiguration: lifecycleConfiguration as never,
|
|
}),
|
|
)
|
|
},
|
|
[client],
|
|
)
|
|
|
|
const deleteBucketLifecycle = useCallback(
|
|
async (bucket: string) => {
|
|
return client.send(new DeleteBucketLifecycleCommand({ Bucket: bucket }))
|
|
},
|
|
[client],
|
|
)
|
|
|
|
const putObjectRetention = useCallback(
|
|
async (bucket: string, key: string, retention: unknown) => {
|
|
return client.send(
|
|
new PutObjectRetentionCommand({
|
|
Bucket: bucket,
|
|
Key: key,
|
|
Retention: retention as never,
|
|
}),
|
|
)
|
|
},
|
|
[client],
|
|
)
|
|
|
|
const getObjectRetention = useCallback(
|
|
async (bucket: string, key: string) => {
|
|
return client.send(new GetObjectRetentionCommand({ Bucket: bucket, Key: key }))
|
|
},
|
|
[client],
|
|
)
|
|
|
|
const getBucketEncryption = useCallback(
|
|
async (bucket: string) => {
|
|
return client.send(new GetBucketEncryptionCommand({ Bucket: bucket }))
|
|
},
|
|
[client],
|
|
)
|
|
|
|
const putBucketEncryption = useCallback(
|
|
async (bucket: string, encryption: unknown) => {
|
|
return client.send(
|
|
new PutBucketEncryptionCommand({
|
|
Bucket: bucket,
|
|
ServerSideEncryptionConfiguration: encryption as never,
|
|
}),
|
|
)
|
|
},
|
|
[client],
|
|
)
|
|
|
|
const deleteBucketEncryption = useCallback(
|
|
async (bucket: string) => {
|
|
return client.send(new DeleteBucketEncryptionCommand({ Bucket: bucket }))
|
|
},
|
|
[client],
|
|
)
|
|
|
|
const getBucketCors = useCallback(
|
|
async (bucket: string) => {
|
|
return client.send(new GetBucketCorsCommand({ Bucket: bucket }))
|
|
},
|
|
[client],
|
|
)
|
|
|
|
const putBucketCors = useCallback(
|
|
async (bucket: string, corsConfiguration: unknown) => {
|
|
return client.send(
|
|
new PutBucketCorsCommand({
|
|
Bucket: bucket,
|
|
CORSConfiguration: corsConfiguration as never,
|
|
}),
|
|
)
|
|
},
|
|
[client],
|
|
)
|
|
|
|
const deleteBucketCors = useCallback(
|
|
async (bucket: string) => {
|
|
return client.send(new DeleteBucketCorsCommand({ Bucket: bucket }))
|
|
},
|
|
[client],
|
|
)
|
|
|
|
const getBucketReplication = useCallback(
|
|
async (bucket: string) => {
|
|
return client.send(new GetBucketReplicationCommand({ Bucket: bucket }))
|
|
},
|
|
[client],
|
|
)
|
|
|
|
const putBucketReplication = useCallback(
|
|
async (bucket: string, replication: unknown) => {
|
|
return client.send(
|
|
new PutBucketReplicationCommand({
|
|
Bucket: bucket,
|
|
ReplicationConfiguration: replication as never,
|
|
}),
|
|
)
|
|
},
|
|
[client],
|
|
)
|
|
|
|
const deleteBucketReplication = useCallback(
|
|
async (bucket: string) => {
|
|
return client.send(new DeleteBucketReplicationCommand({ Bucket: bucket }))
|
|
},
|
|
[client],
|
|
)
|
|
|
|
const deleteRemoteReplicationTarget = useCallback(
|
|
async (bucket: string, arn: string) => {
|
|
return api.delete(`/remove-remote-target?bucket=${bucket}&arn=${encodeURIComponent(arn)}`)
|
|
},
|
|
[api],
|
|
)
|
|
|
|
const setRemoteReplicationTarget = useCallback(
|
|
async (bucket: string, data: unknown) => {
|
|
return api.put(`/set-remote-target?bucket=${encodeURIComponent(bucket)}`, data)
|
|
},
|
|
[api],
|
|
)
|
|
|
|
const listBucketNotifications = useCallback(
|
|
async (bucket: string) => {
|
|
return client.send(new GetBucketNotificationConfigurationCommand({ Bucket: bucket }))
|
|
},
|
|
[client],
|
|
)
|
|
|
|
const putBucketNotifications = useCallback(
|
|
async (bucket: string, data: unknown) => {
|
|
return client.send(
|
|
new PutBucketNotificationConfigurationCommand({
|
|
Bucket: bucket,
|
|
NotificationConfiguration: data as never,
|
|
}),
|
|
)
|
|
},
|
|
[client],
|
|
)
|
|
|
|
const getBucketQuota = useCallback(async (bucket: string) => api.get(`/quota/${bucket}`), [api])
|
|
const putBucketQuota = useCallback(
|
|
async (bucket: string, quota: unknown) => api.put(`/quota/${bucket}`, quota),
|
|
[api],
|
|
)
|
|
const deleteBucketQuota = useCallback(async (bucket: string) => api.delete(`/quota/${bucket}`), [api])
|
|
const getBucketQuotaUsage = useCallback(async (bucket: string) => api.get(`/quota-stats/${bucket}`), [api])
|
|
const checkBucketQuota = useCallback(async (bucket: string) => api.get(`/quota-check/${bucket}`), [api])
|
|
|
|
return {
|
|
listBuckets,
|
|
createBucket,
|
|
headBucket,
|
|
deleteBucket,
|
|
getBucketTagging,
|
|
putBucketTagging,
|
|
deleteBucketTagging,
|
|
putBucketVersioning,
|
|
getBucketVersioning,
|
|
getBucketPolicyStatus,
|
|
getBucketPolicy,
|
|
putBucketPolicy,
|
|
deleteBucketPolicy,
|
|
getObjectLockConfiguration,
|
|
putObjectLockConfiguration,
|
|
getBucketLifecycleConfiguration,
|
|
putBucketLifecycleConfiguration,
|
|
deleteBucketLifecycle,
|
|
putObjectRetention,
|
|
getObjectRetention,
|
|
getBucketEncryption,
|
|
putBucketEncryption,
|
|
deleteBucketEncryption,
|
|
getBucketCors,
|
|
putBucketCors,
|
|
deleteBucketCors,
|
|
getBucketReplication,
|
|
putBucketReplication,
|
|
deleteBucketReplication,
|
|
deleteRemoteReplicationTarget,
|
|
setRemoteReplicationTarget,
|
|
listBucketNotifications,
|
|
putBucketNotifications,
|
|
getBucketQuota,
|
|
putBucketQuota,
|
|
deleteBucketQuota,
|
|
getBucketQuotaUsage,
|
|
checkBucketQuota,
|
|
}
|
|
}
|