Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

undefined symbol: EVP_MAC_fetch in Electron on Linux #172

Closed
achingbrain opened this issue Jul 28, 2023 · 25 comments
Closed

undefined symbol: EVP_MAC_fetch in Electron on Linux #172

achingbrain opened this issue Jul 28, 2023 · 25 comments

Comments

@achingbrain
Copy link
Contributor

I'm seeing this error on Electron in GitHub actions:

/home/runner/.cache/electron/416b9e4fe8fa4ae9903a8176cd1cba59f4b1273f87bab9aaf5ca425d2b7602fc/electron: symbol lookup error: /home/runner/work/js-libp2p/js-libp2p/node_modules/node-datachannel/build/Release/node_datachannel.node: undefined symbol: EVP_MAC_fetch

Weirdly I can't replicate it locally on Linux or Mac OS X.

Here is the CI run: https://github.com/libp2p/js-libp2p/actions/runs/5692383157/job/15429456572?pr=1905

@murat-dogan
Copy link
Owner

Hello,
Is OpenSSL installed correctly?

@murat-dogan
Copy link
Owner

I mean on ci

@achingbrain
Copy link
Contributor Author

That's a good question, I'm not sure.

It runs on ubuntu-latest - is there some special config that's required? I can't see anything in the build-linux.yml file in this repo though maybe I'm missing something?

The yml file is here in case anything obvious jumps out at you.

@murat-dogan
Copy link
Owner

Not sure about the OpenSSL version of the latest version. Could you pls try with ubuntu-20

@murat-dogan
Copy link
Owner

And I can not see the full log? Is it normal?

@achingbrain
Copy link
Contributor Author

I've tried with ubuntu-20.04 in this run, it still fails with the same error.

And I can not see the full log? Is it normal?

I'm not sure what other logging there is supposed to be? Do I need to set an env var or something?

@murat-dogan
Copy link
Owner

I can see the logs now.
EVP_MAC_fetch is an openssl symbol. We require only for the aarch64 as a dynamic library for others it is statically linked.

Is there any test with nodejs that passed?

@achingbrain
Copy link
Contributor Author

Sorry for the delay in my replying - yes, the test suite runs on nodejs without error, the error only occurs on the electron main process.

I know electron bundles it's own version of node with extra patches (18.16 at the time of writing) - looks like it uses BoringSSL over OpenSSL as well - could this be the cause?

@paullouisageneau
Copy link
Contributor

I know electron bundles it's own version of node with extra patches (18.16 at the time of writing) - looks like it uses BoringSSL over OpenSSL as well - could this be the cause?

Yes, a mismatch between OpenSSL and BoringSSL may well be the cause.

@murat-dogan It looks like we don't hide symbols so the OpenSSL symbols end up re-exported by node_datachannel.node (you can see them with readelf -Ws node_datachannel.node), so this could cause symbol collisions.

@murat-dogan
Copy link
Owner

murat-dogan commented Sep 7, 2023

Here I am already working on a electron example project. It is not ready to merge.
https://github.com/murat-dogan/node-datachannel/tree/electron-demo/electron-node-datachannel-demo

I can build and run it without any problem. I don't re-build it for electron, it just works.
I wonder how do you use it? Re-building all modules or just use as it is.

@murat-dogan
Copy link
Owner

If you enable nodeIntegration and run node-datachannel in renderer part, everything works.

But if you run node-datachannel in main process then you got this error.
In this case you need to rebuild the module for this specific electron version.
After rebuild everything works again.

The the bad part is electron-rebuild does not support cmake-js. I needed to rebuild the module manually.
Trying to find another solution.

@murat-dogan
Copy link
Owner

murat-dogan commented Sep 12, 2023

@achingbrain

Solution 1

Please check https://github.com/murat-dogan/node-datachannel/tree/electron-demo branch

In examples/electron-demo folder there is a working example.

For electron binary needs to be rebuilt. But as I said electron-rebuild does not support cmake-js.

So I created a simple plugin for electron-forge here https://github.com/murat-dogan/plugin-node-datachannel

Please check the demo and plugin.

With NAPI

Could you please try also this release without recompiling or the plugin above?
https://github.com/murat-dogan/node-datachannel/releases/tag/v0.5.0-dev

It is napi based and should also work without recompiling.

@murat-dogan
Copy link
Owner

I have just release Version 0.5.0-dev
https://github.com/murat-dogan/node-datachannel/releases/tag/v0.5.0-dev

It consists electron-demo project also

@achingbrain
Copy link
Contributor Author

Progress! With the 0.5.0-dev release the tests now pass!

Unfortunately it crashes after the test run with:

Command was killed with SIGABRT (Aborted): electron-mocha test/**/*.spec.{js,mjs,cjs} dist/test/**/*.spec.{js,cjs,mjs} --bail --timeout=60000 --colors --full-trace

This is the build: https://github.com/libp2p/js-libp2p/actions/runs/6432905404/job/17478596409?pr=1918

@murat-dogan
Copy link
Owner

There are some other error messages on the log. Are they related?
Otherwise, I have no idea.

Is it an option for you to run tests locally?

@murat-dogan
Copy link
Owner

Any update on this, or should I close the issue?

@achingbrain
Copy link
Contributor Author

No, unfortunately it still crashes after the test run. Here's a recent test run.

@libp2p/webrtc: Command was killed with SIGABRT (Aborted): electron-mocha test/**/*.spec.{js,mjs,cjs} dist/test/**/*.spec.{js,cjs,mjs} --bail --timeout=60000 --colors --full-trace
@libp2p/webrtc: npm ERR! Lifecycle script `test:electron-main` failed with error: 
@libp2p/webrtc: npm ERR! Error: command failed 
@libp2p/webrtc: npm ERR!   in workspace: @libp2p/webrtc@4.0.20 
@libp2p/webrtc: npm ERR!   at location: /home/runner/work/js-libp2p/js-libp2p/packages/transport-webrtc 
Command failed with exit code 1: npm run test:electron-main
[5165:0306/134524.916509:ERROR:bus.cc(407)] Failed to connect to the bus: Could not parse server address: Unknown address type (examples of valid types are "tcp" and on UNIX "unix")
[5165:0306/134524.916556:ERROR:bus.cc(407)] Failed to connect to the bus: Could not parse server address: Unknown address type (examples of valid types are "tcp" and on UNIX "unix")
[5165:0306/134524.916568:ERROR:bus.cc(407)] Failed to connect to the bus: Could not parse server address: Unknown address type (examples of valid types are "tcp" and on UNIX "unix")
[5165:0306/134524.916578:ERROR:bus.cc(407)] Failed to connect to the bus: Could not parse server address: Unknown address type (examples of valid types are "tcp" and on UNIX "unix")
[5165:0306/134524.945215:ERROR:bus.cc(407)] Failed to connect to the bus: Could not parse server address: Unknown address type (examples of valid types are "tcp" and on UNIX "unix")
[5165:0306/134524.945246:ERROR:bus.cc(407)] Failed to connect to the bus: Could not parse server address: Unknown address type (examples of valid types are "tcp" and on UNIX "unix")
[5199:0306/134525.003225:ERROR:viz_main_impl.cc(196)] Exiting GPU process due to errors during initialization
[5226:0306/134525.121265:ERROR:viz_main_impl.cc(196)] Exiting GPU process due to errors during initialization
Command was killed with SIGABRT (Aborted): electron-mocha test/**/*.spec.{js,mjs,cjs} dist/test/**/*.spec.{js,cjs,mjs} --bail --timeout=60000 --colors --full-trace
npm ERR! Lifecycle script `test:electron-main` failed with error: 
npm ERR! Error: command failed 
npm ERR!   in workspace: @libp2p/webrtc@4.0.20 
npm ERR!   at location: /home/runner/work/js-libp2p/js-libp2p/packages/transport-webrtc 

Locally on Mac OS X it fails too, though without the extra info:

... more test output
    ✔ toString property getter
    ✔ symbol property getter
    ✔ transport filter filters out invalid multiaddrs
    ✔ throws WebRTC transport error when dialing a multiaddr without a PeerId


  46 passing (12s)

Command was killed with SIGABRT (Aborted): electron-mocha test/**/*.spec.{js,mjs,cjs} dist/test/**/*.spec.{js,cjs,mjs} --bail --timeout=60000 --colors --full-trace
% echo $?
1

@murat-dogan
Copy link
Owner

I cloned the repo and tried to re-produce it.
But I got this error. Am I trying something wrong?

murat@murat-ThinkBook:~/tmp/js-libp2p$ npx xvfb-maybe npm run --if-present test:electron-main

> js-libp2p-monorepo@1.0.0 test:electron-main
> aegir run test:electron-main


@libp2p/crypto: npm run test:electron-main

@libp2p/peer-id: npm run test:electron-main
@libp2p/crypto: > @libp2p/crypto@4.0.3 test:electron-main
@libp2p/crypto: > aegir test -t electron-main
@libp2p/peer-id: > @libp2p/peer-id@4.0.7 test:electron-main
@libp2p/peer-id: > aegir test -t electron-main
@libp2p/crypto: build
@libp2p/peer-id: build
@libp2p/crypto: > @libp2p/crypto@4.0.3 build
@libp2p/crypto: > aegir build
@libp2p/peer-id: > @libp2p/peer-id@4.0.7 build
@libp2p/peer-id: > aegir build
@libp2p/crypto: [19:48:28] tsc [started]
@libp2p/peer-id: [19:48:28] tsc [started]
@libp2p/peer-id: src/index.ts(17,27): error TS2307: Cannot find module '@libp2p/interface' or its corresponding type declarations.
@libp2p/peer-id: src/index.ts(18,118): error TS2307: Cannot find module '@libp2p/interface' or its corresponding type declarations.
@libp2p/peer-id: src/index.ts(88,12): error TS1166: A computed property name in a class property declaration must have a simple literal type or a 'unique symbol' type.
@libp2p/peer-id: [19:48:28] tsc [failed]
@libp2p/peer-id: [19:48:28] → Command failed with exit code 1: tsc
@libp2p/peer-id: Command failed with exit code 1: tsc
@libp2p/peer-id: npm ERR! Lifecycle script `build` failed with error: 
@libp2p/peer-id: npm ERR! Error: command failed 
@libp2p/peer-id: npm ERR!   in workspace: @libp2p/peer-id@4.0.7 
@libp2p/peer-id: npm ERR!   at location: /home/murat/tmp/js-libp2p/packages/peer-id 
@libp2p/peer-id: Command failed with exit code 1: npm run build --if-present
@libp2p/peer-id: npm ERR! Lifecycle script `test:electron-main` failed with error: 
@libp2p/peer-id: npm ERR! Error: command failed 
@libp2p/peer-id: npm ERR!   in workspace: @libp2p/peer-id@4.0.7 
@libp2p/peer-id: npm ERR!   at location: /home/murat/tmp/js-libp2p/packages/peer-id 
Command failed with exit code 1: npm run test:electron-main
Command failed with exit code 1: tsc
npm ERR! Lifecycle script `build` failed with error: 
npm ERR! Error: command failed 
npm ERR!   in workspace: @libp2p/peer-id@4.0.7 
npm ERR!   at location: /home/murat/tmp/js-libp2p/packages/peer-id 
Command failed with exit code 1: npm run build --if-present
npm ERR! Lifecycle script `test:electron-main` failed with error: 
npm ERR! Error: command failed 
npm ERR!   in workspace: @libp2p/peer-id@4.0.7 
npm ERR!   at location: /home/murat/tmp/js-libp2p/packages/peer-id 

> @libp2p/peer-id@4.0.7 test:electron-main
> aegir test -t electron-main

build

> @libp2p/peer-id@4.0.7 build
> aegir build

[19:48:28] tsc [started]
src/index.ts(17,27): error TS2307: Cannot find module '@libp2p/interface' or its corresponding type declarations.
src/index.ts(18,118): error TS2307: Cannot find module '@libp2p/interface' or its corresponding type declarations.
src/index.ts(88,12): error TS1166: A computed property name in a class property declaration must have a simple literal type or a 'unique symbol' type.
[19:48:28] tsc [failed]
[19:48:28] → Command failed with exit code 1: tsc
Failed with exit code: 1
Output:

@achingbrain
Copy link
Contributor Author

Thanks for investigating. It's a monorepo project with cross-dependencies between the package siblings.

From the output it looks like you've run npm i then npx ...(test command) in the repo root.

You need to build the project before running tests.

In the root of the repo run:

$ npm run build

After that the test command should run.

@murat-dogan
Copy link
Owner

Now I can run the test.
No error for me, I can not reproduce it.
I couldn't find webrtc tests on main command (test:electron-main), so I run in the package like below.
Node V20, ubuntu 22.04

murat@murat-ThinkBook:~/tmp/js-libp2p/packages/transport-webrtc$ npm run test

> @libp2p/webrtc@4.0.20 test
> aegir test -t node -t browser -- --exit

build

> @libp2p/webrtc@4.0.20 build
> aegir build

[20:18:02] tsc [started]
[20:18:04] tsc [completed]
[20:18:04] esbuild [started]
[20:18:04] esbuild [completed]
test node.js
Warning: Cannot find any files matching pattern "test/node.{js,cjs,mjs}"
Warning: Cannot find any files matching pattern "test/**/*.spec.{js,cjs,mjs}"
Warning: Cannot find any files matching pattern "dist/test/node.{js,cjs,mjs}"


  basics
    ✔ can dial through a relay (1100ms)
    ✔ reports remote addresses correctly (1071ms)
    ✔ can send a large file (1567ms)
    ✔ can close local stream for reading but send a large file (1374ms)
    ✔ can close local stream for writing but receive a large file (1305ms)
    ✔ can close local stream for writing and reading while a remote stream is writing (2060ms)
    ✔ can close local stream for writing and reading while a remote stream is writing using source/sink (2080ms)

  webrtc private-to-private listener
    ✔ should only return relay addresses as webrtc listen addresses

  Multiaddr Connection
    ✔ can open and close

  muxer
    ✔ should delay notification of early streams (1004ms)

  webrtc basic
    ✔ should connect (1019ms)
    ✔ should survive aborting during connection (112ms)

  webrtc receiver
    ✔ should fail receiving on invalid sdp offer

  webrtc dialer
    ✔ should fail receiving on invalid sdp answer
    ✔ should fail on receiving a candidate before an answer

  webrtc filter
    ✔ can filter multiaddrs to dial

  webrtc splitAddr
    ✔ can split a ws relay addr
    ✔ can split a webrtc-direct relay addr

  SDP
    ✔ converts multiaddr with certhash to an answer SDP
    ✔ extracts certhash from a multiaddr
    ✔ decodes a certhash
    ✔ converts a multiaddr into a fingerprint
    ✔ extracts a fingerprint from sdp
    ✔ munges the ufrag and pwd in a SDP

  Max message size
    ✔ sends messages smaller or equal to 16384 bytes in one
    ✔ sends messages greater than 16384 bytes in parts
    ✔ closes the stream if bufferamountlow timeout (104ms)

  Stream Stats
    ✔ can construct
    ✔ close marks it closed
    ✔ closeRead marks it read-closed only
    ✔ closeWrite marks it write-closed only
    ✔ closeWrite AND closeRead = close
    ✔ abort = close
    ✔ reset = close

  Stream Read Stats Transition By Incoming Flag
    ✔ no flag, no transition
    ✔ open to read-close by flag:FIN (100ms)
    ✔ read-close to close by flag:STOP_SENDING (100ms)

  Stream Write Stats Transition By Incoming Flag
    ✔ open to write-close by flag:STOP_SENDING (101ms)
    ✔ write-close to close by flag:FIN (100ms)

  WebRTCDirect Transport
    ✔ can construct
    ✔ can dial
    ✔ createListner throws
    ✔ toString property getter
    ✔ symbol property getter
    ✔ transport filter filters out invalid multiaddrs
    ✔ throws WebRTC transport error when dialing a multiaddr without a PeerId


  46 passing (14s)

test browser
ℹ Browser "chromium" setup complete.

  basics
    ✅ can dial through a relay (175ms)
    ✅ reports remote addresses correctly (66ms)
    ✅ can send a large file (1191ms)
    ✅ can close local stream for reading but send a large file (587ms)
    ✅ can close local stream for writing but receive a large file (773ms)
    ✅ can close local stream for writing and reading while a remote stream is writing (1066ms)
    ✅ can close local stream for writing and reading while a remote stream is writing using source/sink (1074ms)
  webrtc private-to-private listener
    ✅ should only return relay addresses as webrtc listen addresses
  Multiaddr Connection
    ✅ can open and close
  muxer
    ✅ should delay notification of early streams (1003ms)
  webrtc basic
    ✅ should connect (1033ms)
    ✅ should survive aborting during connection (115ms)
  webrtc receiver
    ✅ should fail receiving on invalid sdp offer
  webrtc dialer
    ✅ should fail receiving on invalid sdp answer
    ✅ should fail on receiving a candidate before an answer
  webrtc filter
    ✅ can filter multiaddrs to dial
  webrtc splitAddr
    ✅ can split a ws relay addr
    ✅ can split a webrtc-direct relay addr
  SDP
    ✅ converts multiaddr with certhash to an answer SDP
    ✅ extracts certhash from a multiaddr
    ✅ decodes a certhash
    ✅ converts a multiaddr into a fingerprint
    ✅ extracts a fingerprint from sdp
    ✅ munges the ufrag and pwd in a SDP
  Max message size
    ✅ sends messages smaller or equal to 16384 bytes in one
    ✅ sends messages greater than 16384 bytes in parts
    ✅ closes the stream if bufferamountlow timeout (104ms)
  Stream Stats
    ✅ can construct
    ✅ close marks it closed
    ✅ closeRead marks it read-closed only
    ✅ closeWrite marks it write-closed only
    ✅ closeWrite AND closeRead = close
    ✅ abort = close
    ✅ reset = close
  Stream Read Stats Transition By Incoming Flag
    ✅ no flag, no transition
    ✅ open to read-close by flag:FIN (101ms)
    ✅ read-close to close by flag:STOP_SENDING (101ms)
  Stream Write Stats Transition By Incoming Flag
    ✅ open to write-close by flag:STOP_SENDING (101ms)
    ✅ write-close to close by flag:FIN (101ms)
  WebRTCDirect Transport
    ✅ can construct
    ✅ can dial
    ✅ createListner throws
    ✅ toString property getter
    ✅ symbol property getter
    ✅ transport filter filters out invalid multiaddrs
    ✅ throws WebRTC transport error when dialing a multiaddr without a PeerId
  46 passing (9s)
✔ Tests passed.

@murat-dogan
Copy link
Owner

murat-dogan commented Mar 11, 2024

This is full output of the main test (but no webrtc)

@libp2p/peer-id: npm run test:electron-main
@libp2p/peer-id: > @libp2p/peer-id@4.0.7 test:electron-main
@libp2p/peer-id: > aegir test -t electron-main
@libp2p/crypto: > @libp2p/crypto@4.0.3 test:electron-main
@libp2p/crypto: > aegir test -t electron-main
@libp2p/peer-id: build
@libp2p/crypto: build
@libp2p/crypto: > @libp2p/crypto@4.0.3 build
@libp2p/crypto: > aegir build
@libp2p/peer-id: > @libp2p/peer-id@4.0.7 build
@libp2p/peer-id: > aegir build
@libp2p/crypto: [20:09:19] tsc [started]
@libp2p/peer-id: [20:09:19] tsc [started]
@libp2p/peer-id: [20:09:21] tsc [completed]
@libp2p/peer-id: [20:09:21] esbuild [started]
@libp2p/peer-id: [20:09:21] esbuild [completed]
@libp2p/peer-id: test electron main
@libp2p/peer-id: [20:09:21] Downloading electron: 27.0.2 [started]
@libp2p/peer-id: [20:09:21] Downloading electron: 27.0.2 [completed]
@libp2p/crypto: [20:09:21] tsc [completed]
@libp2p/crypto: [20:09:21] esbuild [started]
@libp2p/crypto: [20:09:21] esbuild [completed]
@libp2p/crypto: test electron main
@libp2p/crypto: [20:09:21] Downloading electron: 27.0.2 [started]
@libp2p/crypto: [20:09:21] Downloading electron: 27.0.2 [completed]
@libp2p/peer-id: [504571:0311/200922.005145:ERROR:object_proxy.cc(577)] Failed to call method: org.freedesktop.DBus.Properties.Get: object_path= /org/freedesktop/portal/desktop: org.freedesktop.DBus.Error.InvalidArgs: No such interface “org.freedesktop.portal.FileChooser”
@libp2p/peer-id: [504571:0311/200922.005194:ERROR:select_file_dialog_linux_portal.cc(280)] Failed to read portal version property
@libp2p/peer-id: Warning: Cannot find any files matching pattern "test/**/*.spec.{js,mjs,cjs}"
@libp2p/peer-id: 
@libp2p/peer-id:   PeerId
@libp2p/peer-id:     ✔ create an id without 'new'
@libp2p/peer-id:     ✔ create a new id from multihash
@libp2p/peer-id:     ✔ parses a v1 CID with the libp2p-key codec
@libp2p/peer-id:     ✔ defaults to base58btc when stringifying
@libp2p/peer-id:     ✔ turns into a CID
@libp2p/peer-id:     ✔ equals a Uint8Array
@libp2p/peer-id:     ✔ equals a PeerId
@libp2p/peer-id:     ✔ equals nothing
@libp2p/peer-id:     ✔ equals undefined
@libp2p/peer-id:     ✔ parses a PeerId as Ed25519
@libp2p/peer-id:     ✔ parses a PeerId as RSA
@libp2p/peer-id:     ✔ parses a PeerId as secp256k1
@libp2p/peer-id:     ✔ decodes a PeerId as Ed25519
@libp2p/peer-id:     ✔ decodes a PeerId as RSA
@libp2p/peer-id:     ✔ decodes a PeerId as secp256k1
@libp2p/peer-id:     ✔ caches toString output
@libp2p/peer-id:     ✔ stringifies as JSON
@libp2p/peer-id:   17 passing (15ms)
@libp2p/crypto: [504665:0311/200922.393276:ERROR:object_proxy.cc(577)] Failed to call method: org.freedesktop.DBus.Properties.Get: object_path= /org/freedesktop/portal/desktop: org.freedesktop.DBus.Error.InvalidArgs: No such interface “org.freedesktop.portal.FileChooser”
@libp2p/crypto: [504665:0311/200922.393552:ERROR:select_file_dialog_linux_portal.cc(280)] Failed to read portal version property
@libp2p/crypto: Warning: Cannot find any files matching pattern "test/**/*.spec.{js,mjs,cjs}"
@libp2p/crypto: 
@libp2p/crypto:   libp2p-crypto
@libp2p/crypto:     ✔ marshalPublicKey and unmarshalPublicKey
@libp2p/crypto:     ✔ marshalPrivateKey and unmarshalPrivateKey
@libp2p/crypto:     ✔ generateKeyPair
@libp2p/crypto:     ✔ generateKeyPairFromSeed
@libp2p/crypto:     go interop
@libp2p/crypto:       - unmarshals private key
@libp2p/crypto:       - unmarshals public key
@libp2p/crypto:       - unmarshal -> marshal, private key
@libp2p/crypto:       - unmarshal -> marshal, public key
@libp2p/crypto:     pbkdf2
@libp2p/crypto:       ✔ generates a derived password using sha1
@libp2p/crypto:       ✔ generates a derived password using sha2-512
@libp2p/crypto:       ✔ generates the same derived password with the same options
@libp2p/crypto:       ✔ throws on invalid hash name
@libp2p/crypto:     randomBytes
@libp2p/crypto:       ✔ throws with invalid number passed
@libp2p/crypto:       ✔ generates different random things
@libp2p/crypto:   HMAC
@libp2p/crypto:     ✔ SHA1 - sign and verify
@libp2p/crypto:     ✔ SHA256 - sign and verify
@libp2p/crypto:     ✔ SHA512 - sign and verify
@libp2p/crypto:   ed25519
@libp2p/crypto:     ✔ generates a valid key
@libp2p/crypto:     ✔ generates a valid key from seed
@libp2p/crypto:     ✔ generates the same key from the same seed
@libp2p/crypto:     ✔ generates different keys for different seeds
@libp2p/crypto:     ✔ signs
@libp2p/crypto:     ✔ signs a list
@libp2p/crypto:     ✔ encoding
@libp2p/crypto:     ✔ key id
@libp2p/crypto:     ✔ should export a password encrypted libp2p-key
@libp2p/crypto:     ✔ should export a libp2p-key with no password to encrypt
@libp2p/crypto:     ✔ should fail to import libp2p-key with wrong password
@libp2p/crypto:     ✔ sign and verify
@libp2p/crypto:     ✔ sign and verify from seed
@libp2p/crypto:     ✔ fails to verify for different data
@libp2p/crypto:     key equals
@libp2p/crypto:       ✔ equals itself
@libp2p/crypto:       ✔ not equals other key
@libp2p/crypto:     throws error instead of crashing
@libp2p/crypto:       ✔ key.verify(Uint8Array(10) [
@libp2p/crypto:   0, 1, 2, 3, 4,
@libp2p/crypto:   5, 6, 7, 8, 9
@libp2p/crypto: ], Uint8Array(10) [
@libp2p/crypto:   0, 1, 2, 3, 4,
@libp2p/crypto:   5, 6, 7, 8, 9
@libp2p/crypto: ])
@libp2p/crypto:       ✔ key.verify({}, {})
@libp2p/crypto:       ✔ key.verify(null, null)
@libp2p/crypto:       ✔ key.verify(false, false)
@libp2p/crypto:       ✔ key.verify(undefined, undefined)
@libp2p/crypto:       ✔ key.verify(true, true)
@libp2p/crypto:       ✔ key.verify(1, 1)
@libp2p/crypto:       ✔ key.verify(0, 0)
@libp2p/crypto:       ✔ key.verify(Uint8Array(0) [], Uint8Array(0) [])
@libp2p/crypto:       ✔ key.verify('aGVsbG93b3JsZA==', 'aGVsbG93b3JsZA==')
@libp2p/crypto:       ✔ key.verify('helloworld', 'helloworld')
@libp2p/crypto:       ✔ key.verify('', '')
@libp2p/crypto:       ✔ crypto.keys.unmarshalPrivateKey(Uint8Array(10) [
@libp2p/crypto:   0, 1, 2, 3, 4,
@libp2p/crypto:   5, 6, 7, 8, 9
@libp2p/crypto: ])
@libp2p/crypto:       ✔ crypto.keys.unmarshalPrivateKey({})
@libp2p/crypto:       ✔ crypto.keys.unmarshalPrivateKey(null)
@libp2p/crypto:       ✔ crypto.keys.unmarshalPrivateKey(false)
@libp2p/crypto:       ✔ crypto.keys.unmarshalPrivateKey(undefined)
@libp2p/crypto:       ✔ crypto.keys.unmarshalPrivateKey(true)
@libp2p/crypto:       ✔ crypto.keys.unmarshalPrivateKey(1)
@libp2p/crypto:       ✔ crypto.keys.unmarshalPrivateKey(0)
@libp2p/crypto:       ✔ crypto.keys.unmarshalPrivateKey(Uint8Array(0) [])
@libp2p/crypto:       ✔ crypto.keys.unmarshalPrivateKey('aGVsbG93b3JsZA==')
@libp2p/crypto:       ✔ crypto.keys.unmarshalPrivateKey('helloworld')
@libp2p/crypto:       ✔ crypto.keys.unmarshalPrivateKey('')
@libp2p/crypto:     go interop
@libp2p/crypto:       ✔ verifies with data from go
@libp2p/crypto:       ✔ does not include the redundant public key when marshalling privatekey
@libp2p/crypto:       ✔ verifies with data from go with redundant public key
@libp2p/crypto:       ✔ generates the same signature as go
@libp2p/crypto:       ✔ generates the same signature as go with redundant public key
@libp2p/crypto:   generateEphemeralKeyPair
@libp2p/crypto:     ✔ generate and shared key P-256
@libp2p/crypto:     ✔ generate and shared key P-384
@libp2p/crypto:     ✔ handles bad curve name
@libp2p/crypto:     go interop
@libp2p/crypto:       ✔ generates a shared secret
@libp2p/crypto:   libp2p-crypto importer/exporter
@libp2p/crypto:     ✔ roundtrips
@libp2p/crypto:   keyStretcher
@libp2p/crypto:     generate
@libp2p/crypto:       ✔ AES-128 - SHA1
@libp2p/crypto:       ✔ AES-128 - SHA256
@libp2p/crypto:       ✔ AES-128 - SHA512
@libp2p/crypto:       ✔ AES-256 - SHA1
@libp2p/crypto:       ✔ AES-256 - SHA256
@libp2p/crypto:       ✔ AES-256 - SHA512
@libp2p/crypto:       ✔ Blowfish - SHA1
@libp2p/crypto:       ✔ Blowfish - SHA256
@libp2p/crypto:       ✔ Blowfish - SHA512
@libp2p/crypto:       ✔ handles invalid cipher type
@libp2p/crypto:       ✔ handles missing hash type
@libp2p/crypto:     go interop
@libp2p/crypto:       ✔ AES-256 - SHA256
@libp2p/crypto:   RSA
@libp2p/crypto:     ✔ generates a valid key
@libp2p/crypto:     ✔ does not generate a big key
@libp2p/crypto:     ✔ does not unmarshal a big key (1349ms)
@libp2p/crypto:     ✔ signs
@libp2p/crypto:     ✔ signs a list
@libp2p/crypto:     ✔ encoding
@libp2p/crypto:     ✔ key id
@libp2p/crypto:     ✔ unmarshals a public key
@libp2p/crypto:     ✔ unmarshals a private key
@libp2p/crypto:     ✔ imports a PEM file (92ms)
@libp2p/crypto:     ✔ sign and verify
@libp2p/crypto:     ✔ fails to verify for different data
@libp2p/crypto:     key equals
@libp2p/crypto:       ✔ equals itself
@libp2p/crypto:       ✔ not equals other key
@libp2p/crypto:     export and import
@libp2p/crypto:       ✔ should export a password encrypted libp2p-key
@libp2p/crypto:       ✔ exports RSA key to an encrypted PEM file (68ms)
@libp2p/crypto:       ✔ handles invalid export type
@libp2p/crypto:     throws error instead of crashing
@libp2p/crypto:       ✔ key.verify({}, {})
@libp2p/crypto:       ✔ key.verify(null, null)
@libp2p/crypto:       ✔ key.verify(false, false)
@libp2p/crypto:       ✔ key.verify(undefined, undefined)
@libp2p/crypto:       ✔ key.verify(true, true)
@libp2p/crypto:       ✔ key.verify(1, 1)
@libp2p/crypto:       ✔ key.verify(0, 0)
@libp2p/crypto:       ✔ crypto.keys.unmarshalPrivateKey(Uint8Array(10) [
@libp2p/crypto:   0, 1, 2, 3, 4,
@libp2p/crypto:   5, 6, 7, 8, 9
@libp2p/crypto: ])
@libp2p/crypto:       ✔ crypto.keys.unmarshalPrivateKey({})
@libp2p/crypto:       ✔ crypto.keys.unmarshalPrivateKey(null)
@libp2p/crypto:       ✔ crypto.keys.unmarshalPrivateKey(false)
@libp2p/crypto:       ✔ crypto.keys.unmarshalPrivateKey(undefined)
@libp2p/crypto:       ✔ crypto.keys.unmarshalPrivateKey(true)
@libp2p/crypto:       ✔ crypto.keys.unmarshalPrivateKey(1)
@libp2p/crypto:       ✔ crypto.keys.unmarshalPrivateKey(0)
@libp2p/crypto:       ✔ crypto.keys.unmarshalPrivateKey(Uint8Array(0) [])
@libp2p/crypto:       ✔ crypto.keys.unmarshalPrivateKey('aGVsbG93b3JsZA==')
@libp2p/crypto:       ✔ crypto.keys.unmarshalPrivateKey('helloworld')
@libp2p/crypto:       ✔ crypto.keys.unmarshalPrivateKey('')
@libp2p/crypto:     go interop
@libp2p/crypto:       ✔ verifies with data from go
@libp2p/crypto:   secp256k1 keys
@libp2p/crypto:     ✔ generates a valid key
@libp2p/crypto:     ✔ optionally accepts a `bits` argument when generating a key
@libp2p/crypto:     ✔ signs
@libp2p/crypto:     ✔ signs a list
@libp2p/crypto:     ✔ encoding
@libp2p/crypto:     ✔ key id
@libp2p/crypto:     ✔ should export a password encrypted libp2p-key
@libp2p/crypto:     ✔ should fail to import libp2p-key with wrong password
@libp2p/crypto:     ✔ sign and verify
@libp2p/crypto:     ✔ fails to verify for different data
@libp2p/crypto:     key equals
@libp2p/crypto:       ✔ equals itself
@libp2p/crypto:       ✔ not equals other key
@libp2p/crypto:   crypto functions
@libp2p/crypto:     ✔ generates valid keys
@libp2p/crypto:     ✔ does not validate an invalid key
@libp2p/crypto:     ✔ validates a correct signature
@libp2p/crypto:     ✔ does not validate when validating a message with an invalid signature
@libp2p/crypto:     ✔ errors if given a null Uint8Array to sign
@libp2p/crypto:     ✔ errors when signing with an invalid key
@libp2p/crypto:     ✔ errors if given a null Uint8Array to validate
@libp2p/crypto:     ✔ throws when compressing an invalid public key
@libp2p/crypto:     ✔ throws when decompressing an invalid public key
@libp2p/crypto:     ✔ compresses/decompresses a valid public key
@libp2p/crypto:   go interop
@libp2p/crypto:     ✔ loads a private key marshaled by go-libp2p-crypto
@libp2p/crypto:     ✔ loads a public key marshaled by go-libp2p-crypto
@libp2p/crypto:     ✔ generates the same signature as go-libp2p-crypto
@libp2p/crypto:   randomBytes
@libp2p/crypto:     ✔ produces random bytes
@libp2p/crypto:     ✔ throws if length is 0
@libp2p/crypto:     ✔ throws if length is < 0
@libp2p/crypto:     ✔ throws if length is not a number
@libp2p/crypto:   Util
@libp2p/crypto:     ✔ should convert base64url encoded string to Uint8Array with padding
@libp2p/crypto:   Constant derived key is generated correctly
@libp2p/crypto:     ✔ Generates correctly
@libp2p/crypto:   143 passing (2s)
@libp2p/crypto:   4 pending

@libp2p/peer-id-factory: npm run test:electron-main

@libp2p/logger: npm run test:electron-main
@libp2p/logger: > @libp2p/logger@4.0.7 test:electron-main
@libp2p/logger: > aegir test -t electron-main
@libp2p/peer-id-factory: > @libp2p/peer-id-factory@4.0.7 test:electron-main
@libp2p/peer-id-factory: > aegir test -t electron-main
@libp2p/logger: build
@libp2p/peer-id-factory: build
@libp2p/peer-id-factory: > @libp2p/peer-id-factory@4.0.7 build
@libp2p/peer-id-factory: > aegir build
@libp2p/logger: > @libp2p/logger@4.0.7 build
@libp2p/logger: > aegir build
@libp2p/peer-id-factory: [20:09:26] tsc [started]
@libp2p/logger: [20:09:26] tsc [started]
@libp2p/logger: [20:09:27] tsc [completed]
@libp2p/logger: [20:09:27] esbuild [started]
@libp2p/logger: [20:09:27] esbuild [completed]
@libp2p/logger: test electron main
@libp2p/logger: [20:09:27] Downloading electron: 27.0.2 [started]
@libp2p/peer-id-factory: [20:09:28] tsc [completed]
@libp2p/peer-id-factory: [20:09:28] esbuild [started]
@libp2p/logger: [20:09:28] Downloading electron: 27.0.2 [completed]
@libp2p/peer-id-factory: [20:09:28] esbuild [completed]
@libp2p/peer-id-factory: test electron main
@libp2p/peer-id-factory: [20:09:28] Downloading electron: 27.0.2 [started]
@libp2p/peer-id-factory: [20:09:28] Downloading electron: 27.0.2 [completed]
@libp2p/logger: [505077:0311/200928.381294:ERROR:object_proxy.cc(577)] Failed to call method: org.freedesktop.DBus.Properties.Get: object_path= /org/freedesktop/portal/desktop: org.freedesktop.DBus.Error.InvalidArgs: No such interface “org.freedesktop.portal.FileChooser”
@libp2p/logger: [505077:0311/200928.381351:ERROR:select_file_dialog_linux_portal.cc(280)] Failed to read portal version property
@libp2p/logger: Warning: Cannot find any files matching pattern "test/**/*.spec.{js,mjs,cjs}"
@libp2p/logger: 
@libp2p/logger:   logger
@libp2p/logger:     ✔ creates a logger
@libp2p/logger:     ✔ creates a peer logger
@libp2p/logger:     ✔ creates a logger with logging enabled
@libp2p/logger:     ✔ creates a logger with logging and errors enabled
@libp2p/logger:     ✔ creates a logger with trace enabled
@libp2p/logger:     ✔ has all formatters
@libp2p/logger: 2024-03-11T19:09:28.549Z printf-style multiaddr /ip4/127.0.0.1/tcp/4001
@libp2p/logger:     ✔ test printf style formatting
@libp2p/logger:     ✔ test ma formatter
@libp2p/logger:     ✔ test peerId formatter
@libp2p/logger:     ✔ test cid formatter
@libp2p/logger:     ✔ test base58 formatter
@libp2p/logger:     ✔ test base32 formatter
@libp2p/logger:     ✔ test base64 formatter
@libp2p/logger:     ✔ test datastore key formatter
@libp2p/logger:   utils
@libp2p/logger:     ✔ should truncate a peer id
@libp2p/logger:   15 passing (22ms)
@libp2p/peer-id-factory: [505107:0311/200928.615309:ERROR:object_proxy.cc(577)] Failed to call method: org.freedesktop.DBus.Properties.Get: object_path= /org/freedesktop/portal/desktop: org.freedesktop.DBus.Error.InvalidArgs: No such interface “org.freedesktop.portal.FileChooser”
@libp2p/peer-id-factory: [505107:0311/200928.615374:ERROR:select_file_dialog_linux_portal.cc(280)] Failed to read portal version property
@libp2p/peer-id-factory: Warning: Cannot find any files matching pattern "test/**/*.spec.{js,mjs,cjs}"
@libp2p/peer-id-factory: 
@libp2p/peer-id-factory:   PeerId
@libp2p/peer-id-factory:     ✔ create an id without 'new'
@libp2p/peer-id-factory:     ✔ create a new id
@libp2p/peer-id-factory:     ✔ can be created for a secp256k1 key
@libp2p/peer-id-factory:     ✔ can get the public key from a Secp256k1 key
@libp2p/peer-id-factory:     ✔ recreate from a Uint8Array
@libp2p/peer-id-factory:     ✔ recreate from a B58 String
@libp2p/peer-id-factory:     ✔ recreate from CID object
@libp2p/peer-id-factory:     ✔ recreate from Base58 String (CIDv0)
@libp2p/peer-id-factory:     ✔ recreate from Base36 String
@libp2p/peer-id-factory:     ✔ recreate from CIDv1 Base32 (libp2p-key multicodec)
@libp2p/peer-id-factory:     ✔ recreate from CID Uint8Array
@libp2p/peer-id-factory:     ✔ throws on invalid CID multicodec
@libp2p/peer-id-factory:     ✔ throws on invalid multihash value
@libp2p/peer-id-factory:     ✔ throws on invalid CID object
@libp2p/peer-id-factory:     ✔ recreate from a Public Key (86ms)
@libp2p/peer-id-factory:     ✔ recreate from a Private Key (50ms)
@libp2p/peer-id-factory:     ✔ recreate from Protobuf (52ms)
@libp2p/peer-id-factory:     ✔ recreate from embedded ed25519 key
@libp2p/peer-id-factory:     ✔ recreate from embedded secp256k1 key
@libp2p/peer-id-factory:     ✔ recreate from string key
@libp2p/peer-id-factory:     ✔ can be created from a secp256k1 public key
@libp2p/peer-id-factory:     ✔ can be created from a Secp256k1 private key
@libp2p/peer-id-factory:     ✔ Compare generated ID with one created from PubKey
@libp2p/peer-id-factory:     ✔ Works with default options
@libp2p/peer-id-factory:     ✔ Non-default # of bits
@libp2p/peer-id-factory:     ✔ equals
@libp2p/peer-id-factory:     ✔ keys are equal after one is stringified
@libp2p/peer-id-factory:     fromJSON
@libp2p/peer-id-factory:       ✔ full node
@libp2p/peer-id-factory:       ✔ only id
@libp2p/peer-id-factory:       ✔ go interop (38ms)
@libp2p/peer-id-factory:     returns error instead of crashing
@libp2p/peer-id-factory:       ✔ createFromPubKey (Uint8Array(10) [
@libp2p/peer-id-factory:   0, 1, 2, 3, 4,
@libp2p/peer-id-factory:   5, 6, 7, 8, 9
@libp2p/peer-id-factory: ])
@libp2p/peer-id-factory:       ✔ createFromPrivKey (Uint8Array(10) [
@libp2p/peer-id-factory:   0, 1, 2, 3, 4,
@libp2p/peer-id-factory:   5, 6, 7, 8, 9
@libp2p/peer-id-factory: ])
@libp2p/peer-id-factory:       ✔ createFromJSON (Uint8Array(10) [
@libp2p/peer-id-factory:   0, 1, 2, 3, 4,
@libp2p/peer-id-factory:   5, 6, 7, 8, 9
@libp2p/peer-id-factory: ])
@libp2p/peer-id-factory:       ✔ createFromProtobuf (Uint8Array(10) [
@libp2p/peer-id-factory:   0, 1, 2, 3, 4,
@libp2p/peer-id-factory:   5, 6, 7, 8, 9
@libp2p/peer-id-factory: ])
@libp2p/peer-id-factory:       ✔ createFromPubKey ({})
@libp2p/peer-id-factory:       ✔ createFromPrivKey ({})
@libp2p/peer-id-factory:       ✔ createFromJSON ({})
@libp2p/peer-id-factory:       ✔ createFromProtobuf ({})
@libp2p/peer-id-factory:       ✔ createFromPubKey (null)
@libp2p/peer-id-factory:       ✔ createFromPrivKey (null)
@libp2p/peer-id-factory:       ✔ createFromJSON (null)
@libp2p/peer-id-factory:       ✔ createFromProtobuf (null)
@libp2p/peer-id-factory:       ✔ createFromPubKey (false)
@libp2p/peer-id-factory:       ✔ createFromPrivKey (false)
@libp2p/peer-id-factory:       ✔ createFromJSON (false)
@libp2p/peer-id-factory:       ✔ createFromProtobuf (false)
@libp2p/peer-id-factory:       ✔ createFromPubKey (undefined)
@libp2p/peer-id-factory:       ✔ createFromPrivKey (undefined)
@libp2p/peer-id-factory:       ✔ createFromJSON (undefined)
@libp2p/peer-id-factory:       ✔ createFromProtobuf (undefined)
@libp2p/peer-id-factory:       ✔ createFromPubKey (true)
@libp2p/peer-id-factory:       ✔ createFromPrivKey (true)
@libp2p/peer-id-factory:       ✔ createFromJSON (true)
@libp2p/peer-id-factory:       ✔ createFromProtobuf (true)
@libp2p/peer-id-factory:       ✔ createFromPubKey (1)
@libp2p/peer-id-factory:       ✔ createFromPrivKey (1)
@libp2p/peer-id-factory:       ✔ createFromJSON (1)
@libp2p/peer-id-factory:       ✔ createFromProtobuf (1)
@libp2p/peer-id-factory:       ✔ createFromPubKey (0)
@libp2p/peer-id-factory:       ✔ createFromPrivKey (0)
@libp2p/peer-id-factory:       ✔ createFromJSON (0)
@libp2p/peer-id-factory:       ✔ createFromProtobuf (0)
@libp2p/peer-id-factory:       ✔ createFromPubKey (Uint8Array(0) [])
@libp2p/peer-id-factory:       ✔ createFromPrivKey (Uint8Array(0) [])
@libp2p/peer-id-factory:       ✔ createFromJSON (Uint8Array(0) [])
@libp2p/peer-id-factory:       ✔ createFromProtobuf (Uint8Array(0) [])
@libp2p/peer-id-factory:       ✔ createFromPubKey ('aGVsbG93b3JsZA==')
@libp2p/peer-id-factory:       ✔ createFromPrivKey ('aGVsbG93b3JsZA==')
@libp2p/peer-id-factory:       ✔ createFromJSON ('aGVsbG93b3JsZA==')
@libp2p/peer-id-factory:       ✔ createFromProtobuf ('aGVsbG93b3JsZA==')
@libp2p/peer-id-factory:       ✔ createFromPubKey ('helloworld')
@libp2p/peer-id-factory:       ✔ createFromPrivKey ('helloworld')
@libp2p/peer-id-factory:       ✔ createFromJSON ('helloworld')
@libp2p/peer-id-factory:       ✔ createFromProtobuf ('helloworld')
@libp2p/peer-id-factory:       ✔ createFromPubKey ('')
@libp2p/peer-id-factory:       ✔ createFromPrivKey ('')
@libp2p/peer-id-factory:       ✔ createFromJSON ('')
@libp2p/peer-id-factory:       ✔ createFromProtobuf ('')
@libp2p/peer-id-factory:   78 passing (339ms)

@libp2p/keychain: npm run test:electron-main

@libp2p/utils: npm run test:electron-main

@libp2p/peer-collections: npm run test:electron-main

@libp2p/multistream-select: npm run test:electron-main
@libp2p/utils: > @libp2p/utils@5.2.6 test:electron-main
@libp2p/utils: > aegir test -t electron-main
@libp2p/multistream-select: > @libp2p/multistream-select@5.1.4 test:electron-main
@libp2p/multistream-select: > aegir test -t electron-main
@libp2p/keychain: > @libp2p/keychain@4.0.9 test:electron-main
@libp2p/keychain: > aegir test -t electron-main
@libp2p/peer-collections: > @libp2p/peer-collections@5.1.7 test:electron-main
@libp2p/peer-collections: > aegir test -t electron-main
@libp2p/utils: build
@libp2p/multistream-select: build
@libp2p/keychain: build
@libp2p/peer-collections: build
@libp2p/utils: > @libp2p/utils@5.2.6 build
@libp2p/utils: > aegir build
@libp2p/keychain: > @libp2p/keychain@4.0.9 build
@libp2p/keychain: > aegir build
@libp2p/multistream-select: > @libp2p/multistream-select@5.1.4 build
@libp2p/multistream-select: > aegir build
@libp2p/peer-collections: > @libp2p/peer-collections@5.1.7 build
@libp2p/peer-collections: > aegir build
@libp2p/keychain: [20:09:31] tsc [started]
@libp2p/multistream-select: [20:09:31] tsc [started]
@libp2p/utils: [20:09:31] tsc [started]
@libp2p/peer-collections: [20:09:31] tsc [started]
@libp2p/keychain: [20:09:33] tsc [completed]
@libp2p/keychain: [20:09:33] esbuild [started]
@libp2p/keychain: [20:09:33] esbuild [completed]
@libp2p/keychain: test electron main
@libp2p/keychain: [20:09:33] Downloading electron: 27.0.2 [started]
@libp2p/peer-collections: [20:09:33] tsc [completed]
@libp2p/peer-collections: [20:09:33] esbuild [started]
@libp2p/multistream-select: [20:09:33] tsc [completed]
@libp2p/multistream-select: [20:09:33] esbuild [started]
@libp2p/peer-collections: [20:09:33] esbuild [completed]
@libp2p/multistream-select: [20:09:33] esbuild [completed]
@libp2p/peer-collections: test electron main
@libp2p/multistream-select: test electron main
@libp2p/keychain: [20:09:33] Downloading electron: 27.0.2 [completed]
@libp2p/utils: [20:09:33] tsc [completed]
@libp2p/utils: [20:09:33] esbuild [started]
@libp2p/utils: [20:09:33] esbuild [completed]
@libp2p/utils: test electron main
@libp2p/utils: [20:09:33] Downloading electron: 27.0.2 [started]
@libp2p/utils: [20:09:33] Downloading electron: 27.0.2 [completed]
@libp2p/keychain: [505660:0311/200934.156928:ERROR:object_proxy.cc(577)] Failed to call method: org.freedesktop.DBus.Properties.Get: object_path= /org/freedesktop/portal/desktop: org.freedesktop.DBus.Error.InvalidArgs: No such interface “org.freedesktop.portal.FileChooser”
@libp2p/keychain: [505660:0311/200934.157024:ERROR:select_file_dialog_linux_portal.cc(280)] Failed to read portal version property
@libp2p/keychain: Warning: Cannot find any files matching pattern "test/**/*.spec.{js,mjs,cjs}"
@libp2p/utils: [505698:0311/200934.245153:ERROR:object_proxy.cc(577)] Failed to call method: org.freedesktop.DBus.Properties.Get: object_path= /org/freedesktop/portal/desktop: org.freedesktop.DBus.Error.InvalidArgs: No such interface “org.freedesktop.portal.FileChooser”
@libp2p/utils: [505698:0311/200934.245209:ERROR:select_file_dialog_linux_portal.cc(280)] Failed to read portal version property
@libp2p/utils: Warning: Cannot find any files matching pattern "test/**/*.spec.{js,mjs,cjs}"
@libp2p/keychain: 
@libp2p/keychain:   keychain
@libp2p/keychain:     ✔ can start without a password
@libp2p/keychain:     ✔ needs a NIST SP 800-132 non-weak pass phrase
@libp2p/keychain:     ✔ has default options
@libp2p/keychain:     ✔ supports supported hashing alorithms
@libp2p/keychain:     ✔ does not support unsupported hashing alorithms
@libp2p/keychain:     ✔ can list keys without a password
@libp2p/peer-collections: [20:09:34] Downloading electron: 27.0.2 [started]
@libp2p/utils: 
@libp2p/utils:   abstract stream
@libp2p/utils:     ✔ sends data
@libp2p/utils:     ✔ receives data
@libp2p/keychain:     ✔ can find a key without a password (61ms)
@libp2p/utils:     ✔ closes
@libp2p/utils:     ✔ closes for reading
@libp2p/utils:     ✔ closes for writing
@libp2p/utils:     ✔ aborts
@libp2p/utils:     ✔ gets reset remotely
@libp2p/utils:     ✔ does not send close read when remote closes write (100ms)
@libp2p/peer-collections: [20:09:34] Downloading electron: 27.0.2 [completed]
@libp2p/utils:     ✔ does not send close write when remote closes read (101ms)
@libp2p/utils:     ✔ does not send close read or write when remote resets (102ms)
@libp2p/peer-collections: [505843:0311/200934.986186:ERROR:object_proxy.cc(577)] Failed to call method: org.freedesktop.DBus.Properties.Get: object_path= /org/freedesktop/portal/desktop: org.freedesktop.DBus.Error.InvalidArgs: No such interface “org.freedesktop.portal.FileChooser”
@libp2p/peer-collections: [505843:0311/200934.986242:ERROR:select_file_dialog_linux_portal.cc(280)] Failed to read portal version property
@libp2p/peer-collections: Warning: Cannot find any files matching pattern "test/**/*.spec.{js,mjs,cjs}"
@libp2p/peer-collections: 
@libp2p/peer-collections:   peer-list
@libp2p/peer-collections:     ✔ should return a list
@libp2p/peer-collections:     ✔ should create a list with PeerList contents
@libp2p/peer-collections:     ✔ should create a list with Array contents
@libp2p/peer-collections:   peer-map
@libp2p/peer-collections:     ✔ should return a map
@libp2p/peer-collections:     ✔ should create a map with contents
@libp2p/peer-collections:   peer-set
@libp2p/peer-collections:     ✔ should return a set
@libp2p/peer-collections:     ✔ should create a set with PeerSet contents
@libp2p/peer-collections:     ✔ should create a set with Array contents
@libp2p/peer-collections:     ✔ should create a set with Set contents
@libp2p/peer-collections:     ✔ should return intersection
@libp2p/peer-collections:     ✔ should return difference
@libp2p/peer-collections:     ✔ should return union
@libp2p/peer-collections:   tracked-peer-list
@libp2p/peer-collections:     ✔ should return a map with metrics
@libp2p/peer-collections:     ✔ should return a list without metrics
@libp2p/peer-collections:     ✔ should track metrics
@libp2p/peer-collections:   tracked-peer-map
@libp2p/peer-collections:     ✔ should return a map with metrics
@libp2p/peer-collections:     ✔ should return a map without metrics
@libp2p/peer-collections:     ✔ should track metrics
@libp2p/peer-collections:   tracked-peer-set
@libp2p/peer-collections:     ✔ should return a map with metrics
@libp2p/peer-collections:     ✔ should return a list without metrics
@libp2p/peer-collections:     ✔ should track metrics
@libp2p/peer-collections:   21 passing (37ms)
@libp2p/keychain:     ✔ can remove a key without a password (1005ms)
@libp2p/multistream-select: [20:09:35] Downloading electron: 27.0.2 [started]
@libp2p/utils:     ✔ should wait for sending data to finish when closing gracefully (1004ms)
@libp2p/utils:     ✔ should abort close due to timeout with slow sender
@libp2p/utils:   address-sort
@libp2p/utils:     public addresses first
@libp2p/utils:       ✔ should sort public addresses first
@libp2p/utils:     certified addresses first
@libp2p/utils:       ✔ should sort certified addresses first
@libp2p/utils:     circuit relay addresses last
@libp2p/utils:       ✔ should sort circuit relay addresses last
@libp2p/utils:     default address sort
@libp2p/utils:       ✔ should sort public, then public relay, then private, then private relay with certified addresses taking priority
@libp2p/utils:       ✔ should sort WebRTC over relay addresses before relay addresses
@libp2p/utils:   non primitive array equals
@libp2p/utils:     ✔ returns true if two arrays of multiaddrs are equal
@libp2p/utils:     ✔ returns true if two arrays of multiaddrs have the same content but different orders
@libp2p/utils:     ✔ returns false if two arrays of multiaddrs are different
@libp2p/utils:     ✔ returns false if two arrays of multiaddrs are partially equal, but different lengths
@libp2p/utils:   close source
@libp2p/utils:     ✔ should close an async iterable
@libp2p/utils:   IP and port to Multiaddr
@libp2p/utils:     ✔ creates multiaddr from valid IPv4 IP and port
@libp2p/utils:     ✔ creates multiaddr from valid IPv4 IP and numeric port
@libp2p/utils:     ✔ creates multiaddr from valid IPv4 in IPv6 IP and port
@libp2p/utils:     ✔ creates multiaddr from valid IPv6 IP and port
@libp2p/utils:     ✔ throws for missing IP address
@libp2p/utils:     ✔ throws for invalid IP address
@libp2p/utils:     ✔ throws for invalid port
@libp2p/utils:   is-promise
@libp2p/utils:     ✔ should detect Promise.resolve
@libp2p/utils:     ✔ should detect Promise.reject
@libp2p/utils:     ✔ should detect new Promise
@libp2p/utils:     ✔ should not detect boolean
@libp2p/utils:     ✔ should not detect object
@libp2p/utils:     ✔ should not detect number
@libp2p/utils:     ✔ should not detect partial promise
@libp2p/utils:   multiaddr isLoopback
@libp2p/utils:     ✔ identifies loopback ip4 multiaddrs
@libp2p/utils:     ✔ identifies non loopback ip4 multiaddrs
@libp2p/utils:     ✔ identifies loopback ip6 multiaddrs
@libp2p/utils:     ✔ identifies non loopback ip6 multiaddrs
@libp2p/utils:     ✔ identifies other multiaddrs as not loopback addresses
@libp2p/utils:   multiaddr isPrivate
@libp2p/utils:     ✔ identifies private ip4 multiaddrs
@libp2p/utils:     ✔ identifies public ip4 multiaddrs
@libp2p/utils:     ✔ identifies private ip6 multiaddrs
@libp2p/utils:     ✔ identifies public ip6 multiaddrs
@libp2p/utils:     ✔ identifies other multiaddrs as not private addresses
@libp2p/utils:     ✔ identifies non-public addresses
@libp2p/utils:   peer queue
@libp2p/utils:     ✔ should have jobs
@libp2p/utils:     ✔ can join existing jobs
@libp2p/utils:     ✔ can join an existing job that fails
@libp2p/utils:     ✔ cannot join jobs after clear
@libp2p/utils:   private-ip
@libp2p/utils:     ✔ identifies public ips
@libp2p/utils:     ✔ identifies private ips
@libp2p/utils:     ✔ identifies invalid ips
@libp2p/utils:   queue
@libp2p/utils:     ✔ adds
@libp2p/utils:     ✔ adds with limited concurrency (102ms)
@libp2p/multistream-select: [20:09:36] Downloading electron: 27.0.2 [completed]
@libp2p/keychain:     ✔ requires a name to create a password (810ms)
@libp2p/keychain:     ✔ can generate options (87ms)
@libp2p/keychain:     ✔ needs a passphrase to be used, otherwise throws an error
@libp2p/keychain:     ✔ can be used when a passphrase is provided (72ms)
@libp2p/keychain:     ✔ can reload keys (142ms)
@libp2p/keychain:     key name
@libp2p/multistream-select: [505955:0311/200936.668505:ERROR:object_proxy.cc(577)] Failed to call method: org.freedesktop.DBus.Properties.Get: object_path= /org/freedesktop/portal/desktop: org.freedesktop.DBus.Error.InvalidArgs: No such interface “org.freedesktop.portal.FileChooser”
@libp2p/multistream-select: [505955:0311/200936.668565:ERROR:select_file_dialog_linux_portal.cc(280)] Failed to read portal version property
@libp2p/multistream-select: Warning: Cannot find any files matching pattern "test/**/*.spec.{js,mjs,cjs}"
@libp2p/multistream-select: 
@libp2p/multistream-select:   Dialer
@libp2p/multistream-select:     dialer.select
@libp2p/multistream-select:       ✔ should select from single protocol on outgoing stream
@libp2p/multistream-select:       ✔ should select from single protocol on incoming stream
@libp2p/utils:     ✔ adds with concurrency 1 (1082ms)
@libp2p/utils:     ✔ adds with concurrency 5 (225ms)
@libp2p/keychain:       ✔ is a valid filename and non-ASCII (926ms)
@libp2p/keychain:     key
@libp2p/keychain:       ✔ can be an RSA key (257ms)
@libp2p/keychain:       ✔ is encrypted PEM encoded PKCS #8
@libp2p/multistream-select:       ✔ should fail to select twice (1003ms)
@libp2p/multistream-select:       ✔ should select from multiple protocols
@libp2p/multistream-select:       ✔ should throw if protocol selection fails
@libp2p/multistream-select:     dialer optimistic select
@libp2p/multistream-select:       ✔ should optimistically select a single protocol when negotiateFully is false
@libp2p/multistream-select:       ✔ should not optimistically select a single protocol when negotiateFully is true
@libp2p/multistream-select:   Dialer and Listener integration
@libp2p/multistream-select:     ✔ should handle and select
@libp2p/multistream-select:     ✔ should handle, ls and select
@libp2p/multistream-select:     ✔ should handle and select with Uint8Array streams
@libp2p/multistream-select:     ✔ should handle and optimistically select
@libp2p/multistream-select:     ✔ should handle and optimistically select that fails
@libp2p/multistream-select:     ✔ should handle and optimistically select only by reading
@libp2p/multistream-select:     ✔ should handle and optimistically select only by writing
@libp2p/multistream-select:     ✔ should handle and optimistically select only by reading that fails
@libp2p/multistream-select:     ✔ should abort an unhandled optimistically select
@libp2p/multistream-select:   Listener
@libp2p/multistream-select:     listener.handle
@libp2p/multistream-select:       ✔ should handle a protocol
@libp2p/multistream-select:       ✔ should reject unhandled protocols
@libp2p/multistream-select:       ✔ should reject when unsupported protocols are ignored
@libp2p/multistream-select:       ✔ should handle ls
@libp2p/multistream-select:   Multistream
@libp2p/multistream-select:     Multistream.write
@libp2p/multistream-select:       ✔ should encode and write a multistream-select message
@libp2p/multistream-select:     Multistream.read
@libp2p/multistream-select:       ✔ should decode a multistream-select message
@libp2p/multistream-select:       ✔ should throw for non-newline delimited message
@libp2p/multistream-select:       ✔ should throw for a large message
@libp2p/multistream-select:       ✔ should throw for a 0-length message
@libp2p/multistream-select:       ✔ should be abortable
@libp2p/multistream-select:   26 passing (1s)
@libp2p/keychain:       ✔ throws if an invalid private key name is given (878ms)
@libp2p/keychain:       ✔ throws if a private key cant be found (282ms)
@libp2p/keychain:       ✔ does not overwrite existing key (441ms)
@libp2p/keychain:       ✔ cannot create the "self" key (668ms)
@libp2p/keychain:       ✔ should validate name is string (813ms)
@libp2p/keychain:       ✔ should validate type is string (1001ms)
@libp2p/utils:     ✔ updates concurrency while adding (4693ms)
@libp2p/utils:     ✔ adds with priority
@libp2p/utils:     ✔ .onEmpty()
@libp2p/utils:     ✔ aborts .onEmpty()
@libp2p/keychain:       ✔ should validate size is integer (512ms)
@libp2p/keychain:       implements NIST SP 800-131A
@libp2p/utils:     ✔ .onIdle() (405ms)
@libp2p/utils:     ✔ aborts .onIdle()
@libp2p/keychain:         ✔ disallows RSA length < 2048 (306ms)
@libp2p/keychain:     Ed25519 keys
@libp2p/keychain:       ✔ can be an Ed25519 key
@libp2p/utils:     ✔ .onSizeLessThan() (506ms)
@libp2p/utils:     ✔ aborts .onSizeLessThan()
@libp2p/utils:     ✔ .onIdle() - no pending
@libp2p/utils:     ✔ .clear()
@libp2p/utils:     ✔ .add() - handle task throwing error
@libp2p/utils:     ✔ should emit active event per item
@libp2p/utils:     ✔ should emit idle event when idle (303ms)
@libp2p/utils:     ✔ should emit empty event when empty
@libp2p/utils:     ✔ should emit add event when adding task (305ms)
@libp2p/keychain:       ✔ does not overwrite existing key (909ms)
@libp2p/keychain:       ✔ can export/import a key (39ms)
@libp2p/utils:     ✔ should emit next event when completing task (305ms)
@libp2p/utils:     ✔ should emit completed / error events (203ms)
@libp2p/utils:     ✔ should skip an aborted job
@libp2p/utils:     ✔ should abort a job
@libp2p/utils:     ✔ should pass AbortSignal instance to job
@libp2p/utils:     ✔ aborting multiple jobs at the same time
@libp2p/utils:     ✔ should abort jobs
@libp2p/utils:     ✔ can be used as a generator (54ms)
@libp2p/utils:     ✔ can abort a generator
@libp2p/utils:     ✔ can break out of a loop with a generator (202ms)
@libp2p/utils:   RateLimiter with fixed window
@libp2p/utils:     ✔ consume 1 point
@libp2p/utils:     ✔ can not consume more than maximum points
@libp2p/utils:     ✔ execute evenly over duration with minimum delay 20 ms (41ms)
@libp2p/keychain:       ✔ cannot create the "self" key (997ms)
@libp2p/keychain:     query
@libp2p/keychain:       ✔ finds all existing keys
@libp2p/keychain:       ✔ finds a key by name
@libp2p/keychain:       ✔ finds a key by id
@libp2p/keychain:       ✔ returns the key's name and id
@libp2p/keychain:     exported key
@libp2p/keychain:       ✔ requires the password (425ms)
@libp2p/keychain:       ✔ requires the key name (647ms)
@libp2p/keychain:       ✔ is a PKCS #8 encrypted pem (379ms)
@libp2p/keychain:       ✔ can be imported (244ms)
@libp2p/utils:     ✔ execute evenly over duration (2503ms)
@libp2p/utils:     ✔ makes penalty
@libp2p/utils:     ✔ reward points
@libp2p/utils:     ✔ use keyPrefix from options
@libp2p/utils:     ✔ blocks key for block duration when consumed more than points
@libp2p/keychain:       ✔ requires the pem (686ms)
@libp2p/keychain:       ✔ cannot be imported as an existing key name (785ms)
@libp2p/utils:     ✔ do not block key second time until block expires no matter how many points consumed (1203ms)
@libp2p/keychain:       ✔ cannot be imported with the wrong password (364ms)
@libp2p/keychain:     peer id
@libp2p/keychain:       ✔ private key can be imported (151ms)
@libp2p/keychain:       ✔ private key can be exported (381ms)
@libp2p/keychain:       ✔ private key import requires a valid name (968ms)
@libp2p/keychain:       ✔ private key import requires the peer (244ms)
@libp2p/keychain:       ✔ key id exists
@libp2p/keychain:       ✔ key name exists
@libp2p/keychain:       ✔ can create Ed25519 peer id (52ms)
@libp2p/utils:     ✔ block expires in blockDuration seconds (2002ms)
@libp2p/utils:     ✔ block custom key
@libp2p/utils:     ✔ get by key
@libp2p/utils:     ✔ get resolves null if key is not set
@libp2p/utils:     ✔ delete resolves true if key is set
@libp2p/utils:     ✔ delete resolves false if key is not set
@libp2p/utils:     ✔ consume applies options.customDuration to set expire
@libp2p/utils:     ✔ consume applies options.customDuration to set not expiring key
@libp2p/utils:     ✔ penalty applies options.customDuration to set expire
@libp2p/utils:     ✔ reward applies options.customDuration to set expire
@libp2p/utils:     ✔ does not expire key if duration set to 0
@libp2p/keychain:       ✔ can create RSA peer id (527ms)
@libp2p/keychain:       ✔ can create secp256k1 peer id (74ms)
@libp2p/keychain:     rename
@libp2p/keychain:       ✔ requires an existing key name (233ms)
@libp2p/utils:     ✔ block key forever, if secDuration is 0 (1000ms)
@libp2p/utils:     ✔ set points by key
@libp2p/keychain:       ✔ requires a valid new key name (621ms)
@libp2p/utils:     ✔ set points by key forever (1101ms)
@libp2p/utils:     ✔ consume should start new time window if previous already expired (msBeforeNext is negative)
@libp2p/utils:   Convert stream into a multiaddr connection
@libp2p/utils:     ✔ converts a stream and adds the provided metadata
@libp2p/utils:     ✔ can stream data over the multiaddr connection
@libp2p/utils:   tracked-list
@libp2p/keychain:       ✔ does not overwrite existing key (735ms)
@libp2p/utils:     ✔ should return a list with metrics
@libp2p/utils:     ✔ should return a map without metrics
@libp2p/utils:     ✔ should track metrics
@libp2p/utils:   tracked-map
@libp2p/utils:     ✔ should return a map with metrics
@libp2p/utils:     ✔ should return a map without metrics
@libp2p/utils:     ✔ should track metrics
@libp2p/utils:   115 passing (18s)
@libp2p/keychain:       ✔ cannot create the "self" key (360ms)
@libp2p/keychain:       ✔ removes the existing key name (976ms)
@libp2p/keychain:       ✔ creates the new key name
@libp2p/keychain:       ✔ does not change the key ID
@libp2p/keychain:       ✔ throws with invalid key names (984ms)
@libp2p/keychain:     key removal
@libp2p/keychain:       ✔ cannot remove the "self" key (981ms)
@libp2p/keychain:       ✔ cannot remove an unknown key (752ms)
@libp2p/keychain:       ✔ can remove a known key
@libp2p/keychain:     rotate keychain passphrase
@libp2p/keychain:       ✔ should validate newPass is a string (810ms)
@libp2p/keychain:       ✔ should validate oldPass is a string (362ms)
@libp2p/keychain:       ✔ should validate newPass is at least 20 characters (996ms)
@libp2p/keychain:       ✔ can rotate keychain passphrase (1715ms)
@libp2p/keychain:   peer ID
@libp2p/keychain:     ✔ decoded public key (54ms)
@libp2p/keychain:     ✔ encoded public key with DER
@libp2p/keychain:     ✔ encoded public key with JWT
@libp2p/keychain:     ✔ decoded private key (44ms)
@libp2p/keychain:   67 passing (26s)

@libp2p/peer-record: npm run test:electron-main
@libp2p/peer-record: > @libp2p/peer-record@7.0.10 test:electron-main
@libp2p/peer-record: > aegir test -t electron-main
@libp2p/peer-record: build
@libp2p/peer-record: > @libp2p/peer-record@7.0.10 build
@libp2p/peer-record: > aegir build
@libp2p/peer-record: [20:10:03] tsc [started]
@libp2p/peer-record: [20:10:05] tsc [completed]
@libp2p/peer-record: [20:10:05] esbuild [started]
@libp2p/peer-record: [20:10:05] esbuild [completed]
@libp2p/peer-record: test electron main
@libp2p/peer-record: [20:10:05] Downloading electron: 27.0.2 [started]
@libp2p/peer-record: [20:10:06] Downloading electron: 27.0.2 [completed]
@libp2p/peer-record: [506857:0311/201006.697418:ERROR:object_proxy.cc(577)] Failed to call method: org.freedesktop.DBus.Properties.Get: object_path= /org/freedesktop/portal/desktop: org.freedesktop.DBus.Error.InvalidArgs: No such interface “org.freedesktop.portal.FileChooser”
@libp2p/peer-record: [506857:0311/201006.697543:ERROR:select_file_dialog_linux_portal.cc(280)] Failed to read portal version property
@libp2p/peer-record: Warning: Cannot find any files matching pattern "test/**/*.spec.{js,mjs,cjs}"
@libp2p/peer-record: 
@libp2p/peer-record:   Envelope
@libp2p/peer-record:     ✔ creates an envelope with a random key
@libp2p/peer-record:     ✔ can seal a record
@libp2p/peer-record:     ✔ can open and verify a sealed record
@libp2p/peer-record:     ✔ throw on open and verify when a different domain is used
@libp2p/peer-record:   PeerRecord
@libp2p/peer-record:     ✔ de/serializes the same as a go record
@libp2p/peer-record:     ✔ creates a peer record with peerId
@libp2p/peer-record:     ✔ creates a peer record with provided data
@libp2p/peer-record:     ✔ marshals and unmarshals a peer record
@libp2p/peer-record:     ✔ equals returns false if the peer record has a different peerId
@libp2p/peer-record:     ✔ equals returns false if the peer record has a different seqNumber
@libp2p/peer-record:     ✔ equals returns false if the peer record has a different multiaddrs
@libp2p/peer-record:   PeerRecord inside Envelope
@libp2p/peer-record:     ✔ creates an envelope with the PeerRecord and can unmarshal it
@libp2p/peer-record:   12 passing (28ms)

@libp2p/peer-store: npm run test:electron-main

@libp2p/upnp-nat: npm run test:electron-main

@libp2p/interface-compliance-tests: npm run test:electron-main

@libp2p/pubsub: npm run test:electron-main
@libp2p/peer-store: > @libp2p/peer-store@10.0.11 test:electron-main
@libp2p/peer-store: > aegir test -t electron-main
@libp2p/upnp-nat: > @libp2p/upnp-nat@1.0.14 test:electron-main
@libp2p/upnp-nat: > aegir test -t electron-main
@libp2p/pubsub: > @libp2p/pubsub@9.0.11 test:electron-main
@libp2p/pubsub: > aegir test -t electron-main
@libp2p/interface-compliance-tests: > @libp2p/interface-compliance-tests@5.3.2 test:electron-main
@libp2p/interface-compliance-tests: > aegir test -t electron-main
@libp2p/interface-compliance-tests: build
@libp2p/peer-store: build
@libp2p/pubsub: build
@libp2p/upnp-nat: build
@libp2p/peer-store: > @libp2p/peer-store@10.0.11 build
@libp2p/peer-store: > aegir build
@libp2p/interface-compliance-tests: > @libp2p/interface-compliance-tests@5.3.2 build
@libp2p/interface-compliance-tests: > aegir build
@libp2p/upnp-nat: > @libp2p/upnp-nat@1.0.14 build
@libp2p/upnp-nat: > aegir build --no-bundle
@libp2p/pubsub: > @libp2p/pubsub@9.0.11 build
@libp2p/pubsub: > aegir build
@libp2p/peer-store: [20:10:10] tsc [started]
@libp2p/interface-compliance-tests: [20:10:10] tsc [started]
@libp2p/upnp-nat: [20:10:10] tsc [started]
@libp2p/pubsub: [20:10:10] tsc [started]
@libp2p/upnp-nat: [20:10:11] tsc [completed]
@libp2p/upnp-nat: test electron main
@libp2p/upnp-nat: [20:10:11] Downloading electron: 27.0.2 [started]
@libp2p/upnp-nat: [20:10:12] Downloading electron: 27.0.2 [completed]
@libp2p/peer-store: [20:10:12] tsc [completed]
@libp2p/peer-store: [20:10:12] esbuild [started]
@libp2p/peer-store: [20:10:12] esbuild [completed]
@libp2p/peer-store: test electron main
@libp2p/peer-store: [20:10:12] Downloading electron: 27.0.2 [started]
@libp2p/pubsub: [20:10:12] tsc [completed]
@libp2p/pubsub: [20:10:12] esbuild [started]
@libp2p/pubsub: [20:10:12] esbuild [completed]
@libp2p/pubsub: test electron main
@libp2p/upnp-nat: [507306:0311/201012.752316:ERROR:object_proxy.cc(577)] Failed to call method: org.freedesktop.DBus.Properties.Get: object_path= /org/freedesktop/portal/desktop: org.freedesktop.DBus.Error.InvalidArgs: No such interface “org.freedesktop.portal.FileChooser”
@libp2p/upnp-nat: [507306:0311/201012.752378:ERROR:select_file_dialog_linux_portal.cc(280)] Failed to read portal version property
@libp2p/upnp-nat: Warning: Cannot find any files matching pattern "test/**/*.spec.{js,mjs,cjs}"
@libp2p/peer-store: [20:10:12] Downloading electron: 27.0.2 [completed]
@libp2p/interface-compliance-tests: [20:10:12] tsc [completed]
@libp2p/interface-compliance-tests: [20:10:12] esbuild [started]
@libp2p/interface-compliance-tests: [20:10:12] esbuild [completed]
@libp2p/interface-compliance-tests: test electron main
@libp2p/interface-compliance-tests: [20:10:12] Downloading electron: 27.0.2 [started]
@libp2p/upnp-nat: 
@libp2p/upnp-nat:   UPnP NAT (TCP)
@libp2p/upnp-nat:     ✔ should map TCP connections to external ports
@libp2p/upnp-nat:     ✔ should not map TCP connections when double-natted
@libp2p/upnp-nat:     ✔ should not map non-ipv4 connections to external ports
@libp2p/upnp-nat:     ✔ should not map non-ipv6 loopback connections to external ports
@libp2p/upnp-nat:     ✔ should not map non-TCP connections to external ports
@libp2p/upnp-nat:     ✔ should not map loopback connections to external ports
@libp2p/upnp-nat:     ✔ should not map non-thin-waist connections to external ports
@libp2p/upnp-nat:     ✔ should specify large enough TTL
@libp2p/upnp-nat:   8 passing (27ms)
@libp2p/interface-compliance-tests: [20:10:13] Downloading electron: 27.0.2 [completed]
@libp2p/peer-store: [507389:0311/201013.219550:ERROR:object_proxy.cc(577)] Failed to call method: org.freedesktop.DBus.Properties.Get: object_path= /org/freedesktop/portal/desktop: org.freedesktop.DBus.Error.InvalidArgs: No such interface “org.freedesktop.portal.FileChooser”
@libp2p/peer-store: [507389:0311/201013.219583:ERROR:select_file_dialog_linux_portal.cc(280)] Failed to read portal version property
@libp2p/peer-store: Warning: Cannot find any files matching pattern "test/**/*.spec.{js,mjs,cjs}"
@libp2p/peer-store: 
@libp2p/peer-store:   PersistentPeerStore
@libp2p/peer-store:     ✔ has an empty map of peers
@libp2p/peer-store:     has
@libp2p/peer-store:       ✔ has peer data
@libp2p/peer-store:     delete
@libp2p/peer-store:       ✔ deletes peer data
@libp2p/peer-store:       ✔ does not allow deleting the self peer
@libp2p/peer-store:     tags
@libp2p/peer-store:       ✔ tags a peer
@libp2p/peer-store:       ✔ tags a peer with a value
@libp2p/peer-store:       ✔ tags a peer with a valid value
@libp2p/interface-compliance-tests: [507523:0311/201013.529934:ERROR:object_proxy.cc(577)] Failed to call method: org.freedesktop.DBus.Properties.Get: object_path= /org/freedesktop/portal/desktop: org.freedesktop.DBus.Error.InvalidArgs: No such interface “org.freedesktop.portal.FileChooser”
@libp2p/interface-compliance-tests: [507523:0311/201013.530219:ERROR:select_file_dialog_linux_portal.cc(280)] Failed to read portal version property
@libp2p/interface-compliance-tests: Warning: Cannot find any files matching pattern "test/**/*.spec.{js,mjs,cjs}"
@libp2p/peer-store:       ✔ tags a peer with an expiring value (102ms)
@libp2p/peer-store:       ✔ untags a peer
@libp2p/peer-store:     peer record
@libp2p/peer-store:       ✔ consumes a peer record, creating a peer
@libp2p/peer-store:       ✔ overwrites old addresses with those from a peer record
@libp2p/peer-store:       ✔ ignores older peer records
@libp2p/peer-store:       ✔ ignores record for unexpected peer
@libp2p/peer-store:       ✔ allows queries
@libp2p/peer-store:   merge
@libp2p/peer-store:     ✔ emits peer:update event on merge
@libp2p/peer-store:     ✔ emits self:peer:update event on merge for self peer
@libp2p/peer-store:     ✔ merges multiaddrs
@libp2p/peer-store:     ✔ merges metadata
@libp2p/peer-store:     ✔ merges tags
@libp2p/peer-store:     ✔ merges protocols
@libp2p/peer-store:     ✔ merges peer record envelope
@libp2p/peer-store:   patch
@libp2p/peer-store:     ✔ emits peer:update event on patch
@libp2p/peer-store:     ✔ emits self:peer:update event on patch for self peer
@libp2p/peer-store:     ✔ replaces multiaddrs
@libp2p/peer-store:     ✔ replaces metadata
@libp2p/peer-store:     ✔ replaces tags
@libp2p/peer-store:     ✔ replaces protocols
@libp2p/peer-store:     ✔ replaces peer record envelope
@libp2p/peer-store:   save
@libp2p/peer-store:     ✔ throws invalid parameters error if invalid PeerId is provided
@libp2p/peer-store:     ✔ throws invalid parameters error if no peer data provided
@libp2p/peer-store:     ✔ throws invalid parameters error if invalid multiaddrs are provided
@libp2p/peer-store:     ✔ replaces the stored content by default and emit change event
@libp2p/peer-store:     ✔ emits on set if not storing the exact same content
@libp2p/peer-store:     ✔ emits self event on save for self peer
@libp2p/peer-store:     ✔ does not emit on set if it is storing the exact same content (51ms)
@libp2p/peer-store:     ✔ should not set public key when key does not match
@libp2p/peer-store:     ✔ should not store a public key if already stored
@libp2p/pubsub: [20:10:13] Downloading electron: 27.0.2 [started]
@libp2p/peer-store:     ✔ should not store a public key if part of peer id (76ms)
@libp2p/peer-store:     ✔ saves all of the fields
@libp2p/peer-store:   dedupe-addresses
@libp2p/peer-store:     ✔ should dedupe addresses
@libp2p/peer-store:     ✔ should sort addresses
@libp2p/peer-store:     ✔ should retain isCertified when deduping addresses
@libp2p/peer-store:     ✔ should filter addresses
@libp2p/peer-store:   43 passing (312ms)
@libp2p/interface-compliance-tests: 
@libp2p/interface-compliance-tests:   peer id matcher
@libp2p/interface-compliance-tests:     ✔ should match the same object
@libp2p/interface-compliance-tests:     ✔ should match the same value
@libp2p/interface-compliance-tests:   multiaddr matcher
@libp2p/interface-compliance-tests:     ✔ should match the same object
@libp2p/interface-compliance-tests:     ✔ should match the same value
@libp2p/interface-compliance-tests:   mock connection compliance tests
@libp2p/interface-compliance-tests:     connection
@libp2p/interface-compliance-tests:       open connection
@libp2p/interface-compliance-tests:         ✔ should have properties set
@libp2p/interface-compliance-tests:         ✔ should get the metadata of an open connection
@libp2p/interface-compliance-tests:         ✔ should return an empty array of streams
@libp2p/interface-compliance-tests:         ✔ should be able to create a new stream
@libp2p/interface-compliance-tests:       close connection
@libp2p/interface-compliance-tests:         ✔ should be able to close the connection after being created
@libp2p/interface-compliance-tests:         ✔ should be able to close the connection after opening a stream
@libp2p/interface-compliance-tests:         ✔ should properly track streams
@libp2p/interface-compliance-tests:         ✔ should track outbound streams
@libp2p/interface-compliance-tests:         ✔ should support a proxy on the timeline
@libp2p/interface-compliance-tests:         ✔ should fail to create a new stream if the connection is closing
@libp2p/pubsub: [20:10:13] Downloading electron: 27.0.2 [completed]
@libp2p/interface-compliance-tests:         ✔ should fail to create a new stream if the connection is closed
@libp2p/interface-compliance-tests:   mock stream muxer compliance tests
@libp2p/interface-compliance-tests:     interface-stream-muxer
@libp2p/interface-compliance-tests:       base
@libp2p/interface-compliance-tests:         ✔ Open a stream from the dialer
@libp2p/interface-compliance-tests:         ✔ Open a stream from the listener
@libp2p/interface-compliance-tests:         ✔ Open a stream on both sides
@libp2p/interface-compliance-tests:         ✔ Open a stream on one side, write, open a stream on the other side
@libp2p/interface-compliance-tests:         ✔ should echo a small value via a pipe
@libp2p/pubsub: [507694:0311/201014.235637:ERROR:object_proxy.cc(577)] Failed to call method: org.freedesktop.DBus.Properties.Get: object_path= /org/freedesktop/portal/desktop: org.freedesktop.DBus.Error.InvalidArgs: No such interface “org.freedesktop.portal.FileChooser”
@libp2p/pubsub: [507694:0311/201014.235687:ERROR:select_file_dialog_linux_portal.cc(280)] Failed to read portal version property
@libp2p/pubsub: Warning: Cannot find any files matching pattern "test/**/*.spec.{js,mjs,cjs}"
@libp2p/pubsub: 
@libp2p/pubsub:   emitSelf
@libp2p/pubsub:     enabled
@libp2p/pubsub:       ✔ should emit to self on publish
@libp2p/pubsub:       ✔ should publish a message without data
@libp2p/pubsub:     disabled
@libp2p/pubsub:       ✔ should not emit to self on publish (1002ms)
@libp2p/pubsub:   pubsub instance
@libp2p/pubsub:     ✔ should throw if no init is provided
@libp2p/pubsub:     ✔ should accept valid parameters
@libp2p/pubsub:   pubsub base lifecycle
@libp2p/pubsub:     should start and stop properly
@libp2p/pubsub:       ✔ should be able to start and stop
@libp2p/pubsub:       ✔ starting should not throw if already started
@libp2p/pubsub:       ✔ stopping should not throw if not started
@libp2p/pubsub:     should be able to register two nodes
@libp2p/pubsub:       ✔ should handle onConnect as expected
@libp2p/pubsub:       ✔ should use the latest connection if onConnect is called more than once
@libp2p/pubsub:       ✔ should handle newStream errors in onConnect
@libp2p/pubsub:       ✔ should handle onDisconnect as expected
@libp2p/pubsub:       ✔ should handle onDisconnect for unknown peers
@libp2p/pubsub:   pubsub base messages
@libp2p/pubsub:     ✔ buildMessage normalizes and signs messages
@libp2p/pubsub:     ✔ validate with StrictNoSign will reject a message with from, signature, key, seqno present
@libp2p/pubsub:     ✔ validate with StrictNoSign will validate a message without a signature, key, and seqno
@libp2p/pubsub:     ✔ validate with StrictSign requires a signature
@libp2p/pubsub:   pubsub base implementation
@libp2p/pubsub:     publish
@libp2p/pubsub:       ✔ calls _publish for router to forward messages
@libp2p/pubsub:       ✔ should sign messages on publish
@libp2p/pubsub:       ✔ calls publishes messages twice
@libp2p/pubsub:     subscribe
@libp2p/pubsub:       basics
@libp2p/pubsub:         ✔ should add subscription
@libp2p/pubsub:       two nodes
@libp2p/pubsub:         ✔ should send subscribe message to connected peers
@libp2p/pubsub:     unsubscribe
@libp2p/pubsub:       basics
@libp2p/pubsub:         ✔ should remove all subscriptions for a topic
@libp2p/pubsub:       two nodes
@libp2p/pubsub:         ✔ should send unsubscribe message to connected peers (44ms)
@libp2p/pubsub:         ✔ should not send unsubscribe message to connected peers if not subscribed
@libp2p/pubsub:     getTopics
@libp2p/pubsub:       ✔ returns the subscribed topics
@libp2p/pubsub:     getSubscribers
@libp2p/pubsub:       ✔ should fail if pubsub is not started
@libp2p/pubsub:       ✔ should fail if no topic is provided
@libp2p/pubsub:       ✔ should get peer subscribed to one topic
@libp2p/pubsub:     verification
@libp2p/pubsub:       ✔ should drop unsigned messages (1003ms)
@libp2p/pubsub:       ✔ should not drop unsigned messages if strict signing is disabled
@libp2p/pubsub:   message signing
@libp2p/pubsub:     ✔ should be able to sign and verify a message (80ms)
@libp2p/pubsub:     ✔ should be able to extract the public key from an inlined key
@libp2p/pubsub:     ✔ should be able to extract the public key from the message
@libp2p/pubsub:   topic validators
@libp2p/pubsub:     ✔ should filter messages by topic validator (41ms)
@libp2p/pubsub:   utils
@libp2p/pubsub:     ✔ randomSeqno
@libp2p/pubsub:     ✔ msgId should not generate same ID for two different Uint8Arrays
@libp2p/pubsub:     ✔ anyMatch
@libp2p/pubsub:     ✔ ensureArray
@libp2p/pubsub:     ✔ converts an OUT msg.from to binary
@libp2p/pubsub:     ✔ converts non-negative BigInts to bytes and back
@libp2p/pubsub:     ✔ ensures message is signed if public key is extractable
@libp2p/pubsub:   42 passing (2s)
@libp2p/interface-compliance-tests:         ✔ should echo a large value via a pipe (7882ms)
@libp2p/interface-compliance-tests:         ✔ should echo a small value via sink
@libp2p/interface-compliance-tests:         ✔ should echo a large value via sink (1475ms)
@libp2p/interface-compliance-tests:         ✔ should echo a small value via a pushable
@libp2p/interface-compliance-tests:         ✔ should echo a large value via a pushable (3446ms)
@libp2p/interface-compliance-tests:       close
@libp2p/interface-compliance-tests:         ✔ closing underlying socket closes streams (53ms)
@libp2p/interface-compliance-tests:         ✔ calling close closes streams (55ms)
@libp2p/interface-compliance-tests:         ✔ calling close with an error aborts streams (53ms)
@libp2p/interface-compliance-tests:         ✔ calling newStream after close throws an error
@libp2p/interface-compliance-tests:         ✔ closing one of the muxed streams doesn't close others (104ms)
@libp2p/interface-compliance-tests:         ✔ can close a stream for writing
@libp2p/interface-compliance-tests:         ✔ can close a stream for reading
@libp2p/interface-compliance-tests:         ✔ calls onStreamEnd for closed streams not previously written
@libp2p/interface-compliance-tests:         ✔ calls onStreamEnd for read and write closed streams not previously written
@libp2p/interface-compliance-tests:         ✔ should wait for all data to be sent when closing streams
@libp2p/interface-compliance-tests:       stress test
@libp2p/interface-compliance-tests:         ✔ 1 stream with 1 msg
@libp2p/interface-compliance-tests:         ✔ 1 stream with 10 msg
@libp2p/interface-compliance-tests:         ✔ 1 stream with 100 msg
@libp2p/interface-compliance-tests:         ✔ 10 streams with 1 msg
@libp2p/interface-compliance-tests:         ✔ 10 streams with 10 msg
@libp2p/interface-compliance-tests:         ✔ 10 streams with 100 msg
@libp2p/interface-compliance-tests:         ✔ 100 streams with 1 msg
@libp2p/interface-compliance-tests:         ✔ 100 streams with 10 msg (43ms)
@libp2p/interface-compliance-tests:         ✔ 100 streams with 100 msg (175ms)
@libp2p/interface-compliance-tests:         ✔ 1000 streams with 1 msg (190ms)
@libp2p/interface-compliance-tests:         ✔ 1000 streams with 10 msg (317ms)
@libp2p/interface-compliance-tests:         ✔ 1000 streams with 100 msg (1788ms)
@libp2p/interface-compliance-tests:       mega stress test
@libp2p/interface-compliance-tests:         - 10,000 streams with 10,000 msg
@libp2p/interface-compliance-tests:   mock peer discovery compliance tests
@libp2p/interface-compliance-tests:     interface-peer-discovery compliance tests
@libp2p/interface-compliance-tests:       ✔ can start the service
@libp2p/interface-compliance-tests:       ✔ can start and stop the service
@libp2p/interface-compliance-tests:       ✔ should not fail to stop the service if it was not started
@libp2p/interface-compliance-tests:       ✔ should not fail to start the service if it is already started
@libp2p/interface-compliance-tests:       ✔ should emit a peer event after start
@libp2p/interface-compliance-tests:       ✔ should not receive a peer event before start (2001ms)
@libp2p/interface-compliance-tests:       ✔ should not receive a peer event after stop (2004ms)
@libp2p/interface-compliance-tests:   54 passing (20s)
@libp2p/interface-compliance-tests:   1 pending

@libp2p/prometheus-metrics: npm run test:electron-main

@libp2p/websockets: npm run test:electron-main

@libp2p/bootstrap: npm run test:electron-main

@libp2p/mdns: npm run test:electron-main

@libp2p/mplex: npm run test:electron-main

@libp2p/tcp: npm run test:electron-main

@libp2p/floodsub: npm run test:electron-main
@libp2p/bootstrap: > @libp2p/bootstrap@10.0.16 test:electron-main
@libp2p/bootstrap: > aegir test -t electron-main
@libp2p/prometheus-metrics: > @libp2p/prometheus-metrics@3.0.16 test:electron-main
@libp2p/prometheus-metrics: > aegir test -t electron-main --cov
@libp2p/websockets: > @libp2p/websockets@8.0.16 test:electron-main
@libp2p/websockets: > aegir test -t electron-main -f ./dist/test/node.js --cov
@libp2p/mplex: > @libp2p/mplex@10.0.16 test:electron-main
@libp2p/mplex: > aegir test -t electron-main
@libp2p/mdns: > @libp2p/mdns@10.0.16 test:electron-main
@libp2p/mdns: > aegir test -t electron-main
@libp2p/floodsub: > @libp2p/floodsub@9.0.12 test:electron-main
@libp2p/floodsub: > aegir test -t electron-main
@libp2p/tcp: > @libp2p/tcp@9.0.16 test:electron-main
@libp2p/tcp: > aegir test -t electron-main
@libp2p/bootstrap: build
@libp2p/mplex: build
@libp2p/prometheus-metrics: build
@libp2p/websockets: build
@libp2p/floodsub: build
@libp2p/tcp: build
@libp2p/mdns: build
@libp2p/bootstrap: > @libp2p/bootstrap@10.0.16 build
@libp2p/bootstrap: > aegir build
@libp2p/mplex: > @libp2p/mplex@10.0.16 build
@libp2p/mplex: > aegir build
@libp2p/prometheus-metrics: > @libp2p/prometheus-metrics@3.0.16 build
@libp2p/prometheus-metrics: > aegir build
@libp2p/websockets: > @libp2p/websockets@8.0.16 build
@libp2p/websockets: > aegir build
@libp2p/floodsub: > @libp2p/floodsub@9.0.12 build
@libp2p/floodsub: > aegir build
@libp2p/tcp: > @libp2p/tcp@9.0.16 build
@libp2p/tcp: > aegir build
@libp2p/mdns: > @libp2p/mdns@10.0.16 build
@libp2p/mdns: > aegir build
@libp2p/bootstrap: [20:10:37] tsc [started]
@libp2p/websockets: [20:10:37] tsc [started]
@libp2p/prometheus-metrics: [20:10:37] tsc [started]
@libp2p/mplex: [20:10:37] tsc [started]
@libp2p/floodsub: [20:10:37] tsc [started]
@libp2p/tcp: [20:10:37] tsc [started]
@libp2p/mdns: [20:10:37] tsc [started]
@libp2p/bootstrap: [20:10:41] tsc [completed]
@libp2p/bootstrap: [20:10:41] esbuild [started]
@libp2p/bootstrap: [20:10:41] esbuild [completed]
@libp2p/bootstrap: test electron main
@libp2p/bootstrap: [20:10:41] Downloading electron: 27.0.2 [started]
@libp2p/mdns: [20:10:42] tsc [completed]
@libp2p/mdns: [20:10:42] esbuild [started]
@libp2p/prometheus-metrics: [20:10:42] tsc [completed]
@libp2p/floodsub: [20:10:42] tsc [completed]
@libp2p/floodsub: [20:10:42] esbuild [started]
@libp2p/prometheus-metrics: test electron main
@libp2p/mdns: [20:10:42] esbuild [completed]
@libp2p/mdns: test electron main
@libp2p/bootstrap: [20:10:42] Downloading electron: 27.0.2 [completed]
@libp2p/floodsub: [20:10:42] esbuild [completed]
@libp2p/websockets: [20:10:42] tsc [completed]
@libp2p/websockets: [20:10:42] esbuild [started]
@libp2p/floodsub: test electron main
@libp2p/floodsub: [20:10:42] Downloading electron: 27.0.2 [started]
@libp2p/tcp: [20:10:42] tsc [completed]
@libp2p/tcp: [20:10:42] esbuild [started]
@libp2p/mplex: [20:10:42] tsc [completed]
@libp2p/mplex: [20:10:42] esbuild [started]
@libp2p/websockets: [20:10:42] esbuild [completed]
@libp2p/tcp: [20:10:42] esbuild [completed]
@libp2p/websockets: test electron main
@libp2p/tcp: test electron main
@libp2p/mplex: [20:10:42] esbuild [completed]
@libp2p/mplex: test electron main
@libp2p/floodsub: [20:10:42] Downloading electron: 27.0.2 [completed]
@libp2p/bootstrap: [508890:0311/201042.967219:ERROR:object_proxy.cc(577)] Failed to call method: org.freedesktop.DBus.Properties.Get: object_path= /org/freedesktop/portal/desktop: org.freedesktop.DBus.Error.InvalidArgs: No such interface “org.freedesktop.portal.FileChooser”
@libp2p/bootstrap: [508890:0311/201042.967271:ERROR:select_file_dialog_linux_portal.cc(280)] Failed to read portal version property
@libp2p/bootstrap: Warning: Cannot find any files matching pattern "test/**/*.spec.{js,mjs,cjs}"
@libp2p/bootstrap: 
@libp2p/bootstrap:   bootstrap
@libp2p/bootstrap:     ✔ should throw if no peer list is provided
@libp2p/prometheus-metrics: [20:10:43] Downloading electron: 27.0.2 [started]
@libp2p/floodsub: [508964:0311/201043.221283:ERROR:object_proxy.cc(577)] Failed to call method: org.freedesktop.DBus.Properties.Get: object_path= /org/freedesktop/portal/desktop: org.freedesktop.DBus.Error.InvalidArgs: No such interface “org.freedesktop.portal.FileChooser”
@libp2p/floodsub: [508964:0311/201043.221384:ERROR:select_file_dialog_linux_portal.cc(280)] Failed to read portal version property
@libp2p/floodsub: Warning: Cannot find any files matching pattern "test/**/*.spec.{js,mjs,cjs}"
@libp2p/bootstrap:     ✔ should discover bootstrap peers (109ms)
@libp2p/prometheus-metrics: [20:10:43] Downloading electron: 27.0.2 [completed]
@libp2p/bootstrap:     ✔ should tag bootstrap peers (109ms)
@libp2p/bootstrap:     ✔ should not fail on malformed peers in peer list (105ms)
@libp2p/bootstrap:   compliance tests
@libp2p/bootstrap:     interface-peer-discovery compliance tests
@libp2p/bootstrap:       ✔ can start the service
@libp2p/bootstrap:       ✔ can start and stop the service
@libp2p/bootstrap:       ✔ should not fail to stop the service if it was not started
@libp2p/bootstrap:       ✔ should not fail to start the service if it is already started
@libp2p/floodsub: 
@libp2p/floodsub:   interface compliance
@libp2p/floodsub:     interface-pubsub compliance tests
@libp2p/floodsub:       pubsub api
@libp2p/tcp: [20:10:43] Downloading electron: 27.0.2 [started]
@libp2p/floodsub:         ✔ can start correctly
@libp2p/floodsub:         ✔ can stop correctly
@libp2p/bootstrap:       ✔ should emit a peer event after start (103ms)
@libp2p/floodsub:         ✔ can subscribe and unsubscribe correctly (103ms)
@libp2p/floodsub:         ✔ can subscribe and publish correctly
@libp2p/floodsub:       emit self
@libp2p/floodsub:         enabled
@libp2p/floodsub:           ✔ should emit to self on publish
@libp2p/floodsub:         disabled
@libp2p/tcp: [20:10:43] Downloading electron: 27.0.2 [completed]
@libp2p/prometheus-metrics: [509170:0311/201043.752248:ERROR:object_proxy.cc(577)] Failed to call method: org.freedesktop.DBus.Properties.Get: object_path= /org/freedesktop/portal/desktop: org.freedesktop.DBus.Error.InvalidArgs: No such interface “org.freedesktop.portal.FileChooser”
@libp2p/prometheus-metrics: [509170:0311/201043.752529:ERROR:select_file_dialog_linux_portal.cc(280)] Failed to read portal version property
@libp2p/prometheus-metrics: Warning: Cannot find any files matching pattern "test/**/*.spec.{js,mjs,cjs}"
@libp2p/prometheus-metrics: 
@libp2p/prometheus-metrics:   counter groups
@libp2p/prometheus-metrics:     ✔ should increment a counter group
@libp2p/prometheus-metrics:     ✔ should increment a counter group with a value
@libp2p/prometheus-metrics:     ✔ should calculate a counter group value
@libp2p/prometheus-metrics:     ✔ should promise to calculate a counter group value
@libp2p/prometheus-metrics:     ✔ should reset a counter group
@libp2p/prometheus-metrics:     ✔ should allow use of the same counter group from multiple reporters
@libp2p/prometheus-metrics:   counters
@libp2p/prometheus-metrics:     ✔ should set a counter
@libp2p/prometheus-metrics:     ✔ should increment a counter with a value
@libp2p/prometheus-metrics:     ✔ should calculate a counter
@libp2p/prometheus-metrics:     ✔ should promise to calculate a counter
@libp2p/prometheus-metrics:     ✔ should reset a counter
@libp2p/prometheus-metrics:     ✔ should allow use of the same counter from multiple reporters
@libp2p/prometheus-metrics:   custom registry
@libp2p/prometheus-metrics:     ✔ should set a metric in the custom registry and not in the global registry
@libp2p/prometheus-metrics:   metric groups
@libp2p/prometheus-metrics:     ✔ should set a metric group
@libp2p/prometheus-metrics:     ✔ should increment a metric group without a value
@libp2p/prometheus-metrics:     ✔ should increment a metric group with a value
@libp2p/prometheus-metrics:     ✔ should decrement a metric group without a value
@libp2p/prometheus-metrics:     ✔ should decrement a metric group with a value
@libp2p/prometheus-metrics:     ✔ should calculate a metric group value
@libp2p/prometheus-metrics:     ✔ should promise to calculate a metric group value
@libp2p/prometheus-metrics:     ✔ should reset a metric group
@libp2p/prometheus-metrics:     ✔ should allow use of the same metric group from multiple reporters
@libp2p/prometheus-metrics:   metrics
@libp2p/prometheus-metrics:     ✔ should set a metric
@libp2p/prometheus-metrics:     ✔ should increment a metric without a value
@libp2p/prometheus-metrics:     ✔ should increment a metric with a value
@libp2p/tcp: [509227:0311/201044.096946:ERROR:object_proxy.cc(577)] Failed to call method: org.freedesktop.DBus.Properties.Get: object_path= /org/freedesktop/portal/desktop: org.freedesktop.DBus.Error.InvalidArgs: No such interface “org.freedesktop.portal.FileChooser”
@libp2p/tcp: [509227:0311/201044.097178:ERROR:select_file_dialog_linux_portal.cc(280)] Failed to read portal version property
@libp2p/prometheus-metrics:     ✔ should decrement a metric without a value
@libp2p/prometheus-metrics:     ✔ should decrement a metric with a value
@libp2p/prometheus-metrics:     ✔ should calculate a metric
@libp2p/prometheus-metrics:     ✔ should promise to calculate a metric
@libp2p/prometheus-metrics:     ✔ should reset a metric
@libp2p/prometheus-metrics:     ✔ should allow use of the same metric from multiple reporters
@libp2p/prometheus-metrics:   streams
@libp2p/tcp: Warning: Cannot find any files matching pattern "test/**/*.spec.{js,mjs,cjs}"
@libp2p/prometheus-metrics:     ✔ should track bytes sent over connections
@libp2p/prometheus-metrics:     ✔ should track bytes received over connections
@libp2p/prometheus-metrics:     ✔ should track sent stream metrics
@libp2p/prometheus-metrics:     ✔ should track sent received metrics
@libp2p/prometheus-metrics:   utils
@libp2p/prometheus-metrics:     normaliseString
@libp2p/prometheus-metrics:       ✔ should normalise string
@libp2p/prometheus-metrics:   36 passing (126ms)
@libp2p/tcp: 
@libp2p/tcp:   interface-transport compliance
@libp2p/tcp:     interface-transport
@libp2p/tcp:       dial
@libp2p/tcp:         ✔ simple
@libp2p/tcp:         ✔ can close connections
@libp2p/tcp:         ✔ to non existent listener
@libp2p/tcp:         ✔ abort before dialing throws AbortError
@libp2p/tcp:         ✔ abort while dialing throws AbortError (52ms)
@libp2p/tcp:       listen
@libp2p/tcp:         ✔ simple
@libp2p/tcp:         ✔ close listener with connections, through timeout
@libp2p/tcp:         ✔ should not handle connection if upgradeInbound throws
@libp2p/tcp:         events
@libp2p/tcp:           ✔ connection
@libp2p/tcp:           ✔ listening
@libp2p/tcp:           ✔ error
@libp2p/tcp:           ✔ close
@libp2p/tcp:       filter
@libp2p/tcp:         ✔ filters addresses
@libp2p/tcp:   closeAbove/listenBelow
@libp2p/tcp:     ✔ reject dial of connection above closeAbove
@libp2p/tcp:     ✔ accepts dial of connection when connection drop listenBelow limit
@libp2p/tcp:     ✔ should not emit "close" event when server is stopped due to "closeAbove" limit
@libp2p/tcp:     ✔ should emit "listening" event when server is resumed due to "listenBelow" limit (54ms)
@libp2p/tcp:   valid localAddr and remoteAddr
@libp2p/tcp:     ✔ should resolve port 0
@libp2p/tcp:     ✔ should handle multiple simultaneous closes
@libp2p/tcp:   filter addrs
@libp2p/tcp:     ✔ filter valid addrs for this transport
@libp2p/tcp:     ✔ filter a single addr for this transport
@libp2p/tcp:   listen
@libp2p/tcp:     ✔ listen on path
@libp2p/tcp:     ✔ listen on port 0
@libp2p/tcp:     ✔ errors when listening on busy port
@libp2p/tcp:     ✔ listen on IPv6 addr
@libp2p/tcp:     ✔ listen on any Interface
@libp2p/tcp:     ✔ getAddrs
@libp2p/tcp:     ✔ getAddrs on port 0 listen
@libp2p/tcp:     ✔ getAddrs from listening on 0.0.0.0
@libp2p/tcp:     ✔ getAddrs from listening on 0.0.0.0 and port 0
@libp2p/tcp:     ✔ getAddrs from listening on ip6 '::'
@libp2p/tcp:     ✔ getAddrs preserves IPFS Id
@libp2p/tcp:   dial
@libp2p/tcp:     ✔ dial on IPv4
@libp2p/tcp:     ✔ dial on IPv6
@libp2p/tcp:     ✔ dial on path
@libp2p/mdns: [20:10:44] Downloading electron: 27.0.2 [started]
@libp2p/tcp:     ✔ dial and destroy on listener (103ms)
@libp2p/tcp:     ✔ dial and destroy on dialer
@libp2p/floodsub:           ✔ should not emit to self on publish (1003ms)
@libp2p/tcp:     ✔ dials on IPv4 with IPFS Id
@libp2p/floodsub:       messages
@libp2p/floodsub:         ✔ should emit normalized signed messages on publish
@libp2p/floodsub:       pubsub connection handlers
@libp2p/floodsub:         nodes send state on connection
@libp2p/floodsub:           ✔ existing subscriptions are sent upon peer connection
@libp2p/floodsub:         pubsub started before connect
@libp2p/floodsub:           ✔ should get notified of connected peers on dial
@libp2p/floodsub:           ✔ should receive pubsub messages
@libp2p/floodsub:         pubsub started after connect
@libp2p/mdns: [20:10:44] Downloading electron: 27.0.2 [completed]
@libp2p/tcp:     ✔ aborts during dial (106ms)
@libp2p/floodsub:           ✔ should get notified of connected peers after starting
@libp2p/tcp:     ✔ aborts before dial
@libp2p/tcp:   maxConnections
@libp2p/floodsub:           ✔ should receive pubsub messages (48ms)
@libp2p/floodsub:         pubsub with intermittent connections
@libp2p/floodsub:           - should receive pubsub messages after a node restart
@libp2p/floodsub:           - should handle quick reconnects with a delayed disconnect
@libp2p/floodsub:       pubsub with two nodes
@libp2p/mplex: [20:10:44] Downloading electron: 27.0.2 [started]
@libp2p/floodsub:         ✔ Subscribe to a topic in nodeA
@libp2p/floodsub:         ✔ Publish to a topic in nodeA
@libp2p/floodsub:         ✔ Publish to a topic in nodeB (103ms)
@libp2p/mplex: [20:10:45] Downloading electron: 27.0.2 [completed]
@libp2p/tcp:     ✔ reject dial of connection above maxConnections (255ms)
@libp2p/tcp:   socket-to-conn
@libp2p/floodsub:         ✔ validate topic message
@libp2p/floodsub:         ✔ Publish 10 msg to a topic in nodeB
@libp2p/floodsub:         ✔ Unsubscribe from topic in nodeA
@libp2p/floodsub:       pubsub with multiple nodes
@libp2p/floodsub:         every peer subscribes to the topic
@libp2p/floodsub:           line
@libp2p/floodsub:             ✔ subscribe to the topic on node a
@libp2p/mdns: [509387:0311/201045.140227:ERROR:object_proxy.cc(577)] Failed to call method: org.freedesktop.DBus.Properties.Get: object_path= /org/freedesktop/portal/desktop: org.freedesktop.DBus.Error.InvalidArgs: No such interface “org.freedesktop.portal.FileChooser”
@libp2p/mdns: [509387:0311/201045.140569:ERROR:select_file_dialog_linux_portal.cc(280)] Failed to read portal version property
@libp2p/tcp:     ✔ should destroy a socket that is closed by the client (103ms)
@libp2p/mdns: Warning: Cannot find any files matching pattern "test/**/*.spec.{js,mjs,cjs}"
@libp2p/floodsub:             ✔ subscribe to the topic on node b
@libp2p/floodsub:             ✔ subscribe to the topic on node c
@libp2p/tcp:     ✔ should destroy a socket that is forcibly closed by the client (102ms)
@libp2p/tcp:     ✔ should destroy a socket that is half-closed by the client (102ms)
@libp2p/mdns: 
@libp2p/mdns:   compliance tests
@libp2p/mdns:     interface-peer-discovery compliance tests
@libp2p/mdns:       ✔ can start the service
@libp2p/mdns:       ✔ can start and stop the service
@libp2p/mdns:       ✔ should not fail to stop the service if it was not started
@libp2p/mdns:       ✔ should not fail to start the service if it is already started
@libp2p/mplex: [509417:0311/201045.422626:ERROR:object_proxy.cc(577)] Failed to call method: org.freedesktop.DBus.Properties.Get: object_path= /org/freedesktop/portal/desktop: org.freedesktop.DBus.Error.InvalidArgs: No such interface “org.freedesktop.portal.FileChooser”
@libp2p/mplex: [509417:0311/201045.422680:ERROR:select_file_dialog_linux_portal.cc(280)] Failed to read portal version property
@libp2p/mplex: Warning: Cannot find any files matching pattern "test/**/*.spec.{js,mjs,cjs}"
@libp2p/tcp:     ✔ should destroy a socket after sinking (101ms)
@libp2p/tcp:     ✔ should destroy a socket when containing MultiaddrConnection is closed
@libp2p/tcp:     ✔ should destroy a socket by timeout when containing MultiaddrConnection is closed
@libp2p/tcp:     ✔ should destroy a socket by timeout when containing MultiaddrConnection is closed but remote keeps sending data
@libp2p/mplex: 
@libp2p/mplex:   coder
@libp2p/mplex:     ✔ should encode header
@libp2p/mplex:     ✔ should decode header
@libp2p/mplex:     ✔ should encode several msgs into buffer
@libp2p/mplex:     ✔ should encode from Uint8ArrayList
@libp2p/mplex:     ✔ should decode msgs from buffer
@libp2p/mplex:     ✔ should encode zero length body msg
@libp2p/mplex:     ✔ should decode zero length body msg
@libp2p/mplex:   compliance
@libp2p/mplex:     interface-stream-muxer
@libp2p/mplex:       base
@libp2p/mplex:         ✔ Open a stream from the dialer
@libp2p/mplex:         ✔ Open a stream from the listener
@libp2p/mplex:         ✔ Open a stream on both sides
@libp2p/mplex:         ✔ Open a stream on one side, write, open a stream on the other side
@libp2p/mplex:         ✔ should echo a small value via a pipe
@libp2p/bootstrap:       ✔ should not receive a peer event before start (2009ms)
@libp2p/mplex:         ✔ should echo a large value via a pipe (153ms)
@libp2p/mplex:         ✔ should echo a small value via sink
@libp2p/mplex:         ✔ should echo a large value via sink (160ms)
@libp2p/mplex:         ✔ should echo a small value via a pushable
@libp2p/tcp:     ✔ should destroy a socket by timeout when containing MultiaddrConnection is closed but closing remote times out (543ms)
@libp2p/tcp:   49 passing (2s)
@libp2p/mplex:         ✔ should echo a large value via a pushable (151ms)
@libp2p/mplex:       close
@libp2p/mplex:         ✔ closing underlying socket closes streams (53ms)
@libp2p/mplex:         ✔ calling close closes streams (57ms)
@libp2p/floodsub:             ✔ publish on node a (1005ms)
@libp2p/floodsub:             1 level tree
@libp2p/mplex:         ✔ calling close with an error aborts streams (54ms)
@libp2p/mdns:       ✔ should emit a peer event after start (1005ms)
@libp2p/websockets: [20:10:46] Downloading electron: 27.0.2 [started]
@libp2p/mplex:         ✔ calling newStream after close throws an error (501ms)
@libp2p/mplex:         ✔ closing one of the muxed streams doesn't close others (104ms)
@libp2p/mplex:         ✔ can close a stream for writing
@libp2p/mplex:         ✔ can close a stream for reading
@libp2p/mplex:         ✔ calls onStreamEnd for closed streams not previously written
@libp2p/mplex:         ✔ calls onStreamEnd for read and write closed streams not previously written
@libp2p/mplex:         ✔ should wait for all data to be sent when closing streams
@libp2p/mplex:       stress test
@libp2p/mplex:         ✔ 1 stream with 1 msg
@libp2p/mplex:         ✔ 1 stream with 10 msg
@libp2p/mplex:         ✔ 1 stream with 100 msg
@libp2p/mplex:         ✔ 10 streams with 1 msg
@libp2p/mplex:         ✔ 10 streams with 10 msg
@libp2p/websockets: [20:10:46] Downloading electron: 27.0.2 [completed]
@libp2p/mplex:         ✔ 10 streams with 100 msg
@libp2p/mplex:         ✔ 100 streams with 1 msg
@libp2p/mplex:         ✔ 100 streams with 10 msg
@libp2p/mplex:         ✔ 100 streams with 100 msg (90ms)
@libp2p/mplex:         ✔ 1000 streams with 1 msg (192ms)
@libp2p/floodsub:               ✔ publish on node b (1005ms)
@libp2p/floodsub:           2 level tree
@libp2p/floodsub:             ✔ subscribes
@libp2p/websockets: [509639:0311/201047.331288:ERROR:object_proxy.cc(577)] Failed to call method: org.freedesktop.DBus.Properties.Get: object_path= /org/freedesktop/portal/desktop: org.freedesktop.DBus.Error.InvalidArgs: No such interface “org.freedesktop.portal.FileChooser”
@libp2p/websockets: [509639:0311/201047.331342:ERROR:select_file_dialog_linux_portal.cc(280)] Failed to read portal version property
@libp2p/mplex:         ✔ 1000 streams with 10 msg (310ms)
@libp2p/websockets: 
@libp2p/websockets:   interface-transport compliance
@libp2p/websockets:     interface-transport
@libp2p/websockets:       dial
@libp2p/websockets:         ✔ simple
@libp2p/websockets:         ✔ can close connections
@libp2p/websockets:         ✔ to non existent listener
@libp2p/websockets:         ✔ abort before dialing throws AbortError
@libp2p/bootstrap:       ✔ should not receive a peer event after stop (2103ms)
@libp2p/bootstrap:   11 passing (5s)
@libp2p/websockets:         ✔ abort while dialing throws AbortError (56ms)
@libp2p/websockets:       listen
@libp2p/websockets:         ✔ simple
@libp2p/websockets:         ✔ close listener with connections, through timeout
@libp2p/websockets:         ✔ should not handle connection if upgradeInbound throws
@libp2p/websockets:         events
@libp2p/websockets:           ✔ connection
@libp2p/websockets:           ✔ listening
@libp2p/websockets:           ✔ error
@libp2p/websockets:           ✔ close
@libp2p/websockets:       filter
@libp2p/websockets:         ✔ filters addresses
@libp2p/websockets:   instantiate the transport
@libp2p/websockets:     ✔ create
@libp2p/websockets:   listen
@libp2p/websockets:     ✔ should close connections when stopping the listener
@libp2p/websockets:     ip4
@libp2p/websockets:       ✔ listen, check for promise
@libp2p/websockets:       ✔ listen, check for listening event
@libp2p/websockets:       ✔ should error on starting two listeners on same address
@libp2p/websockets:       ✔ listen, check for the close event
@libp2p/websockets:       ✔ listen on addr with /ipfs/QmHASH
@libp2p/websockets:       ✔ listen on port 0
@libp2p/websockets:       ✔ listen on any Interface
@libp2p/websockets:       ✔ getAddrs
@libp2p/websockets:       ✔ getAddrs on port 0 listen
@libp2p/websockets:       ✔ getAddrs from listening on 0.0.0.0
@libp2p/websockets:       ✔ getAddrs from listening on 0.0.0.0 and port 0
@libp2p/websockets:       ✔ getAddrs preserves p2p Id
@libp2p/websockets:     ip6
@libp2p/websockets:       ✔ listen, check for promise
@libp2p/websockets:       ✔ listen, check for listening event
@libp2p/websockets:       ✔ listen, check for the close event
@libp2p/websockets:       ✔ listen on addr with /ipfs/QmHASH
@libp2p/websockets:   dial
@libp2p/websockets:     ip4
@libp2p/websockets:       ✔ dial
@libp2p/websockets:       ✔ dial with p2p Id
@libp2p/websockets:       ✔ dial should throw on immediate abort
@libp2p/websockets:       ✔ should resolve port 0
@libp2p/websockets:     ip4 no loopback
@libp2p/websockets:       ✔ dial
@libp2p/websockets:     ip4 with wss
@libp2p/websockets:       ✔ should listen on wss address
@libp2p/websockets:       ✔ dial ip4
@libp2p/websockets:     ip6
@libp2p/websockets:       ✔ dial ip6
@libp2p/websockets:       ✔ dial with p2p Id
@libp2p/websockets:   filter addrs
@libp2p/websockets:     default filter addrs with only dns
@libp2p/websockets:       ✔ should filter out invalid WS addresses
@libp2p/websockets:       ✔ should filter correct dns address
@libp2p/websockets:       ✔ should filter correct dns address with ipfs id
@libp2p/websockets:       ✔ should filter correct dns4 address
@libp2p/websockets:       ✔ should filter correct dns6 address
@libp2p/websockets:       ✔ should filter correct dns6 address with ipfs id
@libp2p/websockets:     custom filter addrs
@libp2p/websockets:       ✔ should fail invalid WS addresses
@libp2p/websockets:       ✔ should filter correct ipv4 addresses
@libp2p/websockets:       ✔ should filter correct ipv4 addresses with ipfs id
@libp2p/websockets:       ✔ should filter correct ipv6 address
@libp2p/websockets:       ✔ should filter correct ipv6 addresses with ipfs id
@libp2p/websockets:       ✔ should filter correct dns address
@libp2p/websockets:       ✔ should filter correct dns address with ipfs id
@libp2p/websockets:       ✔ should filter correct dns4 address
@libp2p/websockets:       ✔ should filter correct dns6 address
@libp2p/websockets:       ✔ should filter correct dns6 address with ipfs id
@libp2p/websockets:       ✔ should filter mixed addresses
@libp2p/websockets:       ✔ filter a single addr for this transport
@libp2p/websockets:   58 passing (400ms)
@libp2p/floodsub:             ✔ publishes from c (1010ms)
@libp2p/floodsub:   floodsub
@libp2p/floodsub:     ✔ checks cache when processing incoming message
@libp2p/floodsub:     ✔ forwards normalized messages on publish
@libp2p/floodsub:     ✔ does not send received message back to original sender
@libp2p/floodsub:   28 passing (5s)
@libp2p/floodsub:   2 pending
@libp2p/mdns:       ✔ should not receive a peer event before start (2002ms)
@libp2p/mplex:         ✔ 1000 streams with 100 msg (981ms)
@libp2p/mplex:       mega stress test
@libp2p/mplex:         - 10,000 streams with 10,000 msg
@libp2p/mplex:   mplex
@libp2p/mplex:     ✔ should restrict number of initiator streams per connection
@libp2p/mplex:     ✔ should restrict number of recipient streams per connection
@libp2p/mplex:     ✔ should reset a stream that fills the message buffer (97ms)
@libp2p/mplex:   restrict size
@libp2p/mplex:     ✔ should throw when size is too big
@libp2p/mplex:     ✔ should allow message with no data property
@libp2p/mplex:     ✔ should throw when unprocessed message queue size is too big
@libp2p/mplex:     ✔ should throw when unprocessed message queue size is too big because of garbage
@libp2p/mplex:   stream
@libp2p/mplex:     ✔ should initiate stream with NEW_STREAM message
@libp2p/mplex:     ✔ should initiate named stream with NEW_STREAM message
@libp2p/mplex:     ✔ should end a stream when it is aborted
@libp2p/mplex:     ✔ should end a stream when it is reset
@libp2p/mplex:     ✔ should send data with MESSAGE_INITIATOR messages if stream initiator
@libp2p/mplex:     ✔ should send data with MESSAGE_RECEIVER messages if stream receiver
@libp2p/mplex:     ✔ should close stream with CLOSE_INITIATOR message if stream initiator
@libp2p/mplex:     ✔ should close stream with CLOSE_RECEIVER message if stream receiver
@libp2p/mplex:     ✔ should reset stream on error with RESET_INITIATOR message if stream initiator
@libp2p/mplex:     ✔ should reset stream on error with RESET_RECEIVER message if stream receiver
@libp2p/mplex:     ✔ should close for reading (remote close)
@libp2p/mplex:     ✔ should close for reading and writing (abort on local error)
@libp2p/mplex:     ✔ should close for reading and writing (abort on remote error)
@libp2p/mplex:     ✔ should close immediately for reading and writing (reset on local error)
@libp2p/mplex:     ✔ should close immediately for reading and writing (reset on remote error)
@libp2p/mplex:     ✔ should call onEnd only when both sides have closed
@libp2p/mplex:     ✔ should call onEnd with error for local error
@libp2p/mplex:     ✔ should split writes larger than max message size
@libp2p/mplex:     ✔ should error on double sink
@libp2p/mplex:     ✔ should error on double sink after sink has ended
@libp2p/mplex:     ✔ should chunk really big messages
@libp2p/mplex:   67 passing (3s)
@libp2p/mplex:   1 pending
@libp2p/mdns:       ✔ should not receive a peer event after stop (3004ms)
@libp2p/mdns:   MulticastDNS
@libp2p/mdns:     ✔ find another peer
@libp2p/mdns:     ✔ announces all multiaddresses
@libp2p/mdns:     ✔ doesn't emit peers after stop (6007ms)
@libp2p/mdns:     ✔ should not emit undefined peer ids (105ms)
@libp2p/mdns:     ✔ find another peer with different udp4 address
@libp2p/mdns:     ✔ only includes link-local addresses
@libp2p/mdns:   13 passing (12s)

@achingbrain
Copy link
Contributor Author

achingbrain commented Mar 12, 2024

I couldn't find webrtc tests

Ah, sorry - they are disabled right now because they fail in CI.

I should have pasted the below. After installing and building in the root you can run just the relevant WebRTC tests with electron-main with:

% cd packages/transport-webrtc
% npx aegir test -t electron-main

@murat-dogan
Copy link
Owner

Thanks for guiding me.

It seems there are 2 problems.
The first problem is solved here #215

The second thing is as I understood test is waiting for a clear exit. Then you should call the cleanup function somewhere.
Like

after(() => {
  node.cleanup()
})

I am releasing latest changes. So you can try it.
https://github.com/murat-dogan/node-datachannel/releases/tag/v0.5.4

@murat-dogan
Copy link
Owner

I did some debugging on tests with the latest version.
electron test is not waiting for peer connections to be destroyed correctly.
Calling explicitly the close function also solves the issue.

Is it a solution for you?

Wİth this patch it passes

diff --git a/packages/transport-webrtc/test/peer.spec.ts b/packages/transport-webrtc/test/peer.spec.ts
index 7f7b8cc78..f899faa94 100644
--- a/packages/transport-webrtc/test/peer.spec.ts
+++ b/packages/transport-webrtc/test/peer.spec.ts
@@ -40,7 +40,7 @@ interface PrivateToPrivateComponents {
   }
 }
 
-async function getComponents (): Promise<PrivateToPrivateComponents> {
+async function getComponents(): Promise<PrivateToPrivateComponents> {
   const relayPeerId = await createEd25519PeerId()
   const initiatorPeerId = await createEd25519PeerId()
   const receiverPeerId = await createEd25519PeerId()
@@ -150,6 +150,9 @@ describe('webrtc basic', () => {
       handleIncomingStream(recipient)
     ]))
       .to.eventually.be.rejected.with.property('message', 'Oh noes!')
+
+    initiator.peerConnection.close()
+    recipient.peerConnection.close()
   })
 })
 
@@ -161,6 +164,9 @@ describe('webrtc receiver', () => {
 
     await stream.write({ type: Message.Type.SDP_OFFER, data: 'bad' })
     await expect(receiverPeerConnectionPromise).to.be.rejectedWith(/Failed to set remoteDescription/)
+
+    initiator.peerConnection.close()
+    recipient.peerConnection.close()
   })
 })
 
@@ -184,6 +190,9 @@ describe('webrtc dialer', () => {
 
     await stream.write({ type: Message.Type.SDP_ANSWER, data: 'bad' })
     await expect(initiatorPeerConnectionPromise).to.be.rejectedWith(/Failed to set remoteDescription/)
+
+    initiator.peerConnection.close()
+    recipient.peerConnection.close()
   })
 
   it('should fail on receiving a candidate before an answer', async () => {
@@ -217,6 +226,8 @@ describe('webrtc dialer', () => {
     await expect(initiatorPeerConnectionPromise).to.be.rejectedWith(/Remote should send an SDP answer/)
 
     pc.close()
+    initiator.peerConnection.close()
+    recipient.peerConnection.close()
   })
 })
 

@achingbrain
Copy link
Contributor Author

Is it a solution for you?

Yes! User error is the best kind of error 😅 .

Thanks for looking in to this.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants