aboutsummaryrefslogtreecommitdiff
path: root/protocol/v0v1/server/session.go
diff options
context:
space:
mode:
Diffstat (limited to 'protocol/v0v1/server/session.go')
-rw-r--r--protocol/v0v1/server/session.go88
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()
+}