Write persists a batch atomically as - .fb. The filename timestamp is used to drain oldest-first.
(payload []byte)
| 26 | // Write persists a batch atomically as <unix_nanos>-<rand>.fb. The filename |
| 27 | // timestamp is used to drain oldest-first. |
| 28 | func (s *Spool) Write(payload []byte) (string, error) { |
| 29 | var randSuffix [4]byte |
| 30 | if _, err := rand.Read(randSuffix[:]); err != nil { |
| 31 | return "", err |
| 32 | } |
| 33 | name := fmt.Sprintf("%d-%s%s", time.Now().UnixNano(), hex.EncodeToString(randSuffix[:]), spoolExt) |
| 34 | final := filepath.Join(s.Dir, name) |
| 35 | tmp := final + ".tmp" |
| 36 | |
| 37 | if err := os.WriteFile(tmp, payload, 0o644); err != nil { |
| 38 | return "", err |
| 39 | } |
| 40 | if err := os.Rename(tmp, final); err != nil { |
| 41 | _ = os.Remove(tmp) |
| 42 | return "", err |
| 43 | } |
| 44 | return final, nil |
| 45 | } |
| 46 | |
| 47 | // List returns spooled file paths sorted oldest-first. |
| 48 | func (s *Spool) List() ([]string, error) { |