{"id":18917788,"url":"https://github.com/tus/ietf-hackathon","last_synced_at":"2026-03-12T00:30:17.318Z","repository":{"id":204734390,"uuid":"712308057","full_name":"tus/ietf-hackathon","owner":"tus","description":"Repository for the Resumable Upload projects at the IETF 118 Hackathon","archived":false,"fork":false,"pushed_at":"2023-11-05T13:28:02.000Z","size":23,"stargazers_count":1,"open_issues_count":0,"forks_count":1,"subscribers_count":5,"default_branch":"main","last_synced_at":"2024-12-31T15:34:58.206Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"C","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/tus.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"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}},"created_at":"2023-10-31T07:59:39.000Z","updated_at":"2023-11-05T13:20:08.000Z","dependencies_parsed_at":"2023-11-05T13:32:36.286Z","dependency_job_id":null,"html_url":"https://github.com/tus/ietf-hackathon","commit_stats":null,"previous_names":["tus/ietf-hackathon"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tus%2Fietf-hackathon","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tus%2Fietf-hackathon/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tus%2Fietf-hackathon/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tus%2Fietf-hackathon/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tus","download_url":"https://codeload.github.com/tus/ietf-hackathon/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":239914930,"owners_count":19717760,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":[],"created_at":"2024-11-08T10:28:10.105Z","updated_at":"2026-03-12T00:30:15.235Z","avatar_url":"https://github.com/tus.png","language":"C","funding_links":[],"categories":[],"sub_categories":[],"readme":"# IETF 118 Hackathon\n\nThe Internet Engineering Task Force (IETF) is holding a hackathon to encourage\ndevelopers and subject-matter experts to discuss, collaborate, and develop\nutilities, ideas, sample code, and solutions that show practical implementations\nof IETF standards.\n\nThis is the repository for the [Resumable Uploads for HTTP][rufh] (RUFH)\nhackathon project to hold the context and individual challenges. The project is\nbeginner-friendly for those who are new to the IETF or new to the Hackathon.\n\n## Prerequisites\n\n- Familiarity with either JavaScript (runtimes), HTTP proxies, or building CLI\n  tools.\n- Optionally, awareness of [tus][]. RUFH is an evolution of [tus][], an existing open\n  protocol for resumable uploads. As such you can look at practical\n  implementations, such as the official [tus-js-client][] and [tusd][], a\n  reference implementation in Go with [support for the new IETF\n  protocol][tusd-draft].\n\n## Resources\n\n- [The IETF hackathon wiki][wiki] contains organizational details for the hackathon.\n- [The Resumable Uploads for HTTP draft][rufh] (RUFH) is the central document for our\n  project.\n- [draft-example][] contains several client and server implementation for RUFH,\n  targeting the current or previous versions of the draft.\n\n## Challenges\n\n### Resumability polyfill for the Fetch API in browsers\n\nIn the current state of Resumable Uploads for HTTP, we would still need a small\nlibrary to use it in the browser as the [Fetch][] API does not support resumable\nuploads. Fetch falls under the WHATWG and there is an [issue][tus-fetch] to\ndiscuss supporting resumable uploads but there is no timeline on that front.\n\n#### Solution\n\nTo move things along and to have a plug-and-play alternative, we want to explore\ncreating a [polyfill][] for the [Fetch][] API for resumable uploads. It could help\nto find a suitable API for resumable upload in browsers.\n\n#### Requirements\n\n- A new `resumable` option (`boolean`, default: `false`). Open to alternative\n  APIs.\n\n```js\nconst response = await fetch(url, {\n  method: \"POST\",\n  body: file,\n  resumable: true,\n});\n```\n\n- When the request completes the response should be provided\n- Uploads should be pausable and resumable.\n- The current [Fetch][] API does not expose informational responses (1XX)\n  to the user. The polyfill should work around this by using `Upload-Complete: ?0`\n  to separate the upload creation from the data transfer in multiple requests.\n\n### Plugins for popular HTTP proxies for handling resumable uploads\n\nIn some cases people would like to handle files themselves through regular\nrequests rather than having a separate (or integrable) RUFH server, which would\nwrite it to disk or to some storage provider. But they do want reliable,\nresumable uploads without reading the files again yourself.\n\nIn other cases a platform, such as WordPress, can not easily be extended to handle\nresumable uploads but could receive a traditional request with a file.\n\nThe [Swift NIO implementation][] uses a similar approach.\n\n#### Solution\n\nPlugins for popular HTTP proxies, which handle resumability with buffering. Once\nthe upload is complete, it will forward the upload as a regular HTTP request to\nyour backend.\n\n[Nginx][] and [HAProxy][] seem like a good place to start, but we‘re open to\nother contributions.\n\n### CLI program to test if a server conforms to the spec\n\nImplementing RUFH (or [tus][]) means re-implementing the same kind of end-to-end\ntests over and over again. To ensure compatibility and interoperability between\nservers and clients, a tool for checking conformity to the protocol is helpful.\n\n#### Solution\n\nA CLI program which runs end-to-end tests against a server.\n\n#### Requirements\n\n- Lightweight. Little or no dependencies.\n- Single binary. People should not have to install a language and package\n  manager to get the program, such as needing a `package.json` with Node.js\n- Flags to only run subsets of tests so you can incrementally build your server\n  to test against\n- Optional: separate built-in tests for [tus][] v1. tus already has a big\n  ecosystem of clients and servers and users such as Cloudfare, Supabase, Vimeo,\n  and many others. Every server implementation has to write their own end-to-end\n  tests, which is sometimes done well but not always. The ecosystem would\n  greatly benefit from a single source of truth for tests.\n\n### JavaScript runtime compatibility\n\nThere is a rise in JavaScript runtimes, such as Deno, Bun, Cloudfare Workers,\nAWS Lambda, and more. These should have minimal differences, but the devil is in\nthe details and we need to know if the current version of RUFH works in most\nruntimes, particularly on the edge.\n\n#### Solution\n\nA minimal proof of concept of RUFH in JavaScript with different adapters for\nruntimes.\n\n\u003c!-- definitions --\u003e\n\n[rufh]: https://datatracker.ietf.org/doc/draft-ietf-httpbis-resumable-upload/02/\n[wiki]: https://wiki.ietf.org/en/meeting/118/hackathon\n[tus]: https://tus.io/\n[tus-js-client]: https://github.com/tus/tus-js-client/\n[tusd]: https://github.com/tus/tusd/\n[tusd-draft]:\n  https://tus.io/blog/2023/09/20/tusd-200#support-for-the-new-ietf-protocol\n[nginx]: https://www.nginx.com/\n[haproxy]: https://www.haproxy.com/\n[fetch]: https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API\n[tus-fetch]: https://github.com/whatwg/fetch/issues/1626\n[polyfill]: https://developer.mozilla.org/en-US/docs/Glossary/Polyfill\n[draft-example]: https://github.com/tus/draft-example\n[Swift NIO implementation]: https://github.com/tus/draft-example/tree/main/servers/swift-nio\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftus%2Fietf-hackathon","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftus%2Fietf-hackathon","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftus%2Fietf-hackathon/lists"}