diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f2288af6b..5a8b631ca 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -60,7 +60,7 @@ jobs: strategy: matrix: node-version: [18.x] - folder: [./packages/client,./packages/log ./packages/programs,./packages/libp2p/direct-block ./packages/libp2p/direct-stream ./packages/libp2p/direct-sub ./packages/libp2p/libp2p-test-utils ./packages/libp2p/peerbit-libp2p ./packages/utils ./packages/server-node] + folder: [./packages/client,./packages/log ./packages/programs,./packages/transport/direct-block ./packages/transport/direct-stream ./packages/transport/direct-sub ./packages/transport/libp2p-test-utils ./packages/transport/peerbit-libp2p ./packages/utils ./packages/server-node] if: github.event_name == 'push' runs-on: ubuntu-22.04 steps: @@ -88,7 +88,7 @@ jobs: matrix: os: [ ubuntu-22.04 ] node-version: [18.x] - folder: [./packages/client,./packages/log ./packages/programs,./packages/libp2p/direct-block ./packages/libp2p/direct-stream ./packages/libp2p/direct-sub ./packages/libp2p/libp2p-test-utils ./packages/libp2p/peerbit-libp2p ./packages/utils ./packages/server-node] + folder: [./packages/client,./packages/log ./packages/programs,./packages/transport/direct-block ./packages/transport/direct-stream ./packages/transport/direct-sub ./packages/transport/libp2p-test-utils ./packages/transport/peerbit-libp2p ./packages/utils ./packages/server-node] name: Test (Node v${{ matrix.node-version }}, OS ${{ matrix.os }}) runs-on: ${{ matrix.os }} steps: diff --git a/.gitignore b/.gitignore index 86a8bba01..56f3913ba 100644 --- a/.gitignore +++ b/.gitignore @@ -5,7 +5,7 @@ orbitdb /orbit-db orbit-db-stores lib -peerbit/ +/peerbit .vscode /keystore/ keystore-test diff --git a/.release-please-manifest.json b/.release-please-manifest.json index e4b15b169..c37a92b9d 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1 +1,25 @@ -{"packages/server-node/node":"1.0.5","packages/server-node/frontend":"0.2.2","packages/libp2p/direct-block":"1.0.4","packages/libp2p/direct-stream":"1.0.4","packages/libp2p/direct-sub":"1.0.4","packages/libp2p/libp2p-test-utils":"1.0.4","packages/client":"1.0.4","packages/programs/clock-service":"1.0.4","packages/utils/crypto":"1.0.4","packages/programs/data/document":"1.0.4","packages/programs/acl/identity-access-controller":"1.0.4","packages/libp2p/peerbit-libp2p":"1.0.4","packages/log":"1.0.4","packages/programs/program-interface":"1.0.4","packages/programs/rpc":"1.0.4","packages/programs/data/string":"1.0.4","packages/utils/test-utils":"1.0.4","packages/programs/acl/trusted-network":"1.0.4","packages/utils/logger":"1.0.0","packages/utils/time":"1.0.0","packages/utils/uint8arrays":"1.0.0","packages/utils/cache":"0.0.7","packages/utils/lazy-level":"0.0.9"} +{ + "packages/server-node/node": "1.0.6", + "packages/server-node/frontend": "0.2.2", + "packages/libp2p/direct-block": "1.0.4", + "packages/libp2p/direct-stream": "1.0.4", + "packages/libp2p/direct-sub": "1.0.4", + "packages/libp2p/libp2p-test-utils": "1.0.4", + "packages/client": "1.0.5", + "packages/programs/clock-service": "1.0.5", + "packages/utils/crypto": "1.0.4", + "packages/programs/data/document": "1.0.5", + "packages/programs/acl/identity-access-controller": "1.0.5", + "packages/libp2p/peerbit-libp2p": "1.0.4", + "packages/log": "1.0.4", + "packages/programs/program-interface": "1.0.4", + "packages/programs/rpc": "1.0.4", + "packages/programs/data/string": "1.0.4", + "packages/utils/test-utils": "1.0.4", + "packages/programs/acl/trusted-network": "1.0.5", + "packages/utils/logger": "1.0.0", + "packages/utils/time": "1.0.0", + "packages/utils/uint8arrays": "1.0.0", + "packages/utils/cache": "0.0.7", + "packages/utils/lazy-level": "0.0.9" +} \ No newline at end of file diff --git a/README.md b/README.md index d40169524..f32e6a227 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@

- Peerbit icon Icon + Peerbit icon Icon

diff --git a/docs/README.md b/docs/README.md index e235e6901..53bd4dc2c 100644 --- a/docs/README.md +++ b/docs/README.md @@ -27,7 +27,7 @@ Every peer has an identity which is simply their public key, this key can *curre Data can be shared and encrypted on a granular level, you can decide exactly what parts of metadata should be public and not. When you create a commit or a query request, you can specify exactly who is going to be able to decrypt the message. If you want an end to end conversation between two identities, you just include the other peers' public key as a receiver and you would be certain that know one in the middle would be able to read your message. ## Scaling networks -Peerbit is built on top of a [pubsub](./../packages/libp2p/direct-sub/) protocol that automatically optimizes the routing for packages so that the network stays overall healthy. If some path in the network gets congested, packages are routed with alternative routes, potentially over WebRTC, Websocket and TCP connections. +Peerbit is built on top of a [pubsub](./../packages/transport/direct-sub/) protocol that automatically optimizes the routing for packages so that the network stays overall healthy. If some path in the network gets congested, packages are routed with alternative routes, potentially over WebRTC, Websocket and TCP connections. This is useful when you are building a app that requires streaming large amount of data, with a network consisting of peers with limited bandwidth. An example is a streaming service, where a streamer can write video stream chunks into a database and these chunks can propagage to thousands of peers without having to send to all of them directly. diff --git a/docs/coverpage.md b/docs/coverpage.md index 37fb67759..5b915ab8f 100644 --- a/docs/coverpage.md +++ b/docs/coverpage.md @@ -11,9 +11,9 @@ [Get Started](introduction) [Demo Sandbox](https://codesandbox.io/s/xv36w4695o) [GitHub](https://github.com/jhildenbiddle/docsify-themeable) --> - +

- Peerbit icon Icon + Peerbit icon Icon

# Peerbit @@ -27,7 +27,7 @@ Uint8Array subscription metadata (the latest recieved) public peerToTopic: Map>; // peer -> topics @@ -96,7 +77,7 @@ export class DirectSub extends DirectStream { return super.onPeerReachable(publicKey); } - public async onPeerDisconnected(peerId: PeerId, conn?: Connection) { + public async onPeerDisconnected(peerId: Libp2pPeerId, conn?: Connection) { return super.onPeerDisconnected(peerId, conn); } @@ -145,6 +126,7 @@ export class DirectSub extends DirectStream { newTopicsForTopicData.push(t); this.listenForSubscribers(t); + await this.requestSubscribers(t); } } @@ -200,6 +182,7 @@ export class DirectSub extends DirectStream { this.subscriptions.delete(topic); this.topics.delete(topic); this.topicsToPeers.delete(topic); + await this.publishMessage( this.components.peerId, await new DataMessage({ @@ -312,12 +295,12 @@ export class DirectSub extends DirectStream { options: | { topics?: string[]; - to?: (string | PeerId | PublicSignKey)[]; + to?: (string | PeerId)[]; strict?: false; } | { topics: string[]; - to: (string | PeerId | PublicSignKey)[]; + to: (string | PeerId)[]; strict: true; } ): Promise { @@ -344,7 +327,7 @@ export class DirectSub extends DirectStream { ); } - deletePeerFromTopic(topic: string, publicKeyHash: string) { + private deletePeerFromTopic(topic: string, publicKeyHash: string) { const peers = this.topics.get(topic); let change: SubscriptionData | undefined = undefined; if (peers) { @@ -413,7 +396,11 @@ export class DirectSub extends DirectStream { return true; } - async onDataMessage(from: PeerId, stream: PeerStreams, message: DataMessage) { + async onDataMessage( + from: Libp2pPeerId, + stream: PeerStreams, + message: DataMessage + ) { const pubsubMessage = PubSubMessage.deserialize(message.data); if (pubsubMessage instanceof PubSubData) { /** @@ -449,7 +436,7 @@ export class DirectSub extends DirectStream { } this.dispatchEvent( new CustomEvent("data", { - detail: pubsubMessage, + detail: { data: pubsubMessage, message }, }) ); } @@ -632,24 +619,33 @@ export class DirectSub extends DirectStream { } } -export type PeerIds = - | (PeerId | { peerId: PeerId })[] - | PeerId - | { peerId: PeerId }; export const waitForSubscribers = async ( libp2p: { services: { pubsub: DirectSub } }, - peersToWait: PeerIds, + peersToWait: + | PeerId + | PeerId[] + | { peerId: Libp2pPeerId } + | { peerId: Libp2pPeerId }[] + | string + | string[], topic: string ) => { const peersToWaitArr = Array.isArray(peersToWait) ? peersToWait : [peersToWait]; - const peerIdsToWait = peersToWaitArr.map((peer) => - peer["peerId"] - ? getPublicKeyFromPeerId(peer["peerId"]).hashcode() - : getPublicKeyFromPeerId(peer as PeerId).hashcode() - ); + const peerIdsToWait: string[] = peersToWaitArr.map((peer) => { + if (typeof peer === "string") { + return peer; + } + const id: PublicSignKey | Libp2pPeerId = peer["peerId"] || peer; + if (typeof id === "string") { + return id; + } + return id instanceof PublicSignKey + ? id.hashcode() + : getPublicKeyFromPeerId(id).hashcode(); + }); await libp2p.services.pubsub.requestSubscribers(topic); return new Promise((resolve, reject) => { diff --git a/packages/client/tsconfig.json b/packages/transport/pubsub/tsconfig.json similarity index 70% rename from packages/client/tsconfig.json rename to packages/transport/pubsub/tsconfig.json index 336d071d9..9c2db1ebd 100644 --- a/packages/client/tsconfig.json +++ b/packages/transport/pubsub/tsconfig.json @@ -1,5 +1,5 @@ { - "extends": "../../tsconfig.json", + "extends": "../../../tsconfig.json", "include": ["src"], "compilerOptions": { "noEmit": false, diff --git a/packages/transport/stream-interface/.gitignore b/packages/transport/stream-interface/.gitignore new file mode 100644 index 000000000..cdc4bba7e --- /dev/null +++ b/packages/transport/stream-interface/.gitignore @@ -0,0 +1,3 @@ +node_modules/ +.nyc_output +coverage diff --git a/packages/transport/stream-interface/README.md b/packages/transport/stream-interface/README.md new file mode 100644 index 000000000..056d8baae --- /dev/null +++ b/packages/transport/stream-interface/README.md @@ -0,0 +1,3 @@ +# Direct block + +Block swap/share protocol built on top of [Direct Stream](./../direct-stream/README.md) diff --git a/packages/transport/stream-interface/package.json b/packages/transport/stream-interface/package.json new file mode 100644 index 000000000..5ed408140 --- /dev/null +++ b/packages/transport/stream-interface/package.json @@ -0,0 +1,57 @@ +{ + "name": "@peerbit/stream-interface", + "version": "1.0.0", + "description": "Block store streaming", + "type": "module", + "sideEffects": false, + "private": false, + "publishConfig": { + "access": "public" + }, + "module": "lib/esm/index.js", + "types": "lib/esm/index.d.ts", + "exports": { + "import": "./lib/esm/index.js" + }, + "scripts": { + "clean": "shx rm -rf lib/*", + "build": "yarn clean && tsc -p tsconfig.json", + "postbuild": "echo '{\"type\":\"module\"} ' | node ../../../node_modules/.bin/json > lib/esm/package.json", + "test": "node ../../../node_modules/.binß/jest test -c ../../../jest.config.ts --runInBand --forceExit", + "test:unit": "node ../../../node_modules/.bin/jest test -c ../../../jest.config.unit.ts --runInBand --forceExit", + "test:integration": "node ../node_modules/.bin/jest test -c ../../../jest.config.integration.ts --runInBand --forceExit" + }, + "files": [ + "lib", + "src", + "!src/**/__tests__", + "!lib/**/__tests__", + "!src/**/__benchmark__", + "!lib/**/__benchmark__", + "LICENSE" + ], + "engines": { + "node": ">=16.15.1" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/dao-xyz/peerbit.git" + }, + "keywords": [ + "peerbit" + ], + "author": "dao.xyz", + "license": "MIT", + "bugs": { + "url": "https://github.com/dao-xyz/peerbit/issues" + }, + "homepage": "https://github.com/dao-xyz/peerbit#readme", + "localMaintainers": [ + "dao.xyz" + ], + "dependencies": { + "@dao-xyz/borsh": "^5.1.5", + "@peerbit/crypto": "1.0.4", + "@libp2p/interface-peer-id": "^2.0.2" + } +} diff --git a/packages/transport/stream-interface/src/index.ts b/packages/transport/stream-interface/src/index.ts new file mode 100644 index 000000000..cf6df6d90 --- /dev/null +++ b/packages/transport/stream-interface/src/index.ts @@ -0,0 +1,14 @@ +import { PublicSignKey } from "@peerbit/crypto"; +import type { PeerId } from "@libp2p/interface-peer-id"; + +export interface PeerStreamEvents { + "stream:inbound": CustomEvent; + "stream:outbound": CustomEvent; + close: CustomEvent; +} + +export * from "./messages.js"; + +export interface WaitForPeer { + waitFor(peer: PeerId | PublicSignKey): Promise; +} diff --git a/packages/libp2p/direct-stream/src/messages.ts b/packages/transport/stream-interface/src/messages.ts similarity index 99% rename from packages/libp2p/direct-stream/src/messages.ts rename to packages/transport/stream-interface/src/messages.ts index a027863ce..77ad8387f 100644 --- a/packages/libp2p/direct-stream/src/messages.ts +++ b/packages/transport/stream-interface/src/messages.ts @@ -16,7 +16,7 @@ import { randomBytes, sha256Base64, sha256, -} from "@dao-xyz/peerbit-crypto"; +} from "@peerbit/crypto"; /** * The default msgID implementation @@ -273,6 +273,10 @@ export class DataMessage extends Message { this._to = to; } + get sender(): PublicSignKey { + return this.signatures.signatures[0].publicKey; + } + get data(): Uint8Array { return this._data; } diff --git a/packages/transport/stream-interface/tsconfig.json b/packages/transport/stream-interface/tsconfig.json new file mode 100644 index 000000000..9c2db1ebd --- /dev/null +++ b/packages/transport/stream-interface/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "../../../tsconfig.json", + "include": ["src"], + "compilerOptions": { + "noEmit": false, + "outDir": "lib/esm" + } +} diff --git a/packages/transport/stream/.gitignore b/packages/transport/stream/.gitignore new file mode 100644 index 000000000..cdc4bba7e --- /dev/null +++ b/packages/transport/stream/.gitignore @@ -0,0 +1,3 @@ +node_modules/ +.nyc_output +coverage diff --git a/packages/libp2p/direct-stream/CHANGELOG.md b/packages/transport/stream/CHANGELOG.md similarity index 73% rename from packages/libp2p/direct-stream/CHANGELOG.md rename to packages/transport/stream/CHANGELOG.md index d3088654b..47d36d5a4 100644 --- a/packages/libp2p/direct-stream/CHANGELOG.md +++ b/packages/transport/stream/CHANGELOG.md @@ -13,9 +13,9 @@ * The following workspace dependencies were updated * dependencies * @dao-xyz/cache bumped from 0.0.6 to 0.0.7 - * @dao-xyz/peerbit-crypto bumped from 1.0.3 to 1.0.4 + * @peerbit/crypto bumped from 1.0.3 to 1.0.4 * devDependencies - * @dao-xyz/libp2p-test-utils bumped from 1.0.3 to 1.0.4 + * @peerbit/libp2p-test-utils bumped from 1.0.3 to 1.0.4 ## [1.0.3](https://github.com/dao-xyz/peerbit/compare/libp2p-direct-stream-v1.0.0-alpha1...libp2p-direct-stream-v1.0.3) (2023-06-14) @@ -30,9 +30,9 @@ * The following workspace dependencies were updated * dependencies - * @dao-xyz/peerbit-crypto bumped from 1.0.2 to 1.0.3 + * @peerbit/crypto bumped from 1.0.2 to 1.0.3 * devDependencies - * @dao-xyz/libp2p-test-utils bumped from 1.0.2 to 1.0.3 + * @peerbit/libp2p-test-utils bumped from 1.0.2 to 1.0.3 ## [1.0.0-alpha1](https://github.com/dao-xyz/peerbit/compare/libp2p-direct-stream-v1.0.0-alpha1...libp2p-direct-stream-v1.0.0-alpha1) (2023-06-14) @@ -57,11 +57,11 @@ * The following workspace dependencies were updated * dependencies - * @dao-xyz/peerbit-crypto bumped from 0.1.16 to 1.0.0-alpha1 + * @peerbit/crypto bumped from 0.1.16 to 1.0.0-alpha1 * devDependencies - * @dao-xyz/libp2p-test-utils bumped from 0.5.3 to 1.0.0-alpha1 + * @peerbit/libp2p-test-utils bumped from 0.5.3 to 1.0.0-alpha1 -## @dao-xyz/libp2p-direct-stream [0.5.3](https://github.com/dao-xyz/peerbit/compare/@dao-xyz/libp2p-direct-stream@0.5.2...@dao-xyz/libp2p-direct-stream@0.5.3) (2023-06-07) +## @peerbit/stream [0.5.3](https://github.com/dao-xyz/peerbit/compare/@peerbit/stream@0.5.2...@peerbit/stream@0.5.3) (2023-06-07) ### Bug Fixes @@ -75,5 +75,5 @@ ### Dependencies * **@dao-xyz/cache:** upgraded to 0.0.6 -* **@dao-xyz/peerbit-crypto:** upgraded to 0.1.16 -* **@dao-xyz/libp2p-test-utils:** upgraded to 0.5.3 +* **@peerbit/crypto:** upgraded to 0.1.16 +* **@peerbit/libp2p-test-utils:** upgraded to 0.5.3 diff --git a/packages/libp2p/direct-stream/README.md b/packages/transport/stream/README.md similarity index 100% rename from packages/libp2p/direct-stream/README.md rename to packages/transport/stream/README.md diff --git a/packages/libp2p/direct-stream/package.json b/packages/transport/stream/package.json similarity index 92% rename from packages/libp2p/direct-stream/package.json rename to packages/transport/stream/package.json index 4b8348387..4ecd64db3 100644 --- a/packages/libp2p/direct-stream/package.json +++ b/packages/transport/stream/package.json @@ -1,5 +1,5 @@ { - "name": "@dao-xyz/libp2p-direct-stream", + "name": "@peerbit/stream", "version": "1.0.4", "description": "A building block for direct streaming protocols", "type": "module", @@ -51,14 +51,15 @@ "dao.xyz" ], "devDependencies": { - "@dao-xyz/libp2p-test-utils": "1.0.4", + "@peerbit/libp2p-test-utils": "1.0.4", "@types/yallist": "^4.0.1", "graphology-types": "^0.24.7" }, "dependencies": { "@dao-xyz/borsh": "^5.1.5", "@dao-xyz/cache": "0.0.7", - "@dao-xyz/peerbit-crypto": "1.0.4", + "@peerbit/crypto": "1.0.4", + "@peerbit/stream-interface": "^1.0.0", "@libp2p/topology": "^4.0.1", "abstract-level": "^1.0.3", "graphology": "^0.25.1", diff --git a/packages/libp2p/direct-stream/src/__benchmark__/routes.ts b/packages/transport/stream/src/__benchmark__/routes.ts similarity index 100% rename from packages/libp2p/direct-stream/src/__benchmark__/routes.ts rename to packages/transport/stream/src/__benchmark__/routes.ts diff --git a/packages/libp2p/direct-stream/src/__benchmark__/transfer.ts b/packages/transport/stream/src/__benchmark__/transfer.ts similarity index 95% rename from packages/libp2p/direct-stream/src/__benchmark__/transfer.ts rename to packages/transport/stream/src/__benchmark__/transfer.ts index eaf0b7e96..09c87e52e 100644 --- a/packages/libp2p/direct-stream/src/__benchmark__/transfer.ts +++ b/packages/transport/stream/src/__benchmark__/transfer.ts @@ -1,11 +1,11 @@ import B from "benchmark"; -import { LSession } from "@dao-xyz/libp2p-test-utils"; +import { LSession } from "@peerbit/libp2p-test-utils"; import { DirectStreamComponents, DirectStream, waitForPeers, } from "../index.js"; -import { delay } from "@dao-xyz/peerbit-time"; +import { delay } from "@peerbit/time"; import { tcp } from "@libp2p/tcp"; import crypto from "crypto"; diff --git a/packages/libp2p/direct-stream/src/__tests__/routes.test.ts b/packages/transport/stream/src/__tests__/routes.test.ts similarity index 100% rename from packages/libp2p/direct-stream/src/__tests__/routes.test.ts rename to packages/transport/stream/src/__tests__/routes.test.ts diff --git a/packages/libp2p/direct-stream/src/__tests__/stream.test.ts b/packages/transport/stream/src/__tests__/stream.test.ts similarity index 99% rename from packages/libp2p/direct-stream/src/__tests__/stream.test.ts rename to packages/transport/stream/src/__tests__/stream.test.ts index ae7cc9a2a..30f1dbb71 100644 --- a/packages/libp2p/direct-stream/src/__tests__/stream.test.ts +++ b/packages/transport/stream/src/__tests__/stream.test.ts @@ -1,5 +1,5 @@ -import { LSession, LibP2POptions } from "@dao-xyz/libp2p-test-utils"; -import { waitFor, delay, waitForResolved } from "@dao-xyz/peerbit-time"; +import { LSession, LibP2POptions } from "@peerbit/libp2p-test-utils"; +import { waitFor, delay, waitForResolved } from "@peerbit/time"; import crypto from "crypto"; import { waitForPeers as waitForPeerStreams, @@ -7,8 +7,8 @@ import { ConnectionManagerOptions, DirectStreamComponents, } from ".."; -import { DataMessage, Message, getMsgId } from "../messages"; -import { PublicSignKey } from "@dao-xyz/peerbit-crypto"; +import { DataMessage, Message, getMsgId } from "@peerbit/stream-interface"; +import { PublicSignKey } from "@peerbit/crypto"; import { PeerId, isPeerId } from "@libp2p/interface-peer-id"; import { Multiaddr } from "@multiformats/multiaddr"; import { multiaddr } from "@multiformats/multiaddr"; @@ -672,7 +672,7 @@ describe("streams", function () { }, }; }) - ); // Second arg is due to https://github.com/libp2p/js-libp2p/issues/1690 + ); // Second arg is due to https://github.com/transport/js-libp2p/issues/1690 metrics = []; for (const [i, peer] of session.peers.entries()) { diff --git a/packages/libp2p/direct-stream/src/index.ts b/packages/transport/stream/src/index.ts similarity index 96% rename from packages/libp2p/direct-stream/src/index.ts rename to packages/transport/stream/src/index.ts index 2e2d7106b..b2b111968 100644 --- a/packages/libp2p/direct-stream/src/index.ts +++ b/packages/transport/stream/src/index.ts @@ -7,7 +7,6 @@ import type { Pushable } from "it-pushable"; import { pushable } from "it-pushable"; import type { Stream } from "@libp2p/interface-connection"; import { Uint8ArrayList } from "uint8arraylist"; -import type { PeerStreamEvents } from "@libp2p/interface-pubsub"; import { abortableSource } from "abortable-iterator"; import * as lp from "it-length-prefixed"; import { Routes } from "./routes.js"; @@ -20,31 +19,15 @@ import type { import { ConnectionManager } from "@libp2p/interface-connection-manager"; import { PeerStore } from "@libp2p/interface-peer-store"; -import { - Hello, - DataMessage, - Message, - Goodbye, - Ping, - PingPong, - Pong, - getMsgId, -} from "./messages.js"; -import { delay, TimeoutError, waitFor } from "@dao-xyz/peerbit-time"; +import { delay, TimeoutError, waitFor } from "@peerbit/time"; import { Ed25519PublicKey, getKeypairFromPeerId, getPublicKeyFromPeerId, PublicSignKey, SignatureWithKey, -} from "@dao-xyz/peerbit-crypto"; -export { - Message as Message, - Goodbye, - Hello, - DataMessage, - MessageHeader, -} from "./messages.js"; +} from "@peerbit/crypto"; + export type SignaturePolicy = "StictSign" | "StrictNoSign"; import type { AddressManager } from "@libp2p/interface-address-manager"; @@ -53,6 +36,18 @@ import { Cache } from "@dao-xyz/cache"; import { createTopology } from "./topology.js"; export { logger }; import type { Libp2pEvents } from "@libp2p/interface-libp2p"; +import { + PeerStreamEvents, + Message as Message, + Goodbye, + Hello, + DataMessage, + Ping, + PingPong, + Pong, + getMsgId, + WaitForPeer, +} from "@peerbit/stream-interface"; export interface PeerStreamsInit { peerId: PeerId; publicKey: PublicSignKey; @@ -323,8 +318,12 @@ export interface DirectStreamComponents { } export abstract class DirectStream< - Events extends { [s: string]: any } = StreamEvents -> extends EventEmitter { + Events extends { [s: string]: any } = StreamEvents + > + extends EventEmitter + implements WaitForPeer +{ + public peerId: PeerId; public peerIdStr: string; public publicKey: PublicSignKey; public publicKeyHash: string; @@ -384,6 +383,7 @@ export abstract class DirectStream< const signKey = getKeypairFromPeerId(components.peerId); this.sign = signKey.sign.bind(signKey); + this.peerId = components.peerId; this.peerIdStr = components.peerId.toString(); this.publicKey = signKey.publicKey; this.publicKeyHash = signKey.publicKey.hashcode(); @@ -1496,56 +1496,60 @@ export abstract class DirectStream< } } } -} -export const waitForPeers = async (...libs: DirectStream[]) => { - for (let i = 0; i < libs.length; i++) { - for (let j = 0; j < libs.length; j++) { - try { - if (i === j) { - continue; + async waitFor(peer: PeerId | PublicSignKey) { + const hash = ( + peer instanceof PublicSignKey ? peer : getPublicKeyFromPeerId(peer) + ).hashcode(); + try { + await waitFor(() => { + if (!this.peers.has(hash)) { + return false; + } + if (!this.routes.hasLink(this.publicKeyHash, hash)) { + return false; } - await waitFor(() => { - if (!libs[i].peers.has(libs[j].publicKeyHash)) { - return false; - } - if ( - !libs[i].routes.hasLink( - libs[i].publicKeyHash, - libs[j].publicKeyHash - ) - ) { - return false; - } - return true; - }); - } catch (error) { - throw new Error( - "Stream to " + - libs[j].publicKeyHash + - " does not exist. Connection exist: " + - libs[i].peers.has(libs[j].publicKeyHash) + - ". Route exist: " + - libs[i].routes.hasLink(libs[i].publicKeyHash, libs[j].publicKeyHash) - ); - } + return true; + }); + } catch (error) { + throw new Error( + "Stream to " + + hash + + " does not exist. Connection exist: " + + this.peers.has(hash) + + ". Route exist: " + + this.routes.hasLink(this.publicKeyHash, hash) + ); } + const stream = this.peers.get(hash)!; + try { + await waitFor(() => stream.isReadable && stream.isWritable); + } catch (error) { + throw new Error( + "Stream to " + + stream.publicKey.hashcode() + + " not ready. Readable: " + + stream.isReadable + + ". Writable " + + stream.isWritable + ); + } + } +} - const peers = libs[i].peers; - for (const peer of peers.values()) { - try { - await waitFor(() => peer.isReadable && peer.isWritable); - } catch (error) { - throw new Error( - "Stream to " + - peer.publicKey.hashcode() + - " not ready. Readable: " + - peer.isReadable + - ". Writable " + - peer.isWritable - ); +export const waitForPeers = async ( + ...libs: { + waitFor: (peer: PeerId | PublicSignKey) => Promise; + peerId: PeerId; + }[] +) => { + for (let i = 0; i < libs.length; i++) { + for (let j = 0; j < libs.length; j++) { + if (i === j) { + continue; } + await libs[i].waitFor(libs[j].peerId); } } }; diff --git a/packages/libp2p/direct-stream/src/logger.ts b/packages/transport/stream/src/logger.ts similarity index 55% rename from packages/libp2p/direct-stream/src/logger.ts rename to packages/transport/stream/src/logger.ts index 1a8439605..47759675b 100644 --- a/packages/libp2p/direct-stream/src/logger.ts +++ b/packages/transport/stream/src/logger.ts @@ -1,2 +1,2 @@ -import { logger as logFn } from "@dao-xyz/peerbit-logger"; +import { logger as logFn } from "@peerbit/logger"; export const logger = logFn({ module: "direct-stream", level: "warn" }); diff --git a/packages/libp2p/direct-stream/src/metrics.ts b/packages/transport/stream/src/metrics.ts similarity index 96% rename from packages/libp2p/direct-stream/src/metrics.ts rename to packages/transport/stream/src/metrics.ts index ffda635e6..75773a8df 100644 --- a/packages/libp2p/direct-stream/src/metrics.ts +++ b/packages/transport/stream/src/metrics.ts @@ -1,4 +1,4 @@ -import { PublicSignKey } from "@dao-xyz/peerbit-crypto"; +import { PublicSignKey } from "@peerbit/crypto"; export class Frequency { private interval: ReturnType; diff --git a/packages/libp2p/direct-stream/src/peer-map.ts b/packages/transport/stream/src/peer-map.ts similarity index 100% rename from packages/libp2p/direct-stream/src/peer-map.ts rename to packages/transport/stream/src/peer-map.ts diff --git a/packages/libp2p/direct-stream/src/routes.ts b/packages/transport/stream/src/routes.ts similarity index 100% rename from packages/libp2p/direct-stream/src/routes.ts rename to packages/transport/stream/src/routes.ts diff --git a/packages/libp2p/direct-stream/src/topology.ts b/packages/transport/stream/src/topology.ts similarity index 100% rename from packages/libp2p/direct-stream/src/topology.ts rename to packages/transport/stream/src/topology.ts diff --git a/packages/transport/stream/tsconfig.json b/packages/transport/stream/tsconfig.json new file mode 100644 index 000000000..9c2db1ebd --- /dev/null +++ b/packages/transport/stream/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "../../../tsconfig.json", + "include": ["src"], + "compilerOptions": { + "noEmit": false, + "outDir": "lib/esm" + } +} diff --git a/packages/utils/cache/CHANGELOG.md b/packages/utils/cache/CHANGELOG.md index f7dc9ee3a..262a2d61d 100644 --- a/packages/utils/cache/CHANGELOG.md +++ b/packages/utils/cache/CHANGELOG.md @@ -4,7 +4,7 @@ * The following workspace dependencies were updated * devDependencies - * @dao-xyz/peerbit-time bumped from 0.0.24 to 1.0.0 + * @peerbit/time bumped from 0.0.24 to 1.0.0 ## @dao-xyz/cache [0.0.6](https://github.com/dao-xyz/peerbit/compare/@dao-xyz/cache@0.0.5...@dao-xyz/cache@0.0.6) (2023-06-07) @@ -19,4 +19,4 @@ ### Dependencies -* **@dao-xyz/peerbit-time:** upgraded to 0.0.24 +* **@peerbit/time:** upgraded to 0.0.24 diff --git a/packages/utils/cache/package.json b/packages/utils/cache/package.json index 9cbfdd0a5..45693f847 100644 --- a/packages/utils/cache/package.json +++ b/packages/utils/cache/package.json @@ -35,7 +35,7 @@ }, "license": "MIT", "devDependencies": { - "@dao-xyz/peerbit-time": "1.0.0", + "@peerbit/time": "1.0.0", "@types/yallist": "^4.0.1" }, "dependencies": { diff --git a/packages/utils/cache/src/__tests__/cache.test.ts b/packages/utils/cache/src/__tests__/cache.test.ts index 26c8c8524..e6b5bc01e 100644 --- a/packages/utils/cache/src/__tests__/cache.test.ts +++ b/packages/utils/cache/src/__tests__/cache.test.ts @@ -1,4 +1,4 @@ -import { delay } from "@dao-xyz/peerbit-time"; +import { delay } from "@peerbit/time"; import { Cache } from "../index.js"; describe("cache", () => { diff --git a/packages/utils/crypto/CHANGELOG.md b/packages/utils/crypto/CHANGELOG.md index cff57634e..99fa2ade5 100644 --- a/packages/utils/crypto/CHANGELOG.md +++ b/packages/utils/crypto/CHANGELOG.md @@ -1,6 +1,6 @@ # Changelog -## [1.0.4](https://github.com/dao-xyz/peerbit/compare/peerbit-crypto-v1.0.3...peerbit-crypto-v1.0.4) (2023-06-15) +## [1.0.4](https://github.com/dao-xyz/peerbit/compare/@peerbit/crypto-v1.0.3...@peerbit/crypto-v1.0.4) (2023-06-15) ### Bug Fixes @@ -14,7 +14,7 @@ * dependencies * @dao-xyz/uint8arrays bumped from 0.0.4 to 1.0.0 -## [1.0.3](https://github.com/dao-xyz/peerbit/compare/peerbit-crypto-v1.0.0-alpha1...peerbit-crypto-v1.0.3) (2023-06-14) +## [1.0.3](https://github.com/dao-xyz/peerbit/compare/@peerbit/crypto-v1.0.0-alpha1...@peerbit/crypto-v1.0.3) (2023-06-14) ### Bug Fixes @@ -34,7 +34,7 @@ * only allow Ed25519 PeerIds ([532c8b3](https://github.com/dao-xyz/peerbit/commit/532c8b35bc4e85719669db47639ec5ffd11c8eab)) * simplified identity handling ([1ae2416](https://github.com/dao-xyz/peerbit/commit/1ae24168a5c8629b8f9d1c57eceed6abd4a15020)) -## @dao-xyz/peerbit-crypto [0.1.16](https://github.com/dao-xyz/peerbit/compare/@dao-xyz/peerbit-crypto@0.1.15...@dao-xyz/peerbit-crypto@0.1.16) (2023-06-07) +## @peerbit/crypto [0.1.16](https://github.com/dao-xyz/peerbit/compare/@peerbit/crypto@0.1.15...@peerbit/crypto@0.1.16) (2023-06-07) ### Bug Fixes diff --git a/packages/utils/crypto/package.json b/packages/utils/crypto/package.json index ecfaff35d..1a471be1e 100644 --- a/packages/utils/crypto/package.json +++ b/packages/utils/crypto/package.json @@ -1,5 +1,5 @@ { - "name": "@dao-xyz/peerbit-crypto", + "name": "@peerbit/crypto", "version": "1.0.4", "description": "Crypto fn", "type": "module", @@ -43,6 +43,7 @@ "uint8arrays": "^4.0.4" }, "dependencies": { + "@dao-xyz/cache": "^0.0.7", "@dao-xyz/borsh": "^5.1.5", "@dao-xyz/uint8arrays": "1.0.0", "@ethersproject/wallet": "^5.7.0", diff --git a/packages/utils/crypto/src/__tests__/encryption.test.ts b/packages/utils/crypto/src/__tests__/encryption.test.ts index 196aa3c25..5bb7ad6fc 100644 --- a/packages/utils/crypto/src/__tests__/encryption.test.ts +++ b/packages/utils/crypto/src/__tests__/encryption.test.ts @@ -1,30 +1,20 @@ import { DecryptedThing, - X25519PublicKey, - PublicKeyEncryptionResolver, - Ed25519Keypair, X25519Keypair, + Keychain, + PublicSignKey, } from "../index.js"; describe("encryption", function () { - const config = (keypair: Ed25519Keypair | X25519Keypair) => { + const keychain = (keypair: X25519Keypair): Keychain => { return { - getEncryptionKeypair: () => keypair, - getAnyKeypair: async (publicKeys: X25519PublicKey[]) => { - const pk = - keypair.publicKey instanceof X25519PublicKey - ? keypair.publicKey - : await X25519PublicKey.from(keypair.publicKey); - for (let i = 0; i < publicKeys.length; i++) { - if (publicKeys[i].equals(pk)) { - return { - index: i, - keypair, - }; - } - } + exportById: async (id: Uint8Array) => undefined, + exportByKey: async (publicKey: T) => + publicKey.equals(keypair.publicKey) ? (keypair as Q) : undefined, + import: (keypair: any, id: Uint8Array) => { + throw new Error("No implemented+"); }, - } as PublicKeyEncryptionResolver; + }; }; it("encrypt", async () => { const senderKey = await X25519Keypair.create(); @@ -36,8 +26,8 @@ describe("encryption", function () { data, }); - const reciever1Config = config(recieverKey1); - const reciever2Config = config(recieverKey2); + const reciever1Config = keychain(recieverKey1); + const reciever2Config = keychain(recieverKey2); const encrypted = await decrypted.encrypt( senderKey, @@ -46,14 +36,10 @@ describe("encryption", function () { ); encrypted._decrypted = undefined; - const decryptedFromEncrypted1 = await encrypted.decrypt( - reciever1Config.getAnyKeypair - ); + const decryptedFromEncrypted1 = await encrypted.decrypt(reciever1Config); expect(decryptedFromEncrypted1._data).toStrictEqual(data); - const decryptedFromEncrypted2 = await encrypted.decrypt( - reciever2Config.getAnyKeypair - ); + const decryptedFromEncrypted2 = await encrypted.decrypt(reciever2Config); expect(decryptedFromEncrypted2._data).toStrictEqual(data); }); @@ -62,27 +48,27 @@ describe("encryption", function () { const senderKey = await Ed25519Keypair.create(); const recieverKey1 = await Ed25519Keypair.create(); const recieverKey2 = await Ed25519Keypair.create(); - + const reciever1Config = config(recieverKey1); const reciever2Config = config(recieverKey2); - + const data = new Uint8Array([1, 2, 3]); const decrypted = new DecryptedThing({ data, }); - + const encrypted = await decrypted.encrypt( senderKey, recieverKey1.publicKey, recieverKey2.publicKey ); encrypted._decrypted = undefined; - + const decryptedFromEncrypted1 = await encrypted.decrypt( reciever1Config.getAnyKeypair ); expect(decryptedFromEncrypted1._data).toStrictEqual(data); - + const decryptedFromEncrypted2 = await encrypted.decrypt( reciever2Config.getAnyKeypair ); diff --git a/packages/utils/crypto/src/__tests__/keychain.test.ts b/packages/utils/crypto/src/__tests__/keychain.test.ts new file mode 100644 index 000000000..4fe2d4619 --- /dev/null +++ b/packages/utils/crypto/src/__tests__/keychain.test.ts @@ -0,0 +1,57 @@ +import { Keychain, Libp2pKeychain } from "../keychain"; +import { MemoryDatastore } from "datastore-core"; +import { DefaultKeyChain } from "@libp2p/keychain"; +import { Ed25519Keypair } from "../ed25519"; +import { X25519Keypair } from "../x25519"; +import { Cache } from "@dao-xyz/cache"; + +describe("keychain", () => { + let keychains: Keychain[]; + + beforeEach(() => { + keychains = [ + new Libp2pKeychain( + new DefaultKeyChain({ datastore: new MemoryDatastore() }, {}) + ), + new Libp2pKeychain( + new DefaultKeyChain({ datastore: new MemoryDatastore() }, {}), + { cache: new Cache({ max: 1000 }) } + ), + ]; + }); + + describe("ed25519", () => { + it("import/export", async () => { + for (const keychain of keychains) { + const kp = await Ed25519Keypair.create(); + await keychain.import(kp, new Uint8Array([1, 2, 3])); + expect( + ( + await keychain.exportById(new Uint8Array([1, 2, 3]), "ed25519") + )?.equals(kp) + ).toBeTrue(); + expect( + (await keychain.exportByKey(kp.publicKey))?.equals(kp) + ).toBeTrue(); + } + }); + }); + + describe("x25519", () => { + it("import/export", async () => { + for (const keychain of keychains) { + const kp = await Ed25519Keypair.create(); + const xkp = await X25519Keypair.from(kp); + await keychain.import(kp, new Uint8Array([1, 2, 3])); + expect( + ( + await keychain.exportById(new Uint8Array([1, 2, 3]), "x25519") + )?.equals(xkp) + ).toBeTrue(); + expect( + (await keychain.exportByKey(xkp.publicKey))?.equals(xkp) + ).toBeTrue(); + } + }); + }); +}); diff --git a/packages/utils/crypto/src/encryption.ts b/packages/utils/crypto/src/encryption.ts index 08bd511db..b91237730 100644 --- a/packages/utils/crypto/src/encryption.ts +++ b/packages/utils/crypto/src/encryption.ts @@ -13,23 +13,10 @@ import sodium from "libsodium-wrappers"; import { X25519Keypair, X25519PublicKey, X25519SecretKey } from "./x25519.js"; import { Ed25519Keypair, Ed25519PublicKey } from "./ed25519.js"; import { randomBytes } from "./random.js"; +import { Keychain } from "./keychain.js"; const NONCE_LENGTH = 24; -export interface PublicKeyEncryptionResolver { - getEncryptionKeypair: GetEncryptionKeypair; - getAnyKeypair: GetAnyKeypair; -} -export type GetAnyKeypair = - | (( - publicKey: X25519PublicKey[] - ) => Promise<{ index: number; keypair: X25519Keypair } | undefined>) - | X25519Keypair; -export type GetEncryptionKeypair = - | (() => X25519Keypair) - | (() => Promise) - | X25519Keypair; - @variant(0) export abstract class MaybeEncrypted { /** @@ -40,7 +27,7 @@ export abstract class MaybeEncrypted { } decrypt( - keyResolver?: GetAnyKeypair + keyOrKeychain?: Keychain | X25519Keypair ): Promise> | DecryptedThing { throw new Error("Not implemented"); } @@ -83,7 +70,7 @@ export class DecryptedThing extends MaybeEncrypted { } async encrypt( - keyResolver: GetEncryptionKeypair, + x25519Keypair: X25519Keypair, ...recieverPublicKeys: (X25519PublicKey | Ed25519PublicKey)[] ): Promise> { const bytes = serialize(this); @@ -91,12 +78,6 @@ export class DecryptedThing extends MaybeEncrypted { const nonce = randomBytes(NONCE_LENGTH); // crypto random is faster than sodim random const cipher = sodium.crypto_secretbox_easy(bytes, nonce, epheremalKey); - let encryptionKeypair = - typeof keyResolver === "function" ? await keyResolver() : keyResolver; - if (encryptionKeypair instanceof Ed25519Keypair) { - encryptionKeypair = await X25519Keypair.from(encryptionKeypair); - } - const x25519Keypair = encryptionKeypair as X25519Keypair; const recieverX25519PublicKeys = await Promise.all( recieverPublicKeys.map((key) => { if (key instanceof Ed25519PublicKey) { @@ -285,7 +266,9 @@ export class EncryptedThing extends MaybeEncrypted { return this._decrypted; } - async decrypt(keyResolver?: GetAnyKeypair): Promise> { + async decrypt( + keyResolver?: Keychain | X25519Keypair + ): Promise> { if (this._decrypted) { return this._decrypted; } @@ -295,9 +278,7 @@ export class EncryptedThing extends MaybeEncrypted { } // We only need to open with one of the keys - let key: - | { index: number; keypair: X25519Keypair | Ed25519Keypair } - | undefined; + let key: { index: number; keypair: X25519Keypair } | undefined; if (keyResolver instanceof X25519Keypair) { for (const [i, k] of this._envelope._ks.entries()) { if (k._recieverPublicKey.equals(keyResolver.publicKey)) { @@ -308,9 +289,16 @@ export class EncryptedThing extends MaybeEncrypted { } } } else { - key = await keyResolver( - this._envelope._ks.map((k) => k._recieverPublicKey) - ); + for (const [i, k] of this._envelope._ks.entries()) { + const exported = await keyResolver.exportByKey(k._recieverPublicKey); + if (exported) { + key = { + index: i, + keypair: exported, + }; + break; + } + } } if (key) { diff --git a/packages/utils/crypto/src/index.ts b/packages/utils/crypto/src/index.ts index c1dd19bbe..87b97e9af 100644 --- a/packages/utils/crypto/src/index.ts +++ b/packages/utils/crypto/src/index.ts @@ -5,10 +5,10 @@ export * from "./key.js"; export * from "./sepc256k1.js"; export * from "./x25519.js"; export * from "./encryption.js"; -export * from "./mix.js"; export * from "./libp2p.js"; export * from "./utils.js"; export * from "./hash.js"; export * from "./random.js"; export * from "./prehash.js"; export * from "./signer.js"; +export * from "./keychain.js"; diff --git a/packages/utils/crypto/src/keychain.ts b/packages/utils/crypto/src/keychain.ts new file mode 100644 index 000000000..8528227ad --- /dev/null +++ b/packages/utils/crypto/src/keychain.ts @@ -0,0 +1,197 @@ +import { KeyChain as InternalKeychain } from "@libp2p/interface-keychain"; +import { keysPBM } from "@libp2p/crypto/keys"; +import { identity } from "multiformats/hashes/identity"; +import { base58btc } from "multiformats/bases/base58"; +import { Cache } from "@dao-xyz/cache"; +import { Ed25519Keypair, Ed25519PublicKey } from "./ed25519.js"; +import { Keypair, PublicSignKey } from "./key.js"; + +import { KeyInfo } from "@libp2p/interface-keychain"; +import { AccessError, X25519Keypair, X25519PublicKey } from "./x25519.js"; + +export type KeypairFromPublicKey = T extends X25519PublicKey + ? X25519PublicKey extends T + ? X25519Keypair + : Ed25519Keypair + : Ed25519Keypair; + +export interface Keychain { + import(keypair: Ed25519Keypair, id: Uint8Array): Promise; + + exportByKey< + T extends Ed25519PublicKey | X25519PublicKey, + Q = KeypairFromPublicKey + >( + publicKey: T + ): Promise; + + exportById< + T = "ed25519" | "x25519", + Q = T extends "ed25519" ? Ed25519Keypair : X25519Keypair + >( + id: Uint8Array, + type: T + ): Promise; +} + +export class Libp2pKeychain implements Keychain { + constructor( + readonly keychain: InternalKeychain, + readonly options?: { cache?: Cache } + ) {} + + keychainKeyIdFromPublicKey(publicKey: X25519PublicKey) { + const bytes = keysPBM.PublicKey.encode({ + Type: keysPBM.KeyType.Ed25519, + Data: publicKey.publicKey, + }).subarray(); + + const encoding = identity.digest(bytes); + return base58btc.encode(encoding.bytes).substring(1); + } + + private cacheKey(key: Ed25519Keypair | X25519Keypair, id?: Uint8Array) { + this.options?.cache?.add(base58btc.encode(key.publicKey.bytes), key); + id && this.options?.cache?.add(base58btc.encode(id), key); + } + + private getCachedById(id: Uint8Array): Ed25519Keypair | null | undefined { + const key = base58btc.encode(id instanceof PublicSignKey ? id.bytes : id); + const cached = this.options?.cache?.get(key); + if (cached === null) { + return null; + } else if (!cached) { + return undefined; + } else if (cached instanceof Ed25519Keypair) { + return cached; + } + throw new Error("Unexpected cached keypair type: " + key?.constructor.name); + } + + private getCachedByKey< + T extends X25519PublicKey | Ed25519PublicKey, + Q = KeypairFromPublicKey + >(publicKey: T): Q | null | undefined { + const key = base58btc.encode(publicKey.bytes); + const cached = this.options?.cache?.get(key); + if (cached === null) { + return null; + } else if (!cached) { + return undefined; + } else if (cached instanceof Keypair) { + return cached as Q; + } + throw new Error("Unexpected cached keypair type: " + key?.constructor.name); + } + + exportByKey = async < + T extends X25519PublicKey | Ed25519PublicKey, + Q = KeypairFromPublicKey + >( + publicKey: T + ): Promise => { + const cached = this.getCachedByKey(publicKey); + if (cached !== undefined) { + // if null, means key is deleted + return cached ? cached : undefined; + } + + let keyInfo: KeyInfo | undefined = undefined; + if (publicKey instanceof Ed25519PublicKey) { + try { + keyInfo = await this.keychain.findKeyById( + (await publicKey.toPeerId()).toString() + ); + } catch (e: any) { + if (e.code !== "ERR_KEY_NOT_FOUND") { + throw e; + } + } + } + + try { + keyInfo = await this.keychain.findKeyByName( + base58btc.encode(publicKey.bytes) + ); + } catch (e: any) { + if (e.code !== "ERR_KEY_NOT_FOUND") { + throw e; + } + } + + if (!keyInfo) { + return undefined; + } + + const peerId = await this.keychain.exportPeerId(keyInfo.name); + + return ( + publicKey instanceof X25519PublicKey + ? X25519Keypair.fromPeerId(peerId) + : Ed25519Keypair.fromPeerId(peerId) + ) as Q; + }; + + async exportById< + T = "ed25519" | "x25519", + Q = T extends "ed25519" ? Ed25519Keypair : X25519Keypair + >(id: Uint8Array, type: T): Promise { + const cached = this.getCachedById(id) as Ed25519Keypair | undefined | null; + if (cached !== undefined) { + // if null, means key is deleted + if (type === "x25519" && cached instanceof Ed25519Keypair) { + return X25519Keypair.from(cached) as Q; // TODO perf, don't do this all the time + } + return cached ? (cached as Q) : undefined; + } + try { + const keyInfo = await this.keychain.findKeyByName(base58btc.encode(id)); + const peerId = await this.keychain.exportPeerId(keyInfo.name); + if (type === "x25519") { + return X25519Keypair.fromPeerId(peerId) as Q; + } + return Ed25519Keypair.fromPeerId(peerId) as Q; + } catch (e: any) { + if (e.code !== "ERR_KEY_NOT_FOUND") { + throw e; + } + } + } + + import = async (keypair: Ed25519Keypair, id: Uint8Array) => { + const receiverKeyPeerId = await keypair.toPeerId(); + this.cacheKey(keypair, id); + + // import as ed + await this.keychain.importPeer(base58btc.encode(id), receiverKeyPeerId); + + // import as x so we can decrypt messages with this public key (if recieved any) + const xKeypair = await X25519Keypair.from(keypair); + this.cacheKey(xKeypair); + await this.keychain.importPeer( + base58btc.encode(xKeypair.publicKey.bytes), + receiverKeyPeerId + ); + }; + + // Arrow function is used so we can reference this function and use 'this' without .bind(self) + getAnyKeypair = async (publicKeys) => { + for (let i = 0; i < publicKeys.length; i++) { + try { + const key = await this.exportByKey(publicKeys[i]); + if (key && key instanceof X25519Keypair) { + return { + index: i, + keypair: key as X25519Keypair, + }; + } + } catch (error: any) { + // Key missing + if (error.code !== "ERR_NOT_FOUND") { + throw error; + } + } + } + throw new AccessError("Failed to access key"); + }; +} diff --git a/packages/utils/crypto/src/mix.ts b/packages/utils/crypto/src/mix.ts deleted file mode 100644 index e3d4db4f3..000000000 --- a/packages/utils/crypto/src/mix.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { AbstractType, deserialize } from "@dao-xyz/borsh"; -import { PublicSignKey } from "./key.js"; -import { MaybeSigned } from "./signature.js"; -import { GetAnyKeypair, MaybeEncrypted } from "./encryption.js"; -import { AccessError } from "./errors.js"; -export const decryptVerifyInto = async ( - data: Uint8Array, - clazz: AbstractType, - keyResolver: GetAnyKeypair, - options: { isTrusted?: (key: MaybeSigned) => Promise } = {} -): Promise<{ result: T; from?: PublicSignKey }> => { - const maybeEncrypted = deserialize>>( - data, - MaybeEncrypted - ); - const decrypted = await maybeEncrypted.decrypt(keyResolver); - const maybeSigned = decrypted.getValue(MaybeSigned); - if (!(await maybeSigned.verify())) { - throw new AccessError(); - } - - if (options.isTrusted) { - if (!(await options.isTrusted(maybeSigned))) { - throw new AccessError(); - } - } - return { - result: deserialize(maybeSigned.data, clazz), - from: maybeSigned.signature?.publicKey, - }; -}; diff --git a/packages/utils/lazy-level/CHANGELOG.md b/packages/utils/lazy-level/CHANGELOG.md index f3171a534..32044012f 100644 --- a/packages/utils/lazy-level/CHANGELOG.md +++ b/packages/utils/lazy-level/CHANGELOG.md @@ -4,8 +4,8 @@ * The following workspace dependencies were updated * dependencies - * @dao-xyz/peerbit-logger bumped from 0.0.7 to 1.0.0 - * @dao-xyz/peerbit-time bumped from 0.0.24 to 1.0.0 + * @peerbit/logger bumped from 0.0.7 to 1.0.0 + * @peerbit/time bumped from 0.0.24 to 1.0.0 ## @dao-xyz/lazy-level [0.0.8](https://github.com/dao-xyz/peerbit/compare/@dao-xyz/lazy-level@0.0.7...@dao-xyz/lazy-level@0.0.8) (2023-06-07) @@ -20,5 +20,5 @@ ### Dependencies -* **@dao-xyz/peerbit-logger:** upgraded to 0.0.7 -* **@dao-xyz/peerbit-time:** upgraded to 0.0.24 +* **@peerbit/logger:** upgraded to 0.0.7 +* **@peerbit/time:** upgraded to 0.0.24 diff --git a/packages/utils/lazy-level/package.json b/packages/utils/lazy-level/package.json index 10ff285f0..1de6f488a 100644 --- a/packages/utils/lazy-level/package.json +++ b/packages/utils/lazy-level/package.json @@ -36,8 +36,8 @@ }, "license": "MIT", "dependencies": { - "@dao-xyz/peerbit-logger": "1.0.0", - "@dao-xyz/peerbit-time": "1.0.0", + "@peerbit/logger": "1.0.0", + "@peerbit/time": "1.0.0", "level": "^8.0.0" }, "localMaintainers": [ diff --git a/packages/utils/lazy-level/src/__tests__/cache.test.ts b/packages/utils/lazy-level/src/__tests__/cache.test.ts index fbf938645..0f43052dc 100644 --- a/packages/utils/lazy-level/src/__tests__/cache.test.ts +++ b/packages/utils/lazy-level/src/__tests__/cache.test.ts @@ -1,21 +1,21 @@ -import Cache from "../index.js"; +import LazyLevel from "../index.js"; import assert from "assert"; import { MemoryLevel } from "memory-level"; import crypto from "crypto"; -import { waitFor } from "@dao-xyz/peerbit-time"; +import { waitFor } from "@peerbit/time"; + export const createStore = (): MemoryLevel => { return new MemoryLevel({ valueEncoding: "view" }); }; -describe(`Cache - level`, function () { +describe(`LazyLevel - level`, function () { const data = [{ key: "boolean", value: true }]; describe("sequential", () => { - let cache: Cache, store: MemoryLevel; - + let cache: LazyLevel, store: MemoryLevel; beforeAll(async () => { store = await createStore(); - cache = new Cache(store, { batch: false }); + cache = new LazyLevel(store, { batch: false }); await cache.open(); }); @@ -25,7 +25,7 @@ describe(`Cache - level`, function () { it(`set, get, delete`, async () => { for (const d of data) { - await cache.set(d.key, Buffer.from(JSON.stringify(d.value))); + await cache.put(d.key, Buffer.from(JSON.stringify(d.value))); const val = await cache.get(d.key); expect(new Uint8Array(val!)).toEqual( new Uint8Array(Buffer.from(JSON.stringify(d.value))) @@ -36,7 +36,7 @@ describe(`Cache - level`, function () { fail(); } - await cache.set(d.key, Buffer.from(JSON.stringify(d.value))); + await cache.put(d.key, Buffer.from(JSON.stringify(d.value))); await cache.del(d.key); try { await store.get(d.key); @@ -53,29 +53,32 @@ describe(`Cache - level`, function () { } } }); + /* TODO feat (?) + it("delete by prefix", async () => { - await cache.set("a", crypto.randomBytes(8)); - await cache.set("ab", crypto.randomBytes(8)); - await cache.set("abc", crypto.randomBytes(8)); - - await cache.deleteByPrefix("a"); - expect(await cache.get("a")).toBeUndefined(); - expect(await cache.get("ab")).toBeUndefined(); - expect(await cache.get("abc")).toBeUndefined(); - await cache.idle(); - expect(await cache.get("a")).toBeUndefined(); - expect(await cache.get("ab")).toBeUndefined(); - expect(await cache.get("abc")).toBeUndefined(); - }); + await cache.put("a", crypto.randomBytes(8)); + await cache.put("ab", crypto.randomBytes(8)); + await cache.put("abc", crypto.randomBytes(8)); + + await cache.deleteByPrefix("a"); + expect(await cache.get("a")).toBeUndefined(); + expect(await cache.get("ab")).toBeUndefined(); + expect(await cache.get("abc")).toBeUndefined(); + await cache.idle(); + expect(await cache.get("a")).toBeUndefined(); + expect(await cache.get("ab")).toBeUndefined(); + expect(await cache.get("abc")).toBeUndefined(); + }); + */ }); describe("batched", () => { - let cache: Cache, store: MemoryLevel; + let cache: LazyLevel, store: MemoryLevel; let interval = 1000; beforeEach(async () => { store = await createStore(); - cache = new Cache(store, { batch: { interval: interval } }); + cache = new LazyLevel(store, { batch: { interval: interval } }); await cache.open(); }); @@ -85,13 +88,13 @@ describe(`Cache - level`, function () { it(`set, get, delete`, async () => { for (const d of data) { - await cache.set(d.key, Buffer.from(JSON.stringify(d.value))); + await cache.put(d.key, Buffer.from(JSON.stringify(d.value))); const val = await cache.get(d.key); expect(new Uint8Array(val!)).toEqual( new Uint8Array(Buffer.from(JSON.stringify(d.value))) ); await cache.idle(); - expect(cache._tempStore?.size).toEqual(0); + expect(cache["_tempStore"]?.size).toEqual(0); expect(new Uint8Array(val!)).toEqual( new Uint8Array(Buffer.from(JSON.stringify(d.value))) ); @@ -101,7 +104,7 @@ describe(`Cache - level`, function () { fail(); } - await cache.set(d.key, Buffer.from(JSON.stringify(d.value))); + await cache.put(d.key, Buffer.from(JSON.stringify(d.value))); await cache.del(d.key); try { await store.get(d.key); @@ -121,11 +124,11 @@ describe(`Cache - level`, function () { it("put many", async () => { for (let i = 0; i < 100; i++) { - cache.set(String(i), crypto.randomBytes(8)); + cache.put(String(i), crypto.randomBytes(8)); } - expect(cache._tempStore?.size).toEqual(100); + expect(cache["_tempStore"]?.size).toEqual(100); await cache.idle(); - expect(cache._tempStore?.size).toEqual(0); + expect(cache["_tempStore"]?.size).toEqual(0); for (let i = 0; i < 100; i++) { expect(await cache.get(String(i))).toBeDefined(); } @@ -133,32 +136,34 @@ describe(`Cache - level`, function () { it("delete", async () => { const key = "2"; - await cache.set(key, crypto.randomBytes(8)); + await cache.put(key, crypto.randomBytes(8)); await cache.delAll([key]); expect(await cache.get(key)).toBeUndefined(); await cache.idle(); expect(await cache.get(key)).toBeUndefined(); - await waitFor(() => cache._tempDeleted?.size === 0); - expect(cache._tempStore!.size).toEqual(0); + await waitFor(() => cache["_tempDeleted"]?.size === 0); + expect(cache["_tempStore"]!.size).toEqual(0); }); it("put delete put", async () => { const key = ""; - cache.set(key, new Uint8Array([0])); + cache.put(key, new Uint8Array([0])); cache.delAll([key]); - cache.set(key, new Uint8Array([1])); + cache.put(key, new Uint8Array([1])); expect(await cache.get(key)).toEqual(new Uint8Array([1])); await cache.idle(); expect(new Uint8Array((await cache.get(key))!)).toEqual( new Uint8Array([1]) ); - await waitFor(() => cache._tempDeleted?.size === 0); - await waitFor(() => cache._tempStore!.size === 0); + await waitFor(() => cache["_tempDeleted"]?.size === 0); + await waitFor(() => cache["_tempStore"]!.size === 0); }); + /* TODO feat (?) + it("delete by prefix", async () => { - await cache.set("a", crypto.randomBytes(8)); - await cache.set("ab", crypto.randomBytes(8)); - await cache.set("abc", crypto.randomBytes(8)); + await cache.put("a", crypto.randomBytes(8)); + await cache.put("ab", crypto.randomBytes(8)); + await cache.put("abc", crypto.randomBytes(8)); await cache.deleteByPrefix("a"); expect(await cache.get("a")).toBeUndefined(); @@ -168,9 +173,10 @@ describe(`Cache - level`, function () { expect(await cache.get("a")).toBeUndefined(); expect(await cache.get("ab")).toBeUndefined(); expect(await cache.get("abc")).toBeUndefined(); - }); + }); */ + it("can open and close many times", async () => { - cache.set(" ", crypto.randomBytes(8)); + cache.put(" ", crypto.randomBytes(8)); await cache.close(); await cache.open(); await cache.open(); @@ -178,13 +184,34 @@ describe(`Cache - level`, function () { await cache.close(); }); }); - it("can create from sublevel", async () => { - let store = createStore(); - const sublevel = store.sublevel("sublevel"); - const _sublevelCache = new Cache(sublevel); - await _sublevelCache.close(); - expect(sublevel.status).toEqual("closed"); - expect(store.status).toEqual("open"); - await store.close(); + + describe("sublevel", () => { + let level: LazyLevel; + + afterEach(async () => { + await level?.close(); + }); + it("create from sublevel", async () => { + let store = createStore(); + const sublevel = store.sublevel("sublevel"); + level = new LazyLevel(sublevel); + await level.close(); + expect(sublevel.status).toEqual("closed"); + expect(store.status).toEqual("open"); + }); + + it("clear sublevel", async () => { + level = new LazyLevel(createStore()); + await level.open(); + await level.put("a", new Uint8Array([1])); + const sublevel = level.sublevel("sublevel"); + await sublevel.open(); + await sublevel.put("a", new Uint8Array([2])); + expect(await level.get("a")).toEqual(new Uint8Array([1])); + expect(await sublevel.get("a")).toEqual(new Uint8Array([2])); + await sublevel.clear(); + expect(await level.get("a")).toEqual(new Uint8Array([1])); + expect(await sublevel.get("a")).toBeUndefined(); + }); }); }); diff --git a/packages/utils/lazy-level/src/__tests__/types.test.ts b/packages/utils/lazy-level/src/__tests__/types.test.ts deleted file mode 100644 index e148a72db..000000000 --- a/packages/utils/lazy-level/src/__tests__/types.test.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { SimpleLevel } from ".."; -import { MemoryLevel } from "memory-level"; - -describe("SimpleLevel", () => - it("level is SimpleLevel", async () => { - const level: SimpleLevel = new MemoryLevel(); - await level.close(); - })); diff --git a/packages/utils/lazy-level/src/index.ts b/packages/utils/lazy-level/src/index.ts index 342fdb250..fcb918997 100644 --- a/packages/utils/lazy-level/src/index.ts +++ b/packages/utils/lazy-level/src/index.ts @@ -1,5 +1,5 @@ -import { logger as loggerFn } from "@dao-xyz/peerbit-logger"; -import { waitFor } from "@dao-xyz/peerbit-time"; +import { logger as loggerFn } from "@peerbit/logger"; +import { waitFor } from "@peerbit/time"; import { AbstractBatchOperation, AbstractLevel } from "abstract-level"; export type LevelBatchOptions = { @@ -18,19 +18,24 @@ export interface SimpleLevel { get(key: string): Promise; put(key: string, value: Uint8Array); del(key): Promise; + sublevel(name: string): SimpleLevel; + clear(): Promise; + idle?(): Promise; } + export default class LazyLevel implements SimpleLevel { - _store: AbstractLevel; - _interval: any; - _txQueue?: AbstractBatchOperation< + private _store: AbstractLevel; + private _interval: any; + private _txQueue?: AbstractBatchOperation< AbstractLevel, string, Uint8Array >[]; - _tempStore?: Map; - _tempDeleted?: Set; - _txPromise?: Promise; - _opts?: LazyLevelOptions; + private _tempStore?: Map; + private _tempDeleted?: Set; + private _txPromise?: Promise; + private _opts?: LazyLevelOptions; + private _sublevels: LazyLevel[] = []; constructor( store: AbstractLevel, @@ -81,6 +86,7 @@ export default class LazyLevel implements SimpleLevel { this._tempStore?.clear(); this._tempDeleted?.clear(); } + await Promise.all(this._sublevels.map((l) => l.close())); if (this.status !== "closed" && this.status !== "closing") { await this._store.close(); @@ -186,28 +192,34 @@ export default class LazyLevel implements SimpleLevel { return ret; } - async deleteByPrefix(prefix: string): Promise { - const iterator = this._store.iterator({ - gte: prefix, - lte: prefix + "\xFF", - valueEncoding: "view", - }); - const keys: string[] = []; - for await (const [key, _value] of iterator) { - keys.push(key); - } + async clear(): Promise { + this._tempStore?.clear(); + this._tempDeleted?.clear(); + return this._store.clear(); + } - if (this._tempStore) { - for (const key of this._tempStore.keys()) { - if (key.startsWith(prefix)) { - keys.push(key); + /* async deleteByPrefix(prefix: string): Promise { + const iterator = this._store.iterator({ + gte: prefix, + lte: prefix + "\xFF", + valueEncoding: "view", + }); + const keys: string[] = []; + for await (const [key, _value] of iterator) { + keys.push(key); + } + + if (this._tempStore) { + for (const key of this._tempStore.keys()) { + if (key.startsWith(prefix)) { + keys.push(key); + } } } - } - return this.delAll(keys); - } + return this.delAll(keys); + } */ - set(key: string, value: Uint8Array) { + put(key: string, value: Uint8Array) { if (this._opts?.batch) { this._tempDeleted!.delete(key); this._tempStore!.set(key, value); @@ -221,10 +233,6 @@ export default class LazyLevel implements SimpleLevel { } } - put(key: string, value: Uint8Array) { - return this.set(key, value); - } - // Remove a value and key from the cache async del(key: string) { if (this._store.status !== "open") { @@ -261,6 +269,8 @@ export default class LazyLevel implements SimpleLevel { } sublevel(name: string) { - return new LazyLevel(this._store.sublevel(name), this._opts); + const l = new LazyLevel(this._store.sublevel(name), this._opts); + this._sublevels.push(l); + return l; } } diff --git a/packages/utils/logger/CHANGELOG.md b/packages/utils/logger/CHANGELOG.md index fefb0a926..7dd5f85da 100644 --- a/packages/utils/logger/CHANGELOG.md +++ b/packages/utils/logger/CHANGELOG.md @@ -7,7 +7,7 @@ * bump dependencies ([8a8fd44](https://github.com/dao-xyz/peerbit/commit/8a8fd440149a966337382db77afe1071141e5c74)) -## @dao-xyz/peerbit-logger [0.0.7](https://github.com/dao-xyz/peerbit/compare/@dao-xyz/peerbit-logger@0.0.6...@dao-xyz/peerbit-logger@0.0.7) (2023-06-07) +## @peerbit/logger [0.0.7](https://github.com/dao-xyz/peerbit/compare/@peerbit/logger@0.0.6...@peerbit/logger@0.0.7) (2023-06-07) ### Bug Fixes diff --git a/packages/utils/logger/package.json b/packages/utils/logger/package.json index 9bd9ad054..30819707e 100644 --- a/packages/utils/logger/package.json +++ b/packages/utils/logger/package.json @@ -1,5 +1,5 @@ { - "name": "@dao-xyz/peerbit-logger", + "name": "@peerbit/logger", "version": "1.0.0", "description": "Logging utils", "type": "module", diff --git a/packages/utils/test-utils/src/session.ts b/packages/utils/test-utils/src/session.ts deleted file mode 100644 index 09bb9698e..000000000 --- a/packages/utils/test-utils/src/session.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { - LSession as SSession, - LibP2POptions as SLibP2POptions, -} from "@dao-xyz/libp2p-test-utils"; -import { - CreateOptionsWithServices, - Libp2pExtended, - Libp2pExtendServices, -} from "@dao-xyz/peerbit-libp2p"; -import { waitForPeers as waitForPeersStreams } from "@dao-xyz/libp2p-direct-stream"; -import { CreateOptions } from "@dao-xyz/peerbit-libp2p"; -import { DirectBlock } from "@dao-xyz/libp2p-direct-block"; -import { DirectSub } from "@dao-xyz/libp2p-direct-sub"; - -export type LibP2POptions = SLibP2POptions; - -export class LSession { - private session: SSession; - constructor(session: SSession) { - this.session = session; - } - - public get peers(): Libp2pExtended[] { - return this.session.peers; - } - - async connect(groups?: Libp2pExtended[][]) { - await this.session.connect(groups); - return; - } - async stop() { - return this.session.stop(); - } - - static async connected(n: number, options?: CreateOptions) { - const session = await LSession.disconnected(n, options); - await session.connect(); - await waitForPeersStreams(...session.peers.map((x) => x.services.blocks)); - return session; - } - - static async disconnected(n: number, options?: CreateOptions) { - let optionsWithServices: CreateOptionsWithServices = { - ...options, - services: { - blocks: (c) => new DirectBlock(c), - pubsub: (c) => new DirectSub(c, { canRelayMessage: true }), - ...options?.services, - }, - }; - const session = await SSession.disconnected(n, optionsWithServices); - return new LSession(session); - } -} diff --git a/packages/utils/time/CHANGELOG.md b/packages/utils/time/CHANGELOG.md index 228f036f8..243a4a970 100644 --- a/packages/utils/time/CHANGELOG.md +++ b/packages/utils/time/CHANGELOG.md @@ -7,7 +7,7 @@ * bump dependencies ([8a8fd44](https://github.com/dao-xyz/peerbit/commit/8a8fd440149a966337382db77afe1071141e5c74)) -## @dao-xyz/peerbit-time [0.0.24](https://github.com/dao-xyz/peerbit/compare/@dao-xyz/peerbit-time@0.0.23...@dao-xyz/peerbit-time@0.0.24) (2023-06-07) +## @peerbit/time [0.0.24](https://github.com/dao-xyz/peerbit/compare/@peerbit/time@0.0.23...@peerbit/time@0.0.24) (2023-06-07) ### Bug Fixes diff --git a/packages/utils/time/package.json b/packages/utils/time/package.json index be0eac22a..00ea61ea8 100644 --- a/packages/utils/time/package.json +++ b/packages/utils/time/package.json @@ -1,5 +1,5 @@ { - "name": "@dao-xyz/peerbit-time", + "name": "@peerbit/time", "version": "1.0.0", "description": "Utility functions for time", "type": "module", diff --git a/packages/utils/time/src/index.ts b/packages/utils/time/src/index.ts index cb3c51acb..aad2a44cf 100644 --- a/packages/utils/time/src/index.ts +++ b/packages/utils/time/src/index.ts @@ -67,7 +67,7 @@ export const waitForResolved = async ( return; } try { - return fn(); + return await fn(); } catch (error: any) { lastError = error; } diff --git a/release-please-config.json b/release-please-config.json index fe56ec7c4..430f1fe08 100644 --- a/release-please-config.json +++ b/release-please-config.json @@ -4,11 +4,11 @@ "bump-patch-for-minor-pre-major": true, "plugins": ["node-workspace"], "packages": { - "packages/libp2p/direct-block": {}, - "packages/libp2p/direct-stream": {}, - "packages/libp2p/direct-sub": {}, - "packages/libp2p/libp2p-test-utils": {}, - "packages/libp2p/peerbit-libp2p": {}, + "packages/transport/direct-block": {}, + "packages/transport/direct-stream": {}, + "packages/transport/direct-sub": {}, + "packages/transport/libp2p-test-utils": {}, + "packages/transport/peerbit-libp2p": {}, "packages/log": {}, "packages/client": {}, "packages/server-node/node": {}, diff --git a/yarn.lock b/yarn.lock index fedfa497d..a06a31455 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2724,7 +2724,7 @@ "@libp2p/peer-collections" "^3.0.1" "@multiformats/multiaddr" "^12.0.0" -"@libp2p/interface-connection@^5.0.0", "@libp2p/interface-connection@^5.0.1", "@libp2p/interface-connection@^5.0.2": +"@libp2p/interface-connection@^5.0.0", "@libp2p/interface-connection@^5.0.1": version "5.1.0" resolved "https://registry.yarnpkg.com/@libp2p/interface-connection/-/interface-connection-5.1.0.tgz#dd5e5f5b0d0fec2b5b2324439f64209db910f21b" integrity sha512-KFjCnGvFVlu0hHS/O8NOsst32mIzUQEkRWq5EhOBehXjjpOJBcm8XQaqmhBlxVfHEYm7XQsztEtFumveszzm1A== @@ -2735,7 +2735,7 @@ it-stream-types "^2.0.1" uint8arraylist "^2.4.3" -"@libp2p/interface-connection@^5.1.1": +"@libp2p/interface-connection@^5.0.2", "@libp2p/interface-connection@^5.1.1": version "5.1.1" resolved "https://registry.yarnpkg.com/@libp2p/interface-connection/-/interface-connection-5.1.1.tgz#da0572c76da43629d52b8bec6cd092143fae421d" integrity sha512-ytknMbuuNW72LYMmTP7wFGP5ZTaUSGBCmV9f+uQ55XPcFHtKXLtKWVU/HE8IqPmwtyU8AO7veGoJ/qStMHNRVA== @@ -3085,10 +3085,10 @@ private-ip "^3.0.0" uint8arraylist "^2.3.2" -"@libp2p/webrtc@^2.0.4": - version "2.0.7" - resolved "https://registry.yarnpkg.com/@libp2p/webrtc/-/webrtc-2.0.7.tgz#f5931fbfd6ba285e648996948c9f7f0ee7f9b92b" - integrity sha512-i3BhTuOOEmMoLNt9SxXSVdutWc12qUHma19smlK3/qABDEDO8QOH8F0MTcQYR+v3lGLrs57txp7mZuJwQqNYEg== +"@libp2p/webrtc@2.0.11": + version "2.0.11" + resolved "https://registry.yarnpkg.com/@libp2p/webrtc/-/webrtc-2.0.11.tgz#e992d913d7078b28f4321f6f578564a37ddc31bb" + integrity sha512-6lhlndCYxRrkbqldUFruxIzyyFcrgnyueYIpLXJP2phZf2P19zwhborae0raRyeRz7MwJ+uw+Ksql8D8Ry+KXg== dependencies: "@chainsafe/libp2p-noise" "^12.0.0" "@libp2p/interface-connection" "^5.0.2" @@ -3109,15 +3109,16 @@ it-pipe "^3.0.1" it-pushable "^3.1.3" it-stream-types "^2.0.1" + it-to-buffer "^4.0.2" multiformats "^11.0.2" multihashes "^4.0.3" p-defer "^4.0.0" - p-event "^5.0.1" + p-event "^6.0.0" protons-runtime "^5.0.0" uint8arraylist "^2.4.3" uint8arrays "^4.0.3" -"@libp2p/websockets@^6.0.1": +"@libp2p/websockets@^6.0.3": version "6.0.3" resolved "https://registry.yarnpkg.com/@libp2p/websockets/-/websockets-6.0.3.tgz#28ce191442f2fd454608647ca00600efe6e796d5" integrity sha512-pwOr3iAbczWmmCg1nHnC2Dl0Ek81Y6LE8ptImiUbuZ08q1E/fTumM8pRNmrrsogSshG4lugebArIO9SNMylJZg== @@ -6995,6 +6996,13 @@ it-take@^3.0.1: resolved "https://registry.yarnpkg.com/it-take/-/it-take-3.0.2.tgz#ba947c6300a36556e223b4f5ab0bffba4b4fbbb1" integrity sha512-HgtnQYW45iV+lOJIk54dhKWNi+puAeutUehIWQE9tRkM91nlCn0abbDU2xG/FZV3cVnEG4hGwxOEImnMMKwhmg== +it-to-buffer@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/it-to-buffer/-/it-to-buffer-4.0.2.tgz#ad3ea5053fe915f54e0cd6548a2cf9366aa9f286" + integrity sha512-PCUk9Vn9E9qGYTvGuG9AFSzVflQHW4kRdo2X+c9mU+ZUXPt+szysqDFz46hswQmkYfPvP2xWK5C+q4RI21273g== + dependencies: + uint8arrays "^4.0.2" + it-ws@^6.0.0: version "6.0.1" resolved "https://registry.yarnpkg.com/it-ws/-/it-ws-6.0.1.tgz#a58d054df641093c08f0435ce69be3dae066d3c4" @@ -8551,12 +8559,12 @@ p-each-series@^3.0.0: resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-3.0.0.tgz#d1aed5e96ef29864c897367a7d2a628fdc960806" integrity sha512-lastgtAdoH9YaLyDa5i5z64q+kzOcQHsQ5SsZJD3q0VEyI8mq872S3geuNbRUQLVAE9siMfgKrpj7MloKFHruw== -p-event@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/p-event/-/p-event-5.0.1.tgz#614624ec02ae7f4f13d09a721c90586184af5b0c" - integrity sha512-dd589iCQ7m1L0bmC5NLlVYfy3TbBEsMUfWx9PyAgPeIcFZ/E2yaTZ4Rz4MiBmmJShviiftHVXOqfnfzJ6kyMrQ== +p-event@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/p-event/-/p-event-6.0.0.tgz#ebb53ff3563268849219d660f8eae1055cb51051" + integrity sha512-Xbfxd0CfZmHLGKXH32k1JKjQYX6Rkv0UtQdaFJ8OyNcf+c0oWCeXHc1C4CX/IESZLmcvfPa5aFIO/vCr5gqtag== dependencies: - p-timeout "^5.0.2" + p-timeout "^6.1.2" p-finally@^1.0.0: version "1.0.0" @@ -8680,6 +8688,11 @@ p-timeout@^6.0.0, p-timeout@^6.1.1: resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-6.1.1.tgz#bcee5e37d730f5474d973b6ff226751a1a5e6ff1" integrity sha512-yqz2Wi4fiFRpMmK0L2pGAU49naSUaP23fFIQL2Y6YT+qDGPoFwpvgQM/wzc6F8JoenUkIlAFa4Ql7NguXBxI7w== +p-timeout@^6.1.2: + version "6.1.2" + resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-6.1.2.tgz#22b8d8a78abf5e103030211c5fc6dee1166a6aa5" + integrity sha512-UbD77BuZ9Bc9aABo74gfXhNvzC9Tx7SxtHSh1fxvx3jTLLYvmVhiQZZrJzqqU0jKbN32kb5VOKiLEQI/3bIjgQ== + p-try@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3"