{"_id":"blind-relay","_rev":"10-2f6d78f7bf73f85747846d85b061c19c","name":"blind-relay","dist-tags":{"latest":"1.6.1"},"versions":{"1.3.0":{"name":"blind-relay","version":"1.3.0","author":{"name":"Holepunch"},"license":"Apache-2.0","_id":"blind-relay@1.3.0","maintainers":[{"name":"kasperisager","email":"kasperisager@hey.com"}],"homepage":"https://github.com/holepunchto/blind-relay#readme","bugs":{"url":"https://github.com/holepunchto/blind-relay/issues"},"dist":{"shasum":"ba53a224c1791efdb1a2d96454f5e8956e104c98","tarball":"https://registry.npmjs.org/blind-relay/-/blind-relay-1.3.0.tgz","fileCount":5,"integrity":"sha512-yPB4JDmJTbf/J7/jUJak17LWQJ4jwpuf5iAbJ4djVSzrtTKG75UidfTbDc7pSjq0qNdbh51WVxtND8ngWj2Mtw==","signatures":[{"sig":"MEUCICn+qV7NL2zc3SxSuULhZi5B37hEiqMLTyAawDiXSiEgAiEA9pLQBhWGUFo/Y99EAAVGaufkpZgnkK9X5I9j+6ps7Bc=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":24685},"main":"index.js","gitHead":"6949bc7c0ba45f3e53dc2f0c4dcf718efdc40553","scripts":{"test":"standard && brittle test.mjs"},"_npmUser":{"name":"kasperisager","email":"kasperisager@hey.com"},"repository":{"url":"git+https://github.com/holepunchto/blind-relay.git","type":"git"},"_npmVersion":"9.7.2","description":"Blind relay for UDX over Protomux channels","directories":{},"_nodeVersion":"20.4.0","dependencies":{"b4a":"^1.6.4","streamx":"^2.15.1","protomux":"^3.5.1","bits-to-bytes":"^1.3.0","compact-encoding":"^2.12.0","sodium-universal":"^4.0.0","compact-encoding-bitfield":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"brittle":"^3.2.1","hyperdht":"^6.6.1","standard":"^17.0.0","udx-native":"^1.6.1"},"_npmOperationalInternal":{"tmp":"tmp/blind-relay_1.3.0_1695976222972_0.9086033297194147","host":"s3://npm-registry-packages"}},"1.3.1":{"name":"blind-relay","version":"1.3.1","author":{"name":"Holepunch"},"license":"Apache-2.0","_id":"blind-relay@1.3.1","maintainers":[{"name":"kasperisager","email":"kasperisager@hey.com"}],"homepage":"https://github.com/holepunchto/blind-relay#readme","bugs":{"url":"https://github.com/holepunchto/blind-relay/issues"},"dist":{"shasum":"d046c749d45e60760a3bcfeec13670c15260db0b","tarball":"https://registry.npmjs.org/blind-relay/-/blind-relay-1.3.1.tgz","fileCount":5,"integrity":"sha512-GNOCAQG76WvN8e1k4C8UyQgfpSl8h2NiUgr6aFQJY/WKISvsU1flG0o3TJoUGn5K9uvtbEUtdulgikS1aYKbAQ==","signatures":[{"sig":"MEUCIGoGGIBPNkBkl56SUAIicxN2INtdq9SFZ9jY6ybgBGPWAiEA2XYK78xkLSYyOPjssWlbquelf9d8F7BBqIN5v1FocOk=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":24965},"main":"index.js","gitHead":"d045199bb5fbd9c1f7d575e84fcda30b47e9891c","scripts":{"test":"standard && brittle test.mjs"},"_npmUser":{"name":"kasperisager","email":"kasperisager@hey.com"},"repository":{"url":"git+https://github.com/holepunchto/blind-relay.git","type":"git"},"_npmVersion":"9.7.2","description":"Blind relay for UDX over Protomux channels","directories":{},"_nodeVersion":"20.4.0","dependencies":{"b4a":"^1.6.4","streamx":"^2.15.1","protomux":"^3.5.1","bits-to-bytes":"^1.3.0","compact-encoding":"^2.12.0","sodium-universal":"^4.0.0","compact-encoding-bitfield":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"brittle":"^3.2.1","hyperdht":"^6.6.1","standard":"^17.0.0","udx-native":"^1.6.1"},"_npmOperationalInternal":{"tmp":"tmp/blind-relay_1.3.1_1696490076762_0.1693869760041673","host":"s3://npm-registry-packages"}},"1.3.2":{"name":"blind-relay","version":"1.3.2","author":{"name":"Holepunch"},"license":"Apache-2.0","_id":"blind-relay@1.3.2","maintainers":[{"name":"kasperisager","email":"kasperisager@hey.com"}],"homepage":"https://github.com/holepunchto/blind-relay#readme","bugs":{"url":"https://github.com/holepunchto/blind-relay/issues"},"dist":{"shasum":"9991c2aa0acf9a42cd6605ab747080faafd3676b","tarball":"https://registry.npmjs.org/blind-relay/-/blind-relay-1.3.2.tgz","fileCount":5,"integrity":"sha512-RvM4TaBKUZC3dus2jXpjJ2pyHgQd+3/bfVKx8ztxY/AfCQoZHC7SDQA5r95UGBMdQ32iTsLxEl5MXiPEXbwr+w==","signatures":[{"sig":"MEQCIA7dMKFqoC90jjGITE1uxYluEffgBw7QAtYuk2FWzN4GAiBCPa4rlENr+g497S+9cgpjF7dRTXs0SJDwnAZZLz2JxQ==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":25892},"main":"index.js","gitHead":"9972021fab5fd0e4c135dfd1aed174cca047786d","imports":{"events":{"bare":"bare-events","default":"events"}},"scripts":{"test":"standard && brittle test.mjs"},"_npmUser":{"name":"kasperisager","email":"kasperisager@hey.com"},"repository":{"url":"git+https://github.com/holepunchto/blind-relay.git","type":"git"},"_npmVersion":"10.2.4","description":"Blind relay for UDX over Protomux channels","directories":{},"_nodeVersion":"21.4.0","dependencies":{"b4a":"^1.6.4","streamx":"^2.15.1","protomux":"^3.5.1","bare-events":"^2.2.0","bits-to-bytes":"^1.3.0","compact-encoding":"^2.12.0","sodium-universal":"^4.0.0","compact-encoding-bitfield":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"brittle":"^3.2.1","hyperdht":"^6.6.1","standard":"^17.0.0","udx-native":"^1.6.1"},"_npmOperationalInternal":{"tmp":"tmp/blind-relay_1.3.2_1707396765528_0.6708822859230539","host":"s3://npm-registry-packages"}},"1.3.3":{"name":"blind-relay","version":"1.3.3","author":{"name":"Holepunch"},"license":"Apache-2.0","_id":"blind-relay@1.3.3","maintainers":[{"name":"mafintosh","email":"mathiasbuus@gmail.com"},{"name":"kasperisager","email":"kasperisager@hey.com"}],"homepage":"https://github.com/holepunchto/blind-relay#readme","bugs":{"url":"https://github.com/holepunchto/blind-relay/issues"},"dist":{"shasum":"b9460fac1c2e8a8a326dbbb827b8c00339ed729f","tarball":"https://registry.npmjs.org/blind-relay/-/blind-relay-1.3.3.tgz","fileCount":5,"integrity":"sha512-J49HZaRLA+jgmIA+J01x0NzDtNMQVzuFfz7CnLLijIUMJkxTbaexIGI/tfk6LONcr/+INmgbS8gMLeuaRvfreA==","signatures":[{"sig":"MEQCIFuCxlAFRNa8p1Y5mq4uK+vgoxmVYmNYRlFLEupFQivjAiA4GnnfOz9fgAGIrK9HIWnXxxrd8hTPIewl/ETjOtSgpw==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":26699},"main":"index.js","gitHead":"11801acdf9e4cf1dfcbba930c5b36ce3022e0431","imports":{"events":{"bare":"bare-events","default":"events"}},"scripts":{"test":"standard && brittle test.mjs"},"_npmUser":{"name":"mafintosh","email":"mathiasbuus@gmail.com"},"repository":{"url":"git+https://github.com/holepunchto/blind-relay.git","type":"git"},"_npmVersion":"10.2.4","description":"Blind relay for UDX over Protomux channels","directories":{},"_nodeVersion":"20.11.1","dependencies":{"b4a":"^1.6.4","streamx":"^2.15.1","protomux":"^3.5.1","hypertrace":"^1.4.1","bare-events":"^2.2.0","bits-to-bytes":"^1.3.0","compact-encoding":"^2.12.0","sodium-universal":"^4.0.0","compact-encoding-bitfield":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"brittle":"^3.2.1","hyperdht":"^6.6.1","standard":"^17.0.0","udx-native":"^1.6.1"},"_npmOperationalInternal":{"tmp":"tmp/blind-relay_1.3.3_1710316577739_0.3186057506406257","host":"s3://npm-registry-packages"}},"1.4.0":{"name":"blind-relay","version":"1.4.0","author":{"name":"Holepunch"},"license":"Apache-2.0","_id":"blind-relay@1.4.0","maintainers":[{"name":"mafintosh","email":"mathiasbuus@gmail.com"},{"name":"kasperisager","email":"kasperisager@hey.com"}],"homepage":"https://github.com/holepunchto/blind-relay#readme","bugs":{"url":"https://github.com/holepunchto/blind-relay/issues"},"dist":{"shasum":"1c01263e9f9297c2f898668fcc1693fd816a8beb","tarball":"https://registry.npmjs.org/blind-relay/-/blind-relay-1.4.0.tgz","fileCount":5,"integrity":"sha512-6xt7fDfCs6eGmNNym6I9N42jmjcMQn2qwwOVnkP9ZnrkXFk6c4/tdO1xqRmDEzKzV8gigd+DVdCUG/RUYnen7Q==","signatures":[{"sig":"MEQCIBhZSyttq+aba06J8umEB7ossuWqyaR8/Ry2geBsZ3bUAiADzSVdYRDtxk0unz8/zqS8qinxI6RJFdqZFyBmJnJa4g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":25892},"main":"index.js","gitHead":"14f3673be76469e69908f1517aa6648a1dcccb79","imports":{"events":{"bare":"bare-events","default":"events"}},"scripts":{"test":"standard && brittle test.mjs"},"_npmUser":{"name":"mafintosh","email":"mathiasbuus@gmail.com"},"repository":{"url":"git+https://github.com/holepunchto/blind-relay.git","type":"git"},"_npmVersion":"10.9.0","description":"Blind relay for UDX over Protomux channels","directories":{},"_nodeVersion":"22.12.0","dependencies":{"b4a":"^1.6.4","streamx":"^2.15.1","protomux":"^3.5.1","bare-events":"^2.2.0","bits-to-bytes":"^1.3.0","compact-encoding":"^2.12.0","sodium-universal":"^5.0.0","compact-encoding-bitfield":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"brittle":"^3.2.1","hyperdht":"^6.6.1","standard":"^17.0.0","udx-native":"^1.6.1"},"_npmOperationalInternal":{"tmp":"tmp/blind-relay_1.4.0_1744483711261_0.4603992786207931","host":"s3://npm-registry-packages-npm-production"}},"1.5.0":{"name":"blind-relay","version":"1.5.0","author":{"name":"Holepunch"},"license":"Apache-2.0","_id":"blind-relay@1.5.0","maintainers":[{"name":"mafintosh","email":"mathiasbuus@gmail.com"}],"homepage":"https://github.com/holepunchto/blind-relay#readme","bugs":{"url":"https://github.com/holepunchto/blind-relay/issues"},"dist":{"shasum":"d69b61f91915e8bcde13228f5a9311a32b88b825","tarball":"https://registry.npmjs.org/blind-relay/-/blind-relay-1.5.0.tgz","fileCount":5,"integrity":"sha512-WwTaNv0Ea+L8PJq6KfQiwjuelyyDVDCV3Y8ym5cjoEBXjKK51oSy9Q3SHqSb1y2ddfz3yZZDvSg5xfN7ObayVw==","signatures":[{"sig":"MEYCIQDGOtpezzKOmS4zpRG9dxl+GmGwYxjhEgXlnbgLhDBzzAIhAOws7/PDDGUJgnYH/D8DhfiKVVT0MBpHlm06fZeJXwSt","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/blind-relay@1.5.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":28931},"main":"index.js","gitHead":"2f7c7dc455c39fd575d004900427d94ae03e211e","imports":{"events":{"bare":"bare-events","default":"events"}},"scripts":{"lint":"prettier --check . && lunte","test":"npm run test:bare","format":"prettier --write .","test:bare":"brittle-bare --coverage test.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:89d127b1-5c7e-4fa7-ab13-31fb4a8796d7"}},"repository":{"url":"git+https://github.com/holepunchto/blind-relay.git","type":"git"},"_npmVersion":"11.11.0","description":"Blind relay for UDX over Protomux channels","directories":{},"_nodeVersion":"24.14.1","dependencies":{"b4a":"^1.6.4","streamx":"^2.15.1","protomux":"^3.5.1","bare-events":"^2.2.0","bits-to-bytes":"^1.3.0","compact-encoding":"^2.12.0","sodium-universal":"^5.0.0","compact-encoding-bitfield":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"lunte":"^1.0.0","brittle":"^3.2.1","hyperdht":"^6.6.1","prettier":"^3.6.2","udx-native":"^1.6.1","prettier-config-holepunch":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/blind-relay_1.5.0_1777319614753_0.3133048557153013","host":"s3://npm-registry-packages-npm-production"}},"1.6.0":{"name":"blind-relay","version":"1.6.0","author":{"name":"Holepunch"},"license":"Apache-2.0","_id":"blind-relay@1.6.0","maintainers":[{"name":"mafintosh","email":"mathiasbuus@gmail.com"}],"homepage":"https://github.com/holepunchto/blind-relay#readme","bugs":{"url":"https://github.com/holepunchto/blind-relay/issues"},"dist":{"shasum":"1c1c494be3bc4743d9de544ea4f87ab3c6db918f","tarball":"https://registry.npmjs.org/blind-relay/-/blind-relay-1.6.0.tgz","fileCount":5,"integrity":"sha512-4A54l0fUHJ8sZvRwaLJln9znpPAlbxTcXocemAtFCaZfJjI2CRhG0ue0wAtiYLur426g9wK7u8677kgz8ggS+g==","signatures":[{"sig":"MEUCIAC50reop7fgZtu65TnwPnkbqf1m8rElSbM1DYWesmbaAiEA7rSemHb/PorfIuyXWQBIF7Zmg3GTGHY3rmJ1exCxBD4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/blind-relay@1.6.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":28930},"main":"index.js","gitHead":"e487269c058972871fa0987a91f40a72d71ee9dd","imports":{"events":{"bare":"bare-events","default":"events"}},"scripts":{"lint":"prettier --check . && lunte","test":"npm run test:bare","format":"prettier --write .","test:bare":"brittle-bare --coverage test.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:89d127b1-5c7e-4fa7-ab13-31fb4a8796d7"}},"repository":{"url":"git+https://github.com/holepunchto/blind-relay.git","type":"git"},"_npmVersion":"11.11.0","description":"Blind relay for UDX over Protomux channels","directories":{},"_nodeVersion":"24.14.1","dependencies":{"b4a":"^1.6.4","streamx":"^2.15.1","protomux":"^3.5.1","bare-events":"^2.2.0","bits-to-bytes":"^1.3.0","compact-encoding":"^3.0.0","sodium-universal":"^5.0.0","compact-encoding-bitfield":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"lunte":"^1.0.0","brittle":"^3.2.1","hyperdht":"^6.6.1","prettier":"^3.6.2","udx-native":"^1.6.1","prettier-config-holepunch":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/blind-relay_1.6.0_1778022683616_0.15498517558191116","host":"s3://npm-registry-packages-npm-production"}},"1.6.1":{"name":"blind-relay","version":"1.6.1","description":"Blind relay for UDX over Protomux channels","main":"index.js","scripts":{"format":"prettier --write .","lint":"prettier --check . && lunte","test":"npm run test:bare","test:bare":"brittle-bare --coverage test.mjs"},"repository":{"type":"git","url":"git+https://github.com/holepunchto/blind-relay.git"},"author":{"name":"Holepunch"},"license":"Apache-2.0","bugs":{"url":"https://github.com/holepunchto/blind-relay/issues"},"homepage":"https://github.com/holepunchto/blind-relay#readme","imports":{"events":{"bare":"bare-events","default":"events"}},"dependencies":{"b4a":"^1.6.4","bare-events":"^2.2.0","bits-to-bytes":"^1.3.0","compact-encoding":"^3.0.0","compact-encoding-bitfield":"^1.0.0","protomux":"^3.5.1","sodium-universal":"^5.0.0","streamx":"^2.15.1"},"devDependencies":{"brittle":"^3.2.1","hyperdht":"^6.6.1","lunte":"^1.0.0","prettier":"^3.6.2","prettier-config-holepunch":"^2.0.0","udx-native":"^1.6.1"},"gitHead":"296032773e6c253a688dec9dd1d31674fdef2f3d","_id":"blind-relay@1.6.1","_nodeVersion":"24.14.1","_npmVersion":"11.11.0","dist":{"integrity":"sha512-38YmKCl/m9NcTkwueBbcGIt9Zx3IT/Q9Nsluu6C5Gur6PqfE0zWPhPwCzia1hri/g0ICYxrqkgLtEaoWD5WeSQ==","shasum":"a182b807de26b8d924abe39e977e11cdbccd69f0","tarball":"https://registry.npmjs.org/blind-relay/-/blind-relay-1.6.1.tgz","fileCount":5,"unpackedSize":29085,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/blind-relay@1.6.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCZg2vyDXzw0/Baze/15W6EuIncctJzuVTl25EDnEJoIAIhAP5RV54rhb00ajbf8KBU1H3BWXtd3fYpgkB6qO7hw3/1"}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:89d127b1-5c7e-4fa7-ab13-31fb4a8796d7"}},"directories":{},"maintainers":[{"name":"mafintosh","email":"mathiasbuus@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/blind-relay_1.6.1_1778100691687_0.3425663515924646"},"_hasShrinkwrap":false}},"time":{"created":"2023-09-29T08:30:22.972Z","modified":"2026-05-06T20:51:32.180Z","1.3.0":"2023-09-29T08:30:23.175Z","1.3.1":"2023-10-05T07:14:37.029Z","1.3.2":"2024-02-08T12:52:45.669Z","1.3.3":"2024-03-13T07:56:17.894Z","1.4.0":"2025-04-12T18:48:31.431Z","1.5.0":"2026-04-27T19:53:34.893Z","1.6.0":"2026-05-05T23:11:23.771Z","1.6.1":"2026-05-06T20:51:31.848Z"},"bugs":{"url":"https://github.com/holepunchto/blind-relay/issues"},"author":{"name":"Holepunch"},"license":"Apache-2.0","homepage":"https://github.com/holepunchto/blind-relay#readme","repository":{"type":"git","url":"git+https://github.com/holepunchto/blind-relay.git"},"description":"Blind relay for UDX over Protomux channels","maintainers":[{"name":"mafintosh","email":"mathiasbuus@gmail.com"}],"readme":"# blind-relay\n\nBlind relay for [UDX](https://github.com/holepunchto/udx-native) over [Protomux](https://github.com/mafintosh/protomux) channels. By acting as a blind relay, a host may accept pairing requests from other hosts and relay UDX stream messages between them, similar to Traversal Using Relays around NAT (TURN).\n\n```sh\nnpm i blind-relay\n```\n\n## Protocol\n\n```mermaid\nsequenceDiagram\n    actor a as peer a\n    actor r as relay\n    actor b as peer b\n\n    par\n        a ->> r: pair { isInitiator: true, token, id, seq }\n    and\n        b ->> r: pair { isInitiator: false, token, id, seq }\n    end\n\n    note over r: The relay pairs peers a and b based on the token, allocates a new stream for both peers, and sends back the stream info\n\n    par\n        r -->> a: pair { isInitiator: true, token, id, seq }\n    and\n        r -->> b: pair { isInitiator: false, token, id, seq }\n    end\n\n    par\n        a ->> r: unpair { token }\n\n        note left of r: The relay deallocates the stream previously allocated to peer a\n    and\n        b ->> r: unpair { token }\n\n        note right of r: The relay deallocates the stream previously allocated to peer b\n    end\n```\n\n### Messages\n\nAll types are specified as their corresponding [compact-encoding](https://github.com/compact-encoding) codec.\n\n#### `pair` (`0`)\n\n1.  `bitfield(1)` Flags.\n    1. `isInitiator`\n2.  `fixed32` Preexchanged token.\n3.  `uint` Stream ID of the sender.\n4.  `uint` Initial stream sequence no. of the sender.\n\n#### `unpair` (`1`)\n\n1.  `bitfield(0)` Flags, reserved.\n2.  `fixed32` Preexchanged token.\n\n## Stats\n\nRelay servers expose in-memory stats on `server.stats`.\n\n- `sessions.accepted`, `sessions.opened`, `sessions.closed`, `sessions.active`\n- `pairings.requested`, `pairings.matched`, `pairings.cancelled`, `pairings.pending`, `pairings.active`\n- `streams.opened`, `streams.closed`, `streams.errors`, `streams.active`\n\nAll counters are cumulative for the lifetime of the process, while `active` and `pending` values reflect the current relay state.\n\n## License\n\nApache-2.0\n","readmeFilename":"README.md"}