mirror of
https://github.com/MeshTender/MeshTender.git
synced 2026-09-02 01:38:17 +00:00
33 lines
900 B
Go
33 lines
900 B
Go
package web
|
|
|
|
import (
|
|
"encoding/base64"
|
|
"encoding/json"
|
|
)
|
|
|
|
// EncodeCursor packs a keyset position into an opaque, URL-safe token. Callers
|
|
// pass a small named struct with short JSON tags (the wire form is not stable
|
|
// API — it only round-trips through the client's ?cursor/?before parameter).
|
|
func EncodeCursor[T any](pos T) string {
|
|
b, _ := json.Marshal(pos)
|
|
return base64.RawURLEncoding.EncodeToString(b)
|
|
}
|
|
|
|
// DecodeCursor reverses EncodeCursor. A missing or malformed token decodes to the
|
|
// zero value with ok=false, so a tampered or stale URL just resets paging to the
|
|
// first page rather than erroring.
|
|
func DecodeCursor[T any](tok string) (pos T, ok bool) {
|
|
if tok == "" {
|
|
return pos, false
|
|
}
|
|
b, err := base64.RawURLEncoding.DecodeString(tok)
|
|
if err != nil {
|
|
return pos, false
|
|
}
|
|
if json.Unmarshal(b, &pos) != nil {
|
|
var zero T
|
|
return zero, false
|
|
}
|
|
return pos, true
|
|
}
|