[persiskv] Auto load tls cert & key to prevent tls expiration
[myCabin.git] / src / func.xyz / etc / persiskv.go
blobabf9aba379d2e28b078abc534c089fbc48b4fb2c
1 // Copyright (c) 2024, Jack J. Moh
2 // All rights reserved.
3 // Use of this source code is governed by a BSD-style
4 // license that can be found in the LICENSE file.
6 package etc
8 import (
9 "hash/fnv"
10 "strconv"
11 "sync"
13 "func.xyz/persiskv/cli"
16 var PersisKVCfg = persiskvCfg{
17 Hosts: []string{
18 "01.persiskv.func.xyz",
19 "02.persiskv.func.xyz",
23 func init() {
24 Register("persiskv", &PersisKVCfg)
27 type persiskvCfg struct {
28 Hosts []string `json:"hosts"`
30 clis sync.Map `json:"-"`
33 func (cfg *persiskvCfg) GetBucket(bucket string) persiskv.Client {
34 cli, ok := cfg.clis.Load(bucket)
35 if ok {
36 return cli.(persiskv.Client)
38 cli, err := cfg.newBucket(bucket)
39 if err != nil {
40 panic(err)
42 cli, _ = cfg.clis.LoadOrStore(bucket, cli)
43 return cli.(persiskv.Client)
46 func (cfg *persiskvCfg) newBucket(bucket string) (persiskv.Client, error) {
47 h := fnv.New64a()
48 h.Write([]byte(bucket))
49 code := h.Sum64()
50 host := cfg.Hosts[code%uint64(len(cfg.Hosts))]
51 url := "https://" + host + ":" + strconv.Itoa(int(PortPersisKV))
52 return persiskv.New(url, bucket)