Skip to content

Commit d188511

Browse files
authored
fix: add browser polyfill to upnp-nat (#2959)
To give more helpful error messages, add a browser shim for upnp-nat, similar to `@libp2p/tcp` - without this the user gets errors about not being able to load node api modules, instead throw a specific error that tells them their configuration is invalid.
1 parent 2f5e2aa commit d188511

File tree

3 files changed

+58
-1
lines changed

3 files changed

+58
-1
lines changed

packages/upnp-nat/package.json

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,10 @@
4646
"doc-check": "aegir doc-check",
4747
"build": "aegir build --no-bundle",
4848
"test": "aegir test -t node -t electron-main",
49+
"test:chrome": "aegir test -t browser -f ./dist/test/browser.js --cov",
50+
"test:chrome-webworker": "aegir test -t webworker -f ./dist/test/browser.js",
51+
"test:firefox": "aegir test -t browser -f ./dist/test/browser.js -- --browser firefox",
52+
"test:firefox-webworker": "aegir test -t webworker -f ./dist/test/browser.js -- --browser firefox",
4953
"test:node": "aegir test -t node --cov",
5054
"test:electron-main": "aegir test -t electron-main"
5155
},
@@ -65,7 +69,11 @@
6569
"@libp2p/logger": "^5.1.8",
6670
"@libp2p/peer-id": "^5.0.12",
6771
"aegir": "^45.0.5",
68-
"sinon-ts": "^2.0.0"
72+
"sinon-ts": "^2.0.0",
73+
"wherearewe": "^2.0.1"
74+
},
75+
"browser": {
76+
"./dist/src/upnp-nat.js": "./dist/src/upnp-nat.browser.js"
6977
},
7078
"sideEffects": false
7179
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import { serviceCapabilities, serviceDependencies } from '@libp2p/interface'
2+
import type { UPnPNATClient, UPnPNAT as UPnPNATInterface } from './index.js'
3+
4+
export class UPnPNAT implements UPnPNATInterface {
5+
public portMappingClient: UPnPNATClient
6+
7+
constructor () {
8+
throw new Error('UPnPNAT is not supported in browsers')
9+
}
10+
11+
readonly [Symbol.toStringTag] = '@libp2p/upnp-nat'
12+
13+
readonly [serviceCapabilities]: string[] = [
14+
'@libp2p/nat-traversal'
15+
]
16+
17+
get [serviceDependencies] (): string[] {
18+
return []
19+
}
20+
}

packages/upnp-nat/test/browser.ts

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import { generateKeyPair } from '@libp2p/crypto/keys'
2+
import { TypedEventEmitter } from '@libp2p/interface'
3+
import { defaultLogger } from '@libp2p/logger'
4+
import { peerIdFromPrivateKey } from '@libp2p/peer-id'
5+
import { expect } from 'aegir/chai'
6+
import { stubInterface } from 'sinon-ts'
7+
import { isBrowser, isWebWorker } from 'wherearewe'
8+
import { uPnPNAT } from '../src/index.js'
9+
import type { AddressManager } from '@libp2p/interface-internal'
10+
11+
describe('browser non-support', () => {
12+
it('should throw in browsers', async function () {
13+
if (!isBrowser && !isWebWorker) {
14+
return this.skip()
15+
}
16+
17+
const components = {
18+
peerId: peerIdFromPrivateKey(await generateKeyPair('Ed25519')),
19+
nodeInfo: { name: 'test', version: 'test', userAgent: 'test' },
20+
logger: defaultLogger(),
21+
addressManager: stubInterface<AddressManager>(),
22+
events: new TypedEventEmitter()
23+
}
24+
25+
expect(() => {
26+
uPnPNAT()(components)
27+
}).to.throw()
28+
})
29+
})

0 commit comments

Comments
 (0)