{"_id":"@dozyio/libp2p-pcp","_rev":"3-39013c5f39b4404680c9d5ae7523132f","name":"@dozyio/libp2p-pcp","dist-tags":{"latest":"1.0.2"},"versions":{"1.0.0":{"name":"@dozyio/libp2p-pcp","version":"1.0.0","keywords":["libp2p","nat","pcp","rfc6887","ipv6"],"license":"Apache-2.0 OR MIT","_id":"@dozyio/libp2p-pcp@1.0.0","maintainers":[{"name":"dozyio","email":"npm@dozy.io"}],"homepage":"https://github.com/dozyio/js-libp2p-pcp#readme","bugs":{"url":"https://github.com/dozyio/js-libp2p-pcp/issues"},"dist":{"shasum":"ba3d15ff82ec5e09ed98b722a76d0628a2af7076","tarball":"https://registry.npmjs.org/@dozyio/libp2p-pcp/-/libp2p-pcp-1.0.0.tgz","fileCount":5,"integrity":"sha512-/7y8gH6DaMwol+mFVPnLf+3jcghiIJ7JM6NBjIOlzLsP70eTZ9/JnnNTynCVbfDEeVNMjYy8bRGGGW6zxX9Jpw==","signatures":[{"sig":"MEYCIQDkDhyHPydV6LLSImK/AvmciI1P2LP96gdO9KU2uniVPAIhAOYxBbtSraikeGrSy+PuK/BaM+kd8VPpSvoncBGXxzLh","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@dozyio%2flibp2p-pcp@1.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":14882},"type":"module","types":"./dist/src/index.d.ts","exports":{".":{"types":"./dist/src/index.d.ts","import":"./dist/src/index.js"}},"gitHead":"454f77c0d4b0a2f00482567efb288160de6f536f","release":{"plugins":[["@semantic-release/commit-analyzer",{"preset":"conventionalcommits","releaseRules":[{"release":"major","breaking":true},{"revert":true,"release":"patch"},{"type":"feat","release":"minor"},{"type":"fix","release":"patch"},{"type":"docs","release":"patch"},{"type":"chore","release":"patch"},{"type":"test","release":"patch"},{"type":"deps","release":"patch"},{"scope":"no-release","release":false}]}],["@semantic-release/release-notes-generator",{"preset":"conventionalcommits","presetConfig":{"types":[{"type":"feat","section":"Features"},{"type":"fix","section":"Bug Fixes"},{"type":"chore","section":"Trivial Changes"},{"type":"docs","section":"Documentation"},{"type":"deps","section":"Dependencies"},{"type":"test","section":"Tests"}]}}],"@semantic-release/changelog","@semantic-release/npm","@semantic-release/github",["@semantic-release/git",{"assets":["CHANGELOG.md","package.json"]}]],"branches":["main"]},"scripts":{"docs":"aegir docs","lint":"aegir lint","test":"aegir test -t node","build":"aegir build --no-bundle","clean":"aegir clean","release":"aegir release","dep-check":"aegir dep-check","doc-check":"aegir doc-check","test:node":"aegir test -t node"},"_npmUser":{"name":"dozyio","email":"npm@dozy.io"},"repository":{"url":"git+https://github.com/dozyio/js-libp2p-pcp.git","type":"git"},"_npmVersion":"11.12.1","description":"libp2p NAT traversal service backed by PCP","directories":{},"sideEffects":false,"_nodeVersion":"24.14.1","dependencies":{"main-event":"^1.0.1","@dozyio/pcp":"^1.0.2","@libp2p/utils":"^7.0.10","@libp2p/interface":"^3.1.0","@multiformats/multiaddr":"^13.0.1","@libp2p/interface-internal":"^3.0.10","@multiformats/multiaddr-matcher":"^3.0.1"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"aegir":"^47.0.22","sinon-ts":"^2.0.0","@libp2p/crypto":"^5.1.13","@libp2p/logger":"^6.2.2","@libp2p/peer-id":"^6.0.4"},"_npmOperationalInternal":{"tmp":"tmp/libp2p-pcp_1.0.0_1775513165209_0.04394126333527759","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@dozyio/libp2p-pcp","version":"1.0.1","keywords":["libp2p","nat","pcp","rfc6887","ipv6"],"license":"Apache-2.0 OR MIT","_id":"@dozyio/libp2p-pcp@1.0.1","maintainers":[{"name":"dozyio","email":"npm@dozy.io"}],"homepage":"https://github.com/dozyio/js-libp2p-pcp#readme","bugs":{"url":"https://github.com/dozyio/js-libp2p-pcp/issues"},"dist":{"shasum":"0997f7430da8a4361400ec04bcccc2d364aaf102","tarball":"https://registry.npmjs.org/@dozyio/libp2p-pcp/-/libp2p-pcp-1.0.1.tgz","fileCount":13,"integrity":"sha512-vqSpYO2Itgqmz3a16jzinZrxOx7EKifoCa6HIyXiS3zndqJG5dSSjKyVFHuhvp+YJGStffy0pSqJl0QT//9qqQ==","signatures":[{"sig":"MEQCIHyDJVAifor641EBoz+02S9hBv/lCTQaFXRRaYNV0ngJAiAVkXGHJAUMx17ZGV2SysweZF1BdZJmqfVFjiXBHA/SpA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@dozyio%2flibp2p-pcp@1.0.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":33155},"type":"module","types":"./dist/src/index.d.ts","exports":{".":{"types":"./dist/src/index.d.ts","import":"./dist/src/index.js"}},"gitHead":"bf8f9f89573f3c29d58e0d624de2bba9adce71e6","release":{"plugins":[["@semantic-release/commit-analyzer",{"preset":"conventionalcommits","releaseRules":[{"release":"major","breaking":true},{"revert":true,"release":"patch"},{"type":"feat","release":"minor"},{"type":"fix","release":"patch"},{"type":"docs","release":"patch"},{"type":"chore","release":"patch"},{"type":"test","release":"patch"},{"type":"deps","release":"patch"},{"scope":"no-release","release":false}]}],["@semantic-release/release-notes-generator",{"preset":"conventionalcommits","presetConfig":{"types":[{"type":"feat","section":"Features"},{"type":"fix","section":"Bug Fixes"},{"type":"chore","section":"Trivial Changes"},{"type":"docs","section":"Documentation"},{"type":"deps","section":"Dependencies"},{"type":"test","section":"Tests"}]}}],"@semantic-release/changelog","@semantic-release/npm","@semantic-release/github",["@semantic-release/git",{"assets":["CHANGELOG.md","package.json"]}]],"branches":["main"]},"scripts":{"docs":"aegir docs","lint":"aegir lint","test":"aegir test -t node","build":"aegir build --no-bundle","clean":"aegir clean","prepack":"npm run build","release":"aegir release","dep-check":"aegir dep-check","doc-check":"aegir doc-check","test:node":"aegir test -t node"},"_npmUser":{"name":"dozyio","email":"npm@dozy.io"},"repository":{"url":"git+https://github.com/dozyio/js-libp2p-pcp.git","type":"git"},"_npmVersion":"11.12.1","description":"libp2p NAT traversal service backed by PCP","directories":{},"sideEffects":false,"_nodeVersion":"24.14.1","dependencies":{"main-event":"^1.0.1","@dozyio/pcp":"^1.0.2","@libp2p/utils":"^7.0.10","@libp2p/interface":"^3.1.0","@multiformats/multiaddr":"^13.0.1","@libp2p/interface-internal":"^3.0.10","@multiformats/multiaddr-matcher":"^3.0.1"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"aegir":"^47.0.22","sinon-ts":"^2.0.0","@libp2p/crypto":"^5.1.13","@libp2p/logger":"^6.2.2","@libp2p/peer-id":"^6.0.4"},"_npmOperationalInternal":{"tmp":"tmp/libp2p-pcp_1.0.1_1775513821447_0.8932495002146172","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@dozyio/libp2p-pcp","version":"1.0.2","description":"libp2p NAT traversal service backed by PCP","license":"Apache-2.0 OR MIT","homepage":"https://github.com/dozyio/js-libp2p-pcp#readme","repository":{"type":"git","url":"git+https://github.com/dozyio/js-libp2p-pcp.git"},"bugs":{"url":"https://github.com/dozyio/js-libp2p-pcp/issues"},"publishConfig":{"access":"public","provenance":true},"keywords":["libp2p","nat","pcp","rfc6887","ipv6"],"type":"module","types":"./dist/src/index.d.ts","exports":{".":{"types":"./dist/src/index.d.ts","import":"./dist/src/index.js"}},"release":{"branches":["main"],"plugins":[["@semantic-release/commit-analyzer",{"preset":"conventionalcommits","releaseRules":[{"breaking":true,"release":"major"},{"revert":true,"release":"patch"},{"type":"feat","release":"minor"},{"type":"fix","release":"patch"},{"type":"docs","release":"patch"},{"type":"chore","release":"patch"},{"type":"test","release":"patch"},{"type":"deps","release":"patch"},{"scope":"no-release","release":false}]}],["@semantic-release/release-notes-generator",{"preset":"conventionalcommits","presetConfig":{"types":[{"type":"feat","section":"Features"},{"type":"fix","section":"Bug Fixes"},{"type":"chore","section":"Trivial Changes"},{"type":"docs","section":"Documentation"},{"type":"deps","section":"Dependencies"},{"type":"test","section":"Tests"}]}}],"@semantic-release/changelog","@semantic-release/npm","@semantic-release/github",["@semantic-release/git",{"assets":["CHANGELOG.md","package.json"]}]]},"scripts":{"clean":"aegir clean","lint":"aegir lint","dep-check":"aegir dep-check","doc-check":"aegir doc-check","build":"aegir build --no-bundle","prepack":"npm run build","docs":"aegir docs","release":"aegir release","test":"aegir test -t node","test:node":"aegir test -t node"},"dependencies":{"@dozyio/pcp":"^1.0.2","@libp2p/interface":"^3.1.0","@libp2p/interface-internal":"^3.0.10","@libp2p/utils":"^7.0.10","@multiformats/multiaddr":"^13.0.1","@multiformats/multiaddr-matcher":"^3.0.1","main-event":"^1.0.1"},"devDependencies":{"@libp2p/crypto":"^5.1.13","@libp2p/logger":"^6.2.2","@libp2p/peer-id":"^6.0.4","aegir":"^47.0.22","sinon-ts":"^2.0.0"},"sideEffects":false,"gitHead":"1612561a185830b0b0927b90156439d0f30b84be","_id":"@dozyio/libp2p-pcp@1.0.2","_nodeVersion":"24.16.0","_npmVersion":"11.16.0","dist":{"integrity":"sha512-dMiCT3TMzwCkvQQrq47Lqn9g+18x09IrkiVM1X7+YvjnJYPP4uuL803HCFdfZsdKHpweEvmi93FJ2TkiUz8Llw==","shasum":"be02cb696990c89eb840401aea0c937cfca0d66b","tarball":"https://registry.npmjs.org/@dozyio/libp2p-pcp/-/libp2p-pcp-1.0.2.tgz","fileCount":13,"unpackedSize":33155,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@dozyio%2flibp2p-pcp@1.0.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCO8DJfp3Ug6SsAmXwe7VbtqMenw8cMLI6yT6x/iB97oQIhAI+L+7ey+BjwRYnRkoAf6YSDWDB0FWZ7+EKxtdmwV811"}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ca4468ed-5eac-4c85-9891-59d3bf4c4296"}},"directories":{},"maintainers":[{"name":"dozyio","email":"npm@dozy.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/libp2p-pcp_1.0.2_1781182523560_0.7212715745211997"},"_hasShrinkwrap":false}},"time":{"created":"2026-04-06T22:06:05.109Z","modified":"2026-06-11T12:55:23.969Z","1.0.0":"2026-04-06T22:06:05.362Z","1.0.1":"2026-04-06T22:17:01.623Z","1.0.2":"2026-06-11T12:55:23.704Z"},"bugs":{"url":"https://github.com/dozyio/js-libp2p-pcp/issues"},"license":"Apache-2.0 OR MIT","homepage":"https://github.com/dozyio/js-libp2p-pcp#readme","keywords":["libp2p","nat","pcp","rfc6887","ipv6"],"repository":{"type":"git","url":"git+https://github.com/dozyio/js-libp2p-pcp.git"},"description":"libp2p NAT traversal service backed by PCP","maintainers":[{"name":"dozyio","email":"npm@dozy.io"}],"readme":"# @dozyio/libp2p-pcp\n\nlibp2p NAT traversal service backed by PCP (RFC 6887).\n\nThis package is a thin libp2p wrapper around `@dozyio/pcp`.\n\n## Install\n\n```console\nnpm i @dozyio/libp2p-pcp\n```\n\n## Usage\n\n```ts\nimport { createLibp2p } from 'libp2p'\nimport { tcp } from '@libp2p/tcp'\nimport { identify } from '@libp2p/identify'\nimport { ping } from '@libp2p/ping'\nimport { noise } from '@chainsafe/libp2p-noise'\nimport { yamux } from '@chainsafe/libp2p-yamux'\nimport { pcpNAT } from '@dozyio/libp2p-pcp'\n\nconst gateway = process.env.GATEWAY\n\nif (gateway == null || gateway === '') {\n  throw new Error('Please set GATEWAY to your router PCP server address')\n}\n\nconst node = await createLibp2p({\n  addresses: {\n    listen: [\n      '/ip6/::/tcp/0'\n    ]\n  },\n  transports: [\n    tcp()\n  ],\n  connectionEncrypters: [\n    noise()\n  ],\n  streamMuxers: [\n    yamux()\n  ],\n  services: {\n    identify: identify(),\n    ping: ping(),\n    natTraversal: pcpNAT({\n      gateway,\n      trustMappedAddresses: true\n    })\n  }\n})\n\nawait node.start()\n\nconst logListenAddrs = (label: string): void => {\n  console.log(`\\n[${label}] listen addresses:`)\n  for (const addr of node.getMultiaddrs()) {\n    console.log(addr.toString())\n  }\n}\n\nlogListenAddrs('startup')\n\nnode.addEventListener('self:peer:update', () => {\n  logListenAddrs('self:peer:update')\n})\n\nprocess.on('SIGINT', async () => {\n  await node.stop()\n  process.exit(0)\n})\n```\n\n## Notes\n\n- PCP runs over UDP port `5351`.\n- Some routers require PCP on a LAN-side IPv6 GUA instead of link-local/WAN addresses.\n- This service adds mapped addresses as observed addresses. With `trustMappedAddresses: true`, mapped addresses are trusted immediately and `@libp2p/autonat` is not required. With `trustMappedAddresses: false` (default), mapped addresses are unverified until confirmed by `@libp2p/autonat`.\n\n## Testing\n\n- Run unit tests: `npm test`\n- Integration tests require a reachable PCP gateway and are skipped by default in CI.\n- To run integration tests locally, set `GATEWAY` to your router's LAN-side IPv6 GUA:\n\n```console\nGATEWAY=2001:db8::1 npm test\n```\n","readmeFilename":"README.md"}