| 308 | } |
| 309 | |
| 310 | func restoreEvents[E any](dir string) []E { |
| 311 | dirEntries, err := os.ReadDir(dir) |
| 312 | if err != nil { |
| 313 | return nil |
| 314 | } |
| 315 | |
| 316 | var events []E |
| 317 | for _, entry := range dirEntries { |
| 318 | if !entry.Type().IsRegular() || filepath.Ext(entry.Name()) != ".json" { |
| 319 | continue |
| 320 | } |
| 321 | |
| 322 | path := filepath.Join(dir, entry.Name()) |
| 323 | data, err := os.ReadFile(path) |
| 324 | // Always delete the file so we don't end up with an infinitely growing |
| 325 | // backlog of errors. |
| 326 | _ = os.Remove(path) |
| 327 | if err != nil { |
| 328 | continue |
| 329 | } |
| 330 | |
| 331 | var event E |
| 332 | if err := json.Unmarshal(data, &event); err != nil { |
| 333 | continue |
| 334 | } |
| 335 | events = append(events, event) |
| 336 | } |
| 337 | return events |
| 338 | } |
| 339 | |
| 340 | func bufferEvent(file string, event any) { |
| 341 | data, err := json.Marshal(event) |