diff options
| author | 2026-03-07 14:24:05 +0800 | |
|---|---|---|
| committer | 2026-03-07 17:01:46 +0800 | |
| commit | 4b8d39764f9b54ea3090d0fea92a23025dbea30d (patch) | |
| tree | caa6e408c4ea625afcbb1b4aa4fb9e945f46994b /protocol/v0v1/server/session.go | |
| parent | refstore: Split files (diff) | |
| signature | No signature | |
protocol: Add v0v1 server protocol and its receivepack subprotocol
Diffstat (limited to 'protocol/v0v1/server/session.go')
| -rw-r--r-- | protocol/v0v1/server/session.go | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/protocol/v0v1/server/session.go b/protocol/v0v1/server/session.go new file mode 100644 index 00000000..98ed199c --- /dev/null +++ b/protocol/v0v1/server/session.go @@ -0,0 +1,88 @@ +package server + +import ( + "io" + + "codeberg.org/lindenii/furgit/format/pktline" + "codeberg.org/lindenii/furgit/format/sideband64k" + "codeberg.org/lindenii/furgit/objectid" +) + +// Options configures one server-side v0/v1 session. +type Options struct { + // Version selects protocol v0 or v1 framing. + Version Version + // Algorithm is the repository object ID algorithm for this session. + Algorithm objectid.Algorithm +} + +// Session is one stateful server-side v0/v1 server protocol session. +type Session struct { + dec *pktline.Decoder + enc *pktline.Encoder + sideband *sideband64k.Encoder + opts Options + useSideBand bool +} + +// NewSession creates one v0/v1 server session over r and w. +func NewSession(r io.Reader, w pktline.WriteFlusher, opts Options) *Session { + return &Session{ + dec: pktline.NewDecoder(r, pktline.ReadOptions{}), + enc: pktline.NewEncoder(w), + sideband: sideband64k.NewEncoder(w), + opts: opts, + } +} + +// Algorithm returns the session object ID algorithm. +func (session *Session) Algorithm() objectid.Algorithm { + return session.opts.Algorithm +} + +// ReadFrame reads one low-level pkt-line frame from the session input. +func (session *Session) ReadFrame() (Frame, error) { + return session.dec.ReadFrame() +} + +// EnableSideBand64K enables side-band-64k output framing for subsequent data, +// progress, error, and flush writes. +func (session *Session) EnableSideBand64K() { + session.useSideBand = true +} + +// WriteData writes one primary output packet. +func (session *Session) WriteData(p []byte) error { + if session.useSideBand { + return session.sideband.WriteData(p) + } + + return session.enc.WriteData(p) +} + +// WriteProgress writes one progress packet. +func (session *Session) WriteProgress(p []byte) error { + if !session.useSideBand { + return ErrSideBandNotEnabled + } + + return session.sideband.WriteProgress(p) +} + +// WriteError writes one fatal error packet. +func (session *Session) WriteError(p []byte) error { + if !session.useSideBand { + return ErrSideBandNotEnabled + } + + return session.sideband.WriteError(p) +} + +// WriteFlush writes one trailing flush packet. +func (session *Session) WriteFlush() error { + if session.useSideBand { + return session.sideband.WriteFlush() + } + + return session.enc.WriteFlush() +} |
