34 lines
833 B
Go
34 lines
833 B
Go
|
package api
|
||
|
|
||
|
import (
|
||
|
"encoding/base64"
|
||
|
"sync"
|
||
|
|
||
|
"git.solsynth.dev/hypernet/reader/pkg/internal/services"
|
||
|
"github.com/gofiber/fiber/v2"
|
||
|
)
|
||
|
|
||
|
var expandInProgress sync.Map
|
||
|
|
||
|
func getLinkMeta(c *fiber.Ctx) error {
|
||
|
targetEncoded := c.Params("*1")
|
||
|
targetRaw, _ := base64.StdEncoding.DecodeString(targetEncoded)
|
||
|
|
||
|
if ch, loaded := expandInProgress.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{}))
|
||
|
expandInProgress.Delete(targetEncoded)
|
||
|
}()
|
||
|
}
|
||
|
|
||
|
if meta, err := services.ScrapLink(string(targetRaw)); err != nil {
|
||
|
return fiber.NewError(fiber.StatusBadRequest, err.Error())
|
||
|
} else {
|
||
|
return c.JSON(meta)
|
||
|
}
|
||
|
}
|