Kiến trúc IAUP
IAUP là một plugin Bukkit nhỏ với pipeline upload async có guard. Mục tiêu thiết kế chính: không block server thread, reject work cũ sau reload, và cập nhật ItemsAdder config có tính quyết định.
Component chính
Phần tiêu đề “Component chính”ItemsAdderUploadPlus sở hữu:
- command handling
- lifecycle
- settings snapshot
- upload-in-progress guard
- hook registration
- upload orchestration
PluginSettings parse và validate config thành object setting immutable.
S3UploadService build S3 client, upload zip, và trả về object key cùng download URL.
ItemsAdderConfigUpdater ghi URL cuối cùng vào ItemsAdder config.
ItemsAdderHookRegistrar đăng ký listener ItemsAdder pack-compressed event khi có.
Enable flow
Phần tiêu đề “Enable flow”Khi enable:
- tạo message service
- tạo hook registrar
- save default config
- parse settings
- đăng ký
/iaup - bắt đầu lifecycle epoch mới
- bind ItemsAdder hook nếu bật
Nếu parse settings fail, IAUP tự disable.
Upload guard
Phần tiêu đề “Upload guard”IAUP dùng atomic boolean:
uploadInProgressNó ngăn upload chồng lên nhau. Flag được set trước khi schedule async task và clear trong finally.
Async upload pipeline
Phần tiêu đề “Async upload pipeline”Upload task chạy bất đồng bộ:
- build S3 client
- build object key từ
path_scheme - upload
generated.zipvới content typeapplication/zip - áp dụng canned ACL trừ khi
acllànone - build public hoặc presigned download URL
- cập nhật ItemsAdder config
- gửi success/failure message
- tùy chọn schedule
/iareloadvề main thread
S3 client shutdown sau khi upload hoàn tất.
Lifecycle epoch
Phần tiêu đề “Lifecycle epoch”Reload và shutdown có thể xảy ra khi async upload đang chạy. IAUP dùng lifecycle epoch để ngăn task cũ apply kết quả cũ.
Khi upload start, plugin capture:
runEpoch = lifecycle.currentEpoch()Trước khi ghi config hoặc dispatch reload, task kiểm tra epoch đó còn hiện hành không. Nếu không, nó exit mà không apply state cũ.
Reload flow
Phần tiêu đề “Reload flow”/iaup reload:
- parse setting mới
- bắt đầu lifecycle epoch mới
- clear upload-in-progress
- swap settings
- rebind hook
Nếu rebind fail, IAUP cố restore setting và hook trước đó.
Build URL
Phần tiêu đề “Build URL”Object key placeholder được replace trước:
{uid} {file} {name} {ext} {date} {ts}Sau đó chọn URL mode:
- presigned URL nếu
use_presigned_urltrue public_url_base/objectKeynếu public base được đặtendpoint/bucket/objectKeycho path-style endpoint mode- S3 SDK object URL trong các case còn lại
Cache busting append query parameter sau khi URL được build.
Chiến lược cập nhật ItemsAdder config
Phần tiêu đề “Chiến lược cập nhật ItemsAdder config”IAUP đọc ItemsAdder config dưới dạng line trước và cố thay đúng:
resource-pack.hosting.external-host.urlCách này giữ hầu hết formatting và comment. Nếu replace theo line fail, IAUP fallback sang Bukkit YamlConfiguration, set cùng path, rồi save file.