From f48278adce05aae1a4bfd11498fc2bd89a13d80c Mon Sep 17 00:00:00 2001 From: "fryorcraken.eth" Date: Tue, 13 Dec 2022 12:31:27 +1100 Subject: [PATCH] chore: remove waku dep from @waku/interfaces by defining IEnr @waku packages are expected to (dev)depend on @waku/interfaces to implement them. Hence, to avoid possible cyclic (dev)dependency, define IEnr interface and use it as a type across @waku/packages. --- package.json | 6 +-- packages/dns-discovery/package.json | 1 + packages/dns-discovery/src/dns.ts | 5 ++- .../dns-discovery/src/fetch_nodes.spec.ts | 3 +- packages/dns-discovery/src/fetch_nodes.ts | 14 +++---- packages/dns-discovery/src/index.ts | 4 +- packages/enr/package.json | 1 + packages/enr/src/enr.spec.ts | 2 +- packages/enr/src/enr.ts | 21 ++++++---- packages/enr/src/index.ts | 1 - packages/enr/src/types.ts | 11 ------ packages/enr/src/v4.ts | 2 +- packages/enr/src/waku2_codec.spec.ts | 3 +- packages/enr/src/waku2_codec.ts | 7 +--- packages/interfaces/CHANGELOG.md | 5 +++ packages/interfaces/src/enr.ts | 38 +++++++++++++++++++ packages/interfaces/src/index.ts | 1 + packages/interfaces/src/peer_exchange.ts | 4 +- 18 files changed, 84 insertions(+), 45 deletions(-) delete mode 100644 packages/enr/src/types.ts create mode 100644 packages/interfaces/src/enr.ts diff --git a/package.json b/package.json index 0ae010f263..78c438c67e 100644 --- a/package.json +++ b/package.json @@ -3,11 +3,11 @@ "private": true, "type": "module", "workspaces": [ - "packages/proto", "packages/byte-utils", - "packages/enr", - "packages/interfaces", "packages/libp2p-utils", + "packages/proto", + "packages/interfaces", + "packages/enr", "packages/peer-exchange", "packages/core", "packages/dns-discovery", diff --git a/packages/dns-discovery/package.json b/packages/dns-discovery/package.json index bf54fba547..6dcd444e31 100644 --- a/packages/dns-discovery/package.json +++ b/packages/dns-discovery/package.json @@ -70,6 +70,7 @@ "@libp2p/peer-id": "^1.1.10" }, "devDependencies": { + "@waku/interfaces": "*", "@multiformats/multiaddr": "^11.0.6", "@libp2p/peer-id-factory": "^1.0.15", "chai": "^4.3.4", diff --git a/packages/dns-discovery/src/dns.ts b/packages/dns-discovery/src/dns.ts index c6d3d039c9..e227793e1b 100644 --- a/packages/dns-discovery/src/dns.ts +++ b/packages/dns-discovery/src/dns.ts @@ -1,4 +1,5 @@ import { ENR } from "@waku/enr"; +import type { IEnr } from "@waku/interfaces"; import debug from "debug"; import { DnsOverHttps } from "./dns_over_https.js"; @@ -49,7 +50,7 @@ export class DnsNodeDiscovery { async getPeers( enrTreeUrls: string[], wantedNodeCapabilityCount: Partial - ): Promise { + ): Promise { const networkIndex = Math.floor(Math.random() * enrTreeUrls.length); const { publicKey, domain } = ENRTree.parseTree(enrTreeUrls[networkIndex]); const context: SearchContext = { @@ -86,7 +87,7 @@ export class DnsNodeDiscovery { async *getNextPeer( enrTreeUrls: string[], wantedNodeCapabilityCount: Partial - ): AsyncGenerator { + ): AsyncGenerator { const networkIndex = Math.floor(Math.random() * enrTreeUrls.length); const { publicKey, domain } = ENRTree.parseTree(enrTreeUrls[networkIndex]); const context: SearchContext = { diff --git a/packages/dns-discovery/src/fetch_nodes.spec.ts b/packages/dns-discovery/src/fetch_nodes.spec.ts index 9c136d0d59..93eaffbbd0 100644 --- a/packages/dns-discovery/src/fetch_nodes.spec.ts +++ b/packages/dns-discovery/src/fetch_nodes.spec.ts @@ -1,6 +1,7 @@ import { createSecp256k1PeerId } from "@libp2p/peer-id-factory"; import { multiaddr } from "@multiformats/multiaddr"; -import { ENR, Waku2 } from "@waku/enr"; +import { ENR } from "@waku/enr"; +import type { Waku2 } from "@waku/interfaces"; import { expect } from "chai"; import { fetchNodesUntilCapabilitiesFulfilled } from "./fetch_nodes.js"; diff --git a/packages/dns-discovery/src/fetch_nodes.ts b/packages/dns-discovery/src/fetch_nodes.ts index 38fc41b78e..5ac8746d38 100644 --- a/packages/dns-discovery/src/fetch_nodes.ts +++ b/packages/dns-discovery/src/fetch_nodes.ts @@ -1,4 +1,4 @@ -import { ENR, Waku2 } from "@waku/enr"; +import type { IEnr, Waku2 } from "@waku/interfaces"; import debug from "debug"; import { NodeCapabilityCount } from "./dns.js"; @@ -13,8 +13,8 @@ const log = debug("waku:discovery:fetch_nodes"); export async function fetchNodesUntilCapabilitiesFulfilled( wantedNodeCapabilityCount: Partial, errorTolerance: number, - getNode: () => Promise -): Promise { + getNode: () => Promise +): Promise { const wanted = { relay: wantedNodeCapabilityCount.relay ?? 0, store: wantedNodeCapabilityCount.store ?? 0, @@ -33,7 +33,7 @@ export async function fetchNodesUntilCapabilitiesFulfilled( }; let totalSearches = 0; - const peers: ENR[] = []; + const peers: IEnr[] = []; while ( !isSatisfied(wanted, actual) && @@ -64,8 +64,8 @@ export async function fetchNodesUntilCapabilitiesFulfilled( export async function* yieldNodesUntilCapabilitiesFulfilled( wantedNodeCapabilityCount: Partial, errorTolerance: number, - getNode: () => Promise -): AsyncGenerator { + getNode: () => Promise +): AsyncGenerator { const wanted = { relay: wantedNodeCapabilityCount.relay ?? 0, store: wantedNodeCapabilityCount.store ?? 0, @@ -118,7 +118,7 @@ function isSatisfied( ); } -function isNewPeer(peer: ENR, peers: ENR[]): boolean { +function isNewPeer(peer: IEnr, peers: IEnr[]): boolean { if (!peer.nodeId) return false; for (const existingPeer of peers) { diff --git a/packages/dns-discovery/src/index.ts b/packages/dns-discovery/src/index.ts index ad60e4d4b4..b54ae2e707 100644 --- a/packages/dns-discovery/src/index.ts +++ b/packages/dns-discovery/src/index.ts @@ -5,7 +5,7 @@ import type { import { symbol } from "@libp2p/interface-peer-discovery"; import type { PeerInfo } from "@libp2p/interface-peer-info"; import { CustomEvent, EventEmitter } from "@libp2p/interfaces/events"; -import { ENR } from "@waku/enr"; +import type { IEnr } from "@waku/interfaces"; import { multiaddrsToPeerInfo } from "@waku/libp2p-utils"; import debug from "debug"; @@ -22,7 +22,7 @@ export class PeerDiscoveryDns extends EventEmitter implements PeerDiscovery { - private readonly nextPeer: () => AsyncGenerator; + private readonly nextPeer: () => AsyncGenerator; private _started: boolean; /** diff --git a/packages/enr/package.json b/packages/enr/package.json index 5089516fd9..9629746196 100644 --- a/packages/enr/package.json +++ b/packages/enr/package.json @@ -63,6 +63,7 @@ "js-sha3": "^0.8.0" }, "devDependencies": { + "@waku/interfaces": "*", "uint8arrays": "^4.0.2", "@libp2p/peer-id-factory": "^1.0.15", "@rollup/plugin-commonjs": "^22.0.0", diff --git a/packages/enr/src/enr.spec.ts b/packages/enr/src/enr.spec.ts index df23ab397f..5b32bd0e51 100644 --- a/packages/enr/src/enr.spec.ts +++ b/packages/enr/src/enr.spec.ts @@ -1,6 +1,7 @@ import { createSecp256k1PeerId } from "@libp2p/peer-id-factory"; import { multiaddr } from "@multiformats/multiaddr"; import { bytesToHex, hexToBytes, utf8ToBytes } from "@waku/byte-utils"; +import type { Waku2 } from "@waku/interfaces"; import { assert, expect } from "chai"; import { equals } from "uint8arrays/equals"; @@ -8,7 +9,6 @@ import { ERR_INVALID_ID } from "./constants.js"; import { getPublicKey } from "./crypto.js"; import { ENR } from "./enr.js"; import { createKeypairFromPeerId, IKeypair } from "./keypair/index.js"; -import { Waku2 } from "./waku2_codec.js"; describe("ENR", function () { describe("Txt codec", () => { diff --git a/packages/enr/src/enr.ts b/packages/enr/src/enr.ts index faabd94f1d..4831492c65 100644 --- a/packages/enr/src/enr.ts +++ b/packages/enr/src/enr.ts @@ -11,6 +11,14 @@ import { hexToBytes, utf8ToBytes, } from "@waku/byte-utils"; +import type { + ENRKey, + ENRValue, + IEnr, + NodeId, + SequenceNumber, + Waku2, +} from "@waku/interfaces"; import debug from "debug"; import { fromString } from "uint8arrays/from-string"; import { toString } from "uint8arrays/to-string"; @@ -30,22 +38,21 @@ import { } from "./keypair/index.js"; import { multiaddrFromFields } from "./multiaddr_from_fields.js"; import { decodeMultiaddrs, encodeMultiaddrs } from "./multiaddrs_codec.js"; -import { ENRKey, ENRValue, NodeId, SequenceNumber } from "./types.js"; import * as v4 from "./v4.js"; -import { decodeWaku2, encodeWaku2, Waku2 } from "./waku2_codec.js"; +import { decodeWaku2, encodeWaku2 } from "./waku2_codec.js"; const log = debug("waku:enr"); -export class ENR extends Map { +export class ENR extends Map implements IEnr { public static readonly RECORD_PREFIX = "enr:"; public seq: SequenceNumber; - public signature: Uint8Array | null; + public signature?: Uint8Array; public peerId?: PeerId; private constructor( kvs: Record = {}, seq: SequenceNumber = BigInt(1), - signature: Uint8Array | null = null + signature?: Uint8Array ) { super(Object.entries(kvs)); this.seq = seq; @@ -55,7 +62,7 @@ export class ENR extends Map { static async create( kvs: Record = {}, seq: SequenceNumber = BigInt(1), - signature: Uint8Array | null = null + signature?: Uint8Array ): Promise { const enr = new ENR(kvs, seq, signature); try { @@ -150,7 +157,7 @@ export class ENR extends Map { } set(k: ENRKey, v: ENRValue): this { - this.signature = null; + this.signature = undefined; this.seq++; return super.set(k, v); } diff --git a/packages/enr/src/index.ts b/packages/enr/src/index.ts index aca5cf3955..fc8d4c6203 100644 --- a/packages/enr/src/index.ts +++ b/packages/enr/src/index.ts @@ -1,6 +1,5 @@ export * from "./constants.js"; export * from "./enr.js"; -export * from "./types.js"; export * from "./keypair/index.js"; export * from "./waku2_codec.js"; export * from "./crypto.js"; diff --git a/packages/enr/src/types.ts b/packages/enr/src/types.ts deleted file mode 100644 index 00359fb39e..0000000000 --- a/packages/enr/src/types.ts +++ /dev/null @@ -1,11 +0,0 @@ -// Custom and aliased types for ENRs - -/** - * We represent NodeId as a hex string, since node equality is used very heavily - * and it is convenient to index data by NodeId - */ -export type NodeId = string; -export type SequenceNumber = bigint; - -export type ENRKey = string; -export type ENRValue = Uint8Array; diff --git a/packages/enr/src/v4.ts b/packages/enr/src/v4.ts index 5a1a1fe0ec..ede2aeafb8 100644 --- a/packages/enr/src/v4.ts +++ b/packages/enr/src/v4.ts @@ -1,8 +1,8 @@ import * as secp from "@noble/secp256k1"; import { bytesToHex } from "@waku/byte-utils"; +import type { NodeId } from "@waku/interfaces"; import { keccak256 } from "./crypto.js"; -import { NodeId } from "./types.js"; export async function sign( privKey: Uint8Array, diff --git a/packages/enr/src/waku2_codec.spec.ts b/packages/enr/src/waku2_codec.spec.ts index 1dfc2b7cb2..443dad2d90 100644 --- a/packages/enr/src/waku2_codec.spec.ts +++ b/packages/enr/src/waku2_codec.spec.ts @@ -1,6 +1,7 @@ +import type { Waku2 } from "@waku/interfaces"; import { expect } from "chai"; -import { decodeWaku2, encodeWaku2, Waku2 } from "./waku2_codec.js"; +import { decodeWaku2, encodeWaku2 } from "./waku2_codec.js"; const waku2FieldEncodings = { relay: 1, diff --git a/packages/enr/src/waku2_codec.ts b/packages/enr/src/waku2_codec.ts index 601cde5478..eaff25d635 100644 --- a/packages/enr/src/waku2_codec.ts +++ b/packages/enr/src/waku2_codec.ts @@ -1,9 +1,4 @@ -export interface Waku2 { - relay: boolean; - store: boolean; - filter: boolean; - lightPush: boolean; -} +import type { Waku2 } from "@waku/interfaces"; export function encodeWaku2(protocols: Waku2): number { let byte = 0; diff --git a/packages/interfaces/CHANGELOG.md b/packages/interfaces/CHANGELOG.md index c4da6ab715..f10dc2d6f7 100644 --- a/packages/interfaces/CHANGELOG.md +++ b/packages/interfaces/CHANGELOG.md @@ -7,6 +7,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Added + +- `IPeerExchange` interface. +- `IEnr` interface. + ## [0.0.6] - 2022-12-15 ### Changed diff --git a/packages/interfaces/src/enr.ts b/packages/interfaces/src/enr.ts new file mode 100644 index 0000000000..33dcbe28e2 --- /dev/null +++ b/packages/interfaces/src/enr.ts @@ -0,0 +1,38 @@ +import type { PeerId } from "@libp2p/interface-peer-id"; +import type { Multiaddr } from "@multiformats/multiaddr"; + +export type ENRKey = string; +export type ENRValue = Uint8Array; +/** + * We represent NodeId as a hex string, since node equality is used very heavily + * and it is convenient to index data by NodeId + */ +export type NodeId = string; +export type SequenceNumber = bigint; + +export interface Waku2 { + relay: boolean; + store: boolean; + filter: boolean; + lightPush: boolean; +} + +export interface IEnr extends Map { + nodeId?: NodeId; + peerId?: PeerId; + id: string; + seq: SequenceNumber; + publicKey?: Uint8Array; + signature?: Uint8Array; + ip?: string; + tcp?: number; + udp?: number; + ip6?: string; + tcp6?: number; + udp6?: number; + multiaddrs?: Multiaddr[]; + waku2?: Waku2; + + encode(privateKey?: Uint8Array): Promise; + getFullMultiaddrs(): Multiaddr[]; +} diff --git a/packages/interfaces/src/index.ts b/packages/interfaces/src/index.ts index 3e9c3f3948..7ee7403d83 100644 --- a/packages/interfaces/src/index.ts +++ b/packages/interfaces/src/index.ts @@ -1,3 +1,4 @@ +export * from "./enr.js"; export * from "./filter.js"; export * from "./light_push.js"; export * from "./message.js"; diff --git a/packages/interfaces/src/peer_exchange.ts b/packages/interfaces/src/peer_exchange.ts index c74415c4d9..8df6abee12 100644 --- a/packages/interfaces/src/peer_exchange.ts +++ b/packages/interfaces/src/peer_exchange.ts @@ -1,8 +1,8 @@ import type { ConnectionManager } from "@libp2p/interface-connection-manager"; import type { PeerStore } from "@libp2p/interface-peer-store"; import type { Registrar } from "@libp2p/interface-registrar"; -import { ENR } from "@waku/enr"; +import { IEnr } from "./enr.js"; import { PointToPointProtocol } from "./protocols.js"; export interface IPeerExchange extends PointToPointProtocol { @@ -21,7 +21,7 @@ export interface PeerExchangeResponse { } export interface PeerInfo { - ENR?: ENR; + ENR?: IEnr; } export interface PeerExchangeComponents {