package main
import (
"io"
"os"
"time"
"errors"
"context"
"encoding/json"
"github.com/nats-io/nats.go"
)
func run() []byte {
body,err2 := io.ReadAll(os.Stdin)
if err2 != nil {
return []byte{0,1,2,3,4,5}
}
return body
}
func main() {
os.Stdout.Write([]byte(run()))
}
func resp(code, data any) string {
body, err := json.Marshal(map[string]any{
"code": 0,
"data": data,
})
if err != nil {
return `{"code": 10000000, "message": "invalid response"}`
}
return string(body)
}
// natsKV NATS键值存储结构
type natsKV struct {
conn *nats.Conn
js nats.JetStreamContext
bucket nats.KeyValue
bucketName string
}
// NewNATSKV 创建NATS KV存储
func NewNATSKV(url string, bucketName string, ttlDay int) (*natsKV, error) {
conn, err := nats.Connect(url)
if err != nil {
return nil, err
}
js, err := conn.JetStream()
if err != nil {
return nil, err
}
bucket, err := js.KeyValue(bucketName)
if err != nil && !errors.Is(err, nats.ErrBucketNotFound) {
return nil, err
}
if bucket == nil { // 创建bucket
bucketConfig := &nats.KeyValueConfig{
Bucket: bucketName,
Description: "Criui KV store",
History: 10,
Storage: nats.FileStorage,
}
if ttlDay != 0 {
bucketConfig.TTL = time.Hour * 24 * time.Duration(ttlDay)
}
bucket, err = js.CreateKeyValue(bucketConfig)
if err != nil {
return nil, err
}
}
return &natsKV{
conn: conn,
js: js,
bucket: bucket,
bucketName: bucketName,
}, nil
}
// Get 获取键值
func (n *natsKV) Get(ctx context.Context, key string) ([]byte, error) {
entry, err := n.bucket.Get(key)
if err != nil {
if err == nats.ErrKeyNotFound {
return nil, err
}
return nil, err
}
return entry.Value(), nil
}
// Set 设置键值
func (n *natsKV) Set(ctx context.Context, key string, value []byte) error {
_, err := n.bucket.Put(key, value)
if err != nil {
return err
}
return nil
}
// Delete 删除键值
func (n *natsKV) Delete(ctx context.Context, key string) error {
err := n.bucket.Delete(key)
if err != nil {
if err == nats.ErrKeyNotFound {
return err
}
return err
}
return nil
}
// List 列出所有键
func (n *natsKV) List(ctx context.Context, prefix string) ([]string, error) {
keys, err := n.bucket.Keys()
if err != nil {
// 如果bucket是空的,返回空列表
if errors.Is(err, nats.ErrNoKeysFound) {
return []string{}, nil
}
// 如果bucket不存在,返回空列表
if errors.Is(err, nats.ErrBucketNotFound) {
return []string{}, nil
}
return nil, err
}
var result []string
for _, key := range keys {
if prefix == "" || len(key) >= len(prefix) && key[:len(prefix)] == prefix {
result = append(result, key)
}
}
return result, nil
}
module glot-api
go 1.24.5
require (
github.com/nats-io/nats.go master
)
{
"command":"go mod tidy 2>/dev/null && go run main.go"
}