{"id":47816860,"url":"https://github.com/hayabusa-cloud/sess","last_synced_at":"2026-04-03T18:44:55.271Z","repository":{"id":340508125,"uuid":"1160039114","full_name":"hayabusa-cloud/sess","owner":"hayabusa-cloud","description":"Session-typed protocols for Go via algebraic effects","archived":false,"fork":false,"pushed_at":"2026-02-25T06:27:42.000Z","size":60,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-02-25T11:57:49.355Z","etag":null,"topics":["algebraic-effects","golang","session-types"],"latest_commit_sha":null,"homepage":"https://code.hybscloud.com/","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/hayabusa-cloud.png","metadata":{"files":{"readme":"README.es.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":"hayabusa-cloud"}},"created_at":"2026-02-17T13:22:48.000Z","updated_at":"2026-02-25T06:22:29.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/hayabusa-cloud/sess","commit_stats":null,"previous_names":["hayabusa-cloud/sess"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/hayabusa-cloud/sess","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hayabusa-cloud%2Fsess","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hayabusa-cloud%2Fsess/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hayabusa-cloud%2Fsess/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hayabusa-cloud%2Fsess/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/hayabusa-cloud","download_url":"https://codeload.github.com/hayabusa-cloud/sess/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hayabusa-cloud%2Fsess/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31370203,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-03T17:53:18.093Z","status":"ssl_error","status_checked_at":"2026-04-03T17:53:17.617Z","response_time":107,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["algebraic-effects","golang","session-types"],"created_at":"2026-04-03T18:44:52.444Z","updated_at":"2026-04-03T18:44:55.264Z","avatar_url":"https://github.com/hayabusa-cloud.png","language":"Go","readme":"[![Go Reference](https://pkg.go.dev/badge/code.hybscloud.com/sess.svg)](https://pkg.go.dev/code.hybscloud.com/sess)\n[![Go Report Card](https://goreportcard.com/badge/github.com/hayabusa-cloud/sess)](https://goreportcard.com/report/github.com/hayabusa-cloud/sess)\n[![Coverage Status](https://codecov.io/gh/hayabusa-cloud/sess/graph/badge.svg)](https://codecov.io/gh/hayabusa-cloud/sess)\n[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)\n\n[English](README.md) | [简体中文](README.zh-CN.md) | **Español** | [日本語](README.ja.md) | [Français](README.fr.md)\n\n# sess\n\nProtocolos de comunicacion con tipos de sesion via efectos algebraicos sobre [kont](https://code.hybscloud.com/kont).\n\n## Descripcion General\n\nLos tipos de sesion asignan un tipo a cada paso de un protocolo de comunicacion. Cada operacion — enviar, recibir, seleccionar, ofrecer, cerrar — tiene tipos seguros individualmente mediante genericos de Go, y la composicion de protocolos dentro de un mismo endpoint es segura en tipos. La dualidad (correspondencia de operaciones entre endpoints) es responsabilidad del programador: el programador escribe protocolos duales, y las discrepancias se manifiestan en tiempo de ejecucion como fallos de asercion de tipo o deadlocks.\n\n`sess` codifica los tipos de sesion como efectos algebraicos evaluados por el sistema de efectos [kont](https://code.hybscloud.com/kont). Cada paso del protocolo — enviar, recibir, seleccionar, ofrecer, cerrar — es un efecto que suspende la computacion hasta que el transporte completa la operacion. El transporte retorna `iox.ErrWouldBlock` en las fronteras computacionales, permitiendo a los bucles de eventos proactor (ej., `io_uring`) multiplexar la ejecucion sin bloquear hilos.\n\nDos APIs equivalentes: Cont (basado en closures, composicion directa) y Expr (basado en marcos, cero asignaciones amortizadas para rutas criticas).\n\n## Instalacion\n\n```bash\ngo get code.hybscloud.com/sess\n```\n\nRequiere Go 1.26+.\n\n## Operaciones de Sesion\n\nCada operacion tiene un dual. Cuando un endpoint realiza una operacion, el otro debe realizar su dual.\n\n| Operacion | Dual | ¿Suspende? |\n|-----------|------|------------|\n| `Send[T]` — enviar un valor | `Recv[T]` — recibir un valor | `iox.ErrWouldBlock` |\n| `SelectL` / `SelectR` — elegir una rama | `Offer` — seguir la eleccion del par | `iox.ErrWouldBlock` |\n| `Close` — finalizar la sesion | `Close` | Nunca |\n\n## Uso\n\nUse `Run` para el prototipado y la validación de protocolos. Use `Exec` para endpoints administrados externamente. Use la API Expr (`RunExpr`/`ExecExpr`) para el control de stepping o para minimizar la sobrecarga de asignación en rutas críticas.\n\n### Envio y Recepcion\n\nUn lado envia un valor; el lado dual lo recibe.\n\n```go\nclient := sess.SendThen(42, sess.CloseDone(\"ok\"))\nserver := sess.RecvBind(func(n int) kont.Eff[string] {\n    return sess.CloseDone(fmt.Sprintf(\"got %d\", n))\n})\na, b := sess.Run(client, server) // \"ok\", \"got 42\"\n```\n\nEquivalente Expr: `ExprSendThen`, `ExprRecvBind`, `ExprCloseDone`, `RunExpr`.\n\n### Ramificacion\n\nUn lado selecciona una rama; el lado dual ofrece ambas ramas y sigue la seleccion.\n\n```go\nclient := sess.SelectLThen(sess.SendThen(1, sess.CloseDone(\"left\")))\nserver := sess.OfferBranch(\n    func() kont.Eff[string] {\n        return sess.RecvBind(func(n int) kont.Eff[string] {\n            return sess.CloseDone(fmt.Sprintf(\"left %d\", n))\n        })\n    },\n    func() kont.Eff[string] { return sess.CloseDone(\"right\") },\n)\na, b := sess.Run(client, server)\n```\n\n### Protocolos Recursivos\n\nLos protocolos que se repiten usan `Loop` con `Either`: `Left` continua el bucle, `Right` termina.\n\n```go\ncounter := sess.Loop(0, func(i int) kont.Eff[kont.Either[int, string]] {\n    if i \u003e= 3 {\n        return sess.CloseDone(kont.Right[int, string](\"done\"))\n    }\n    return sess.SendThen(i, kont.Pure(kont.Left[int, string](i+1)))\n})\n```\n\n### Delegacion\n\nTransfiera un endpoint a un tercero enviandolo; acepte la delegacion recibiendolo.\n\n```go\ndelegator := sess.SendThen(endpoint, sess.CloseDone(\"delegated\"))\nacceptor := sess.RecvBind(func(ep *sess.Endpoint) kont.Eff[string] {\n    return sess.CloseDone(\"accepted\")\n})\n```\n\n### Paso a Paso\n\nPara bucles de eventos proactor (ej., `io_uring`), `Step` y `Advance` evaluan un efecto a la vez. A diferencia de `Run` y `Exec` — que esperan sincronamente el progreso — la API de stepping devuelve `iox.ErrWouldBlock` al llamador, permitiendo al bucle de eventos reprogramar.\n\n```go\nep, _ := sess.New()\nprotocol := sess.ExprSendThen(42, sess.ExprCloseDone[struct{}](struct{}{}))\n_, susp := sess.Step[struct{}](protocol)\n// In a proactor event loop (e.g., io_uring), yield on boundary:\n_, nextSusp, err := sess.Advance(ep, susp)\nif err != nil {\n    return susp // yield to event loop, reschedule when ready\n}\nsusp = nextSusp\n```\n\n### Manejo de Errores\n\nComponga protocolos de sesion con efectos de error. `Throw` cortocircuita el protocolo y descarta la suspension pendiente.\n\n```go\nclientResult, serverResult := sess.RunError[string, string, string](client, server)\n// Either[string, string]: Right en exito, Left en Throw\n```\n\n## Modelo de Ejecucion\n\n| Funcion | Descripcion |\n|---------|-------------|\n| `Run` / `RunExpr` | Ejecutar ambos lados en un goroutine — crea un par de endpoints internamente |\n| `Exec` / `ExecExpr` | Ejecutar un lado en un endpoint pre-creado |\n| `Step` + `Advance` | Evalua un efecto a la vez, para bucles de eventos externos |\n\n**Cont vs Expr**: Cont se basa en closures y es sencillo de componer. Expr se basa en marcos con cero asignaciones amortizadas, adecuado para rutas criticas.\n\n## API\n\n| Categoria | Cont | Expr |\n|-----------|------|------|\n| Constructores | `SendThen`, `RecvBind`, `CloseDone`, `SelectLThen`, `SelectRThen`, `OfferBranch` | `ExprSendThen`, `ExprRecvBind`, `ExprCloseDone`, `ExprSelectLThen`, `ExprSelectRThen`, `ExprOfferBranch` |\n| Recursion | `Loop` | `ExprLoop` |\n| Ejecucion | `Exec`, `Run` | `ExecExpr`, `RunExpr` |\n| Ejecucion con errores | `ExecError`, `RunError` | `ExecErrorExpr`, `RunErrorExpr` |\n| Paso a paso | | `Step`, `Advance`, `StepError`, `AdvanceError` |\n| Puente | `Reify` (Cont→Expr), `Reflect` (Expr→Cont) | |\n| Transporte | `New` → `(*Endpoint, *Endpoint)` | |\n\n## References\n\n- Kohei Honda. \"Types for Dyadic Interaction.\" In *CONCUR 1993* (LNCS 715), pp. 509-523. Springer, 1993. https://doi.org/10.1007/3-540-57208-2_35\n- Kohei Honda, Vasco T. Vasconcelos, Makoto Kubo. \"Language Primitives and Type Discipline for Structured Communication-Based Programming.\" In *ESOP 1998* (LNCS 1381), pp. 122-138. Springer, 1998. https://doi.org/10.1007/BFb0053567\n- Philip Wadler. \"Propositions as Sessions.\" *Journal of Functional Programming* 24(2-3):384-418, 2014. https://doi.org/10.1017/S095679681400001X\n- Dominic A. Orchard, Nobuko Yoshida. \"Effects as Sessions, Sessions as Effects.\" In *POPL 2016*, pp. 568-581. https://doi.org/10.1145/2837614.2837634\n- Sam Lindley, J. Garrett Morris. \"Lightweight Functional Session Types.\" In *Behavioural Types: From Theory to Tools*, pp. 265-286, 2017 (first published year; DOI metadata date is 2022-09-01). https://doi.org/10.1201/9781003337331-12\n- Simon Fowler, Sam Lindley, J. Garrett Morris, Sara Decova. \"Exceptional Asynchronous Session Types: Session Types without Tiers.\" *Proc. ACM Program. Lang.* 3(POPL):28:1-28:29, 2019. https://doi.org/10.1145/3290341\n\n## Dependencias\n\n- [code.hybscloud.com/kont](https://code.hybscloud.com/kont) — Continuaciones delimitadas y efectos algebraicos\n- [code.hybscloud.com/iox](https://code.hybscloud.com/iox) — Semantica no bloqueante (`ErrWouldBlock`, `Backoff`)\n- [code.hybscloud.com/lfq](https://code.hybscloud.com/lfq) — Colas FIFO sin bloqueo\n\n## Licencia\n\nMIT — ver [LICENSE](LICENSE).\n\n©2026 [Hayabusa Cloud Co., Ltd.](https://code.hybscloud.com)\n","funding_links":["https://github.com/sponsors/hayabusa-cloud"],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhayabusa-cloud%2Fsess","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhayabusa-cloud%2Fsess","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhayabusa-cloud%2Fsess/lists"}