From e61668e6a11be3b633815960015124fb89f82f53 Mon Sep 17 00:00:00 2001
From: Alex Potsides <alex@achingbrain.net>
Date: Thu, 2 Dec 2021 19:22:39 +0000
Subject: [PATCH] chore: update peer-id (#173)

BREAKING CHANGE: requires node 15+
---
 .github/workflows/main.yml | 13 +++++++++++--
 package.json               | 12 ++++++------
 test/2-nodes.spec.js       |  9 +++++++--
 test/gossip.spec.js        | 10 ++++++----
 test/utils/index.js        | 20 ++++++++++++++++++++
 5 files changed, 50 insertions(+), 14 deletions(-)

diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
index d5f2b811..576af4dc 100644
--- a/.github/workflows/main.yml
+++ b/.github/workflows/main.yml
@@ -12,6 +12,9 @@ jobs:
     runs-on: ubuntu-latest
     steps:
     - uses: actions/checkout@v2
+    - uses: actions/setup-node@v2
+      with:
+        node-version: lts/*
     - run: npm install
     - run: npm run lint
     - run: npm run prebuild
@@ -22,11 +25,11 @@ jobs:
     strategy:
       matrix:
         os: [windows-latest, ubuntu-latest, macos-latest]
-        node: [14]
+        node: [16]
       fail-fast: false
     steps:
       - uses: actions/checkout@v2
-      - uses: actions/setup-node@v1
+      - uses: actions/setup-node@v2
         with:
           node-version: ${{ matrix.node }}
       - run: npm install
@@ -38,6 +41,9 @@ jobs:
     runs-on: ubuntu-latest
     steps:
       - uses: actions/checkout@v2
+      - uses: actions/setup-node@v2
+        with:
+          node-version: lts/*
       - run: npm install
       - run: npm run prebuild
       - run: npx aegir test -t browser -t webworker --bail
@@ -46,6 +52,9 @@ jobs:
     runs-on: ubuntu-latest
     steps:
       - uses: actions/checkout@v2
+      - uses: actions/setup-node@v2
+        with:
+          node-version: lts/*
       - run: npm install
       - run: npm run prebuild
       - run: npx aegir test -t browser -t webworker --bail -- --browser firefox
diff --git a/package.json b/package.json
index e9a7d921..faeb6542 100644
--- a/package.json
+++ b/package.json
@@ -44,8 +44,8 @@
     "denque": "^1.5.0",
     "err-code": "^3.0.1",
     "it-pipe": "^1.1.0",
-    "libp2p-interfaces": "^1.1.0",
-    "peer-id": "^0.15.3",
+    "libp2p-interfaces": "^2.0.1",
+    "peer-id": "^0.16.0",
     "protobufjs": "^6.11.2",
     "time-cache": "^0.3.0",
     "uint8arrays": "^3.0.0"
@@ -56,7 +56,7 @@
     "@types/mocha": "^8.2.2",
     "@typescript-eslint/eslint-plugin": "^3.0.2",
     "@typescript-eslint/parser": "^3.0.2",
-    "aegir": "^35.0.1",
+    "aegir": "^36.0.2",
     "benchmark": "^2.1.4",
     "buffer": "^6.0.3",
     "chai": "^4.2.0",
@@ -71,9 +71,9 @@
     "eslint-plugin-promise": "^4.2.1",
     "eslint-plugin-standard": "^4.0.1",
     "it-pair": "^1.0.0",
-    "libp2p": "^0.32.0",
-    "libp2p-floodsub": "^0.27.0",
-    "libp2p-interfaces-compliance-tests": "^1.0.1",
+    "libp2p": "^0.35.0",
+    "libp2p-floodsub": "^0.28.0",
+    "libp2p-interfaces-compliance-tests": "^2.0.3",
     "libp2p-mplex": "^0.10.3",
     "libp2p-websockets": "^0.16.1",
     "lodash": "^4.17.15",
diff --git a/test/2-nodes.spec.js b/test/2-nodes.spec.js
index fe4cac43..d27f6ed3 100644
--- a/test/2-nodes.spec.js
+++ b/test/2-nodes.spec.js
@@ -212,9 +212,14 @@ describe('2 nodes', () => {
     })
 
     it('Publish to a topic after unsubscribe', async () => {
+      const promises = [
+        new Promise((resolve) => nodes[1].once('pubsub:subscription-change', resolve)),
+        new Promise((resolve) => nodes[1].once('gossipsub:heartbeat', resolve))
+      ]
+
       nodes[0].unsubscribe(topic)
-      await new Promise((resolve) => nodes[1].once('pubsub:subscription-change', resolve))
-      await new Promise((resolve) => nodes[1].once('gossipsub:heartbeat', resolve))
+
+      await Promise.all(promises)
 
       const promise = new Promise((resolve, reject) => {
         nodes[0].once(topic, reject)
diff --git a/test/gossip.spec.js b/test/gossip.spec.js
index 72948c8b..ca8dac31 100644
--- a/test/gossip.spec.js
+++ b/test/gossip.spec.js
@@ -11,7 +11,8 @@ const {
   first,
   createGossipsubs,
   connectGossipsubs,
-  stopNode
+  stopNode,
+  waitForAllNodesToBePeered
 } = require('./utils')
 
 describe('gossip', () => {
@@ -31,9 +32,9 @@ describe('gossip', () => {
     // add subscriptions to each node
     nodes.forEach((n) => n.subscribe(topic))
 
+    // every node connected to every other
     await connectGossipsubs(nodes)
-    // await subscription propagation
-    await delay(50)
+    await waitForAllNodesToBePeered(nodes)
 
     // await mesh rebalancing
     await Promise.all(nodes.map((n) => new Promise((resolve) => n.once('gossipsub:heartbeat', resolve))))
@@ -67,7 +68,8 @@ describe('gossip', () => {
 
     // every node connected to every other
     await connectGossipsubs(nodes)
-    await delay(500)
+    await waitForAllNodesToBePeered(nodes)
+
     // await mesh rebalancing
     await Promise.all(nodes.map((n) => new Promise((resolve) => n.once('gossipsub:heartbeat', resolve))))
     await delay(500)
diff --git a/test/utils/index.js b/test/utils/index.js
index f43706bf..90092394 100644
--- a/test/utils/index.js
+++ b/test/utils/index.js
@@ -4,6 +4,7 @@ const { expect } = require('chai')
 
 const FloodSub = require('libp2p-floodsub')
 const PeerId = require('peer-id')
+const delay = require('delay')
 
 exports.first = (map) => map.values().next().value
 
@@ -52,3 +53,22 @@ exports.getMsgId = (msg) => {
   result.set(seqno, from.length)
   return result
 }
+
+exports.waitForAllNodesToBePeered = async (peers, attempts = 10, delayMs = 100) => {
+  const nodeIds = peers.map(peer => peer.peerId.toB58String())
+
+  for (let i = 0; i < attempts; i++) {
+    for (const node of peers) {
+      const nodeId = node.peerId.toB58String()
+      const others = nodeIds.filter(peerId => peerId !== nodeId)
+
+      const missing = others.some(other => !node.peers.has(other))
+
+      if (!missing) {
+        return
+      }
+    }
+
+    await delay(delayMs)
+  }
+}