{"id":15112316,"url":"https://github.com/discord/loqui","last_synced_at":"2025-10-21T14:41:49.442Z","repository":{"id":37182442,"uuid":"74337880","full_name":"discord/loqui","owner":"discord","description":"RPC Transport Layer - with minimal bullshit.","archived":true,"fork":false,"pushed_at":"2022-06-17T01:09:24.000Z","size":879,"stargazers_count":220,"open_issues_count":16,"forks_count":29,"subscribers_count":186,"default_branch":"master","last_synced_at":"2025-09-18T03:19:23.481Z","etag":null,"topics":["elixir","golang","python","rpc"],"latest_commit_sha":null,"homepage":"","language":"Rust","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/discord.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}},"created_at":"2016-11-21T07:34:31.000Z","updated_at":"2025-06-29T13:17:25.000Z","dependencies_parsed_at":"2022-06-24T02:54:06.122Z","dependency_job_id":null,"html_url":"https://github.com/discord/loqui","commit_stats":null,"previous_names":["discordapp/loqui","hammerandchisel/loqui"],"tags_count":13,"template":false,"template_full_name":null,"purl":"pkg:github/discord/loqui","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/discord%2Floqui","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/discord%2Floqui/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/discord%2Floqui/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/discord%2Floqui/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/discord","download_url":"https://codeload.github.com/discord/loqui/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/discord%2Floqui/sbom","scorecard":{"id":344591,"data":{"date":"2025-08-11","repo":{"name":"github.com/discord/loqui","commit":"8d394a7951fd3a82d109becc1aebbd9e7ccc894a"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.7,"checks":[{"name":"Maintained","score":0,"reason":"project is archived","details":["Warn: Repository is archived."],"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Code-Review","score":7,"reason":"Found 3/4 approved changesets -- score normalized to 7","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 29 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":0,"reason":"27 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: PYSEC-2023-177 / GHSA-x7m3-jprg-wc5g","Warn: Project is vulnerable to: RUSTSEC-2025-0012","Warn: Project is vulnerable to: RUSTSEC-2020-0159","Warn: Project is vulnerable to: RUSTSEC-2019-0036 / RUSTSEC-2020-0036 / GHSA-jq66-xh47-j9f3 / GHSA-r98r-j25q-rmpr","Warn: Project is vulnerable to: RUSTSEC-2020-0061 / GHSA-p9m5-3hj7-cp5r","Warn: Project is vulnerable to: RUSTSEC-2020-0060 / GHSA-r93v-9p5q-vhpf","Warn: Project is vulnerable to: RUSTSEC-2020-0062 / GHSA-5r9g-j7jj-hw6c","Warn: Project is vulnerable to: RUSTSEC-2020-0080","Warn: Project is vulnerable to: RUSTSEC-2020-0078 / GHSA-458v-4hrf-g3m4 / GHSA-c79c-gwph-gqfm","Warn: Project is vulnerable to: RUSTSEC-2020-0016","Warn: Project is vulnerable to: RUSTSEC-2019-0035 / GHSA-mmc9-pwm7-qj5w","Warn: Project is vulnerable to: RUSTSEC-2020-0071 / GHSA-wcg3-cvx6-7396","Warn: Project is vulnerable to: RUSTSEC-2021-0124 / GHSA-fg7r-2g4j-5cgr","Warn: Project is vulnerable to: RUSTSEC-2023-0005 / GHSA-4q83-7cq4-p6wg","Warn: Project is vulnerable to: GHSA-rr8g-9fpq-6wmg","Warn: Project is vulnerable to: RUSTSEC-2025-0023","Warn: Project is vulnerable to: RUSTSEC-2021-0093 / GHSA-pqqp-xmhj-wgcw","Warn: Project is vulnerable to: RUSTSEC-2022-0021 / GHSA-6888-wf7j-34jq","Warn: Project is vulnerable to: RUSTSEC-2022-0041 / GHSA-qc84-gqf4-9926","Warn: Project is vulnerable to: RUSTSEC-2020-0070 / GHSA-5wg8-7c9q-794v / GHSA-gmv4-vmx3-x9f3 / GHSA-hj9h-wrgg-hgmx / GHSA-ppj3-7jw3-8vc4 / GHSA-vh4p-6j7g-f4j9","Warn: Project is vulnerable to: RUSTSEC-2019-0011 / GHSA-rh89-x75f-rh3c","Warn: Project is vulnerable to: RUSTSEC-2023-0045 / GHSA-wfg4-322g-9vqv","Warn: Project is vulnerable to: RUSTSEC-2022-0040 / GHSA-9qxh-258v-666c","Warn: Project is vulnerable to: RUSTSEC-2019-0012 / GHSA-69gw-hgj3-45m7","Warn: Project is vulnerable to: RUSTSEC-2019-0009 / GHSA-mm7v-vpv8-xfc3","Warn: Project is vulnerable to: RUSTSEC-2018-0018 / GHSA-55m5-whcv-c49c / GHSA-66p5-j55p-32r9","Warn: Project is vulnerable to: RUSTSEC-2021-0003 / GHSA-43w2-9j62-hq99"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-18T06:45:01.247Z","repository_id":37182442,"created_at":"2025-08-18T06:45:01.247Z","updated_at":"2025-08-18T06:45:01.247Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":277170745,"owners_count":25773061,"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","status":"online","status_checked_at":"2025-09-26T02:00:09.010Z","response_time":78,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["elixir","golang","python","rpc"],"created_at":"2024-09-26T00:44:02.643Z","updated_at":"2025-09-27T15:30:26.995Z","avatar_url":"https://github.com/discord.png","language":"Rust","funding_links":[],"categories":["Rust"],"sub_categories":[],"readme":"# This project is no longer maintained\n\nThe gRPC ecosystem has advanced since we've written this project, and we've moved to using gRPC instead.\n\n# Loqui\nLoqui is a transport that implements a very simple framing protocol over a raw socket. The framing protocol is similar\nto http2, except that we've chosen deliberately to not implement a bunch of stuff, like flow control.\nInstead, the RPC implements very simple request and response semantics. For our purposes, requests and responses are both adequately small so we can just send the entire payload in one frame, instead of having streams (like http2 does).\n\nThe RPC protocol does not care how you encode your data - treating all data passed through it as opaque binaries. However,\nthe protocol does support encoding negotiation, and compression where the client sends the server a list of encodings it can speak and compression algos it can use, and the server picks the encoding and compression it wants to use. Compression can be toggled on a per frame basis with frame flags.\n\n# The protocol\nThe protocol is 9 opcodes, with a binary frame format.\n\nEach frame starts with the opcode as an unsigned 8 bit integer (`uint8`). The opcodes are:\n\n| Name              | Value | Client or Server | Has Payload ? |\n| ----------------- | ----- | ---------------- | ------------- |\n| `HELLO`           | `1`   | Client           | Yes           |\n| `HELLO_ACK`       | `2`   | Server           | Yes           |\n| `PING`            | `3`   | Both             | No            |\n| `PONG`            | `4`   | Both             | No            |\n| `REQUEST`         | `5`   | Client           | Yes           |\n| `RESPONSE`        | `6`   | Server           | Yes           |\n| `PUSH`            | `7`   | Both             | Yes           |\n| `GOAWAY`          | `8`   | Server           | Yes           |\n| `ERROR`           | `9`   | Server           | Yes           |\n\nFollowing the opcode is the frame header - and then if applicable - the payload.\nAll integers are encoded in `Big Endian` format.\n\n## `Hello`\nThe hello opcode is sent by the client to the server upon connecting. It advertises the client's Loqui version and a payload containing a a list of connection settings. Settings are in order and split by `|`and a specific setting can have a list of values split by `,`. In our current version the 2 settings are **supported encodings** and **supported compressions**.\n\n| Offset | Type    | Description     |\n| ------ | ------- | --------------- |\n| `0`    | uint8   | opcode          |\n| `1`    | uint8   | flags           |\n| `2`    | uint8   | Loqui Version   |\n| `3`    | uint32  | Payload Size    |\n| `7`    | binary  | Payload Data    |\n\n\n\n## `HelloAck`\nThe helloAck opcode is sent by the server upon receiving hello from the client. It contains the interval in which the server will ping (and that it expects the client to ping the server) - and the supported encodings within the payload data, contains the **encoding** and **compression** separated by `|`.\n\n| Offset | Type    | Description       |\n| ------ | ------- | ----------------- |\n| `0`    | uint8   | opcode            |\n| `1`    | uint8   | flags             |\n| `2`    | uint32  | Ping Interval(ms) |\n| `6`    | uint32  | Payload Size      |\n| `10`   | binary  | Payload Data      |\n\n\n## `Ping/Pong`\nPing and pong are sent back between the client and server. Either end can initiate a ping - and both ends are expected\nto reply to a ping with a pong, with the seq that the remote end pinged with.\n\n| Offset | Type     | Description      |\n| ------ | -------- | -----------------|\n| `0`    | uint8    | opcode           |\n| `1`    | uint8    | flags            |\n| `2`    | uint32   | Sequence Num     |\n\n## `Request/Response`\nThe client can send requests to the server. The server is expected to reply with a `RESPONSE` payload with the sequence set to\nrequest sequence.\n\n| Offset | Type     | Description      |\n| ------ | -------- | -----------------|\n| `0`    | uint8    | opcode           |\n| `1`    | uint8    | flags            |\n| `2`    | uint32   | Sequence Num     |\n| `6`    | uint32   | Payload Size     |\n| `10`   | binary   | Payload Data     |\n\n## `Push`\nThe client and server can send pushes to their remote connection. These are good for one off messages to\nthe service that do not need to be acknowledged.\n\n| Offset | Type     | Description      |\n| ------ | -------- | -----------------|\n| `0`    | uint8    | opcode           |\n| `1`    | uint8    | flags            |\n| `2`    | uint32   | Payload Size     |\n| `6`    | binary   | Payload Data     |\n\n## `Go Away`\nThe server is getting ready to shut down the connection. It sends this opcode to tell the client end to finish sending\nrequests and to disconnect. The payload data can be empty, or a string with an error message. Or whatever else you want it to be.\n\n| Offset | Type     | Description      |\n| ------ | -------- | -----------------|\n| `0`    | uint8    | opcode           |\n| `1`    | uint8    | flags            |\n| `2`    | uint16   | close code       |\n| `4`    | uint32   | Payload Size     |\n| `8`    | binary   | Payload Data     |\n\n## `Error`\nThe server had an internal error processing a given request for a specific seq.\n\n| Offset | Type     | Description      |\n| ------ | -------- | -----------------|\n| `0`    | uint8    | opcode           |\n| `1`    | uint8    | flags            |\n| `2`    | uint32   | Sequence Num     |\n| `6`    | uint16   | error code       |\n| `8`    | uint32   | Payload Size     |\n| `12`   | binary   | Payload Data     |\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdiscord%2Floqui","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdiscord%2Floqui","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdiscord%2Floqui/lists"}