diff --git a/pkg/internal/server/api/link_expander.go b/pkg/internal/server/api/link_expander.go index 2db6638..1b58d39 100644 --- a/pkg/internal/server/api/link_expander.go +++ b/pkg/internal/server/api/link_expander.go @@ -4,11 +4,25 @@ import ( "encoding/base64" "git.solsynth.dev/hydrogen/dealer/pkg/internal/services" "github.com/gofiber/fiber/v2" + "sync" ) +var inProgress sync.Map + func getLinkMeta(c *fiber.Ctx) error { targetEncoded := c.Params("target") - targetRaw, _ := base64.StdEncoding.DecodeString(targetEncoded) + targetRaw, _ := base64.URLEncoding.DecodeString(targetEncoded) + + if ch, loaded := inProgress.LoadOrStore(targetEncoded, make(chan struct{})); loaded { + // If the request is already in progress, wait for it to complete + <-ch.(chan struct{}) + } else { + // If this is the first request, process it and signal others + defer func() { + close(ch.(chan struct{})) + inProgress.Delete(targetEncoded) + }() + } if meta, err := services.LinkExpand(string(targetRaw)); err != nil { return fiber.NewError(fiber.StatusBadRequest, err.Error())