// Package jsonl 提供 JSONL 的**容忍读取**:坏行跳过、**不设行长上限**。 // // 为什么不直接用 bufio.Scanner:它有 64KB(bufio.MaxScanTokenSize)的默认行长上限, // 超限时 Scan() 直接停下、Err() 返回 "bufio.Scanner: token too long" —— 整个文件 // 于是读不出来。这不是理论风险:20260916 有个会话因为一条 assistant 消息带 204KB // 的 reasoning,整份 763KB 的会话在 WebUI 里**直接消失**(列表按"读不出来就跳过" // 处理),历史也打不开。 // // 所以这里用 bufio.Reader.ReadBytes 按行读,只在内存里持有当前这一行。 package jsonl import ( "bufio" "bytes" "io" ) // Each 逐行调用 fn(只传非空行,已去掉行尾换行)。坏行由 fn 自行决定怎么处理, // 本函数不做解析判断。 // // 返回的 error 只表示**读取失败**(IO),不含内容问题——内容层面的跳过是 fn 的事。 // 读到 EOF 视为正常结束(最后一行没有换行符也算)。 func Each(r io.Reader, fn func(line []byte)) error { br := bufio.NewReader(r) for { line, err := br.ReadBytes('\n') if len(line) > 0 { if trimmed := bytes.TrimRight(line, "\r\n"); len(trimmed) > 0 { fn(trimmed) } } if err != nil { if err == io.EOF { return nil } return err } } }