spark-server/internal/infrastructure/id/id.go
zhr ae9a71034d feat: implement Spark IM V3 modular monolith
Add HTTP /v1 MVC, TCP send path, groups with server-side member-avatar collage, object-storage upload, and friends/favorites around the architecture-v3 layout.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-17 19:52:11 +08:00

47 lines
1003 B
Go

package id
import (
"fmt"
"sync"
"time"
"github.com/bwmarrin/snowflake"
"spark-server/internal/pkg/errs"
)
// Generator issues Snowflake MsgIds. Worker ID is fixed per machine. Clock rewind is rejected.
type Generator struct {
mu sync.Mutex
node *snowflake.Node
lastMs int64
workerID int64
}
func New(workerID int64) (*Generator, error) {
node, err := snowflake.NewNode(workerID)
if err != nil {
return nil, fmt.Errorf("snowflake node: %w", err)
}
return &Generator{node: node, workerID: workerID}, nil
}
func (g *Generator) NextMsgID() (int64, error) {
return g.NextID()
}
// NextID returns a time-ordered Snowflake ID (user id, conversation id, msg id, mailbox event id).
func (g *Generator) NextID() (int64, error) {
g.mu.Lock()
defer g.mu.Unlock()
now := time.Now().UnixMilli()
if now < g.lastMs {
return 0, errs.ErrClockRewind
}
id := g.node.Generate().Int64()
g.lastMs = now
return id, nil
}
func (g *Generator) WorkerID() int64 { return g.workerID }