diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index e0ae4617..dace1a4c 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -16,21 +16,23 @@ jobs: run: | pnpm install --no-frozen-lockfile - build-example-canvas: + generate-matrix: runs-on: ubuntu-latest + outputs: + examples: ${{ steps.list-examples.outputs.examples }} steps: - uses: actions/checkout@v4 - - uses: pnpm/action-setup@v4 - with: - version: 9 - - shell: bash + - name: List examples + id: list-examples run: | - pnpm install --no-frozen-lockfile - cd examples/canvas - pnpm build + echo "examples=$(ls -d examples/*/ | xargs -n 1 basename | jq -R -s -c 'split("\n")[:-1]')" >> $GITHUB_OUTPUT - build-example-chat: + build-examples: + needs: generate-matrix runs-on: ubuntu-latest + strategy: + matrix: + example: ${{ fromJSON(needs.generate-matrix.outputs.examples) }} steps: - uses: actions/checkout@v4 - uses: pnpm/action-setup@v4 @@ -39,5 +41,5 @@ jobs: - shell: bash run: | pnpm install --no-frozen-lockfile - cd examples/chat + cd examples/${{ matrix.example }} pnpm build diff --git a/LICENSE b/LICENSE index 12ebf849..e90dc926 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2024 Topology Foundation +Copyright (c) 2024 Topology Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index e18ad6ca..ce23659d 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@

-

The TypeScript implementation of the Topology Protocol

+

The TypeScript implementation of Distributed Replicated Programs (DRPs)

@@ -17,34 +17,36 @@ [![X](https://img.shields.io/badge/X-000000)](https://x.com/topology_gg) [![Telegram](https://img.shields.io/badge/Telegram-24A1DE)](https://t.me/topologyfrens) [![Discord](https://img.shields.io/badge/Discord-7289da)](https://discord.gg/GUDGzBP5mn) +
# Overview -This is the official TypeScript implementation of the Topology Protocol. The Topology Protocol is a local-first decentralized protocol for real-time applications. It introduces a new concept for Conflict-free Replicated Objects (CRO), that are built on top of libp2p and composed of CRDTs. +This is the official TypeScript implementation of Distributed Replicated Programs (DRP). DRP is a local-first decentralized protocol for real-time applications. It is built on top of libp2p and with a similar design with CRDTs. # Specifications -The specifications of the Topology Protocol are shared across different client implementations and can be found in the [specs repository](https://github.com/topology-foundation/specs). Currently the specifications are starting to be written based on this implementation. +The specifications of DRP are shared across different client implementations and can be found in the [specs repository](https://github.com/topology-foundation/specs). Currently the specifications are starting to be written based on this implementation. # Packages This repository is a monorepo that contains the following packages: -| Package | Description | -|---------|--------------------------------------------------| -| crdt | CRDT implementations intended to use as builtins | -| network | Network middleware to abstract libp2p | -| node | Topology Node library and CLI | -| object | CRO objects structure implementation | +| Package | Description | +| ---------- | ----------------------------------------------- | +| blueprints | Blueprints of some DRPs that can be freely used | +| logger | Logger for the whole project | +| network | Network middleware to abstract libp2p | +| node | Node for interacting with DRPs library and CLI | +| object | DRP objects structure implementation | # Examples -All the examples are located in the `examples` directory. Currently, there is only one example, which is a simple canvas where you can paint pixels. You can also look into the [counter-splash](https://github.com/topology-foundation/counter-splash) (demo for EthCC 2024) repository for a more complex example. +All the examples are located in the `examples` directory. # Usage -This workspae has all packages and examples linked together, so you can run the following commands to start the development: +This workspace has all packages and examples linked together, so you can run the following commands to start the development: ```bash # pnpm diff --git a/biome.json b/biome.json index ae1e79f0..0bf72dbc 100644 --- a/biome.json +++ b/biome.json @@ -7,8 +7,7 @@ "**/doc/*", "**/*_pb.js", "**/*_pb.ts", - "**/bundle/*", - "**/package.json" + "**/bundle/*" ] }, "linter": { diff --git a/buf.gen.yaml b/buf.gen.yaml index ef940fe0..3834d003 100644 --- a/buf.gen.yaml +++ b/buf.gen.yaml @@ -12,9 +12,3 @@ plugins: out: . opt: - ts_proto_opt=esModuleInterop=true -inputs: - - directory: ./packages - exclude_paths: - - packages/node - - packages/network/node_modules - - packages/object/node_modules diff --git a/buf.yaml b/buf.yaml index 61b5f343..ecf35055 100644 --- a/buf.yaml +++ b/buf.yaml @@ -1,10 +1,10 @@ version: v2 modules: - path: packages/node/src/proto - name: buf.build/topology/node + name: buf.build/drp/node - path: packages/object/src/proto - name: buf.build/topology/object + name: buf.build/drp/object - path: packages/network/src/proto - name: buf.build/topology/network + name: buf.build/drp/network diff --git a/examples/canvas/index.html b/examples/canvas/index.html index 3211f75a..29e04918 100644 --- a/examples/canvas/index.html +++ b/examples/canvas/index.html @@ -4,7 +4,7 @@ - Topology - Canvas + DRP - Canvas diff --git a/examples/canvas/package.json b/examples/canvas/package.json index 366da3ef..54b687c6 100644 --- a/examples/canvas/package.json +++ b/examples/canvas/package.json @@ -1,29 +1,20 @@ { - "name": "ts-topology-examples-canvas", - "version": "0.3.1", - "license": "MIT", - "scripts": { - "build": "vite build", - "clean": "rm -rf dist/ node_modules/", - "dev": "vite serve", - "start": "ts-node ./src/index.ts" - }, - "dependencies": { - "@topology-foundation/blueprints": "0.3.1", - "@topology-foundation/network": "0.3.1", - "@topology-foundation/node": "0.3.1", - "@topology-foundation/object": "0.3.1", - "crypto-browserify": "^3.12.0", - "process": "^0.11.10", - "stream-browserify": "^3.0.0", - "ts-node": "^10.9.2", - "vm-browserify": "^1.1.2" - }, - "devDependencies": { - "@types/node": "^22.5.4", - "ts-loader": "^9.3.1", - "typescript": "^5.5.4", - "vite": "^6.0.0", - "vite-plugin-node-polyfills": "^0.22.0" - } + "name": "ts-drp-examples-canvas", + "version": "0.3.1", + "license": "MIT", + "scripts": { + "build": "vite build", + "clean": "rm -rf dist/ node_modules/", + "dev": "vite serve" + }, + "dependencies": { + "@ts-drp/node": "0.3.1", + "@ts-drp/object": "0.3.1" + }, + "devDependencies": { + "@types/node": "^22.5.4", + "typescript": "^5.5.4", + "vite": "^5.4.9", + "vite-plugin-node-polyfills": "^0.22.0" + } } diff --git a/examples/canvas/src/index.ts b/examples/canvas/src/index.ts index 4d2d4459..45d01419 100644 --- a/examples/canvas/src/index.ts +++ b/examples/canvas/src/index.ts @@ -1,10 +1,10 @@ -import { TopologyNode } from "@topology-foundation/node"; -import type { TopologyObject } from "@topology-foundation/object"; +import { DRPNode } from "@ts-drp/node"; +import type { DRPObject } from "@ts-drp/object"; import { Canvas } from "./objects/canvas"; -const node = new TopologyNode(); -let topologyObject: TopologyObject; -let canvasCRO: Canvas; +const node = new DRPNode(); +let drpObject: DRPObject; +let canvasDRP: Canvas; let peers: string[] = []; let discoveryPeers: string[] = []; let objectPeers: string[] = []; @@ -23,10 +23,10 @@ const render = () => { ); object_element.innerHTML = `[${objectPeers.join(", ")}]`; (document.getElementById("canvasId")).innerText = - topologyObject?.id; + drpObject?.id; - if (!canvasCRO) return; - const canvas = canvasCRO.canvas; + if (!canvasDRP) return; + const canvas = canvasDRP.canvas; for (let x = 0; x < canvas.length; x++) { for (let y = 0; y < canvas[x].length; y++) { const pixel = document.getElementById(`${x}-${y}`); @@ -45,19 +45,18 @@ function paint_pixel(pixel: HTMLDivElement) { random_int(256), random_int(256), ]; - canvasCRO.paint([x, y], painting); - const [r, g, b] = canvasCRO.pixel(x, y).color(); + canvasDRP.paint([x, y], painting); + const [r, g, b] = canvasDRP.pixel(x, y).color(); pixel.style.backgroundColor = `rgb(${r}, ${g}, ${b})`; } async function createConnectHandlers() { - node.addCustomGroupMessageHandler(topologyObject.id, (e) => { - if (topologyObject) - objectPeers = node.networkNode.getGroupPeers(topologyObject.id); + node.addCustomGroupMessageHandler(drpObject.id, (e) => { + if (drpObject) objectPeers = node.networkNode.getGroupPeers(drpObject.id); render(); }); - node.objectStore.subscribe(topologyObject.id, (_, _obj) => { + node.objectStore.subscribe(drpObject.id, (_, _obj) => { render(); }); } @@ -86,14 +85,14 @@ async function init() { node.addCustomGroupMessageHandler("", (e) => { peers = node.networkNode.getAllPeers(); - discoveryPeers = node.networkNode.getGroupPeers("topology::discovery"); + discoveryPeers = node.networkNode.getGroupPeers("drp::discovery"); render(); }); const create_button = document.getElementById("create"); create_button.addEventListener("click", async () => { - topologyObject = await node.createObject(new Canvas(5, 10)); - canvasCRO = topologyObject.cro as Canvas; + drpObject = await node.createObject(new Canvas(5, 10)); + canvasDRP = drpObject.drp as Canvas; createConnectHandlers(); render(); @@ -101,21 +100,21 @@ async function init() { const connect_button = document.getElementById("connect"); connect_button.addEventListener("click", async () => { - const croId = (document.getElementById("canvasIdInput")) + const drpId = (document.getElementById("canvasIdInput")) .value; try { - topologyObject = await node.createObject( + drpObject = await node.createObject( new Canvas(5, 10), - croId, + drpId, undefined, true, ); - canvasCRO = topologyObject.cro as Canvas; + canvasDRP = drpObject.drp as Canvas; createConnectHandlers(); render(); } catch (e) { - console.error("Error while connecting with CRO", croId, e); + console.error("Error while connecting with DRP", drpId, e); } }); } diff --git a/examples/canvas/src/objects/canvas.ts b/examples/canvas/src/objects/canvas.ts index 170dfbf3..1255a303 100644 --- a/examples/canvas/src/objects/canvas.ts +++ b/examples/canvas/src/objects/canvas.ts @@ -1,13 +1,13 @@ import { ActionType, - type CRO, + type DRP, type Operation, type ResolveConflictsType, SemanticsType, -} from "@topology-foundation/object"; +} from "@ts-drp/object"; import { Pixel } from "./pixel"; -export class Canvas implements CRO { +export class Canvas implements DRP { operations: string[] = ["splash", "paint"]; semanticsType: SemanticsType = SemanticsType.pair; diff --git a/examples/canvas/vite.config.mts b/examples/canvas/vite.config.mts index e3518486..7f0c5e4c 100644 --- a/examples/canvas/vite.config.mts +++ b/examples/canvas/vite.config.mts @@ -14,7 +14,7 @@ export default defineConfig({ }, resolve: { alias: { - "@topology-foundation": path.resolve(__dirname, "../../packages"), + "@ts-drp": path.resolve(__dirname, "../../packages"), }, }, }); diff --git a/examples/chat/README.md b/examples/chat/README.md index d6623dcc..c923d43c 100644 --- a/examples/chat/README.md +++ b/examples/chat/README.md @@ -1,27 +1,17 @@ -# Topology Protocol Example +# DRP Example -This is an example of Topology Protocol usage in a chat system where a user can create or connect to a chat room, send and read the messages sent in the group chat. +This is an example of a DRP usage in a chat system where a user can create or connect to a chat room, send and read the messages sent in the group chat. ## Specifics -Messages are represented as strings in the format (timestamp, content, senderId). Chat is a class which extends TopologyObject and has Gset\ as an attribute to store the list of messages. +Messages are represented as strings in the format (timestamp, content, senderId). Chat is a class which extends DRPObject and stores the list of messages. ## How to run locally After cloning the repository, run the following commands: ```bash -cd ts-topology/examples/chat -yarn -yarn build -yarn dev -``` - -Debugging is made easier by setting the mode in `webpack.config.js` to "development": - -```js -module.exports = { - mode: "development", - ... -} +cd ts-drp/examples/chat +pnpm i +pnpm dev ``` diff --git a/examples/chat/asconfig.json b/examples/chat/asconfig.json deleted file mode 100644 index 46e620da..00000000 --- a/examples/chat/asconfig.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "entries": ["./src/objects/chat.ts"], - "targets": { - "debug": { - "outFile": "dist/asc/debug.wasm", - "textFile": "dist/asc/debug.wat", - "sourceMap": true, - "debug": true - }, - "release": { - "outFile": "dist/asc/release.wasm", - "textFile": "dist/asc/release.wat", - "sourceMap": false, - "optimizeLevel": 3, - "shrinkLevel": 0, - "converge": false, - "noAssert": false - } - }, - "options": { - "lib": { - "@topology-foundation/crdt": [ - "./node_modules/@topology-foundation/blueprints/src/index.asc.ts" - ] - } - } -} diff --git a/examples/chat/index.html b/examples/chat/index.html index 51d899f1..44aa2b5c 100644 --- a/examples/chat/index.html +++ b/examples/chat/index.html @@ -3,11 +3,11 @@ - Topology - Chat + DRP - Chat
-

Topology Protocol - Chat

+

DRP - Chat

Current peer ID

Connected to

peers:

diff --git a/examples/chat/package.json b/examples/chat/package.json index ee77b075..48a1861f 100644 --- a/examples/chat/package.json +++ b/examples/chat/package.json @@ -1,35 +1,21 @@ { - "name": "topology-example-chat", - "version": "0.3.1", - "description": "Topology Protocol Chat Example", - "main": "src/index.ts", - "repository": "https://github.com/topology-foundation/ts-topology.git", - "license": "MIT", - "scripts": { - "asbuild": "asc --config asconfig.json --target release", - "build": "vite build", - "clean": "rm -rf dist/ node_modules/", - "dev": "vite serve", - "start": "ts-node ./src/index.ts" - }, - "dependencies": { - "@topology-foundation/blueprints": "0.3.1", - "@topology-foundation/network": "0.3.1", - "@topology-foundation/node": "0.3.1", - "@topology-foundation/object": "0.3.1", - "assemblyscript": "^0.27.29", - "crypto-browserify": "^3.12.0", - "process": "^0.11.10", - "stream-browserify": "^3.0.0", - "ts-node": "^10.9.2", - "uint8arrays": "^5.1.0", - "vm-browserify": "^1.1.2" - }, - "devDependencies": { - "@types/node": "^22.5.4", - "ts-loader": "^9.5.1", - "typescript": "^5.5.4", - "vite": "^6.0.0", - "vite-plugin-node-polyfills": "^0.22.0" - } + "name": "ts-drp-example-chat", + "version": "0.3.1", + "license": "MIT", + "scripts": { + "build": "vite build", + "clean": "rm -rf dist/ node_modules/", + "dev": "vite serve", + "start": "ts-node ./src/index.ts" + }, + "dependencies": { + "@ts-drp/node": "0.3.1", + "@ts-drp/object": "0.3.1" + }, + "devDependencies": { + "@types/node": "^22.5.4", + "typescript": "^5.5.4", + "vite": "^5.4.9", + "vite-plugin-node-polyfills": "^0.22.0" + } } diff --git a/examples/chat/src/index.ts b/examples/chat/src/index.ts index 50e6db6c..a2f6a951 100644 --- a/examples/chat/src/index.ts +++ b/examples/chat/src/index.ts @@ -1,19 +1,18 @@ -import { TopologyNode } from "@topology-foundation/node"; -import type { TopologyObject } from "@topology-foundation/object"; +import { DRPNode } from "@ts-drp/node"; +import type { DRPObject } from "@ts-drp/object"; import { Chat } from "./objects/chat"; -const node = new TopologyNode(); -// CRO = Conflict-free Replicated Object -let topologyObject: TopologyObject; -let chatCRO: Chat; +const node = new DRPNode(); +let drpObject: DRPObject; +let chatDRP: Chat; let peers: string[] = []; let discoveryPeers: string[] = []; let objectPeers: string[] = []; const render = () => { - if (topologyObject) + if (drpObject) (document.getElementById("chatId")).innerText = - topologyObject.id; + drpObject.id; const element_peerId = document.getElementById("peerId"); element_peerId.innerHTML = node.networkNode.peerId; @@ -30,8 +29,8 @@ const render = () => { ); element_objectPeers.innerHTML = `[${objectPeers.join(", ")}]`; - if (!chatCRO) return; - const chat = chatCRO.getMessages(); + if (!chatDRP) return; + const chat = chatDRP.getMessages(); const element_chat = document.getElementById("chat"); element_chat.innerHTML = ""; @@ -52,25 +51,24 @@ const render = () => { async function sendMessage(message: string) { const timestamp: string = Date.now().toString(); - if (!chatCRO) { - console.error("Chat CRO not initialized"); + if (!chatDRP) { + console.error("Chat DRP not initialized"); alert("Please create or join a chat room first"); return; } - chatCRO.addMessage(timestamp, message, node.networkNode.peerId); + chatDRP.addMessage(timestamp, message, node.networkNode.peerId); render(); } async function createConnectHandlers() { - node.addCustomGroupMessageHandler(topologyObject.id, (e) => { + node.addCustomGroupMessageHandler(drpObject.id, (e) => { // on create/connect - if (topologyObject) - objectPeers = node.networkNode.getGroupPeers(topologyObject.id); + if (drpObject) objectPeers = node.networkNode.getGroupPeers(drpObject.id); render(); }); - node.objectStore.subscribe(topologyObject.id, (_, _obj) => { + node.objectStore.subscribe(drpObject.id, (_, _obj) => { render(); }); } @@ -82,7 +80,7 @@ async function main() { // generic message handler node.addCustomGroupMessageHandler("", (e) => { peers = node.networkNode.getAllPeers(); - discoveryPeers = node.networkNode.getGroupPeers("topology::discovery"); + discoveryPeers = node.networkNode.getGroupPeers("drp::discovery"); render(); }); @@ -90,8 +88,8 @@ async function main() { document.getElementById("createRoom") ); button_create.addEventListener("click", async () => { - topologyObject = await node.createObject(new Chat()); - chatCRO = topologyObject.cro as Chat; + drpObject = await node.createObject(new Chat()); + chatDRP = drpObject.drp as Chat; createConnectHandlers(); render(); }); @@ -107,13 +105,8 @@ async function main() { return; } - topologyObject = await node.createObject( - new Chat(), - objectId, - undefined, - true, - ); - chatCRO = topologyObject.cro as Chat; + drpObject = await node.createObject(new Chat(), objectId, undefined, true); + chatDRP = drpObject.drp as Chat; createConnectHandlers(); render(); }); diff --git a/examples/chat/src/objects/chat.ts b/examples/chat/src/objects/chat.ts index 1f3238e9..19396962 100644 --- a/examples/chat/src/objects/chat.ts +++ b/examples/chat/src/objects/chat.ts @@ -1,13 +1,13 @@ import { ActionType, - type CRO, + type DRP, type Operation, type ResolveConflictsType, SemanticsType, type Vertex, -} from "@topology-foundation/object"; +} from "@ts-drp/object"; -export class Chat implements CRO { +export class Chat implements DRP { operations: string[] = ["addMessage"]; semanticsType: SemanticsType = SemanticsType.pair; // store messages as strings in the format (timestamp, message, nodeId) diff --git a/examples/chat/vite.config.mts b/examples/chat/vite.config.mts index 6696fa36..4ac66bfb 100644 --- a/examples/chat/vite.config.mts +++ b/examples/chat/vite.config.mts @@ -18,7 +18,7 @@ export default defineConfig({ }, resolve: { alias: { - "@topology-foundation": path.resolve(__dirname, "../../packages"), + "@ts-drp": path.resolve(__dirname, "../../packages"), }, }, }); diff --git a/examples/grid/README.md b/examples/grid/README.md index 0684a01f..9c75ded0 100644 --- a/examples/grid/README.md +++ b/examples/grid/README.md @@ -1,16 +1,17 @@ -# Topology Protocol Example +# DRP Example -This is an example that uses Topology Protocol to implement a 2D grid space where users appear to be circles and can move around the integer grid one grid at a time. +This is an example that uses a DRP to implement a 2D grid space where users appear to be circles and can move around the integer grid one grid at a time. ## Specifics -The Grid CRO has a mapping from user id (node id concacenated with a randomly assigned color string) to the user's position on the grid. The CRO leverages the underlying hash graph for conflict-free consistency. The mergeCallback function receives the linearised operations returned from the underlying hash graph, and recomputes the user-position mapping from those operations. +The Grid DRP has a mapping from user id (node id concacenated with a randomly assigned color string) to the user's position on the grid. The DRP leverages the underlying hash graph for conflict-free consistency. The mergeCallback function receives the linearised operations returned from the underlying hash graph, and recomputes the user-position mapping from those operations. ## How to run locally After cloning the repository, run the following commands: ```bash -cd ts-topology/examples/grid +cd ts-drp/examples/grid +pnpm i pnpm dev ``` diff --git a/examples/grid/asconfig.json b/examples/grid/asconfig.json deleted file mode 100644 index 5c4b430f..00000000 --- a/examples/grid/asconfig.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "entries": ["./src/objects/chat.ts"], - "targets": { - "debug": { - "outFile": "dist/asc/debug.wasm", - "textFile": "dist/asc/debug.wat", - "sourceMap": true, - "debug": true - }, - "release": { - "outFile": "dist/asc/release.wasm", - "textFile": "dist/asc/release.wat", - "sourceMap": false, - "optimizeLevel": 3, - "shrinkLevel": 0, - "converge": false, - "noAssert": false - } - }, - "options": { - "lib": { - "@topology-foundation/blueprints": [ - "../node_modules/@topology-foundation/blueprints/src/index.asc.ts" - ] - } - } -} diff --git a/examples/grid/index.html b/examples/grid/index.html index c43df353..7cb2c8b3 100644 --- a/examples/grid/index.html +++ b/examples/grid/index.html @@ -3,25 +3,25 @@ - Topology - Grid + DRP - Grid
-

A 2D grid made with CRO

+

A 2D grid made with DRP

Your Peer ID:

Peers on dRAM:

Discovery Peers:

- + | - - + +

- Connected to Grid CRO ID: + Connected to Grid DRP ID:

-

Peers in CRO:

+

Peers in DRP:

{ }; const render = () => { - if (topologyObject) { + if (drpObject) { const gridIdElement = document.getElementById("gridId"); - gridIdElement.innerText = topologyObject.id; + gridIdElement.innerText = drpObject.id; const copyGridIdButton = document.getElementById("copyGridId"); if (copyGridIdButton) { copyGridIdButton.style.display = "inline"; // Show the button @@ -75,8 +75,8 @@ const render = () => { ); element_objectPeers.innerHTML = `[${objectPeers.map((peer) => `${formatNodeId(peer)}`).join(", ")}]`; - if (!gridCRO) return; - const users = gridCRO.getUsers(); + if (!gridDRP) return; + const users = gridDRP.getUsers(); const element_grid = document.getElementById("grid"); element_grid.innerHTML = ""; @@ -113,7 +113,7 @@ const render = () => { for (const userColorString of users) { const [id, color] = userColorString.split(":"); - const position = gridCRO.getUserPosition(userColorString); + const position = gridDRP.getUserPosition(userColorString); if (position) { const div = document.createElement("div"); @@ -165,13 +165,13 @@ function hexToRgba(hex: string, alpha: number) { } async function addUser() { - if (!gridCRO) { - console.error("Grid CRO not initialized"); + if (!gridDRP) { + console.error("Grid DRP not initialized"); alert("Please create or join a grid first"); return; } - gridCRO.addUser( + gridDRP.addUser( node.networkNode.peerId, getColorForNodeId(node.networkNode.peerId), ); @@ -179,24 +179,23 @@ async function addUser() { } async function moveUser(direction: string) { - if (!gridCRO) { - console.error("Grid CRO not initialized"); + if (!gridDRP) { + console.error("Grid DRP not initialized"); alert("Please create or join a grid first"); return; } - gridCRO.moveUser(node.networkNode.peerId, direction); + gridDRP.moveUser(node.networkNode.peerId, direction); render(); } async function createConnectHandlers() { - node.addCustomGroupMessageHandler(topologyObject.id, (e) => { - if (topologyObject) - objectPeers = node.networkNode.getGroupPeers(topologyObject.id); + node.addCustomGroupMessageHandler(drpObject.id, (e) => { + if (drpObject) objectPeers = node.networkNode.getGroupPeers(drpObject.id); render(); }); - node.objectStore.subscribe(topologyObject.id, (_, obj) => { + node.objectStore.subscribe(drpObject.id, (_, obj) => { render(); }); } @@ -207,7 +206,7 @@ async function main() { node.addCustomGroupMessageHandler("", (e) => { peers = node.networkNode.getAllPeers(); - discoveryPeers = node.networkNode.getGroupPeers("topology::discovery"); + discoveryPeers = node.networkNode.getGroupPeers("drp::discovery"); render(); }); @@ -215,8 +214,8 @@ async function main() { document.getElementById("createGrid") ); button_create.addEventListener("click", async () => { - topologyObject = await node.createObject(new Grid()); - gridCRO = topologyObject.cro as Grid; + drpObject = await node.createObject(new Grid()); + gridDRP = drpObject.drp as Grid; createConnectHandlers(); await addUser(); render(); @@ -224,22 +223,17 @@ async function main() { const button_connect = document.getElementById("joinGrid"); button_connect.addEventListener("click", async () => { - const croId = (document.getElementById("gridInput")) + const drpId = (document.getElementById("gridInput")) .value; try { - topologyObject = await node.createObject( - new Grid(), - croId, - undefined, - true, - ); - gridCRO = topologyObject.cro as Grid; + drpObject = await node.createObject(new Grid(), drpId, undefined, true); + gridDRP = drpObject.drp as Grid; createConnectHandlers(); await addUser(); render(); - console.log("Succeeded in connecting with CRO", croId); + console.log("Succeeded in connecting with DRP", drpId); } catch (e) { - console.error("Error while connecting with CRO", croId, e); + console.error("Error while connecting with DRP", drpId, e); } }); @@ -257,8 +251,7 @@ async function main() { navigator.clipboard .writeText(gridIdText) .then(() => { - // alert("Grid CRO ID copied to clipboard!"); - console.log("Grid CRO ID copied to clipboard"); + console.log("Grid DRP ID copied to clipboard"); }) .catch((err) => { console.error("Failed to copy: ", err); diff --git a/examples/grid/src/objects/grid.ts b/examples/grid/src/objects/grid.ts index 70e9f286..09e89454 100644 --- a/examples/grid/src/objects/grid.ts +++ b/examples/grid/src/objects/grid.ts @@ -1,13 +1,13 @@ import { ActionType, - type CRO, + type DRP, type Operation, type ResolveConflictsType, SemanticsType, type Vertex, -} from "@topology-foundation/object"; +} from "@ts-drp/object"; -export class Grid implements CRO { +export class Grid implements DRP { operations: string[] = ["addUser", "moveUser"]; semanticsType: SemanticsType = SemanticsType.pair; positions: Map; diff --git a/examples/grid/vite.config.mts b/examples/grid/vite.config.mts index e3518486..7f0c5e4c 100644 --- a/examples/grid/vite.config.mts +++ b/examples/grid/vite.config.mts @@ -14,7 +14,7 @@ export default defineConfig({ }, resolve: { alias: { - "@topology-foundation": path.resolve(__dirname, "../../packages"), + "@ts-drp": path.resolve(__dirname, "../../packages"), }, }, }); diff --git a/examples/local-bootstrap/README.md b/examples/local-bootstrap/README.md index b4882cfb..bb9ba3b2 100644 --- a/examples/local-bootstrap/README.md +++ b/examples/local-bootstrap/README.md @@ -1,29 +1,16 @@ -# Topology Protocol Example +# DRP Example -This is an example of Topology Protocol usage in a local environment after a user has run a custom bootstrap node and tries to connect it and test the chat room system. +This is an example of DRP usage in a local environment after a user has run a custom bootstrap node and tries to connect it. ## How to run locally After cloning the repository, run the following commands: ```bash -cd ts-topology/examples/local-env/chat -yarn -yarn build -yarn dev +cd ts-drp/examples/local-bootstrap +pnpm i +pnpm dev ``` - In your browser, open the URL displayed in the terminal. You will see a form to connect to the bootstrap node. Copy the `peerId` from the terminal where you started the node and paste it in the form. Click "Connect". By default, the bootstrap node is running on `127.0.0.1:50000` using `ws` but you can change these values and connect to your node. - - -Debugging is made easier by setting the mode in `webpack.config.js` to "development": - -```js -module.exports = { - mode: "development", - ... -} -``` - diff --git a/examples/local-bootstrap/asconfig.json b/examples/local-bootstrap/asconfig.json deleted file mode 100644 index 46e620da..00000000 --- a/examples/local-bootstrap/asconfig.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "entries": ["./src/objects/chat.ts"], - "targets": { - "debug": { - "outFile": "dist/asc/debug.wasm", - "textFile": "dist/asc/debug.wat", - "sourceMap": true, - "debug": true - }, - "release": { - "outFile": "dist/asc/release.wasm", - "textFile": "dist/asc/release.wat", - "sourceMap": false, - "optimizeLevel": 3, - "shrinkLevel": 0, - "converge": false, - "noAssert": false - } - }, - "options": { - "lib": { - "@topology-foundation/crdt": [ - "./node_modules/@topology-foundation/blueprints/src/index.asc.ts" - ] - } - } -} diff --git a/examples/local-bootstrap/index.html b/examples/local-bootstrap/index.html index 887b6c52..459794db 100644 --- a/examples/local-bootstrap/index.html +++ b/examples/local-bootstrap/index.html @@ -3,11 +3,11 @@ - Topology - Local env + DRP - Local env
-

Topology Protocol - Local bootstrap connect

+

DRP - Local bootstrap connect

Test the connection to a boostrap node and connect your local peers.

diff --git a/examples/local-bootstrap/package.json b/examples/local-bootstrap/package.json index 23ba3560..5d606958 100644 --- a/examples/local-bootstrap/package.json +++ b/examples/local-bootstrap/package.json @@ -1,35 +1,19 @@ { - "name": "topology-example-localdev", - "version": "0.3.1", - "description": "Topology Protocol Local Dev Example", - "main": "src/index.ts", - "repository": "https://github.com/topology-foundation/ts-topology.git", - "license": "MIT", - "scripts": { - "asbuild": "asc --config asconfig.json --target release", - "build": "vite build", - "clean": "rm -rf dist/ node_modules/", - "dev": "vite serve", - "start": "ts-node ./src/index.ts" - }, - "dependencies": { - "@topology-foundation/blueprints": "0.3.1", - "@topology-foundation/network": "0.3.1", - "@topology-foundation/node": "0.3.1", - "@topology-foundation/object": "0.3.1", - "assemblyscript": "^0.27.29", - "crypto-browserify": "^3.12.0", - "process": "^0.11.10", - "stream-browserify": "^3.0.0", - "ts-node": "^10.9.2", - "uint8arrays": "^5.1.0", - "vm-browserify": "^1.1.2" - }, - "devDependencies": { - "@types/node": "^22.5.4", - "ts-loader": "^9.5.1", - "typescript": "^5.5.4", - "vite": "^6.0.0", - "vite-plugin-node-polyfills": "^0.22.0" - } + "name": "ts-drp-example-localdev", + "version": "0.3.1", + "license": "MIT", + "scripts": { + "build": "vite build", + "clean": "rm -rf dist/ node_modules/", + "dev": "vite serve" + }, + "dependencies": { + "@ts-drp/node": "0.3.1" + }, + "devDependencies": { + "@types/node": "^22.5.4", + "typescript": "^5.5.4", + "vite": "^5.4.6", + "vite-plugin-node-polyfills": "^0.22.0" + } } diff --git a/examples/local-bootstrap/src/index.ts b/examples/local-bootstrap/src/index.ts index 0e96958a..c7c6bf35 100644 --- a/examples/local-bootstrap/src/index.ts +++ b/examples/local-bootstrap/src/index.ts @@ -1,7 +1,4 @@ -import { - TopologyNode, - type TopologyNodeConfig, -} from "@topology-foundation/node"; +import { DRPNode } from "@ts-drp/node"; const local_peer_id = "12D3KooWC6sm9iwmYbeQJCJipKTRghmABNz1wnpJANvSMabvecwJ"; // This is the IP of the local bootstrap node, replace it with the IP of the local node @@ -9,12 +6,12 @@ const local_bootstrap_peer_ip = "127.0.0.1"; if (!local_peer_id) { console.error( - "topology::network::start::bootstrap: Set local_peer_id in `/examples/local-bootstrap/src/index.ts` file with the peer id of the local bootstrap node", + "Set local_peer_id in `/examples/local-bootstrap/src/index.ts` file with the peer id of the local bootstrap node", ); process.exit(1); } -let node: TopologyNode; +let node: DRPNode; let peers: string[] = []; const render = () => { @@ -25,7 +22,7 @@ const render = () => { element_peers.innerHTML = `[${peers.join(", ")}]`; }; -async function initTopologyNode() { +async function initDRPNode() { if (node) { node.addCustomGroupMessageHandler("", (e) => { peers = node.networkNode.getAllPeers(); @@ -92,7 +89,7 @@ async function main() { document.getElementById("fieldset_connect_bootstrap_node") ); try { - node = new TopologyNode({ + node = new DRPNode({ network_config: { bootstrap_peers: [ `/${select_address_type.value}/${bootstrap_node_addr.value}/tcp/${bootstrap_node_port.value}/${ws_protocl}/p2p/${bootstrap_node_peer_id.value}`, @@ -103,7 +100,7 @@ async function main() { await node.start(); field_set.style.backgroundColor = "rgba(0, 255, 0, 0.2)"; - initTopologyNode(); + initDRPNode(); render(); } catch (e) { field_set.style.backgroundColor = "rgba(255, 0, 0, 0.2)"; diff --git a/examples/local-bootstrap/vite.config.mts b/examples/local-bootstrap/vite.config.mts index 6696fa36..7f0c5e4c 100644 --- a/examples/local-bootstrap/vite.config.mts +++ b/examples/local-bootstrap/vite.config.mts @@ -6,11 +6,7 @@ export default defineConfig({ build: { target: "esnext", }, - plugins: [ - nodePolyfills({ - overrides: {}, - }), - ], + plugins: [nodePolyfills()], optimizeDeps: { esbuildOptions: { target: "esnext", @@ -18,7 +14,7 @@ export default defineConfig({ }, resolve: { alias: { - "@topology-foundation": path.resolve(__dirname, "../../packages"), + "@ts-drp": path.resolve(__dirname, "../../packages"), }, }, }); diff --git a/package.json b/package.json index 06fea668..5e55f991 100644 --- a/package.json +++ b/package.json @@ -1,58 +1,55 @@ { - "name": "ts-topology", - "description": "The official TypeScript implementation of Topology Protocol", - "version": "0.3.1", - "license": "MIT", - "homepage": "https://topology.gg/", - "repository": { - "type": "git", - "url": "git+https://github.com/topology-foundation/ts-topology.git" - }, - "bugs": { - "url": "https://github.com/topology-foundation/ts-topology/issues" - }, - "workspaces": [ - "packages/*", - "examples/*" - ], - "scripts": { - "bench": "vitest bench", - "biome-check": "biome check", - "clean": "pnpm --filter '@topology-foundation/*' clean", - "docs": "typedoc", - "postinstall": "pnpm --filter '@topology-foundation/*' build", - "proto-gen": "pnpm proto-gen:object && pnpm proto-gen:network", - "proto-gen:object": "buf generate packages/object/src/proto -o packages/object/src/proto", - "proto-gen:network": "buf generate packages/network/src/proto -o packages/network/src/proto", - "release": "release-it", - "test": "vitest" - }, - "devDependencies": { - "@biomejs/biome": "^1.8.3", - "@release-it-plugins/workspaces": "^4.2.0", - "@types/node": "^22.5.4", - "assemblyscript": "^0.27.29", - "release-it": "^17.6.0", - "ts-proto": "^2.2.4", - "typedoc": "^0.26.6", - "typescript": "^5.5.4", - "vite": "^6.0.0", - "vite-tsconfig-paths": "^5.0.1", - "vitest": "^2.1.1" - }, - "private": true, - "release-it": { - "plugins": { - "@release-it-plugins/workspaces": { - "publish": false - } - }, - "npm": false, - "git": { - "commitMessage": "chore: release v${version}" - }, - "github": { - "release": true - } - } + "name": "ts-drp", + "description": "The official TypeScript implementation of DRP protocol", + "version": "0.3.1", + "license": "MIT", + "homepage": "https://topology.gg/", + "repository": { + "type": "git", + "url": "git+https://github.com/topology-foundation/ts-drp.git" + }, + "bugs": { + "url": "https://github.com/topology-foundation/ts-drp/issues" + }, + "workspaces": ["packages/*", "examples/*"], + "scripts": { + "bench": "vitest bench", + "biome-check": "biome check", + "clean": "pnpm --filter '@ts-drp/*' clean && rm -r node_modules/ docs/", + "docs": "typedoc", + "postinstall": "pnpm --filter '@ts-drp/*' build", + "proto-gen": "pnpm proto-gen:object && pnpm proto-gen:network", + "proto-gen:object": "buf generate packages/object/src/proto -o packages/object/src/proto", + "proto-gen:network": "buf generate packages/network/src/proto -o packages/network/src/proto", + "release": "release-it", + "test": "vitest" + }, + "devDependencies": { + "@biomejs/biome": "^1.8.3", + "@release-it-plugins/workspaces": "^4.2.0", + "@types/node": "^22.5.4", + "assemblyscript": "^0.27.29", + "release-it": "^17.6.0", + "ts-proto": "^2.2.4", + "typedoc": "^0.26.6", + "typescript": "^5.5.4", + "vite": "^5.4.9", + "vite-tsconfig-paths": "^5.0.1", + "vitest": "^2.1.1" + }, + "private": true, + "release-it": { + "plugins": { + "@release-it-plugins/workspaces": { + "publish": false + } + }, + "npm": false, + "git": { + "commitMessage": "chore: release v${version}" + }, + "github": { + "release": true + } + } } diff --git a/packages/blueprints/README.md b/packages/blueprints/README.md index 96cf49e9..69d2b36c 100644 --- a/packages/blueprints/README.md +++ b/packages/blueprints/README.md @@ -1,17 +1,13 @@ -# Topology Blueprints +# DRP Blueprints -This package contains the CRO blueprints intended to be used by other CROs. +This package contains the DRP blueprints intended to be used by other DRPs. ## Usage -This package is intended to be used as a dependency for the Topology Protocol. However, you can use it as a standalone package. For that, you can install it using: +You can use it as a standalone package. For that, you can install it using: ```bash -# yarn -yarn add @topology-foundation/blueprints - -# npm -npm install @topology-foundation/blueprints +pnpm install @ts-drp/blueprints ``` ### Build @@ -19,7 +15,7 @@ npm install @topology-foundation/blueprints To build the package, you can run: ```bash -yarn build +pnpm build ``` ### Tests @@ -27,5 +23,5 @@ yarn build To run the tests, you can run: ```bash -yarn test +pnpm test ``` diff --git a/packages/blueprints/asconfig.json b/packages/blueprints/asconfig.json deleted file mode 100644 index 42582929..00000000 --- a/packages/blueprints/asconfig.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "entries": ["./src/index.asc.ts"], - "targets": { - "debug": { - "outFile": "dist/asc/debug.wasm", - "textFile": "dist/asc/debug.wat", - "sourceMap": true, - "debug": true - }, - "release": { - "outFile": "dist/asc/release.wasm", - "textFile": "dist/asc/release.wat", - "sourceMap": true, - "optimizeLevel": 3, - "shrinkLevel": 0, - "converge": false, - "noAssert": false - } - }, - "options": { - "bindings": "esm", - "disableWarning": [235] - } -} diff --git a/packages/blueprints/package.json b/packages/blueprints/package.json index 625f64c6..42f36bee 100644 --- a/packages/blueprints/package.json +++ b/packages/blueprints/package.json @@ -1,43 +1,30 @@ { - "name": "@topology-foundation/blueprints", - "version": "0.3.1", - "license": "MIT", - "repository": { - "type": "git", - "url": "git+https://github.com/topology-foundation/ts-topology.git" - }, - "type": "module", - "types": "./dist/src/index.d.ts", - "files": [ - "src", - "dist", - "!dist/test", - "!**/*.tsbuildinfo" - ], - "exports": { - ".": { - "types": "./dist/src/index.d.ts", - "import": "./dist/src/index.js" - }, - "./wasm": { - "types": "./dist/src/index.d.ts", - "import": "./src/index.asc.ts" - } - }, - "scripts": { - "asbuild": "yarn asbuild:debug && yarn asbuild:release", - "asbuild:debug": "asc --config asconfig.json --target debug", - "asbuild:release": "asc --config asconfig.json --target release", - "build": "tsc -b", - "clean": "rm -rf dist/ node_modules/", - "prepack": "tsc -b", - "test": "vitest" - }, - "devDependencies": { - "@topology-foundation/object": "0.3.1", - "assemblyscript": "^0.27.29" - }, - "dependencies": { - "@thi.ng/random": "^4.1.0" - } + "name": "@ts-drp/blueprints", + "version": "0.3.1", + "license": "MIT", + "repository": { + "type": "git", + "url": "git+https://github.com/topology-foundation/ts-drp.git" + }, + "type": "module", + "types": "./dist/src/index.d.ts", + "files": ["src", "dist", "!dist/test", "!**/*.tsbuildinfo"], + "exports": { + ".": { + "types": "./dist/src/index.d.ts", + "import": "./dist/src/index.js" + } + }, + "scripts": { + "build": "tsc -b", + "clean": "rm -rf dist/ node_modules/", + "prepack": "tsc -b", + "test": "vitest" + }, + "devDependencies": { + "@ts-drp/object": "0.3.1" + }, + "dependencies": { + "@thi.ng/random": "^4.1.0" + } } diff --git a/packages/blueprints/src/AddWinsSet/index.ts b/packages/blueprints/src/AddWinsSet/index.ts index 10dcc93a..cb8b31ea 100644 --- a/packages/blueprints/src/AddWinsSet/index.ts +++ b/packages/blueprints/src/AddWinsSet/index.ts @@ -1,13 +1,13 @@ import { ActionType, - type CRO, + type DRP, type Operation, type ResolveConflictsType, SemanticsType, type Vertex, -} from "@topology-foundation/object"; +} from "@ts-drp/object"; -export class AddWinsSet implements CRO { +export class AddWinsSet implements DRP { operations: string[] = ["add", "remove"]; state: Map; semanticsType = SemanticsType.pair; diff --git a/packages/blueprints/src/PseudoRandomWinsSet/index.ts b/packages/blueprints/src/PseudoRandomWinsSet/index.ts index 76349ff9..de3d1f9d 100644 --- a/packages/blueprints/src/PseudoRandomWinsSet/index.ts +++ b/packages/blueprints/src/PseudoRandomWinsSet/index.ts @@ -1,13 +1,13 @@ import { Smush32 } from "@thi.ng/random"; import { ActionType, - type CRO, + type DRP, type Hash, type Operation, type ResolveConflictsType, SemanticsType, type Vertex, -} from "@topology-foundation/object"; +} from "@ts-drp/object"; const MOD = 1e9 + 9; @@ -21,12 +21,12 @@ function computeHash(s: string): number { return hash; } -/* +/* Example implementation of multi-vertex semantics that uses the reduce action type. An arbitrary number of concurrent operations can be reduced to a single operation. The winning operation is chosen using a pseudo-random number generator. */ -export class PseudoRandomWinsSet implements CRO { +export class PseudoRandomWinsSet implements DRP { operations: string[] = ["add", "remove"]; state: Map; semanticsType = SemanticsType.multiple; diff --git a/packages/blueprints/src/index.asc.ts b/packages/blueprints/src/index.asc.ts deleted file mode 100644 index 8555077c..00000000 --- a/packages/blueprints/src/index.asc.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from "./AddWinsSet/index.js"; -export * from "./PseudoRandomWinsSet/index.js"; diff --git a/packages/blueprints/tests/AddWinsSet.test.ts b/packages/blueprints/tests/AddWinsSet.test.ts index cdd3485f..17839831 100644 --- a/packages/blueprints/tests/AddWinsSet.test.ts +++ b/packages/blueprints/tests/AddWinsSet.test.ts @@ -2,34 +2,34 @@ import { beforeEach, describe, expect, test } from "vitest"; import { AddWinsSet } from "../src/AddWinsSet/index.js"; describe("HashGraph for AddWinSet tests", () => { - let cro: AddWinsSet; + let drp: AddWinsSet; beforeEach(() => { - cro = new AddWinsSet(); + drp = new AddWinsSet(); }); test("Test: Add", () => { - cro.add(1); - let set = cro.values(); + drp.add(1); + let set = drp.values(); expect(set).toEqual([1]); - cro.add(2); - set = cro.values(); + drp.add(2); + set = drp.values(); expect(set).toEqual([1, 2]); }); test("Test: Add and Remove", () => { - cro.add(1); - let set = cro.values(); + drp.add(1); + let set = drp.values(); expect(set).toEqual([1]); - cro.add(2); - set = cro.values(); + drp.add(2); + set = drp.values(); expect(set).toEqual([1, 2]); - cro.remove(1); - set = cro.values(); - expect(cro.contains(1)).toBe(false); + drp.remove(1); + set = drp.values(); + expect(drp.contains(1)).toBe(false); expect(set).toEqual([2]); }); }); diff --git a/packages/blueprints/tests/PseudoRandomWinsSet.test.ts b/packages/blueprints/tests/PseudoRandomWinsSet.test.ts index d5f96af8..3616baab 100644 --- a/packages/blueprints/tests/PseudoRandomWinsSet.test.ts +++ b/packages/blueprints/tests/PseudoRandomWinsSet.test.ts @@ -2,34 +2,34 @@ import { beforeEach, describe, expect, test } from "vitest"; import { PseudoRandomWinsSet } from "../src/PseudoRandomWinsSet/index.js"; describe("HashGraph for PseudoRandomWinsSet tests", () => { - let cro: PseudoRandomWinsSet; + let drp: PseudoRandomWinsSet; beforeEach(() => { - cro = new PseudoRandomWinsSet(); + drp = new PseudoRandomWinsSet(); }); test("Test: Add", () => { - cro.add(1); - let set = cro.values(); + drp.add(1); + let set = drp.values(); expect(set).toEqual([1]); - cro.add(2); - set = cro.values(); + drp.add(2); + set = drp.values(); expect(set).toEqual([1, 2]); }); test("Test: Add and Remove", () => { - cro.add(1); - let set = cro.values(); + drp.add(1); + let set = drp.values(); expect(set).toEqual([1]); - cro.add(2); - set = cro.values(); + drp.add(2); + set = drp.values(); expect(set).toEqual([1, 2]); - cro.remove(1); - set = cro.values(); - expect(cro.contains(1)).toBe(false); + drp.remove(1); + set = drp.values(); + expect(drp.contains(1)).toBe(false); expect(set).toEqual([2]); }); }); diff --git a/packages/logger/README.md b/packages/logger/README.md index fe1439e4..111b3de0 100644 --- a/packages/logger/README.md +++ b/packages/logger/README.md @@ -1,17 +1,13 @@ -# Topology Logger +# DRP Logger This package makes it easy to log messages in a structured way. ## Usage -This package is intended to be used as a dependency for the Topology Protocol. However, you can use it as a standalone package. For that, you can install it using: +You can use it as a standalone package. For that, you can install it using: ```bash -# yarn -yarn add @topology-foundation/logger - -# npm -npm install @topology-foundation/logger +pnpm install @ts-drp/logger ``` ### Build @@ -19,13 +15,5 @@ npm install @topology-foundation/logger To build the package, you can run: ```bash -yarn build -``` - -### Tests - -To run the tests, you can run: - -```bash -yarn test +pnpm build ``` diff --git a/packages/logger/package.json b/packages/logger/package.json index 92e36863..dcc7c9a7 100644 --- a/packages/logger/package.json +++ b/packages/logger/package.json @@ -1,33 +1,27 @@ { - "name": "@topology-foundation/logger", - "version": "0.3.1", - "license": "MIT", - "repository": { - "type": "git", - "url": "git+https://github.com/topology-foundation/ts-topology.git" - }, - "type": "module", - "types": "./dist/src/index.d.ts", - "files": [ - "src", - "dist", - "!dist/test", - "!**/*.tsbuildinfo" - ], - "exports": { - ".": { - "types": "./dist/src/index.d.ts", - "import": "./dist/src/index.js" - } - }, - "scripts": { - "build": "tsc -b", - "clean": "rm -rf dist/ node_modules/", - "prepack": "tsc -b", - "test": "vitest" - }, - "dependencies": { - "loglevel": "^1.9.2", - "loglevel-plugin-prefix": "^0.8.4" - } + "name": "@ts-drp/logger", + "version": "0.3.1", + "license": "MIT", + "repository": { + "type": "git", + "url": "git+https://github.com/topology-foundation/ts-drp.git" + }, + "type": "module", + "types": "./dist/src/index.d.ts", + "files": ["src", "dist", "!dist/test", "!**/*.tsbuildinfo"], + "exports": { + ".": { + "types": "./dist/src/index.d.ts", + "import": "./dist/src/index.js" + } + }, + "scripts": { + "build": "tsc -b", + "clean": "rm -rf dist/ node_modules/", + "prepack": "tsc -b" + }, + "dependencies": { + "loglevel": "^1.9.2", + "loglevel-plugin-prefix": "^0.8.4" + } } diff --git a/packages/network/README.md b/packages/network/README.md index 5963c4f1..670bb72d 100644 --- a/packages/network/README.md +++ b/packages/network/README.md @@ -1,19 +1,15 @@ -# Topology Network Stack +# DRP Network Stack -This package contains the network middleware to abstract libp2p for the Topology Protocol. +This package contains the network middleware to abstract libp2p for the DRP protocol. -To do so, we define a `TopologyNetworkNode` where we can pass the configs that we want and it "magically" configures libp2p and gives connectivity to the Topology Network. +To do so, we define a `DRPNetworkNode` where we can pass the configs that we want and it "magically" configures libp2p and gives connectivity to the DRP Network. ## Usage -This package is intended to be used as a dependency for the Topology Protocol. However, you can use it as a standalone package. For that, you can install it using: +This package is intended to be used as a dependency for the DRP protocol. However, you can use it as a standalone package. For that, you can install it using: ```bash -# yarn -yarn add @topology-foundation/network - -# npm -npm install @topology-foundation/network +pnpm install @ts-drp/network ``` ### Build @@ -21,7 +17,7 @@ npm install @topology-foundation/network To build the package, you can run: ```bash -yarn build +pnpm build ``` ### Tests @@ -29,5 +25,5 @@ yarn build To run the tests, you can run: ```bash -yarn test +pnpm test ``` diff --git a/packages/network/package.json b/packages/network/package.json index a1e616da..d7b6a036 100644 --- a/packages/network/package.json +++ b/packages/network/package.json @@ -1,60 +1,51 @@ { - "name": "@topology-foundation/network", - "version": "0.3.1", - "license": "MIT", - "repository": { - "type": "git", - "url": "git+https://github.com/topology-foundation/ts-topology.git" - }, - "type": "module", - "types": "./dist/src/index.d.ts", - "files": [ - "src", - "dist", - "!dist/test", - "!**/*.tsbuildinfo" - ], - "exports": { - ".": { - "types": "./dist/src/index.d.ts", - "import": "./dist/src/index.js" - } - }, - "scripts": { - "build": "tsc -b", - "clean": "rm -rf dist/ node_modules/", - "prepack": "tsc -b", - "test": "vitest" - }, - "devDependencies": { - "@libp2p/interface": "^2.1.3", - "react-native-webrtc": "^124.0.3" - }, - "dependencies": { - "@bufbuild/protobuf": "^2.0.0", - "@chainsafe/libp2p-gossipsub": "^14.1.0", - "@chainsafe/libp2p-noise": "^16.0.0", - "@chainsafe/libp2p-yamux": "^7.0.1", - "@libp2p/autonat": "^2.0.6", - "@libp2p/bootstrap": "^11.0.6", - "@libp2p/circuit-relay-v2": "^2.1.2", - "@libp2p/crypto": "^5.0.5", - "@libp2p/dcutr": "^2.0.6", - "@libp2p/devtools-metrics": "^1.1.5", - "@libp2p/identify": "^3.0.6", - "@libp2p/mdns": "^11.0.8", - "@libp2p/peer-id": "^5.0.4", - "@libp2p/pubsub-peer-discovery": "^11.0.0", - "@libp2p/webrtc": "^5.0.9", - "@libp2p/websockets": "^9.0.7", - "@libp2p/webtransport": "^5.0.9", - "@multiformats/multiaddr": "^12.3.1", - "@topology-foundation/logger": "^0.3.1", - "it-length-prefixed": "^9.1.0", - "it-map": "^3.1.1", - "it-pipe": "^3.0.1", - "libp2p": "^2.1.6", - "ts-proto": "^2.2.4", - "uint8arrays": "^5.1.0" - } + "name": "@ts-drp/network", + "version": "0.3.1", + "license": "MIT", + "repository": { + "type": "git", + "url": "git+https://github.com/topology-foundation/ts-drp.git" + }, + "type": "module", + "types": "./dist/src/index.d.ts", + "files": ["src", "dist", "!dist/test", "!**/*.tsbuildinfo"], + "exports": { + ".": { + "types": "./dist/src/index.d.ts", + "import": "./dist/src/index.js" + } + }, + "scripts": { + "build": "tsc -b", + "clean": "rm -rf dist/ node_modules/", + "prepack": "tsc -b", + "test": "vitest" + }, + "devDependencies": { + "@libp2p/interface": "^2.1.3" + }, + "dependencies": { + "@bufbuild/protobuf": "^2.0.0", + "@chainsafe/libp2p-gossipsub": "^14.1.0", + "@chainsafe/libp2p-noise": "^16.0.0", + "@chainsafe/libp2p-yamux": "^7.0.1", + "@libp2p/autonat": "^2.0.6", + "@libp2p/bootstrap": "^11.0.6", + "@libp2p/circuit-relay-v2": "^2.1.2", + "@libp2p/crypto": "^5.0.5", + "@libp2p/dcutr": "^2.0.6", + "@libp2p/devtools-metrics": "^1.1.5", + "@libp2p/identify": "^3.0.6", + "@libp2p/pubsub-peer-discovery": "^11.0.0", + "@libp2p/webrtc": "^5.0.9", + "@libp2p/websockets": "^9.0.7", + "@libp2p/webtransport": "^5.0.9", + "@multiformats/multiaddr": "^12.3.1", + "@ts-drp/logger": "^0.3.1", + "it-length-prefixed": "^9.1.0", + "it-map": "^3.1.1", + "it-pipe": "^3.0.1", + "libp2p": "^2.1.6", + "uint8arrays": "^5.1.0" + } } diff --git a/packages/network/src/index.ts b/packages/network/src/index.ts index 961baf83..f1b8546c 100644 --- a/packages/network/src/index.ts +++ b/packages/network/src/index.ts @@ -1,2 +1,2 @@ export * from "./node.js"; -export * as NetworkPb from "./proto/topology/network/messages_pb.js"; +export * as NetworkPb from "./proto/drp/network/v1/messages_pb.js"; diff --git a/packages/network/src/node.ts b/packages/network/src/node.ts index 4f7d734c..f753a4ec 100644 --- a/packages/network/src/node.ts +++ b/packages/network/src/node.ts @@ -27,18 +27,19 @@ import { webSockets } from "@libp2p/websockets"; import * as filters from "@libp2p/websockets/filters"; import { webTransport } from "@libp2p/webtransport"; import { multiaddr } from "@multiformats/multiaddr"; -import { Logger, type LoggerOptions } from "@topology-foundation/logger"; +import { Logger, type LoggerOptions } from "@ts-drp/logger"; import { type Libp2p, createLibp2p } from "libp2p"; import { fromString as uint8ArrayFromString } from "uint8arrays/from-string"; -import { Message } from "./proto/topology/network/messages_pb.js"; +import { Message } from "./proto/drp/network/v1/messages_pb.js"; import { uint8ArrayToStream } from "./stream.js"; export * from "./stream.js"; +export const DRP_MESSAGE_PROTOCOL = "/drp/message/0.0.1"; let log: Logger; // snake_casing to match the JSON config -export interface TopologyNetworkNodeConfig { +export interface DRPNetworkNodeConfig { addresses?: string[]; bootstrap?: boolean; bootstrap_peers?: string[]; @@ -47,16 +48,16 @@ export interface TopologyNetworkNodeConfig { log_config?: LoggerOptions; } -export class TopologyNetworkNode { - private _config?: TopologyNetworkNodeConfig; +export class DRPNetworkNode { + private _config?: DRPNetworkNodeConfig; private _node?: Libp2p; private _pubsub?: PubSub; peerId = ""; - constructor(config?: TopologyNetworkNodeConfig) { + constructor(config?: DRPNetworkNodeConfig) { this._config = config; - log = new Logger("topology::network", config?.log_config); + log = new Logger("drp::network", config?.log_config); } async start() { @@ -78,7 +79,7 @@ export class TopologyNetworkNode { const _pubsubPeerDiscovery = pubsubPeerDiscovery({ interval: 10_000, - topics: ["topology::discovery"], + topics: ["drp::discovery"], }); const _peerDiscovery = _bootstrapNodesList.length @@ -141,7 +142,7 @@ export class TopologyNetworkNode { this.peerId = this._node.peerId.toString(); log.info( - "::start: Successfuly started topology network w/ peer_id", + "::start: Successfuly started DRP network w/ peer_id", this.peerId, ); @@ -231,10 +232,10 @@ export class TopologyNetworkNode { } } - async sendMessage(peerId: string, protocols: string[], message: Message) { + async sendMessage(peerId: string, message: Message) { try { const connection = await this._node?.dial([multiaddr(`/p2p/${peerId}`)]); - const stream = await connection?.newStream(protocols); + const stream = await connection?.newStream(DRP_MESSAGE_PROTOCOL); const messageBuffer = Message.encode(message).finish(); uint8ArrayToStream(stream, messageBuffer); } catch (e) { @@ -242,18 +243,16 @@ export class TopologyNetworkNode { } } - async sendGroupMessageRandomPeer( - group: string, - protocols: string[], - message: Message, - ) { + async sendGroupMessageRandomPeer(group: string, message: Message) { try { const peers = this._pubsub?.getSubscribers(group); if (!peers || peers.length === 0) throw Error("Topic wo/ peers"); const peerId = peers[Math.floor(Math.random() * peers.length)]; const connection = await this._node?.dial(peerId); - const stream: Stream = (await connection?.newStream(protocols)) as Stream; + const stream: Stream = (await connection?.newStream( + DRP_MESSAGE_PROTOCOL, + )) as Stream; const messageBuffer = Message.encode(message).finish(); uint8ArrayToStream(stream, messageBuffer); } catch (e) { @@ -271,7 +270,11 @@ export class TopologyNetworkNode { }); } - addMessageHandler(protocol: string | string[], handler: StreamHandler) { + addMessageHandler(handler: StreamHandler) { + this._node?.handle(DRP_MESSAGE_PROTOCOL, handler); + } + + addCustomMessageHandler(protocol: string | string[], handler: StreamHandler) { this._node?.handle(protocol, handler); } } diff --git a/packages/network/src/proto/drp/network/v1/messages.proto b/packages/network/src/proto/drp/network/v1/messages.proto new file mode 100644 index 00000000..d419c353 --- /dev/null +++ b/packages/network/src/proto/drp/network/v1/messages.proto @@ -0,0 +1,37 @@ +syntax = "proto3"; +package drp.network.v1; + +import "drp/object/v1/object.proto"; + +enum MessageType { + MESSAGE_TYPE_UNSPECIFIED = 0; + MESSAGE_TYPE_UPDATE = 1; + MESSAGE_TYPE_SYNC = 2; + MESSAGE_TYPE_SYNC_ACCEPT = 3; + MESSAGE_TYPE_SYNC_REJECT = 4; + MESSAGE_TYPE_CUSTOM = 5; +} + +message Message { + string sender = 1; + MessageType type = 2; + bytes data = 3; +} + +message Update { + string object_id = 1; + repeated drp.object.v1.Vertex vertices = 2; +} + +message Sync { + string object_id = 1; + repeated string vertex_hashes = 2; +} + +message SyncAccept { + string object_id = 1; + repeated drp.object.v1.Vertex requested = 2; + repeated string requesting = 3; +} + +message SyncReject {} diff --git a/packages/network/src/proto/topology/network/messages_pb.ts b/packages/network/src/proto/drp/network/v1/messages_pb.ts similarity index 88% rename from packages/network/src/proto/topology/network/messages_pb.ts rename to packages/network/src/proto/drp/network/v1/messages_pb.ts index 1be595de..060f9f91 100644 --- a/packages/network/src/proto/topology/network/messages_pb.ts +++ b/packages/network/src/proto/drp/network/v1/messages_pb.ts @@ -2,71 +2,77 @@ // versions: // protoc-gen-ts_proto v2.2.5 // protoc unknown -// source: topology/network/messages.proto +// source: drp/network/v1/messages.proto /* eslint-disable */ import { BinaryReader, BinaryWriter } from "@bufbuild/protobuf/wire"; -import { Vertex } from "../object/object_pb.js"; +import { Vertex } from "../../object/v1/object_pb.js"; -export const protobufPackage = "topology.network"; +export const protobufPackage = "drp.network.v1"; -export interface Message { - sender: string; - type: Message_MessageType; - data: Uint8Array; -} - -export enum Message_MessageType { - UPDATE = 0, - SYNC = 1, - SYNC_ACCEPT = 2, - SYNC_REJECT = 3, - CUSTOM = 4, +export enum MessageType { + MESSAGE_TYPE_UNSPECIFIED = 0, + MESSAGE_TYPE_UPDATE = 1, + MESSAGE_TYPE_SYNC = 2, + MESSAGE_TYPE_SYNC_ACCEPT = 3, + MESSAGE_TYPE_SYNC_REJECT = 4, + MESSAGE_TYPE_CUSTOM = 5, UNRECOGNIZED = -1, } -export function message_MessageTypeFromJSON(object: any): Message_MessageType { +export function messageTypeFromJSON(object: any): MessageType { switch (object) { case 0: - case "UPDATE": - return Message_MessageType.UPDATE; + case "MESSAGE_TYPE_UNSPECIFIED": + return MessageType.MESSAGE_TYPE_UNSPECIFIED; case 1: - case "SYNC": - return Message_MessageType.SYNC; + case "MESSAGE_TYPE_UPDATE": + return MessageType.MESSAGE_TYPE_UPDATE; case 2: - case "SYNC_ACCEPT": - return Message_MessageType.SYNC_ACCEPT; + case "MESSAGE_TYPE_SYNC": + return MessageType.MESSAGE_TYPE_SYNC; case 3: - case "SYNC_REJECT": - return Message_MessageType.SYNC_REJECT; + case "MESSAGE_TYPE_SYNC_ACCEPT": + return MessageType.MESSAGE_TYPE_SYNC_ACCEPT; case 4: - case "CUSTOM": - return Message_MessageType.CUSTOM; + case "MESSAGE_TYPE_SYNC_REJECT": + return MessageType.MESSAGE_TYPE_SYNC_REJECT; + case 5: + case "MESSAGE_TYPE_CUSTOM": + return MessageType.MESSAGE_TYPE_CUSTOM; case -1: case "UNRECOGNIZED": default: - return Message_MessageType.UNRECOGNIZED; + return MessageType.UNRECOGNIZED; } } -export function message_MessageTypeToJSON(object: Message_MessageType): string { +export function messageTypeToJSON(object: MessageType): string { switch (object) { - case Message_MessageType.UPDATE: - return "UPDATE"; - case Message_MessageType.SYNC: - return "SYNC"; - case Message_MessageType.SYNC_ACCEPT: - return "SYNC_ACCEPT"; - case Message_MessageType.SYNC_REJECT: - return "SYNC_REJECT"; - case Message_MessageType.CUSTOM: - return "CUSTOM"; - case Message_MessageType.UNRECOGNIZED: + case MessageType.MESSAGE_TYPE_UNSPECIFIED: + return "MESSAGE_TYPE_UNSPECIFIED"; + case MessageType.MESSAGE_TYPE_UPDATE: + return "MESSAGE_TYPE_UPDATE"; + case MessageType.MESSAGE_TYPE_SYNC: + return "MESSAGE_TYPE_SYNC"; + case MessageType.MESSAGE_TYPE_SYNC_ACCEPT: + return "MESSAGE_TYPE_SYNC_ACCEPT"; + case MessageType.MESSAGE_TYPE_SYNC_REJECT: + return "MESSAGE_TYPE_SYNC_REJECT"; + case MessageType.MESSAGE_TYPE_CUSTOM: + return "MESSAGE_TYPE_CUSTOM"; + case MessageType.UNRECOGNIZED: default: return "UNRECOGNIZED"; } } +export interface Message { + sender: string; + type: MessageType; + data: Uint8Array; +} + export interface Update { objectId: string; vertices: Vertex[]; @@ -147,7 +153,7 @@ export const Message: MessageFns = { fromJSON(object: any): Message { return { sender: isSet(object.sender) ? globalThis.String(object.sender) : "", - type: isSet(object.type) ? message_MessageTypeFromJSON(object.type) : 0, + type: isSet(object.type) ? messageTypeFromJSON(object.type) : 0, data: isSet(object.data) ? bytesFromBase64(object.data) : new Uint8Array(0), }; }, @@ -158,7 +164,7 @@ export const Message: MessageFns = { obj.sender = message.sender; } if (message.type !== 0) { - obj.type = message_MessageTypeToJSON(message.type); + obj.type = messageTypeToJSON(message.type); } if (message.data.length !== 0) { obj.data = base64FromBytes(message.data); diff --git a/packages/network/src/proto/topology/object/object_pb.ts b/packages/network/src/proto/drp/object/v1/object_pb.ts similarity index 91% rename from packages/network/src/proto/topology/object/object_pb.ts rename to packages/network/src/proto/drp/object/v1/object_pb.ts index e73d21e0..4db66f75 100644 --- a/packages/network/src/proto/topology/object/object_pb.ts +++ b/packages/network/src/proto/drp/object/v1/object_pb.ts @@ -2,13 +2,13 @@ // versions: // protoc-gen-ts_proto v2.2.5 // protoc unknown -// source: topology/object/object.proto +// source: drp/object/v1/object.proto /* eslint-disable */ import { BinaryReader, BinaryWriter } from "@bufbuild/protobuf/wire"; -import { Value } from "../../google/protobuf/struct_pb.js"; +import { Value } from "../../../google/protobuf/struct_pb.js"; -export const protobufPackage = "topology.object"; +export const protobufPackage = "drp.object.v1"; /** Supposed to be the RIBLT stuff */ export interface Vertex { @@ -23,7 +23,7 @@ export interface Vertex_Operation { value: any | undefined; } -export interface TopologyObjectBase { +export interface DRPObjectBase { id: string; abi?: string | undefined; bytecode?: Uint8Array | undefined; @@ -218,12 +218,12 @@ export const Vertex_Operation: MessageFns = { }, }; -function createBaseTopologyObjectBase(): TopologyObjectBase { +function createBaseDRPObjectBase(): DRPObjectBase { return { id: "", abi: undefined, bytecode: undefined, vertices: [] }; } -export const TopologyObjectBase: MessageFns = { - encode(message: TopologyObjectBase, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { +export const DRPObjectBase: MessageFns = { + encode(message: DRPObjectBase, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { if (message.id !== "") { writer.uint32(10).string(message.id); } @@ -239,10 +239,10 @@ export const TopologyObjectBase: MessageFns = { return writer; }, - decode(input: BinaryReader | Uint8Array, length?: number): TopologyObjectBase { + decode(input: BinaryReader | Uint8Array, length?: number): DRPObjectBase { const reader = input instanceof BinaryReader ? input : new BinaryReader(input); let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseTopologyObjectBase(); + const message = createBaseDRPObjectBase(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { @@ -287,7 +287,7 @@ export const TopologyObjectBase: MessageFns = { return message; }, - fromJSON(object: any): TopologyObjectBase { + fromJSON(object: any): DRPObjectBase { return { id: isSet(object.id) ? globalThis.String(object.id) : "", abi: isSet(object.abi) ? globalThis.String(object.abi) : undefined, @@ -296,7 +296,7 @@ export const TopologyObjectBase: MessageFns = { }; }, - toJSON(message: TopologyObjectBase): unknown { + toJSON(message: DRPObjectBase): unknown { const obj: any = {}; if (message.id !== "") { obj.id = message.id; @@ -313,11 +313,11 @@ export const TopologyObjectBase: MessageFns = { return obj; }, - create, I>>(base?: I): TopologyObjectBase { - return TopologyObjectBase.fromPartial(base ?? ({} as any)); + create, I>>(base?: I): DRPObjectBase { + return DRPObjectBase.fromPartial(base ?? ({} as any)); }, - fromPartial, I>>(object: I): TopologyObjectBase { - const message = createBaseTopologyObjectBase(); + fromPartial, I>>(object: I): DRPObjectBase { + const message = createBaseDRPObjectBase(); message.id = object.id ?? ""; message.abi = object.abi ?? undefined; message.bytecode = object.bytecode ?? undefined; diff --git a/packages/network/src/proto/topology/network/messages.proto b/packages/network/src/proto/topology/network/messages.proto deleted file mode 100644 index de339256..00000000 --- a/packages/network/src/proto/topology/network/messages.proto +++ /dev/null @@ -1,37 +0,0 @@ -syntax = "proto3"; -package topology.network; - -import "google/protobuf/struct.proto"; -import "topology/object/object.proto"; - -message Message { - enum MessageType { - UPDATE = 0; - SYNC = 1; - SYNC_ACCEPT = 2; - SYNC_REJECT = 3; - CUSTOM = 4; - } - - string sender = 1; - MessageType type = 2; - bytes data = 3; -} - -message Update { - string objectId = 1; - repeated topology.object.Vertex vertices = 2; -} - -message Sync { - string objectId = 1; - repeated string vertex_hashes = 2; -} - -message SyncAccept { - string objectId = 1; - repeated topology.object.Vertex requested = 2; - repeated string requesting = 3; -} - -message SyncReject {} diff --git a/packages/network/src/proto/topology/network/messages_grpc_pb.js b/packages/network/src/proto/topology/network/messages_grpc_pb.js deleted file mode 100644 index 97b3a246..00000000 --- a/packages/network/src/proto/topology/network/messages_grpc_pb.js +++ /dev/null @@ -1 +0,0 @@ -// GENERATED CODE -- NO SERVICES IN PROTO \ No newline at end of file diff --git a/packages/node/README.md b/packages/node/README.md index bf467ecb..ae57ddf7 100644 --- a/packages/node/README.md +++ b/packages/node/README.md @@ -1,29 +1,19 @@ -# Topology Node +# DRP Node -This package provides the implementation of a Topology Node, which is a node in a network that can be connected to other nodes and exchange messages with them. The Topology Node is the entrypoint for interacting with the Topology Protocol in the Topology Network. +This package provides the implementation of a DRP Node, which is a node in a network that can be connected to other nodes and exchange messages with them. +The DRP Node is the entrypoint for interacting with the DRP protocol in the network. ## Usage -Topology Node can be used using the CLI or integrated into an existing application. +DRP Node can be used using the CLI or integrated into an existing application. ### CLI -The CLI provides a simple way to start a Topology Node and connect it to other nodes in the network. It can be installed globally using: - -```bash -# yarn -yarn global add @topology-foundation/node - -# npm -npm install -g @topology-foundation/node -``` - -> This part is a lie, the cli is being developed. - +The CLI provides a simple way to start a DRP Node and connect it to other nodes in the network. For more information on what are the commands available, run: ```bash -topology-node --help +pnpm cli --help ``` #### Running a bootstrap node @@ -33,30 +23,20 @@ You can run a bootstrap node using the following command: pnpm cli bootstrap --config configs/bootstrap.json ``` -If you want to run a local bootstrap node, you can use the following command: - -```bash -pnpm cli bootstrap --config configs/local-bootstrap.json -``` - ### Integration -To integrate the Topology Node into an existing application, you can install it using: +To integrate the DRP Node into an existing application, you can install it using: ```bash -# yarn -yarn add @topology-foundation/node - -# npm -npm install @topology-foundation/node +pnpm install @ts-drp/node ``` -Then, you can import the Topology Node class and create a new instance: +Then, you can import the DRP Node class and create a new instance: ```javascript -import { TopologyNode } from '@topology-foundation/node'; +import { DRPNode } from '@ts-drp/node'; -const node = new TopologyNode(); +const node = new DRPNode(); // Start the node node.start(); diff --git a/packages/node/package.json b/packages/node/package.json index 20b5bd21..3a85360a 100644 --- a/packages/node/package.json +++ b/packages/node/package.json @@ -1,50 +1,44 @@ { - "name": "@topology-foundation/node", - "version": "0.3.1", - "license": "MIT", - "repository": { - "type": "git", - "url": "git+https://github.com/topology-foundation/ts-topology.git" - }, - "type": "module", - "types": "./dist/src/index.d.ts", - "files": [ - "src", - "dist", - "!dist/test", - "!**/*.tsbuildinfo" - ], - "exports": { - ".": { - "types": "./dist/src/index.d.ts", - "import": "./dist/src/index.js" - } - }, - "scripts": { - "build": "tsc -b", - "clean": "rm -rf dist/ node_modules/", - "cli": "tsx ./src/run.ts", - "prebuild": "node -p \"'export const VERSION = ' + JSON.stringify(require('./package.json').version) + ';'\" > src/version.ts", - "prepack": "tsc -b", - "test": "vitest" - }, - "devDependencies": { - "@bufbuild/protobuf": "^2.0.0", - "@types/node": "^22.5.4", - "tsx": "4.19.1", - "typescript": "^5.5.4", - "vitest": "^2.1.1" - }, - "dependencies": { - "@chainsafe/libp2p-gossipsub": "^14.1.0", - "@grpc/grpc-js": "^1.12.2", - "@libp2p/interface": "^2.1.3", - "dotenv": "^16.4.5", - "@topology-foundation/blueprints": "0.3.1", - "@topology-foundation/network": "0.3.1", - "@topology-foundation/object": "0.3.1", - "@topology-foundation/logger": "0.3.1", - "commander": "^12.1.0", - "google-protobuf": "^3.21.2" - } + "name": "@ts-drp/node", + "version": "0.3.1", + "license": "MIT", + "repository": { + "type": "git", + "url": "git+https://github.com/topology-foundation/ts-drp.git" + }, + "type": "module", + "types": "./dist/src/index.d.ts", + "files": ["src", "dist", "!dist/test", "!**/*.tsbuildinfo"], + "exports": { + ".": { + "types": "./dist/src/index.d.ts", + "import": "./dist/src/index.js" + } + }, + "scripts": { + "build": "tsc -b", + "clean": "rm -rf dist/ node_modules/", + "cli": "tsx ./src/run.ts", + "prebuild": "node -p \"'export const VERSION = ' + JSON.stringify(require('./package.json').version) + ';'\" > src/version.ts", + "prepack": "tsc -b", + "test": "vitest" + }, + "devDependencies": { + "@bufbuild/protobuf": "^2.0.0", + "@types/node": "^22.5.4", + "tsx": "4.19.1", + "typescript": "^5.5.4", + "vitest": "^2.1.1" + }, + "dependencies": { + "@chainsafe/libp2p-gossipsub": "^14.1.0", + "@grpc/grpc-js": "^1.12.2", + "@libp2p/interface": "^2.1.3", + "dotenv": "^16.4.5", + "@ts-drp/blueprints": "0.3.1", + "@ts-drp/network": "0.3.1", + "@ts-drp/object": "0.3.1", + "@ts-drp/logger": "0.3.1", + "commander": "^12.1.0" + } } diff --git a/packages/node/src/config.ts b/packages/node/src/config.ts index f982e9da..e128b9c1 100644 --- a/packages/node/src/config.ts +++ b/packages/node/src/config.ts @@ -1,11 +1,11 @@ import fs from "node:fs"; import * as dotenv from "dotenv"; -import type { TopologyNodeConfig } from "./index.js"; +import type { DRPNodeConfig } from "./index.js"; export function loadConfig( configPath?: string | undefined, -): TopologyNodeConfig | undefined { - let config: TopologyNodeConfig | undefined; +): DRPNodeConfig | undefined { + let config: DRPNodeConfig | undefined; if (configPath) { config = JSON.parse(fs.readFileSync(configPath, "utf8")); diff --git a/packages/node/src/handlers.ts b/packages/node/src/handlers.ts index 744d981e..615c720a 100644 --- a/packages/node/src/handlers.ts +++ b/packages/node/src/handlers.ts @@ -1,18 +1,14 @@ import type { Stream } from "@libp2p/interface"; -import { NetworkPb, streamToUint8Array } from "@topology-foundation/network"; -import type { - ObjectPb, - TopologyObject, - Vertex, -} from "@topology-foundation/object"; -import type { TopologyNode } from "./index.js"; +import { NetworkPb, streamToUint8Array } from "@ts-drp/network"; +import type { DRPObject, ObjectPb, Vertex } from "@ts-drp/object"; +import { type DRPNode, log } from "./index.js"; /* - Handler for all CRO messages, including pubsub messages and direct messages + Handler for all DRP messages, including pubsub messages and direct messages You need to setup stream xor data */ -export async function topologyMessagesHandler( - node: TopologyNode, +export async function drpMessagesHandler( + node: DRPNode, stream?: Stream, data?: Uint8Array, ) { @@ -23,46 +19,33 @@ export async function topologyMessagesHandler( } else if (data) { message = NetworkPb.Message.decode(data); } else { - console.error( - "topology::node::messageHandler", - "Stream and data are undefined", - ); + log.error("::messageHandler: Stream and data are undefined"); return; } switch (message.type) { - case NetworkPb.Message_MessageType.UPDATE: + case NetworkPb.MessageType.MESSAGE_TYPE_UPDATE: updateHandler(node, message.data, message.sender); break; - case NetworkPb.Message_MessageType.SYNC: + case NetworkPb.MessageType.MESSAGE_TYPE_SYNC: if (!stream) { - console.error("topology::node::messageHandler", "Stream is undefined"); + log.error("::messageHandler: Stream is undefined"); return; } - syncHandler( - node, - stream.protocol ?? "/topology/message/0.0.1", - message.sender, - message.data, - ); + syncHandler(node, message.sender, message.data); break; - case NetworkPb.Message_MessageType.SYNC_ACCEPT: + case NetworkPb.MessageType.MESSAGE_TYPE_SYNC_ACCEPT: if (!stream) { - console.error("topology::node::messageHandler", "Stream is undefined"); + log.error("::messageHandler: Stream is undefined"); return; } - syncAcceptHandler( - node, - stream.protocol ?? "/topology/message/0.0.1", - message.sender, - message.data, - ); + syncAcceptHandler(node, message.sender, message.data); break; - case NetworkPb.Message_MessageType.SYNC_REJECT: + case NetworkPb.MessageType.MESSAGE_TYPE_SYNC_REJECT: syncRejectHandler(node, message.data); break; default: - console.error("topology::node::messageHandler", "Invalid operation"); + log.error("::messageHandler: Invalid operation"); break; } } @@ -71,15 +54,11 @@ export async function topologyMessagesHandler( data: { id: string, operations: {nonce: string, fn: string, args: string[] }[] } operations array doesn't contain the full remote operations array */ -async function updateHandler( - node: TopologyNode, - data: Uint8Array, - sender: string, -) { +async function updateHandler(node: DRPNode, data: Uint8Array, sender: string) { const updateMessage = NetworkPb.Update.decode(data); const object = node.objectStore.get(updateMessage.objectId); if (!object) { - console.error("topology::node::updateHandler", "Object not found"); + log.error("::updateHandler: Object not found"); return false; } @@ -110,17 +89,12 @@ async function updateHandler( data: { id: string, operations: {nonce: string, fn: string, args: string[] }[] } operations array contain the full remote operations array */ -function syncHandler( - node: TopologyNode, - protocol: string, - sender: string, - data: Uint8Array, -) { +function syncHandler(node: DRPNode, sender: string, data: Uint8Array) { // (might send reject) <- TODO: when should we reject? const syncMessage = NetworkPb.Sync.decode(data); const object = node.objectStore.get(syncMessage.objectId); if (!object) { - console.error("topology::node::syncHandler", "Object not found"); + log.error("::syncHandler: Object not found"); return; } @@ -139,7 +113,7 @@ function syncHandler( const message = NetworkPb.Message.create({ sender: node.networkNode.peerId, - type: NetworkPb.Message_MessageType.SYNC_ACCEPT, + type: NetworkPb.MessageType.MESSAGE_TYPE_SYNC_ACCEPT, // add data here data: NetworkPb.SyncAccept.encode( NetworkPb.SyncAccept.create({ @@ -149,23 +123,18 @@ function syncHandler( }), ).finish(), }); - node.networkNode.sendMessage(sender, [protocol], message); + node.networkNode.sendMessage(sender, message); } /* data: { id: string, operations: {nonce: string, fn: string, args: string[] }[] } operations array contain the full remote operations array */ -function syncAcceptHandler( - node: TopologyNode, - protocol: string, - sender: string, - data: Uint8Array, -) { +function syncAcceptHandler(node: DRPNode, sender: string, data: Uint8Array) { const syncAcceptMessage = NetworkPb.SyncAccept.decode(data); const object = node.objectStore.get(syncAcceptMessage.objectId); if (!object) { - console.error("topology::node::syncAcceptHandler", "Object not found"); + log.error("::syncAcceptHandler: Object not found"); return; } @@ -199,7 +168,7 @@ function syncAcceptHandler( const message = NetworkPb.Message.create({ sender: node.networkNode.peerId, - type: NetworkPb.Message_MessageType.SYNC_ACCEPT, + type: NetworkPb.MessageType.MESSAGE_TYPE_SYNC_ACCEPT, data: NetworkPb.SyncAccept.encode( NetworkPb.SyncAccept.create({ objectId: object.id, @@ -208,20 +177,20 @@ function syncAcceptHandler( }), ).finish(), }); - node.networkNode.sendMessage(sender, [protocol], message); + node.networkNode.sendMessage(sender, message); } /* data: { id: string } */ -function syncRejectHandler(node: TopologyNode, data: Uint8Array) { +function syncRejectHandler(node: DRPNode, data: Uint8Array) { // TODO: handle reject. Possible actions: // - Retry sync // - Ask sync from another peer // - Do nothing } -export function topologyObjectChangesHandler( - node: TopologyNode, - obj: TopologyObject, +export function drpObjectChangesHandler( + node: DRPNode, + obj: DRPObject, originFn: string, vertices: ObjectPb.Vertex[], ) { @@ -234,7 +203,7 @@ export function topologyObjectChangesHandler( // send vertices to the pubsub group const message = NetworkPb.Message.create({ sender: node.networkNode.peerId, - type: NetworkPb.Message_MessageType.UPDATE, + type: NetworkPb.MessageType.MESSAGE_TYPE_UPDATE, data: NetworkPb.Update.encode( NetworkPb.Update.create({ objectId: obj.id, @@ -246,6 +215,6 @@ export function topologyObjectChangesHandler( break; } default: - console.error("topology::node::createObject", "Invalid origin function"); + log.error("::createObject: Invalid origin function"); } } diff --git a/packages/node/src/index.ts b/packages/node/src/index.ts index 20463d61..2a67f695 100644 --- a/packages/node/src/index.ts +++ b/packages/node/src/index.ts @@ -1,36 +1,40 @@ import type { GossipsubMessage } from "@chainsafe/libp2p-gossipsub"; import type { EventCallback, StreamHandler } from "@libp2p/interface"; +import { Logger, type LoggerOptions } from "@ts-drp/logger"; import { + DRPNetworkNode, + type DRPNetworkNodeConfig, NetworkPb, - TopologyNetworkNode, - type TopologyNetworkNodeConfig, -} from "@topology-foundation/network"; -import { type CRO, TopologyObject } from "@topology-foundation/object"; -import { topologyMessagesHandler } from "./handlers.js"; +} from "@ts-drp/network"; +import { type DRP, DRPObject } from "@ts-drp/object"; +import { drpMessagesHandler } from "./handlers.js"; import * as operations from "./operations.js"; -import { TopologyObjectStore } from "./store/index.js"; +import { DRPObjectStore } from "./store/index.js"; // snake_casing to match the JSON config -export interface TopologyNodeConfig { - network_config?: TopologyNetworkNodeConfig; +export interface DRPNodeConfig { + log_config?: LoggerOptions; + network_config?: DRPNetworkNodeConfig; } -export class TopologyNode { - config?: TopologyNodeConfig; - objectStore: TopologyObjectStore; - networkNode: TopologyNetworkNode; +export let log: Logger; - constructor(config?: TopologyNodeConfig) { +export class DRPNode { + config?: DRPNodeConfig; + objectStore: DRPObjectStore; + networkNode: DRPNetworkNode; + + constructor(config?: DRPNodeConfig) { this.config = config; - this.networkNode = new TopologyNetworkNode(config?.network_config); - this.objectStore = new TopologyObjectStore(); + log = new Logger("drp::node", config?.log_config); + this.networkNode = new DRPNetworkNode(config?.network_config); + this.objectStore = new DRPObjectStore(); } async start(): Promise { await this.networkNode.start(); - this.networkNode.addMessageHandler( - ["/topology/message/0.0.1"], - async ({ stream }) => topologyMessagesHandler(this, stream), + this.networkNode.addMessageHandler(async ({ stream }) => + drpMessagesHandler(this, stream), ); } @@ -48,33 +52,33 @@ export class TopologyNode { sendGroupMessage(group: string, data: Uint8Array) { const message = NetworkPb.Message.create({ sender: this.networkNode.peerId, - type: NetworkPb.Message_MessageType.CUSTOM, + type: NetworkPb.MessageType.MESSAGE_TYPE_CUSTOM, data, }); this.networkNode.broadcastMessage(group, message); } addCustomMessageHandler(protocol: string | string[], handler: StreamHandler) { - this.networkNode.addMessageHandler(protocol, handler); + this.networkNode.addCustomMessageHandler(protocol, handler); } sendCustomMessage(peerId: string, protocol: string, data: Uint8Array) { const message = NetworkPb.Message.create({ sender: this.networkNode.peerId, - type: NetworkPb.Message_MessageType.CUSTOM, + type: NetworkPb.MessageType.MESSAGE_TYPE_CUSTOM, data, }); - this.networkNode.sendMessage(peerId, [protocol], message); + this.networkNode.sendMessage(peerId, message); } async createObject( - cro: CRO, + drp: DRP, id?: string, abi?: string, sync?: boolean, peerId?: string, ) { - const object = new TopologyObject(this.networkNode.peerId, cro, id, abi); + const object = new DRPObject(this.networkNode.peerId, drp, id, abi); operations.createObject(this, object); operations.subscribeObject(this, object.id); if (sync) { diff --git a/packages/node/src/operations.ts b/packages/node/src/operations.ts index 625cf017..853d0ea6 100644 --- a/packages/node/src/operations.ts +++ b/packages/node/src/operations.ts @@ -1,43 +1,40 @@ -import { NetworkPb } from "@topology-foundation/network"; -import { ObjectPb, type TopologyObject } from "@topology-foundation/object"; -import { - topologyMessagesHandler, - topologyObjectChangesHandler, -} from "./handlers.js"; -import type { TopologyNode } from "./index.js"; +import { NetworkPb } from "@ts-drp/network"; +import { type DRPObject, ObjectPb } from "@ts-drp/object"; +import { drpMessagesHandler, drpObjectChangesHandler } from "./handlers.js"; +import { type DRPNode, log } from "./index.js"; /* Object operations */ enum OPERATIONS { - /* Create a new CRO */ + /* Create a new DRP */ CREATE = 0, - /* Update operation on a CRO */ + /* Update operation on a DRP */ UPDATE = 1, - /* Subscribe to a PubSub group (either CRO or custom) */ + /* Subscribe to a PubSub group (either DRP or custom) */ SUBSCRIBE = 2, /* Unsubscribe from a PubSub group */ UNSUBSCRIBE = 3, - /* Actively send the CRO RIBLT to a random peer */ + /* Actively send the DRP to a random peer */ SYNC = 4, } -export function createObject(node: TopologyNode, object: TopologyObject) { +export function createObject(node: DRPNode, object: DRPObject) { node.objectStore.put(object.id, object); object.subscribe((obj, originFn, vertices) => - topologyObjectChangesHandler(node, obj, originFn, vertices), + drpObjectChangesHandler(node, obj, originFn, vertices), ); } /* data: { id: string } */ -export async function subscribeObject(node: TopologyNode, objectId: string) { +export async function subscribeObject(node: DRPNode, objectId: string) { node.networkNode.subscribe(objectId); node.networkNode.addGroupMessageHandler(objectId, async (e) => - topologyMessagesHandler(node, undefined, e.detail.msg.data), + drpMessagesHandler(node, undefined, e.detail.msg.data), ); } export function unsubscribeObject( - node: TopologyNode, + node: DRPNode, objectId: string, purge?: boolean, ) { @@ -49,13 +46,13 @@ export function unsubscribeObject( data: { vertex_hashes: string[] } */ export async function syncObject( - node: TopologyNode, + node: DRPNode, objectId: string, peerId?: string, ) { - const object: TopologyObject | undefined = node.objectStore.get(objectId); + const object: DRPObject | undefined = node.objectStore.get(objectId); if (!object) { - console.error("topology::node::syncObject", "Object not found"); + log.error("::syncObject: Object not found"); return; } const data = NetworkPb.Sync.create({ @@ -64,21 +61,13 @@ export async function syncObject( }); const message = NetworkPb.Message.create({ sender: node.networkNode.peerId, - type: NetworkPb.Message_MessageType.SYNC, + type: NetworkPb.MessageType.MESSAGE_TYPE_SYNC, data: NetworkPb.Sync.encode(data).finish(), }); if (!peerId) { - await node.networkNode.sendGroupMessageRandomPeer( - objectId, - ["/topology/message/0.0.1"], - message, - ); + await node.networkNode.sendGroupMessageRandomPeer(objectId, message); } else { - await node.networkNode.sendMessage( - peerId, - ["/topology/message/0.0.1"], - message, - ); + await node.networkNode.sendMessage(peerId, message); } } diff --git a/packages/node/src/proto/drp/node/v1/rpc.proto b/packages/node/src/proto/drp/node/v1/rpc.proto new file mode 100644 index 00000000..ea87e237 --- /dev/null +++ b/packages/node/src/proto/drp/node/v1/rpc.proto @@ -0,0 +1,35 @@ +syntax = "proto3"; +package drp.node.v1; + +service DrpRpcService { + rpc SubscribeDRP(SubscribeDRPRequest) returns (SubscribeDRPResponse); + rpc UnsubscribeDRP(UnsubscribeDRPRequest) returns (UnsubscribeDRPResponse); + rpc GetDRPHashGraph(GetDRPHashGraphRequest) returns (GetDRPHashGraphResponse); +} + +message SubscribeDRPRequest { + string drp_id = 1; +} + +message SubscribeDRPResponse { + // can return error codes if different than 0 + int32 return_code = 1; +} + +message UnsubscribeDRPRequest { + string drp_id = 1; +} + +message UnsubscribeDRPResponse { + // can return error codes if different than 0 + int32 return_code = 1; +} + +message GetDRPHashGraphRequest { + string drp_id = 1; +} + +message GetDRPHashGraphResponse { + // linearized vertices hashes + repeated string vertices_hashes = 1; +} diff --git a/packages/node/src/proto/drp/node/v1/rpc_grpc_pb.js b/packages/node/src/proto/drp/node/v1/rpc_grpc_pb.js new file mode 100644 index 00000000..62562741 --- /dev/null +++ b/packages/node/src/proto/drp/node/v1/rpc_grpc_pb.js @@ -0,0 +1,91 @@ +import * as node_src_proto_rpc_pb from './rpc_pb.js'; + +function serialize_drp_node_GetDRPHashGraphRequest(arg) { + let encoded = node_src_proto_rpc_pb.GetDRPHashGraphRequest.encode(arg).finish() + return Buffer.from(encoded); +} + +function deserialize_drp_node_GetDRPHashGraphRequest(buffer_arg) { + return node_src_proto_rpc_pb.GetDRPHashGraphRequest.decode(new Uint8Array(buffer_arg)); +} + +function serialize_drp_node_GetDRPHashGraphResponse(arg) { + let encoded = node_src_proto_rpc_pb.GetDRPHashGraphResponse.encode(arg).finish() + return Buffer.from(encoded); +} + +function deserialize_drp_node_GetDRPHashGraphResponse(buffer_arg) { + return node_src_proto_rpc_pb.GetDRPHashGraphResponse.decode(new Uint8Array(buffer_arg)); +} + +function serialize_drp_node_SubscribeDRPRequest(arg) { + let encoded = node_src_proto_rpc_pb.SubscribeDRPRequest.encode(arg).finish() + return Buffer.from(encoded); +} + +function deserialize_drp_node_SubscribeDRPRequest(buffer_arg) { + return node_src_proto_rpc_pb.SubscribeDRPRequest.decode(new Uint8Array(buffer_arg)); +} + +function serialize_drp_node_SubscribeDRPResponse(arg) { + let encoded = node_src_proto_rpc_pb.SubscribeDRPResponse.encode(arg).finish() + return Buffer.from(encoded); +} + +function deserialize_drp_node_SubscribeDRPResponse(buffer_arg) { + return node_src_proto_rpc_pb.SubscribeDRPResponse.decode(new Uint8Array(buffer_arg)); +} + +function serialize_drp_node_UnsubscribeDRPRequest(arg) { + let encoded = node_src_proto_rpc_pb.UnsubscribeDRPRequest.encode(arg).finish() + return Buffer.from(encoded); +} + +function deserialize_drp_node_UnsubscribeDRPRequest(buffer_arg) { + return node_src_proto_rpc_pb.UnsubscribeDRPRequest.decode(new Uint8Array(buffer_arg)); +} + +function serialize_drp_node_UnsubscribeDRPResponse(arg) { + let encoded = node_src_proto_rpc_pb.UnsubscribeDRPResponse.encode(arg).finish() + return Buffer.from(encoded); +} + +function deserialize_drp_node_UnsubscribeDRPResponse(buffer_arg) { + return node_src_proto_rpc_pb.UnsubscribeDRPResponse.decode(new Uint8Array(buffer_arg)); +} + +export const DRPRpcService = { + subscribeDRP: { + path: '/drp.node.drpRpc/subscribeDRP', + requestStream: false, + responseStream: false, + requestType: node_src_proto_rpc_pb.SubscribeDRPRequest, + responseType: node_src_proto_rpc_pb.SubscribeDRPResponse, + requestSerialize: serialize_drp_node_SubscribeDRPRequest, + requestDeserialize: deserialize_drp_node_SubscribeDRPRequest, + responseSerialize: serialize_drp_node_SubscribeDRPResponse, + responseDeserialize: deserialize_drp_node_SubscribeDRPResponse, + }, + unsubscribeDRP: { + path: '/drp.node.drpRpc/unsubscribeDRP', + requestStream: false, + responseStream: false, + requestType: node_src_proto_rpc_pb.UnsubscribeDRPRequest, + responseType: node_src_proto_rpc_pb.UnsubscribeDRPResponse, + requestSerialize: serialize_drp_node_UnsubscribeDRPRequest, + requestDeserialize: deserialize_drp_node_UnsubscribeDRPRequest, + responseSerialize: serialize_drp_node_UnsubscribeDRPResponse, + responseDeserialize: deserialize_drp_node_UnsubscribeDRPResponse, + }, + getDRPHashGraph: { + path: '/drp.node.drpRpc/getDRPHashGraph', + requestStream: false, + responseStream: false, + requestType: node_src_proto_rpc_pb.GetDRPHashGraphRequest, + responseType: node_src_proto_rpc_pb.GetDRPHashGraphResponse, + requestSerialize: serialize_drp_node_GetDRPHashGraphRequest, + requestDeserialize: deserialize_drp_node_GetDRPHashGraphRequest, + responseSerialize: serialize_drp_node_GetDRPHashGraphResponse, + responseDeserialize: deserialize_drp_node_GetDRPHashGraphResponse, + }, +}; diff --git a/packages/node/src/proto/drp/node/v1/rpc_pb.ts b/packages/node/src/proto/drp/node/v1/rpc_pb.ts new file mode 100644 index 00000000..0de25276 --- /dev/null +++ b/packages/node/src/proto/drp/node/v1/rpc_pb.ts @@ -0,0 +1,439 @@ +// Code generated by protoc-gen-ts_proto. DO NOT EDIT. +// versions: +// protoc-gen-ts_proto v2.0.3 +// protoc unknown +// source: node/src/proto/rpc.proto + +/* eslint-disable */ +import { BinaryReader, BinaryWriter } from "@bufbuild/protobuf/wire"; + +export const protobufPackage = "drp.node"; + +export interface SubscribeDRPRequest { + drpId: string; +} + +export interface SubscribeDRPResponse { + /** can return error codes if different than 0 */ + returnCode: number; +} + +export interface UnsubscribeDRPRequest { + drpId: string; +} + +export interface UnsubscribeDRPResponse { + /** can return error codes if different than 0 */ + returnCode: number; +} + +export interface GetDRPHashGraphRequest { + drpId: string; +} + +export interface GetDRPHashGraphResponse { + /** linearized vertices hashes */ + verticesHashes: string[]; +} + +function createBaseSubscribeDRPRequest(): SubscribeDRPRequest { + return { drpId: "" }; +} + +export const SubscribeDRPRequest = { + encode(message: SubscribeDRPRequest, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.drpId !== "") { + writer.uint32(10).string(message.drpId); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): SubscribeDRPRequest { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseSubscribeDRPRequest(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + + message.drpId = reader.string(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): SubscribeDRPRequest { + return { drpId: isSet(object.drpId) ? globalThis.String(object.drpId) : "" }; + }, + + toJSON(message: SubscribeDRPRequest): unknown { + const obj: any = {}; + if (message.drpId !== "") { + obj.drpId = message.drpId; + } + return obj; + }, + + create, I>>(base?: I): SubscribeDRPRequest { + return SubscribeDRPRequest.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): SubscribeDRPRequest { + const message = createBaseSubscribeDRPRequest(); + message.drpId = object.drpId ?? ""; + return message; + }, +}; + +function createBaseSubscribeDRPResponse(): SubscribeDRPResponse { + return { returnCode: 0 }; +} + +export const SubscribeDRPResponse = { + encode(message: SubscribeDRPResponse, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.returnCode !== 0) { + writer.uint32(8).int32(message.returnCode); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): SubscribeDRPResponse { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseSubscribeDRPResponse(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 8) { + break; + } + + message.returnCode = reader.int32(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): SubscribeDRPResponse { + return { returnCode: isSet(object.returnCode) ? globalThis.Number(object.returnCode) : 0 }; + }, + + toJSON(message: SubscribeDRPResponse): unknown { + const obj: any = {}; + if (message.returnCode !== 0) { + obj.returnCode = Math.round(message.returnCode); + } + return obj; + }, + + create, I>>(base?: I): SubscribeDRPResponse { + return SubscribeDRPResponse.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): SubscribeDRPResponse { + const message = createBaseSubscribeDRPResponse(); + message.returnCode = object.returnCode ?? 0; + return message; + }, +}; + +function createBaseUnsubscribeDRPRequest(): UnsubscribeDRPRequest { + return { drpId: "" }; +} + +export const UnsubscribeDRPRequest = { + encode(message: UnsubscribeDRPRequest, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.drpId !== "") { + writer.uint32(10).string(message.drpId); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): UnsubscribeDRPRequest { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseUnsubscribeDRPRequest(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + + message.drpId = reader.string(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): UnsubscribeDRPRequest { + return { drpId: isSet(object.drpId) ? globalThis.String(object.drpId) : "" }; + }, + + toJSON(message: UnsubscribeDRPRequest): unknown { + const obj: any = {}; + if (message.drpId !== "") { + obj.drpId = message.drpId; + } + return obj; + }, + + create, I>>(base?: I): UnsubscribeDRPRequest { + return UnsubscribeDRPRequest.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): UnsubscribeDRPRequest { + const message = createBaseUnsubscribeDRPRequest(); + message.drpId = object.drpId ?? ""; + return message; + }, +}; + +function createBaseUnsubscribeDRPResponse(): UnsubscribeDRPResponse { + return { returnCode: 0 }; +} + +export const UnsubscribeDRPResponse = { + encode(message: UnsubscribeDRPResponse, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.returnCode !== 0) { + writer.uint32(8).int32(message.returnCode); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): UnsubscribeDRPResponse { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseUnsubscribeDRPResponse(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 8) { + break; + } + + message.returnCode = reader.int32(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): UnsubscribeDRPResponse { + return { returnCode: isSet(object.returnCode) ? globalThis.Number(object.returnCode) : 0 }; + }, + + toJSON(message: UnsubscribeDRPResponse): unknown { + const obj: any = {}; + if (message.returnCode !== 0) { + obj.returnCode = Math.round(message.returnCode); + } + return obj; + }, + + create, I>>(base?: I): UnsubscribeDRPResponse { + return UnsubscribeDRPResponse.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): UnsubscribeDRPResponse { + const message = createBaseUnsubscribeDRPResponse(); + message.returnCode = object.returnCode ?? 0; + return message; + }, +}; + +function createBaseGetDRPHashGraphRequest(): GetDRPHashGraphRequest { + return { drpId: "" }; +} + +export const GetDRPHashGraphRequest = { + encode(message: GetDRPHashGraphRequest, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.drpId !== "") { + writer.uint32(10).string(message.drpId); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): GetDRPHashGraphRequest { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseGetDRPHashGraphRequest(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + + message.drpId = reader.string(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): GetDRPHashGraphRequest { + return { drpId: isSet(object.drpId) ? globalThis.String(object.drpId) : "" }; + }, + + toJSON(message: GetDRPHashGraphRequest): unknown { + const obj: any = {}; + if (message.drpId !== "") { + obj.drpId = message.drpId; + } + return obj; + }, + + create, I>>(base?: I): GetDRPHashGraphRequest { + return GetDRPHashGraphRequest.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): GetDRPHashGraphRequest { + const message = createBaseGetDRPHashGraphRequest(); + message.drpId = object.drpId ?? ""; + return message; + }, +}; + +function createBaseGetDRPHashGraphResponse(): GetDRPHashGraphResponse { + return { verticesHashes: [] }; +} + +export const GetDRPHashGraphResponse = { + encode(message: GetDRPHashGraphResponse, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + for (const v of message.verticesHashes) { + writer.uint32(10).string(v!); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): GetDRPHashGraphResponse { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseGetDRPHashGraphResponse(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + + message.verticesHashes.push(reader.string()); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): GetDRPHashGraphResponse { + return { + verticesHashes: globalThis.Array.isArray(object?.verticesHashes) + ? object.verticesHashes.map((e: any) => globalThis.String(e)) + : [], + }; + }, + + toJSON(message: GetDRPHashGraphResponse): unknown { + const obj: any = {}; + if (message.verticesHashes?.length) { + obj.verticesHashes = message.verticesHashes; + } + return obj; + }, + + create, I>>(base?: I): GetDRPHashGraphResponse { + return GetDRPHashGraphResponse.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): GetDRPHashGraphResponse { + const message = createBaseGetDRPHashGraphResponse(); + message.verticesHashes = object.verticesHashes?.map((e) => e) || []; + return message; + }, +}; + +export interface DRPRpc { + subscribeDRP(request: SubscribeDRPRequest): Promise; + unsubscribeDRP(request: UnsubscribeDRPRequest): Promise; + getDRPHashGraph(request: GetDRPHashGraphRequest): Promise; +} + +export const DRPRpcServiceName = "drp.node.DRPRpc"; +export class DRPRpcClientImpl implements DRPRpc { + private readonly rpc: Rpc; + private readonly service: string; + constructor(rpc: Rpc, opts?: { service?: string }) { + this.service = opts?.service || DRPRpcServiceName; + this.rpc = rpc; + this.subscribeDRP = this.subscribeDRP.bind(this); + this.unsubscribeDRP = this.unsubscribeDRP.bind(this); + this.getDRPHashGraph = this.getDRPHashGraph.bind(this); + } + subscribeDRP(request: SubscribeDRPRequest): Promise { + const data = SubscribeDRPRequest.encode(request).finish(); + const promise = this.rpc.request(this.service, "subscribeDRP", data); + return promise.then((data) => SubscribeDRPResponse.decode(new BinaryReader(data))); + } + + unsubscribeDRP(request: UnsubscribeDRPRequest): Promise { + const data = UnsubscribeDRPRequest.encode(request).finish(); + const promise = this.rpc.request(this.service, "unsubscribeDRP", data); + return promise.then((data) => UnsubscribeDRPResponse.decode(new BinaryReader(data))); + } + + getDRPHashGraph(request: GetDRPHashGraphRequest): Promise { + const data = GetDRPHashGraphRequest.encode(request).finish(); + const promise = this.rpc.request(this.service, "getDRPHashGraph", data); + return promise.then((data) => GetDRPHashGraphResponse.decode(new BinaryReader(data))); + } +} + +interface Rpc { + request(service: string, method: string, data: Uint8Array): Promise; +} + +type Builtin = Date | Function | Uint8Array | string | number | boolean | undefined; + +export type DeepPartial = T extends Builtin ? T + : T extends globalThis.Array ? globalThis.Array> + : T extends ReadonlyArray ? ReadonlyArray> + : T extends {} ? { [K in keyof T]?: DeepPartial } + : Partial; + +type KeysOfUnion = T extends T ? keyof T : never; +export type Exact = P extends Builtin ? P + : P & { [K in keyof P]: Exact } & { [K in Exclude>]: never }; + +function isSet(value: any): boolean { + return value !== null && value !== undefined; +} diff --git a/packages/node/src/proto/topology/node/rpc.proto b/packages/node/src/proto/topology/node/rpc.proto deleted file mode 100644 index b4dfa92c..00000000 --- a/packages/node/src/proto/topology/node/rpc.proto +++ /dev/null @@ -1,35 +0,0 @@ -syntax = "proto3"; -package topology.node; - -service TopologyRpc { - rpc subscribeCro(SubscribeCroRequest) returns (SubscribeCroResponse); - rpc unsubscribeCro(UnsubscribeCroRequest) returns (UnsubscribeCroResponse); - rpc getCroHashGraph(GetCroHashGraphRequest) returns (GetCroHashGraphResponse); -} - -message SubscribeCroRequest { - string cro_id = 1; -} - -message SubscribeCroResponse { - // can return error codes if different than 0 - int32 return_code = 1; -} - -message UnsubscribeCroRequest { - string cro_id = 1; -} - -message UnsubscribeCroResponse { - // can return error codes if different than 0 - int32 return_code = 1; -} - -message GetCroHashGraphRequest { - string cro_id = 1; -} - -message GetCroHashGraphResponse { - // linearized vertices hashes - repeated string vertices_hashes = 1; -} diff --git a/packages/node/src/proto/topology/node/rpc_grpc_pb.js b/packages/node/src/proto/topology/node/rpc_grpc_pb.js deleted file mode 100644 index fbb71865..00000000 --- a/packages/node/src/proto/topology/node/rpc_grpc_pb.js +++ /dev/null @@ -1,91 +0,0 @@ -import * as node_src_proto_rpc_pb from './rpc_pb.js'; - -function serialize_topology_node_GetCroHashGraphRequest(arg) { - let encoded = node_src_proto_rpc_pb.GetCroHashGraphRequest.encode(arg).finish() - return Buffer.from(encoded); -} - -function deserialize_topology_node_GetCroHashGraphRequest(buffer_arg) { - return node_src_proto_rpc_pb.GetCroHashGraphRequest.decode(new Uint8Array(buffer_arg)); -} - -function serialize_topology_node_GetCroHashGraphResponse(arg) { - let encoded = node_src_proto_rpc_pb.GetCroHashGraphResponse.encode(arg).finish() - return Buffer.from(encoded); -} - -function deserialize_topology_node_GetCroHashGraphResponse(buffer_arg) { - return node_src_proto_rpc_pb.GetCroHashGraphResponse.decode(new Uint8Array(buffer_arg)); -} - -function serialize_topology_node_SubscribeCroRequest(arg) { - let encoded = node_src_proto_rpc_pb.SubscribeCroRequest.encode(arg).finish() - return Buffer.from(encoded); -} - -function deserialize_topology_node_SubscribeCroRequest(buffer_arg) { - return node_src_proto_rpc_pb.SubscribeCroRequest.decode(new Uint8Array(buffer_arg)); -} - -function serialize_topology_node_SubscribeCroResponse(arg) { - let encoded = node_src_proto_rpc_pb.SubscribeCroResponse.encode(arg).finish() - return Buffer.from(encoded); -} - -function deserialize_topology_node_SubscribeCroResponse(buffer_arg) { - return node_src_proto_rpc_pb.SubscribeCroResponse.decode(new Uint8Array(buffer_arg)); -} - -function serialize_topology_node_UnsubscribeCroRequest(arg) { - let encoded = node_src_proto_rpc_pb.UnsubscribeCroRequest.encode(arg).finish() - return Buffer.from(encoded); -} - -function deserialize_topology_node_UnsubscribeCroRequest(buffer_arg) { - return node_src_proto_rpc_pb.UnsubscribeCroRequest.decode(new Uint8Array(buffer_arg)); -} - -function serialize_topology_node_UnsubscribeCroResponse(arg) { - let encoded = node_src_proto_rpc_pb.UnsubscribeCroResponse.encode(arg).finish() - return Buffer.from(encoded); -} - -function deserialize_topology_node_UnsubscribeCroResponse(buffer_arg) { - return node_src_proto_rpc_pb.UnsubscribeCroResponse.decode(new Uint8Array(buffer_arg)); -} - -export const TopologyRpcService = { - subscribeCro: { - path: '/topology.node.TopologyRpc/subscribeCro', - requestStream: false, - responseStream: false, - requestType: node_src_proto_rpc_pb.SubscribeCroRequest, - responseType: node_src_proto_rpc_pb.SubscribeCroResponse, - requestSerialize: serialize_topology_node_SubscribeCroRequest, - requestDeserialize: deserialize_topology_node_SubscribeCroRequest, - responseSerialize: serialize_topology_node_SubscribeCroResponse, - responseDeserialize: deserialize_topology_node_SubscribeCroResponse, - }, - unsubscribeCro: { - path: '/topology.node.TopologyRpc/unsubscribeCro', - requestStream: false, - responseStream: false, - requestType: node_src_proto_rpc_pb.UnsubscribeCroRequest, - responseType: node_src_proto_rpc_pb.UnsubscribeCroResponse, - requestSerialize: serialize_topology_node_UnsubscribeCroRequest, - requestDeserialize: deserialize_topology_node_UnsubscribeCroRequest, - responseSerialize: serialize_topology_node_UnsubscribeCroResponse, - responseDeserialize: deserialize_topology_node_UnsubscribeCroResponse, - }, - getCroHashGraph: { - path: '/topology.node.TopologyRpc/getCroHashGraph', - requestStream: false, - responseStream: false, - requestType: node_src_proto_rpc_pb.GetCroHashGraphRequest, - responseType: node_src_proto_rpc_pb.GetCroHashGraphResponse, - requestSerialize: serialize_topology_node_GetCroHashGraphRequest, - requestDeserialize: deserialize_topology_node_GetCroHashGraphRequest, - responseSerialize: serialize_topology_node_GetCroHashGraphResponse, - responseDeserialize: deserialize_topology_node_GetCroHashGraphResponse, - }, -}; diff --git a/packages/node/src/proto/topology/node/rpc_pb.ts b/packages/node/src/proto/topology/node/rpc_pb.ts deleted file mode 100644 index 76d35e63..00000000 --- a/packages/node/src/proto/topology/node/rpc_pb.ts +++ /dev/null @@ -1,439 +0,0 @@ -// Code generated by protoc-gen-ts_proto. DO NOT EDIT. -// versions: -// protoc-gen-ts_proto v2.0.3 -// protoc unknown -// source: node/src/proto/rpc.proto - -/* eslint-disable */ -import { BinaryReader, BinaryWriter } from "@bufbuild/protobuf/wire"; - -export const protobufPackage = "topology.node"; - -export interface SubscribeCroRequest { - croId: string; -} - -export interface SubscribeCroResponse { - /** can return error codes if different than 0 */ - returnCode: number; -} - -export interface UnsubscribeCroRequest { - croId: string; -} - -export interface UnsubscribeCroResponse { - /** can return error codes if different than 0 */ - returnCode: number; -} - -export interface GetCroHashGraphRequest { - croId: string; -} - -export interface GetCroHashGraphResponse { - /** linearized vertices hashes */ - verticesHashes: string[]; -} - -function createBaseSubscribeCroRequest(): SubscribeCroRequest { - return { croId: "" }; -} - -export const SubscribeCroRequest = { - encode(message: SubscribeCroRequest, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { - if (message.croId !== "") { - writer.uint32(10).string(message.croId); - } - return writer; - }, - - decode(input: BinaryReader | Uint8Array, length?: number): SubscribeCroRequest { - const reader = input instanceof BinaryReader ? input : new BinaryReader(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseSubscribeCroRequest(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.croId = reader.string(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skip(tag & 7); - } - return message; - }, - - fromJSON(object: any): SubscribeCroRequest { - return { croId: isSet(object.croId) ? globalThis.String(object.croId) : "" }; - }, - - toJSON(message: SubscribeCroRequest): unknown { - const obj: any = {}; - if (message.croId !== "") { - obj.croId = message.croId; - } - return obj; - }, - - create, I>>(base?: I): SubscribeCroRequest { - return SubscribeCroRequest.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): SubscribeCroRequest { - const message = createBaseSubscribeCroRequest(); - message.croId = object.croId ?? ""; - return message; - }, -}; - -function createBaseSubscribeCroResponse(): SubscribeCroResponse { - return { returnCode: 0 }; -} - -export const SubscribeCroResponse = { - encode(message: SubscribeCroResponse, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { - if (message.returnCode !== 0) { - writer.uint32(8).int32(message.returnCode); - } - return writer; - }, - - decode(input: BinaryReader | Uint8Array, length?: number): SubscribeCroResponse { - const reader = input instanceof BinaryReader ? input : new BinaryReader(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseSubscribeCroResponse(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 8) { - break; - } - - message.returnCode = reader.int32(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skip(tag & 7); - } - return message; - }, - - fromJSON(object: any): SubscribeCroResponse { - return { returnCode: isSet(object.returnCode) ? globalThis.Number(object.returnCode) : 0 }; - }, - - toJSON(message: SubscribeCroResponse): unknown { - const obj: any = {}; - if (message.returnCode !== 0) { - obj.returnCode = Math.round(message.returnCode); - } - return obj; - }, - - create, I>>(base?: I): SubscribeCroResponse { - return SubscribeCroResponse.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): SubscribeCroResponse { - const message = createBaseSubscribeCroResponse(); - message.returnCode = object.returnCode ?? 0; - return message; - }, -}; - -function createBaseUnsubscribeCroRequest(): UnsubscribeCroRequest { - return { croId: "" }; -} - -export const UnsubscribeCroRequest = { - encode(message: UnsubscribeCroRequest, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { - if (message.croId !== "") { - writer.uint32(10).string(message.croId); - } - return writer; - }, - - decode(input: BinaryReader | Uint8Array, length?: number): UnsubscribeCroRequest { - const reader = input instanceof BinaryReader ? input : new BinaryReader(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseUnsubscribeCroRequest(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.croId = reader.string(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skip(tag & 7); - } - return message; - }, - - fromJSON(object: any): UnsubscribeCroRequest { - return { croId: isSet(object.croId) ? globalThis.String(object.croId) : "" }; - }, - - toJSON(message: UnsubscribeCroRequest): unknown { - const obj: any = {}; - if (message.croId !== "") { - obj.croId = message.croId; - } - return obj; - }, - - create, I>>(base?: I): UnsubscribeCroRequest { - return UnsubscribeCroRequest.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): UnsubscribeCroRequest { - const message = createBaseUnsubscribeCroRequest(); - message.croId = object.croId ?? ""; - return message; - }, -}; - -function createBaseUnsubscribeCroResponse(): UnsubscribeCroResponse { - return { returnCode: 0 }; -} - -export const UnsubscribeCroResponse = { - encode(message: UnsubscribeCroResponse, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { - if (message.returnCode !== 0) { - writer.uint32(8).int32(message.returnCode); - } - return writer; - }, - - decode(input: BinaryReader | Uint8Array, length?: number): UnsubscribeCroResponse { - const reader = input instanceof BinaryReader ? input : new BinaryReader(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseUnsubscribeCroResponse(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 8) { - break; - } - - message.returnCode = reader.int32(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skip(tag & 7); - } - return message; - }, - - fromJSON(object: any): UnsubscribeCroResponse { - return { returnCode: isSet(object.returnCode) ? globalThis.Number(object.returnCode) : 0 }; - }, - - toJSON(message: UnsubscribeCroResponse): unknown { - const obj: any = {}; - if (message.returnCode !== 0) { - obj.returnCode = Math.round(message.returnCode); - } - return obj; - }, - - create, I>>(base?: I): UnsubscribeCroResponse { - return UnsubscribeCroResponse.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): UnsubscribeCroResponse { - const message = createBaseUnsubscribeCroResponse(); - message.returnCode = object.returnCode ?? 0; - return message; - }, -}; - -function createBaseGetCroHashGraphRequest(): GetCroHashGraphRequest { - return { croId: "" }; -} - -export const GetCroHashGraphRequest = { - encode(message: GetCroHashGraphRequest, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { - if (message.croId !== "") { - writer.uint32(10).string(message.croId); - } - return writer; - }, - - decode(input: BinaryReader | Uint8Array, length?: number): GetCroHashGraphRequest { - const reader = input instanceof BinaryReader ? input : new BinaryReader(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseGetCroHashGraphRequest(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.croId = reader.string(); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skip(tag & 7); - } - return message; - }, - - fromJSON(object: any): GetCroHashGraphRequest { - return { croId: isSet(object.croId) ? globalThis.String(object.croId) : "" }; - }, - - toJSON(message: GetCroHashGraphRequest): unknown { - const obj: any = {}; - if (message.croId !== "") { - obj.croId = message.croId; - } - return obj; - }, - - create, I>>(base?: I): GetCroHashGraphRequest { - return GetCroHashGraphRequest.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): GetCroHashGraphRequest { - const message = createBaseGetCroHashGraphRequest(); - message.croId = object.croId ?? ""; - return message; - }, -}; - -function createBaseGetCroHashGraphResponse(): GetCroHashGraphResponse { - return { verticesHashes: [] }; -} - -export const GetCroHashGraphResponse = { - encode(message: GetCroHashGraphResponse, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { - for (const v of message.verticesHashes) { - writer.uint32(10).string(v!); - } - return writer; - }, - - decode(input: BinaryReader | Uint8Array, length?: number): GetCroHashGraphResponse { - const reader = input instanceof BinaryReader ? input : new BinaryReader(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseGetCroHashGraphResponse(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - if (tag !== 10) { - break; - } - - message.verticesHashes.push(reader.string()); - continue; - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skip(tag & 7); - } - return message; - }, - - fromJSON(object: any): GetCroHashGraphResponse { - return { - verticesHashes: globalThis.Array.isArray(object?.verticesHashes) - ? object.verticesHashes.map((e: any) => globalThis.String(e)) - : [], - }; - }, - - toJSON(message: GetCroHashGraphResponse): unknown { - const obj: any = {}; - if (message.verticesHashes?.length) { - obj.verticesHashes = message.verticesHashes; - } - return obj; - }, - - create, I>>(base?: I): GetCroHashGraphResponse { - return GetCroHashGraphResponse.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): GetCroHashGraphResponse { - const message = createBaseGetCroHashGraphResponse(); - message.verticesHashes = object.verticesHashes?.map((e) => e) || []; - return message; - }, -}; - -export interface TopologyRpc { - subscribeCro(request: SubscribeCroRequest): Promise; - unsubscribeCro(request: UnsubscribeCroRequest): Promise; - getCroHashGraph(request: GetCroHashGraphRequest): Promise; -} - -export const TopologyRpcServiceName = "topology.node.TopologyRpc"; -export class TopologyRpcClientImpl implements TopologyRpc { - private readonly rpc: Rpc; - private readonly service: string; - constructor(rpc: Rpc, opts?: { service?: string }) { - this.service = opts?.service || TopologyRpcServiceName; - this.rpc = rpc; - this.subscribeCro = this.subscribeCro.bind(this); - this.unsubscribeCro = this.unsubscribeCro.bind(this); - this.getCroHashGraph = this.getCroHashGraph.bind(this); - } - subscribeCro(request: SubscribeCroRequest): Promise { - const data = SubscribeCroRequest.encode(request).finish(); - const promise = this.rpc.request(this.service, "subscribeCro", data); - return promise.then((data) => SubscribeCroResponse.decode(new BinaryReader(data))); - } - - unsubscribeCro(request: UnsubscribeCroRequest): Promise { - const data = UnsubscribeCroRequest.encode(request).finish(); - const promise = this.rpc.request(this.service, "unsubscribeCro", data); - return promise.then((data) => UnsubscribeCroResponse.decode(new BinaryReader(data))); - } - - getCroHashGraph(request: GetCroHashGraphRequest): Promise { - const data = GetCroHashGraphRequest.encode(request).finish(); - const promise = this.rpc.request(this.service, "getCroHashGraph", data); - return promise.then((data) => GetCroHashGraphResponse.decode(new BinaryReader(data))); - } -} - -interface Rpc { - request(service: string, method: string, data: Uint8Array): Promise; -} - -type Builtin = Date | Function | Uint8Array | string | number | boolean | undefined; - -export type DeepPartial = T extends Builtin ? T - : T extends globalThis.Array ? globalThis.Array> - : T extends ReadonlyArray ? ReadonlyArray> - : T extends {} ? { [K in keyof T]?: DeepPartial } - : Partial; - -type KeysOfUnion = T extends T ? keyof T : never; -export type Exact = P extends Builtin ? P - : P & { [K in keyof P]: Exact } & { [K in Exclude>]: never }; - -function isSet(value: any): boolean { - return value !== null && value !== undefined; -} diff --git a/packages/node/src/rpc/index.ts b/packages/node/src/rpc/index.ts index 480eac2d..b3cd0c01 100644 --- a/packages/node/src/rpc/index.ts +++ b/packages/node/src/rpc/index.ts @@ -1,92 +1,86 @@ import * as grpc from "@grpc/grpc-js"; import type { ServerUnaryCall, sendUnaryData } from "@grpc/grpc-js"; -import { Logger } from "@topology-foundation/logger"; -import type { TopologyNode } from "../index.js"; -import { TopologyRpcService } from "../proto/topology/node/rpc_grpc_pb.js"; +import { type DRPNode, log } from "../index.js"; +import { DRPRpcService } from "../proto/drp/node/v1/rpc_grpc_pb.js"; import type { - GetCroHashGraphRequest, - GetCroHashGraphResponse, - SubscribeCroRequest, - SubscribeCroResponse, - UnsubscribeCroRequest, - UnsubscribeCroResponse, -} from "../proto/topology/node/rpc_pb.js"; + GetDRPHashGraphRequest, + GetDRPHashGraphResponse, + SubscribeDRPRequest, + SubscribeDRPResponse, + UnsubscribeDRPRequest, + UnsubscribeDRPResponse, +} from "../proto/drp/node/v1/rpc_pb.js"; -export function init(node: TopologyNode) { - const log = new Logger( - "topology::rpc", - node.config?.network_config?.log_config, - ); - - function subscribeCro( - call: ServerUnaryCall, - callback: sendUnaryData, +export function init(node: DRPNode) { + function subscribeDRP( + call: ServerUnaryCall, + callback: sendUnaryData, ) { let returnCode = 0; try { - node.subscribeObject(call.request.croId); + node.subscribeObject(call.request.drpId); } catch (e) { - console.error(e); + log.error("::rpc::subscribeDRP: Error", e); returnCode = 1; } - const response: SubscribeCroResponse = { + const response: SubscribeDRPResponse = { returnCode, }; callback(null, response); } - function unsubscribeCro( - call: ServerUnaryCall, - callback: sendUnaryData, + function unsubscribeDRP( + call: ServerUnaryCall, + callback: sendUnaryData, ) { let returnCode = 0; try { - node.unsubscribeObject(call.request.croId); + node.unsubscribeObject(call.request.drpId); } catch (e) { - console.error(e); + log.error("::rpc::unsubscribeDRP: Error", e); returnCode = 1; } - const response: UnsubscribeCroResponse = { + const response: UnsubscribeDRPResponse = { returnCode, }; callback(null, response); } - function getCroHashGraph( - call: ServerUnaryCall, - callback: sendUnaryData, + function getDRPHashGraph( + call: ServerUnaryCall, + callback: sendUnaryData, ) { const hashes: string[] = []; try { - const object = node.objectStore.get(call.request.croId); - if (!object) throw Error("cro not found"); + const object = node.objectStore.get(call.request.drpId); + if (!object) throw Error("drp not found"); for (const v of object.hashGraph.getAllVertices()) { hashes.push(v.hash); } } catch (e) { - console.error(e); + log.error("::rpc::getDRPHashGraph: Error", e); } - const response: GetCroHashGraphResponse = { + const response: GetDRPHashGraphResponse = { verticesHashes: hashes, }; callback(null, response); } const server = new grpc.Server(); - server.addService(TopologyRpcService, { - subscribeCro, - unsubscribeCro, - getCroHashGraph, + server.addService(DRPRpcService, { + subscribeDRP, + unsubscribeDRP, + getDRPHashGraph, }); server.bindAsync( "0.0.0.0:6969", grpc.ServerCredentials.createInsecure(), (_error, _port) => { - log.info("running grpc in port:", _port); + log.info("::rpc::init: running grpc in port:", _port); }, ); } diff --git a/packages/node/src/run.ts b/packages/node/src/run.ts index 7de50daa..757a1ece 100644 --- a/packages/node/src/run.ts +++ b/packages/node/src/run.ts @@ -1,15 +1,15 @@ import { program } from "./cli/index.js"; import { loadConfig } from "./config.js"; -import { TopologyNode } from "./index.js"; -import type { TopologyNodeConfig } from "./index.js"; +import { DRPNode } from "./index.js"; +import type { DRPNodeConfig } from "./index.js"; import { init as rpc_init } from "./rpc/index.js"; const run = async () => { program.parse(process.argv); const opts = program.opts(); - const config: TopologyNodeConfig | undefined = loadConfig(opts.config); + const config: DRPNodeConfig | undefined = loadConfig(opts.config); - const node = new TopologyNode(config); + const node = new DRPNode(config); await node.start(); rpc_init(node); }; diff --git a/packages/node/src/store/index.ts b/packages/node/src/store/index.ts index ca097c85..450cff34 100644 --- a/packages/node/src/store/index.ts +++ b/packages/node/src/store/index.ts @@ -1,37 +1,37 @@ -import type { TopologyObject } from "@topology-foundation/object"; +import type { DRPObject } from "@ts-drp/object"; -export type TopologyObjectStoreCallback = ( +export type DRPObjectStoreCallback = ( objectId: string, - object: TopologyObject, + object: DRPObject, ) => void; -export class TopologyObjectStore { +export class DRPObjectStore { // TODO: should be abstracted in handling multiple types of storage - private _store: Map; - private _subscriptions: Map; + private _store: Map; + private _subscriptions: Map; constructor() { - this._store = new Map(); - this._subscriptions = new Map(); + this._store = new Map(); + this._subscriptions = new Map(); } - get(objectId: string): TopologyObject | undefined { + get(objectId: string): DRPObject | undefined { return this._store.get(objectId); } - put(objectId: string, object: TopologyObject) { + put(objectId: string, object: DRPObject) { this._store.set(objectId, object); this._notifySubscribers(objectId, object); } - subscribe(objectId: string, callback: TopologyObjectStoreCallback): void { + subscribe(objectId: string, callback: DRPObjectStoreCallback): void { if (!this._subscriptions.has(objectId)) { this._subscriptions.set(objectId, []); } this._subscriptions.get(objectId)?.push(callback); } - private _notifySubscribers(objectId: string, object: TopologyObject): void { + private _notifySubscribers(objectId: string, object: DRPObject): void { const callbacks = this._subscriptions.get(objectId); if (callbacks) { for (const callback of callbacks) { diff --git a/packages/object/README.md b/packages/object/README.md index 6f196dbf..82873efb 100644 --- a/packages/object/README.md +++ b/packages/object/README.md @@ -1,17 +1,16 @@ -# Conflict-free Replicated Objects (CROs) +# DRP Objects -This package provides a simple implementation of Conflict-free Replicated Objects (CROs) as defined in the Topology Protocol. CROs are a type of composable object that can be replicated across multiple nodes in a network, and can be updated concurrently by multiple clients without the need for coordination. +This package provides a simple implementation of Distributed Replicated Programs (DRPs). +DRPs are a type of composable programs that can be replicated across multiple nodes in a network, +and can be updated concurrently by multiple clients without the need for coordination. ## Usage -This package is intended to implement a basic abstract class that can be extended for the creation of custom CROs. Basic operations for synchronization are provided, but the implementation of the actual object behavior is left to the app developer. +This package is intended to implement all the fuctionalities for the creation of custom DRPs. +Basic operations for synchronization are provided, but the implementation of the actual program behavior is left to the app developer. For starting, you can install it using: ```bash -# yarn -yarn add @topology-foundation/object - -# npm -npm install @topology-foundation/object +pnpm install @ts-drp/object ``` diff --git a/packages/object/asconfig.json b/packages/object/asconfig.json deleted file mode 100644 index ccd4289b..00000000 --- a/packages/object/asconfig.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "entries": ["./src/index.ts"], - "targets": { - "debug": { - "outFile": "dist/asc/debug.wasm", - "textFile": "dist/asc/debug.wat", - "sourceMap": true, - "debug": true - }, - "release": { - "sourceMap": false, - "optimizeLevel": 3, - "shrinkLevel": 0, - "converge": false, - "noAssert": false - } - }, - "options": { - "lib": { - "@topology-foundation/blueprints": ["../blueprints/src/index.asc.ts"] - } - } -} diff --git a/packages/object/package.json b/packages/object/package.json index 66a872b1..c9990b67 100644 --- a/packages/object/package.json +++ b/packages/object/package.json @@ -1,42 +1,34 @@ { - "name": "@topology-foundation/object", - "version": "0.3.1", - "license": "MIT", - "repository": { - "type": "git", - "url": "git+https://github.com/topology-foundation/ts-topology.git" - }, - "type": "module", - "types": "./dist/src/index.d.ts", - "files": [ - "src", - "dist", - "!dist/test", - "!**/*.tsbuildinfo" - ], - "main": "./dist/src/index.js", - "exports": { - ".": { - "types": "./dist/src/index.d.ts", - "import": "./dist/src/index.js" - } - }, - "scripts": { - "asbuild": "asc --config asconfig.json --target release", - "build": "tsc -b", - "clean": "rm -rf dist/ node_modules/", - "prepack": "tsc -b", - "test": "vitest", - "benchmark": "npx tsx tests/hashgraph.bench.ts | tee benchmark-output.txt" - }, - "devDependencies": { - "assemblyscript": "^0.27.29", - "benchmark": "^2.1.4", - "tsx": "4.19.1" - }, - "dependencies": { - "@bufbuild/protobuf": "^2.0.0", - "@topology-foundation/logger": "^0.3.1", - "ts-proto": "^2.2.4" - } + "name": "@ts-drp/object", + "version": "0.3.1", + "license": "MIT", + "repository": { + "type": "git", + "url": "git+https://github.com/topology-foundation/ts-drp.git" + }, + "type": "module", + "types": "./dist/src/index.d.ts", + "files": ["src", "dist", "!dist/test", "!**/*.tsbuildinfo"], + "main": "./dist/src/index.js", + "exports": { + ".": { + "types": "./dist/src/index.d.ts", + "import": "./dist/src/index.js" + } + }, + "scripts": { + "build": "tsc -b", + "clean": "rm -rf dist/ node_modules/", + "prepack": "tsc -b", + "test": "vitest", + "benchmark": "tsx tests/hashgraph.bench.ts | tee benchmark-output.txt" + }, + "devDependencies": { + "@bufbuild/protobuf": "^2.0.0", + "benchmark": "^2.1.4", + "tsx": "4.19.1" + }, + "dependencies": { + "@ts-drp/logger": "^0.3.1" + } } diff --git a/packages/object/src/hashgraph/index.ts b/packages/object/src/hashgraph/index.ts index 6d0a0b25..97b23657 100644 --- a/packages/object/src/hashgraph/index.ts +++ b/packages/object/src/hashgraph/index.ts @@ -1,15 +1,13 @@ import * as crypto from "node:crypto"; -import { Logger } from "@topology-foundation/logger"; +import { log } from "../index.js"; import { linearizeMultiple } from "../linearize/multipleSemantics.js"; import { linearizePair } from "../linearize/pairSemantics.js"; import { Vertex_Operation as Operation, Vertex, -} from "../proto/topology/object/object_pb.js"; +} from "../proto/drp/object/v1/object_pb.js"; import { BitSet } from "./bitset.js"; -const log: Logger = new Logger("hashgraph"); - // Reexporting the Vertex and Operation types from the protobuf file export { Vertex, Operation }; diff --git a/packages/object/src/index.ts b/packages/object/src/index.ts index 0dcc11b4..bcc83e74 100644 --- a/packages/object/src/index.ts +++ b/packages/object/src/index.ts @@ -1,4 +1,5 @@ import * as crypto from "node:crypto"; +import { Logger, type LoggerOptions } from "@ts-drp/logger"; import { HashGraph, type Operation, @@ -6,42 +7,56 @@ import { type SemanticsType, type Vertex, } from "./hashgraph/index.js"; -import * as ObjectPb from "./proto/topology/object/object_pb.js"; +import * as ObjectPb from "./proto/drp/object/v1/object_pb.js"; -export * as ObjectPb from "./proto/topology/object/object_pb.js"; +export * as ObjectPb from "./proto/drp/object/v1/object_pb.js"; export * from "./hashgraph/index.js"; -export interface CRO { +export interface DRP { operations: string[]; semanticsType: SemanticsType; resolveConflicts: (vertices: Vertex[]) => ResolveConflictsType; mergeCallback: (operations: Operation[]) => void; } -export type TopologyObjectCallback = ( - object: TopologyObject, +export type DRPObjectCallback = ( + object: DRPObject, origin: string, vertices: ObjectPb.Vertex[], ) => void; -export interface ITopologyObject extends ObjectPb.TopologyObjectBase { - cro: ProxyHandler | null; +export interface IDRPObject extends ObjectPb.DRPObjectBase { + drp: ProxyHandler | null; hashGraph: HashGraph; - subscriptions: TopologyObjectCallback[]; + subscriptions: DRPObjectCallback[]; } -export class TopologyObject implements ITopologyObject { +// snake_casing to match the JSON config +export interface DRPObjectConfig { + log_config?: LoggerOptions; +} + +export let log: Logger; + +export class DRPObject implements IDRPObject { nodeId: string; id: string; abi: string; bytecode: Uint8Array; vertices: ObjectPb.Vertex[]; - cro: ProxyHandler | null; + drp: ProxyHandler | null; hashGraph: HashGraph; - subscriptions: TopologyObjectCallback[]; - - constructor(nodeId: string, cro: CRO, id?: string, abi?: string) { + subscriptions: DRPObjectCallback[]; + + constructor( + nodeId: string, + drp: DRP, + id?: string, + abi?: string, + config?: DRPObjectConfig, + ) { this.nodeId = nodeId; + log = new Logger("drp::object", config?.log_config); this.id = id ?? crypto @@ -53,19 +68,19 @@ export class TopologyObject implements ITopologyObject { this.abi = abi ?? ""; this.bytecode = new Uint8Array(); this.vertices = []; - this.cro = new Proxy(cro, this.proxyCROHandler()); + this.drp = drp ? new Proxy(drp, this.proxyDRPHandler()) : null; this.hashGraph = new HashGraph( nodeId, - cro.resolveConflicts.bind(cro), - cro.semanticsType, + drp?.resolveConflicts?.bind(drp ?? this), + drp?.semanticsType, ); this.subscriptions = []; this.vertices = this.hashGraph.getAllVertices(); } - // This function is black magic, it allows us to intercept calls to the CRO object - proxyCROHandler(): ProxyHandler { + // This function is black magic, it allows us to intercept calls to the DRP object + proxyDRPHandler(): ProxyHandler { const obj = this; return { get(target, propKey, receiver) { @@ -125,13 +140,13 @@ export class TopologyObject implements ITopologyObject { const operations = this.hashGraph.linearizeOperations(); this.vertices = this.hashGraph.getAllVertices(); - (this.cro as CRO).mergeCallback(operations); + (this.drp as DRP).mergeCallback(operations); this._notify("merge", this.vertices); return [missing.length === 0, missing]; } - subscribe(callback: TopologyObjectCallback) { + subscribe(callback: DRPObjectCallback) { this.subscriptions.push(callback); } diff --git a/packages/object/src/proto/topology/object/object.proto b/packages/object/src/proto/drp/object/v1/object.proto similarity index 75% rename from packages/object/src/proto/topology/object/object.proto rename to packages/object/src/proto/drp/object/v1/object.proto index db9d6c2b..5dd8d9c9 100644 --- a/packages/object/src/proto/topology/object/object.proto +++ b/packages/object/src/proto/drp/object/v1/object.proto @@ -1,11 +1,9 @@ syntax = "proto3"; -package topology.object; +package drp.object.v1; import "google/protobuf/struct.proto"; -option go_package = "ts-topology/packages/object"; - // Supposed to be the RIBLT stuff message Vertex { message Operation { @@ -13,12 +11,12 @@ message Vertex { google.protobuf.Value value = 2; } string hash = 1; - string nodeId = 2; + string node_id = 2; Operation operation = 3; repeated string dependencies = 4; } -message TopologyObjectBase { +message DRPObjectBase { string id = 1; optional string abi = 2; optional bytes bytecode = 3; diff --git a/packages/object/src/proto/topology/object/object_pb.ts b/packages/object/src/proto/drp/object/v1/object_pb.ts similarity index 91% rename from packages/object/src/proto/topology/object/object_pb.ts rename to packages/object/src/proto/drp/object/v1/object_pb.ts index e73d21e0..4db66f75 100644 --- a/packages/object/src/proto/topology/object/object_pb.ts +++ b/packages/object/src/proto/drp/object/v1/object_pb.ts @@ -2,13 +2,13 @@ // versions: // protoc-gen-ts_proto v2.2.5 // protoc unknown -// source: topology/object/object.proto +// source: drp/object/v1/object.proto /* eslint-disable */ import { BinaryReader, BinaryWriter } from "@bufbuild/protobuf/wire"; -import { Value } from "../../google/protobuf/struct_pb.js"; +import { Value } from "../../../google/protobuf/struct_pb.js"; -export const protobufPackage = "topology.object"; +export const protobufPackage = "drp.object.v1"; /** Supposed to be the RIBLT stuff */ export interface Vertex { @@ -23,7 +23,7 @@ export interface Vertex_Operation { value: any | undefined; } -export interface TopologyObjectBase { +export interface DRPObjectBase { id: string; abi?: string | undefined; bytecode?: Uint8Array | undefined; @@ -218,12 +218,12 @@ export const Vertex_Operation: MessageFns = { }, }; -function createBaseTopologyObjectBase(): TopologyObjectBase { +function createBaseDRPObjectBase(): DRPObjectBase { return { id: "", abi: undefined, bytecode: undefined, vertices: [] }; } -export const TopologyObjectBase: MessageFns = { - encode(message: TopologyObjectBase, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { +export const DRPObjectBase: MessageFns = { + encode(message: DRPObjectBase, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { if (message.id !== "") { writer.uint32(10).string(message.id); } @@ -239,10 +239,10 @@ export const TopologyObjectBase: MessageFns = { return writer; }, - decode(input: BinaryReader | Uint8Array, length?: number): TopologyObjectBase { + decode(input: BinaryReader | Uint8Array, length?: number): DRPObjectBase { const reader = input instanceof BinaryReader ? input : new BinaryReader(input); let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseTopologyObjectBase(); + const message = createBaseDRPObjectBase(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { @@ -287,7 +287,7 @@ export const TopologyObjectBase: MessageFns = { return message; }, - fromJSON(object: any): TopologyObjectBase { + fromJSON(object: any): DRPObjectBase { return { id: isSet(object.id) ? globalThis.String(object.id) : "", abi: isSet(object.abi) ? globalThis.String(object.abi) : undefined, @@ -296,7 +296,7 @@ export const TopologyObjectBase: MessageFns = { }; }, - toJSON(message: TopologyObjectBase): unknown { + toJSON(message: DRPObjectBase): unknown { const obj: any = {}; if (message.id !== "") { obj.id = message.id; @@ -313,11 +313,11 @@ export const TopologyObjectBase: MessageFns = { return obj; }, - create, I>>(base?: I): TopologyObjectBase { - return TopologyObjectBase.fromPartial(base ?? ({} as any)); + create, I>>(base?: I): DRPObjectBase { + return DRPObjectBase.fromPartial(base ?? ({} as any)); }, - fromPartial, I>>(object: I): TopologyObjectBase { - const message = createBaseTopologyObjectBase(); + fromPartial, I>>(object: I): DRPObjectBase { + const message = createBaseDRPObjectBase(); message.id = object.id ?? ""; message.abi = object.abi ?? undefined; message.bytecode = object.bytecode ?? undefined; diff --git a/packages/object/src/proto/topology/object/object_grpc_pb.js b/packages/object/src/proto/topology/object/object_grpc_pb.js deleted file mode 100644 index 97b3a246..00000000 --- a/packages/object/src/proto/topology/object/object_grpc_pb.js +++ /dev/null @@ -1 +0,0 @@ -// GENERATED CODE -- NO SERVICES IN PROTO \ No newline at end of file diff --git a/packages/object/src/wasm/compiler.ts b/packages/object/src/wasm/compiler.ts deleted file mode 100644 index 343fd4a2..00000000 --- a/packages/object/src/wasm/compiler.ts +++ /dev/null @@ -1,47 +0,0 @@ -/* Logic for compiling Topology CROs to wasm and extracting: - - Bytecode - - ABI -*/ -import * as fs from "node:fs"; -import { Logger } from "@topology-foundation/logger"; -import asc from "assemblyscript/asc"; - -export async function compileWasm(path: string) { - const log = new Logger("topology::wasm", { level: "info" }); - - log.info("Compiling", path); - const { error, stderr } = await asc.main( - [path, "--bindings=esm", "--outFile=/tmp/dist.wasm"], - { - readFile: (filename: string) => { - if (!fs.existsSync(filename)) return null; - return fs - .readFileSync(filename, "utf8") - .replace( - "@topology-foundation/blueprints", - "@topology-foundation/blueprints/src/index.asc", - ); - }, - writeFile: ( - filename: string, - contents: string | Uint8Array, - baseDir: string, - ) => fs.writeFileSync(filename, contents), - listFiles: () => [], - }, - ); - - if (error) { - log.info(`Compilation failed: ${error}`); - log.info(stderr.toString()); - return new Uint8Array(); - } - - // read tmp file into uint8array - const bytecode: Uint8Array = new Uint8Array( - fs.readFileSync("/tmp/dist.wasm"), - ); - // fs.unlinkSync('dist/tmp.wasm'); - log.info("Compilation successful", bytecode); - return bytecode; -} diff --git a/packages/object/tests/causallyrelated.bench.ts b/packages/object/tests/causallyrelated.bench.ts index 1eaf0963..a9c79e04 100644 --- a/packages/object/tests/causallyrelated.bench.ts +++ b/packages/object/tests/causallyrelated.bench.ts @@ -1,34 +1,34 @@ import { bench, describe } from "vitest"; import { AddWinsSet } from "../../blueprints/src/AddWinsSet/index.js"; -import { type Hash, TopologyObject } from "../src/index.js"; +import { DRPObject, type Hash } from "../src/index.js"; describe("AreCausallyDependent benchmark", async () => { const samples = 100000; const tests: Hash[][] = []; - const obj1 = new TopologyObject("peer1", new AddWinsSet()); - const obj2 = new TopologyObject("peer2", new AddWinsSet()); - const obj3 = new TopologyObject("peer3", new AddWinsSet()); + const obj1 = new DRPObject("peer1", new AddWinsSet()); + const obj2 = new DRPObject("peer2", new AddWinsSet()); + const obj3 = new DRPObject("peer3", new AddWinsSet()); - const cro1 = obj1.cro as AddWinsSet; - const cro2 = obj2.cro as AddWinsSet; - const cro3 = obj3.cro as AddWinsSet; + const drp1 = obj1.drp as AddWinsSet; + const drp2 = obj2.drp as AddWinsSet; + const drp3 = obj3.drp as AddWinsSet; - cro1.add(1); + drp1.add(1); obj2.merge(obj1.hashGraph.getAllVertices()); - cro1.add(1); - cro1.remove(2); - cro2.remove(2); - cro2.add(2); + drp1.add(1); + drp1.remove(2); + drp2.remove(2); + drp2.add(2); obj3.merge(obj1.hashGraph.getAllVertices()); - cro3.add(3); - cro1.remove(1); + drp3.add(3); + drp1.remove(1); obj1.merge(obj2.hashGraph.getAllVertices()); - cro1.remove(3); - cro2.remove(1); + drp1.remove(3); + drp2.remove(1); obj1.merge(obj2.hashGraph.getAllVertices()); obj1.merge(obj3.hashGraph.getAllVertices()); diff --git a/packages/object/tests/hashgraph.bench.ts b/packages/object/tests/hashgraph.bench.ts index eaa77791..26658f16 100644 --- a/packages/object/tests/hashgraph.bench.ts +++ b/packages/object/tests/hashgraph.bench.ts @@ -1,30 +1,30 @@ import Benchmark from "benchmark"; import { AddWinsSet } from "../../blueprints/src/AddWinsSet/index.js"; -import { TopologyObject } from "../src/index.js"; +import { DRPObject } from "../src/index.js"; function benchmarkForAddWinSet( name: string, - numCROs: number, - verticesPerCRO: number, + numDRPs: number, + verticesPerDRP: number, mergeFn: boolean, ) { return suite.add(name, () => { - const objects: TopologyObject[] = []; - for (let i = 0; i < numCROs; i++) { - const obj: TopologyObject = new TopologyObject( + const objects: DRPObject[] = []; + for (let i = 0; i < numDRPs; i++) { + const obj: DRPObject = new DRPObject( `peer${i + 1}`, new AddWinsSet(), ); - const cro = obj.cro as AddWinsSet; - for (let j = 0; j < verticesPerCRO; j++) { + const drp = obj.drp as AddWinsSet; + for (let j = 0; j < verticesPerDRP; j++) { if (i % 3 === 2) { - cro.add(j); - cro.remove(j); + drp.add(j); + drp.remove(j); } else if (i % 3 === 1) { - cro.remove(j); - cro.add(j); + drp.remove(j); + drp.add(j); } else { - cro.add(j); + drp.add(j); } } objects.push(obj); @@ -47,7 +47,7 @@ const suite = new Benchmark.Suite(); benchmarkForAddWinSet("Create HashGraph with 1000 vertices", 1, 1000, false); benchmarkForAddWinSet( - "Create 2 CROs (1000 vertices each) and Merge", + "Create 2 DRP Objects (1000 vertices each) and Merge", 2, 1000, true, diff --git a/packages/object/tests/hashgraph.test.ts b/packages/object/tests/hashgraph.test.ts index e7c36689..725e0313 100644 --- a/packages/object/tests/hashgraph.test.ts +++ b/packages/object/tests/hashgraph.test.ts @@ -1,30 +1,30 @@ import { beforeEach, describe, expect, test } from "vitest"; import { AddWinsSet } from "../../blueprints/src/AddWinsSet/index.js"; import { PseudoRandomWinsSet } from "../../blueprints/src/PseudoRandomWinsSet/index.js"; -import { type Operation, OperationType, TopologyObject } from "../src/index.js"; +import { DRPObject, type Operation, OperationType } from "../src/index.js"; describe("HashGraph construction tests", () => { - let obj1: TopologyObject; - let obj2: TopologyObject; + let obj1: DRPObject; + let obj2: DRPObject; beforeEach(async () => { - obj1 = new TopologyObject("peer1", new AddWinsSet()); - obj2 = new TopologyObject("peer2", new AddWinsSet()); + obj1 = new DRPObject("peer1", new AddWinsSet()); + obj2 = new DRPObject("peer2", new AddWinsSet()); }); test("Test: Vertices are consistent across data structures", () => { expect(obj1.vertices).toEqual(obj1.hashGraph.getAllVertices()); - const cro1 = obj1.cro as AddWinsSet; - const cro2 = obj2.cro as AddWinsSet; + const drp1 = obj1.drp as AddWinsSet; + const drp2 = obj2.drp as AddWinsSet; for (let i = 0; i < 100; i++) { - cro1.add(i); + drp1.add(i); expect(obj1.vertices).toEqual(obj1.hashGraph.getAllVertices()); } for (let i = 0; i < 100; i++) { - cro2.add(i); + drp2.add(i); } obj1.merge(obj2.hashGraph.getAllVertices()); @@ -33,14 +33,14 @@ describe("HashGraph construction tests", () => { test("Test: HashGraph should be DAG compatibility", () => { /* - V1:ADD(1) - root / + root / \ - V2:ADD(2) */ - const cro1 = obj1.cro as AddWinsSet; - const cro2 = obj2.cro as AddWinsSet; + const drp1 = obj1.drp as AddWinsSet; + const drp2 = obj2.drp as AddWinsSet; - cro1.add(1); - cro2.add(2); + drp1.add(1); + drp2.add(2); obj2.merge(obj1.hashGraph.getAllVertices()); @@ -53,13 +53,13 @@ describe("HashGraph construction tests", () => { ]); }); - test("Test: HashGraph has 2 root vertices", () => { - /* + test("Test: HashGraph with 2 root vertices", () => { + /* root - V1:ADD(1) fakeRoot - V2:ADD(1) */ - const cro1 = obj1.cro as AddWinsSet; - cro1.add(1); + const drp1 = obj1.drp as AddWinsSet; + drp1.add(1); // add fake root const hash = obj1.hashGraph.addVertex( { @@ -85,14 +85,14 @@ describe("HashGraph construction tests", () => { }); describe("HashGraph for AddWinSet tests", () => { - let obj1: TopologyObject; - let obj2: TopologyObject; - let obj3: TopologyObject; + let obj1: DRPObject; + let obj2: DRPObject; + let obj3: DRPObject; beforeEach(async () => { - obj1 = new TopologyObject("peer1", new AddWinsSet()); - obj2 = new TopologyObject("peer2", new AddWinsSet()); - obj3 = new TopologyObject("peer3", new AddWinsSet()); + obj1 = new DRPObject("peer1", new AddWinsSet()); + obj2 = new DRPObject("peer2", new AddWinsSet()); + obj3 = new DRPObject("peer3", new AddWinsSet()); }); test("Test: Add Two Vertices", () => { @@ -100,10 +100,10 @@ describe("HashGraph for AddWinSet tests", () => { V1:NOP <- V2:ADD(1) <- V2:REMOVE(1) */ - const cro1 = obj1.cro as AddWinsSet; - cro1.add(1); - cro1.remove(1); - expect(cro1.contains(1)).toBe(false); + const drp1 = obj1.drp as AddWinsSet; + drp1.add(1); + drp1.remove(1); + expect(drp1.contains(1)).toBe(false); const linearOps = obj1.hashGraph.linearizeOperations(); expect(linearOps).toEqual([ @@ -119,18 +119,18 @@ describe("HashGraph for AddWinSet tests", () => { \ _ V3:ADD(1) */ - const cro1 = obj1.cro as AddWinsSet; - const cro2 = obj2.cro as AddWinsSet; + const drp1 = obj1.drp as AddWinsSet; + const drp2 = obj2.drp as AddWinsSet; - cro1.add(1); + drp1.add(1); obj2.merge(obj1.hashGraph.getAllVertices()); - cro1.remove(1); - cro2.add(1); + drp1.remove(1); + drp2.add(1); obj1.merge(obj2.hashGraph.getAllVertices()); obj2.merge(obj1.hashGraph.getAllVertices()); - expect(cro1.contains(1)).toBe(true); + expect(drp1.contains(1)).toBe(true); expect(obj1.hashGraph.vertices).toEqual(obj2.hashGraph.vertices); const linearOps = obj1.hashGraph.linearizeOperations(); @@ -147,19 +147,19 @@ describe("HashGraph for AddWinSet tests", () => { \ _ V3:ADD(2) */ - const cro1 = obj1.cro as AddWinsSet; - const cro2 = obj2.cro as AddWinsSet; + const drp1 = obj1.drp as AddWinsSet; + const drp2 = obj2.drp as AddWinsSet; - cro1.add(1); + drp1.add(1); obj2.merge(obj1.hashGraph.getAllVertices()); - cro1.remove(1); - cro2.add(2); + drp1.remove(1); + drp2.add(2); obj1.merge(obj2.hashGraph.getAllVertices()); obj2.merge(obj1.hashGraph.getAllVertices()); - expect(cro1.contains(1)).toBe(false); - expect(cro1.contains(2)).toBe(true); + expect(drp1.contains(1)).toBe(false); + expect(drp1.contains(2)).toBe(true); expect(obj1.hashGraph.vertices).toEqual(obj2.hashGraph.vertices); const linearOps = obj1.hashGraph.linearizeOperations(); @@ -177,22 +177,22 @@ describe("HashGraph for AddWinSet tests", () => { \ ___ V3:ADD(1) <- V5:REMOVE(5) */ - const cro1 = obj1.cro as AddWinsSet; - const cro2 = obj2.cro as AddWinsSet; + const drp1 = obj1.drp as AddWinsSet; + const drp2 = obj2.drp as AddWinsSet; - cro1.add(1); + drp1.add(1); obj2.merge(obj1.hashGraph.getAllVertices()); - cro1.remove(1); - cro2.add(1); - cro1.add(10); - cro2.remove(5); + drp1.remove(1); + drp2.add(1); + drp1.add(10); + drp2.remove(5); obj1.merge(obj2.hashGraph.getAllVertices()); obj2.merge(obj1.hashGraph.getAllVertices()); - expect(cro1.contains(1)).toBe(true); - expect(cro1.contains(10)).toBe(true); - expect(cro1.contains(5)).toBe(false); + expect(drp1.contains(1)).toBe(true); + expect(drp1.contains(10)).toBe(true); + expect(drp1.contains(5)).toBe(false); expect(obj1.hashGraph.vertices).toEqual(obj2.hashGraph.vertices); const linearOps = obj1.hashGraph.linearizeOperations(); @@ -211,21 +211,21 @@ describe("HashGraph for AddWinSet tests", () => { \ ___ V3:REMOVE(2) <- V5:ADD(1) */ - const cro1 = obj1.cro as AddWinsSet; - const cro2 = obj2.cro as AddWinsSet; + const drp1 = obj1.drp as AddWinsSet; + const drp2 = obj2.drp as AddWinsSet; - cro1.add(1); + drp1.add(1); obj2.merge(obj1.hashGraph.getAllVertices()); - cro1.remove(1); - cro2.remove(2); - cro1.add(2); - cro2.add(1); + drp1.remove(1); + drp2.remove(2); + drp1.add(2); + drp2.add(1); obj1.merge(obj2.hashGraph.getAllVertices()); obj2.merge(obj1.hashGraph.getAllVertices()); - expect(cro1.contains(1)).toBe(true); - expect(cro1.contains(2)).toBe(true); + expect(drp1.contains(1)).toBe(true); + expect(drp1.contains(2)).toBe(true); expect(obj1.hashGraph.vertices).toEqual(obj2.hashGraph.vertices); const linearOps = obj1.hashGraph.linearizeOperations(); @@ -247,25 +247,25 @@ describe("HashGraph for AddWinSet tests", () => { \ ___ V4:RM(2) <-- V5:ADD(2) <-- V9:RM(1) */ - const cro1 = obj1.cro as AddWinsSet; - const cro2 = obj2.cro as AddWinsSet; - const cro3 = obj3.cro as AddWinsSet; + const drp1 = obj1.drp as AddWinsSet; + const drp2 = obj2.drp as AddWinsSet; + const drp3 = obj3.drp as AddWinsSet; - cro1.add(1); + drp1.add(1); obj2.merge(obj1.hashGraph.getAllVertices()); - cro1.add(1); - cro1.remove(2); - cro2.remove(2); - cro2.add(2); + drp1.add(1); + drp1.remove(2); + drp2.remove(2); + drp2.add(2); obj3.merge(obj1.hashGraph.getAllVertices()); - cro3.add(3); - cro1.remove(1); + drp3.add(3); + drp1.remove(1); obj1.merge(obj2.hashGraph.getAllVertices()); - cro1.remove(3); - cro2.remove(1); + drp1.remove(3); + drp2.remove(1); obj1.merge(obj2.hashGraph.getAllVertices()); obj1.merge(obj3.hashGraph.getAllVertices()); @@ -274,9 +274,9 @@ describe("HashGraph for AddWinSet tests", () => { obj3.merge(obj1.hashGraph.getAllVertices()); obj3.merge(obj2.hashGraph.getAllVertices()); - expect(cro1.contains(1)).toBe(false); - expect(cro1.contains(2)).toBe(true); - expect(cro1.contains(3)).toBe(true); + expect(drp1.contains(1)).toBe(false); + expect(drp1.contains(2)).toBe(true); + expect(drp1.contains(3)).toBe(true); expect(obj1.hashGraph.vertices).toEqual(obj2.hashGraph.vertices); expect(obj1.hashGraph.vertices).toEqual(obj3.hashGraph.vertices); @@ -302,25 +302,25 @@ describe("HashGraph for AddWinSet tests", () => { \ ___ V4:RM(2) <-------------------- V7:ADD(2) <-- V9:RM(1) */ - const cro1 = obj1.cro as AddWinsSet; - const cro2 = obj2.cro as AddWinsSet; - const cro3 = obj3.cro as AddWinsSet; + const drp1 = obj1.drp as AddWinsSet; + const drp2 = obj2.drp as AddWinsSet; + const drp3 = obj3.drp as AddWinsSet; - cro1.add(1); + drp1.add(1); obj2.merge(obj1.hashGraph.getAllVertices()); - cro1.add(1); - cro1.remove(2); - cro2.remove(2); + drp1.add(1); + drp1.remove(2); + drp2.remove(2); obj3.merge(obj1.hashGraph.getAllVertices()); - cro3.add(3); - cro1.remove(1); + drp3.add(3); + drp1.remove(1); obj2.merge(obj1.hashGraph.getAllVertices()); - cro2.add(2); - cro1.remove(3); - cro2.remove(1); + drp2.add(2); + drp1.remove(3); + drp2.remove(1); obj1.merge(obj2.hashGraph.getAllVertices()); obj1.merge(obj3.hashGraph.getAllVertices()); @@ -329,9 +329,9 @@ describe("HashGraph for AddWinSet tests", () => { obj3.merge(obj1.hashGraph.getAllVertices()); obj3.merge(obj2.hashGraph.getAllVertices()); - expect(cro1.contains(1)).toBe(false); - expect(cro1.contains(2)).toBe(true); - expect(cro1.contains(3)).toBe(true); + expect(drp1.contains(1)).toBe(false); + expect(drp1.contains(2)).toBe(true); + expect(drp1.contains(3)).toBe(true); expect(obj1.hashGraph.vertices).toEqual(obj2.hashGraph.vertices); expect(obj1.hashGraph.vertices).toEqual(obj3.hashGraph.vertices); @@ -355,23 +355,23 @@ describe("HashGraph for AddWinSet tests", () => { \__ V3:RM(2) <- V4:RM(2) <--/ */ - const cro1 = obj1.cro as AddWinsSet; - const cro2 = obj2.cro as AddWinsSet; + const drp1 = obj1.drp as AddWinsSet; + const drp2 = obj2.drp as AddWinsSet; - cro1.add(1); + drp1.add(1); obj2.merge(obj1.hashGraph.getAllVertices()); - cro1.add(2); - cro2.remove(2); - cro2.remove(2); + drp1.add(2); + drp2.remove(2); + drp2.remove(2); obj1.merge(obj2.hashGraph.getAllVertices()); obj2.merge(obj1.hashGraph.getAllVertices()); - cro1.remove(2); + drp1.remove(2); obj2.merge(obj1.hashGraph.getAllVertices()); - expect(cro1.contains(1)).toBe(true); - expect(cro1.contains(2)).toBe(false); + expect(drp1.contains(1)).toBe(true); + expect(drp1.contains(2)).toBe(false); expect(obj1.hashGraph.vertices).toEqual(obj2.hashGraph.vertices); const linearOps = obj1.hashGraph.linearizeOperations(); @@ -384,18 +384,18 @@ describe("HashGraph for AddWinSet tests", () => { }); describe("HashGraph for PseudoRandomWinsSet tests", () => { - let obj1: TopologyObject; - let obj2: TopologyObject; - let obj3: TopologyObject; - let obj4: TopologyObject; - let obj5: TopologyObject; + let obj1: DRPObject; + let obj2: DRPObject; + let obj3: DRPObject; + let obj4: DRPObject; + let obj5: DRPObject; beforeEach(async () => { - obj1 = new TopologyObject("peer1", new PseudoRandomWinsSet()); - obj2 = new TopologyObject("peer2", new PseudoRandomWinsSet()); - obj3 = new TopologyObject("peer3", new PseudoRandomWinsSet()); - obj4 = new TopologyObject("peer4", new PseudoRandomWinsSet()); - obj5 = new TopologyObject("peer5", new PseudoRandomWinsSet()); + obj1 = new DRPObject("peer1", new PseudoRandomWinsSet()); + obj2 = new DRPObject("peer2", new PseudoRandomWinsSet()); + obj3 = new DRPObject("peer3", new PseudoRandomWinsSet()); + obj4 = new DRPObject("peer4", new PseudoRandomWinsSet()); + obj5 = new DRPObject("peer5", new PseudoRandomWinsSet()); }); test("Test: Many concurrent operations", () => { @@ -407,17 +407,17 @@ describe("HashGraph for PseudoRandomWinsSet tests", () => { ---- V5:ADD(5) */ - const cro1 = obj1.cro as PseudoRandomWinsSet; - const cro2 = obj2.cro as PseudoRandomWinsSet; - const cro3 = obj3.cro as PseudoRandomWinsSet; - const cro4 = obj4.cro as PseudoRandomWinsSet; - const cro5 = obj5.cro as PseudoRandomWinsSet; + const drp1 = obj1.drp as PseudoRandomWinsSet; + const drp2 = obj2.drp as PseudoRandomWinsSet; + const drp3 = obj3.drp as PseudoRandomWinsSet; + const drp4 = obj4.drp as PseudoRandomWinsSet; + const drp5 = obj5.drp as PseudoRandomWinsSet; - cro1.add(1); - cro2.add(2); - cro3.add(3); - cro4.add(4); - cro5.add(5); + drp1.add(1); + drp2.add(2); + drp3.add(3); + drp4.add(4); + drp5.add(5); obj2.merge(obj1.hashGraph.getAllVertices()); obj3.merge(obj2.hashGraph.getAllVertices()); @@ -432,22 +432,22 @@ describe("HashGraph for PseudoRandomWinsSet tests", () => { }); describe("HashGraph for undefined operations tests", () => { - let obj1: TopologyObject; - let obj2: TopologyObject; + let obj1: DRPObject; + let obj2: DRPObject; beforeEach(async () => { - obj1 = new TopologyObject("peer1", new AddWinsSet()); - obj2 = new TopologyObject("peer2", new AddWinsSet()); + obj1 = new DRPObject("peer1", new AddWinsSet()); + obj2 = new DRPObject("peer2", new AddWinsSet()); }); test("Test: merge should skip undefined operations", () => { - const cro1 = obj1.cro as AddWinsSet; - const cro2 = obj2.cro as AddWinsSet; + const drp1 = obj1.drp as AddWinsSet; + const drp2 = obj2.drp as AddWinsSet; - cro1.add(1); - cro2.add(2); + drp1.add(1); + drp2.add(2); - // Set one of the vertice from cro1 to have undefined operation + // Set one of the vertice from drp1 to have undefined operation obj1.hashGraph.getAllVertices()[1].operation = undefined; obj2.merge(obj1.hashGraph.getAllVertices()); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 720d8323..a9ddd09b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -33,219 +33,99 @@ importers: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^6.0.0 - version: 6.0.0(@types/node@22.9.0)(terser@5.36.0)(tsx@4.19.1)(yaml@2.6.0) + specifier: ^5.4.9 + version: 5.4.10(@types/node@22.9.0)(terser@5.36.0) vite-tsconfig-paths: specifier: ^5.0.1 - version: 5.1.0(typescript@5.6.3)(vite@6.0.0(@types/node@22.9.0)(terser@5.36.0)(tsx@4.19.1)(yaml@2.6.0)) + version: 5.1.0(typescript@5.6.3)(vite@5.4.10(@types/node@22.9.0)(terser@5.36.0)) vitest: specifier: ^2.1.1 version: 2.1.4(@types/node@22.9.0)(terser@5.36.0) examples/canvas: dependencies: - '@topology-foundation/blueprints': - specifier: 0.3.1 - version: link:../../packages/blueprints - '@topology-foundation/network': - specifier: 0.3.1 - version: link:../../packages/network - '@topology-foundation/node': + '@ts-drp/node': specifier: 0.3.1 version: link:../../packages/node - '@topology-foundation/object': + '@ts-drp/object': specifier: 0.3.1 version: link:../../packages/object - crypto-browserify: - specifier: ^3.12.0 - version: 3.12.1 - process: - specifier: ^0.11.10 - version: 0.11.10 - stream-browserify: - specifier: ^3.0.0 - version: 3.0.0 - ts-node: - specifier: ^10.9.2 - version: 10.9.2(@types/node@22.9.0)(typescript@5.6.3) - vm-browserify: - specifier: ^1.1.2 - version: 1.1.2 devDependencies: '@types/node': specifier: ^22.5.4 version: 22.9.0 - ts-loader: - specifier: ^9.3.1 - version: 9.5.1(typescript@5.6.3)(webpack@5.96.1) typescript: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^6.0.0 - version: 6.0.0(@types/node@22.9.0)(terser@5.36.0)(tsx@4.19.1)(yaml@2.6.0) + specifier: ^5.4.9 + version: 5.4.10(@types/node@22.9.0)(terser@5.36.0) vite-plugin-node-polyfills: specifier: ^0.22.0 - version: 0.22.0(rollup@4.24.4)(vite@6.0.0(@types/node@22.9.0)(terser@5.36.0)(tsx@4.19.1)(yaml@2.6.0)) + version: 0.22.0(rollup@4.24.4)(vite@5.4.10(@types/node@22.9.0)(terser@5.36.0)) examples/chat: dependencies: - '@topology-foundation/blueprints': - specifier: 0.3.1 - version: link:../../packages/blueprints - '@topology-foundation/network': - specifier: 0.3.1 - version: link:../../packages/network - '@topology-foundation/node': + '@ts-drp/node': specifier: 0.3.1 version: link:../../packages/node - '@topology-foundation/object': + '@ts-drp/object': specifier: 0.3.1 version: link:../../packages/object - assemblyscript: - specifier: ^0.27.29 - version: 0.27.30 - crypto-browserify: - specifier: ^3.12.0 - version: 3.12.1 - process: - specifier: ^0.11.10 - version: 0.11.10 - stream-browserify: - specifier: ^3.0.0 - version: 3.0.0 - ts-node: - specifier: ^10.9.2 - version: 10.9.2(@types/node@22.9.0)(typescript@5.6.3) - uint8arrays: - specifier: ^5.1.0 - version: 5.1.0 - vm-browserify: - specifier: ^1.1.2 - version: 1.1.2 devDependencies: '@types/node': specifier: ^22.5.4 version: 22.9.0 - ts-loader: - specifier: ^9.5.1 - version: 9.5.1(typescript@5.6.3)(webpack@5.96.1) typescript: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^6.0.0 - version: 6.0.0(@types/node@22.9.0)(terser@5.36.0)(tsx@4.19.1)(yaml@2.6.0) + specifier: ^5.4.9 + version: 5.4.10(@types/node@22.9.0)(terser@5.36.0) vite-plugin-node-polyfills: specifier: ^0.22.0 - version: 0.22.0(rollup@4.24.4)(vite@6.0.0(@types/node@22.9.0)(terser@5.36.0)(tsx@4.19.1)(yaml@2.6.0)) + version: 0.22.0(rollup@4.24.4)(vite@5.4.10(@types/node@22.9.0)(terser@5.36.0)) examples/grid: dependencies: - '@topology-foundation/network': - specifier: 0.3.1 - version: link:../../packages/network - '@topology-foundation/node': + '@ts-drp/node': specifier: 0.3.1 version: link:../../packages/node - '@topology-foundation/object': + '@ts-drp/object': specifier: 0.3.1 version: link:../../packages/object - assemblyscript: - specifier: ^0.27.29 - version: 0.27.30 - crypto-browserify: - specifier: ^3.12.0 - version: 3.12.1 - memfs: - specifier: ^4.11.1 - version: 4.14.0 - process: - specifier: ^0.11.10 - version: 0.11.10 - react-spring: - specifier: ^9.7.4 - version: 9.7.4(@react-three/fiber@8.17.10(react-dom@18.3.1(react@18.3.1))(react-native@0.76.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@types/react@18.3.12)(react@18.3.1))(react@18.3.1)(three@0.170.0))(konva@9.3.16)(react-dom@18.3.1(react@18.3.1))(react-konva@18.2.10(konva@9.3.16)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-native@0.76.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@types/react@18.3.12)(react@18.3.1))(react-zdog@1.2.2)(react@18.3.1)(three@0.170.0)(zdog@1.1.3) - stream-browserify: - specifier: ^3.0.0 - version: 3.0.0 - ts-node: - specifier: ^10.9.2 - version: 10.9.2(@types/node@22.9.0)(typescript@5.6.3) - uint8arrays: - specifier: ^5.1.0 - version: 5.1.0 - vm-browserify: - specifier: ^1.1.2 - version: 1.1.2 devDependencies: '@types/node': specifier: ^22.5.4 version: 22.9.0 - ts-loader: - specifier: ^9.5.1 - version: 9.5.1(typescript@5.6.3)(webpack@5.96.1) typescript: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^6.0.0 - version: 6.0.0(@types/node@22.9.0)(terser@5.36.0)(tsx@4.19.1)(yaml@2.6.0) + specifier: ^5.4.9 + version: 5.4.10(@types/node@22.9.0)(terser@5.36.0) vite-plugin-node-polyfills: specifier: ^0.22.0 - version: 0.22.0(rollup@4.24.4)(vite@6.0.0(@types/node@22.9.0)(terser@5.36.0)(tsx@4.19.1)(yaml@2.6.0)) + version: 0.22.0(rollup@4.24.4)(vite@5.4.10(@types/node@22.9.0)(terser@5.36.0)) examples/local-bootstrap: dependencies: - '@topology-foundation/blueprints': - specifier: 0.3.1 - version: link:../../packages/blueprints - '@topology-foundation/network': - specifier: 0.3.1 - version: link:../../packages/network - '@topology-foundation/node': + '@ts-drp/node': specifier: 0.3.1 version: link:../../packages/node - '@topology-foundation/object': - specifier: 0.3.1 - version: link:../../packages/object - assemblyscript: - specifier: ^0.27.29 - version: 0.27.30 - crypto-browserify: - specifier: ^3.12.0 - version: 3.12.1 - process: - specifier: ^0.11.10 - version: 0.11.10 - stream-browserify: - specifier: ^3.0.0 - version: 3.0.0 - ts-node: - specifier: ^10.9.2 - version: 10.9.2(@types/node@22.9.0)(typescript@5.6.3) - uint8arrays: - specifier: ^5.1.0 - version: 5.1.0 - vm-browserify: - specifier: ^1.1.2 - version: 1.1.2 devDependencies: '@types/node': specifier: ^22.5.4 version: 22.9.0 - ts-loader: - specifier: ^9.5.1 - version: 9.5.1(typescript@5.6.3)(webpack@5.96.1) typescript: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^6.0.0 - version: 6.0.0(@types/node@22.9.0)(terser@5.36.0)(tsx@4.19.1)(yaml@2.6.0) + specifier: ^5.4.6 + version: 5.4.10(@types/node@22.9.0)(terser@5.36.0) vite-plugin-node-polyfills: specifier: ^0.22.0 - version: 0.22.0(rollup@4.24.4)(vite@6.0.0(@types/node@22.9.0)(terser@5.36.0)(tsx@4.19.1)(yaml@2.6.0)) + version: 0.22.0(rollup@4.24.4)(vite@5.4.10(@types/node@22.9.0)(terser@5.36.0)) packages/blueprints: dependencies: @@ -253,12 +133,9 @@ importers: specifier: ^4.1.0 version: 4.1.2 devDependencies: - '@topology-foundation/object': + '@ts-drp/object': specifier: 0.3.1 version: link:../object - assemblyscript: - specifier: ^0.27.29 - version: 0.27.30 packages/logger: dependencies: @@ -304,12 +181,6 @@ importers: '@libp2p/identify': specifier: ^3.0.6 version: 3.0.10 - '@libp2p/mdns': - specifier: ^11.0.8 - version: 11.0.10 - '@libp2p/peer-id': - specifier: ^5.0.4 - version: 5.0.7 '@libp2p/pubsub-peer-discovery': specifier: ^11.0.0 version: 11.0.0 @@ -325,7 +196,7 @@ importers: '@multiformats/multiaddr': specifier: ^12.3.1 version: 12.3.1 - '@topology-foundation/logger': + '@ts-drp/logger': specifier: ^0.3.1 version: link:../logger it-length-prefixed: @@ -340,9 +211,6 @@ importers: libp2p: specifier: ^2.1.6 version: 2.2.1 - ts-proto: - specifier: ^2.2.4 - version: 2.2.5 uint8arrays: specifier: ^5.1.0 version: 5.1.0 @@ -350,9 +218,6 @@ importers: '@libp2p/interface': specifier: ^2.1.3 version: 2.2.0 - react-native-webrtc: - specifier: ^124.0.3 - version: 124.0.4(react-native@0.76.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@types/react@18.3.12)(react@18.3.1)) packages/node: dependencies: @@ -365,16 +230,16 @@ importers: '@libp2p/interface': specifier: ^2.1.3 version: 2.2.0 - '@topology-foundation/blueprints': + '@ts-drp/blueprints': specifier: 0.3.1 version: link:../blueprints - '@topology-foundation/logger': + '@ts-drp/logger': specifier: 0.3.1 version: link:../logger - '@topology-foundation/network': + '@ts-drp/network': specifier: 0.3.1 version: link:../network - '@topology-foundation/object': + '@ts-drp/object': specifier: 0.3.1 version: link:../object commander: @@ -383,9 +248,6 @@ importers: dotenv: specifier: ^16.4.5 version: 16.4.5 - google-protobuf: - specifier: ^3.21.2 - version: 3.21.4 devDependencies: '@bufbuild/protobuf': specifier: ^2.0.0 @@ -405,19 +267,13 @@ importers: packages/object: dependencies: - '@bufbuild/protobuf': - specifier: ^2.0.0 - version: 2.2.2 - '@topology-foundation/logger': + '@ts-drp/logger': specifier: ^0.3.1 version: link:../logger - ts-proto: - specifier: ^2.2.4 - version: 2.2.5 devDependencies: - assemblyscript: - specifier: ^0.27.29 - version: 0.27.30 + '@bufbuild/protobuf': + specifier: ^2.0.0 + version: 2.2.2 benchmark: specifier: ^2.1.4 version: 2.1.4 @@ -1191,10 +1047,6 @@ packages: '@chainsafe/netmask@2.0.0': resolution: {integrity: sha512-I3Z+6SWUoaljh3TBzCnCxjlUyN8tA+NAk5L6m9IxvCf1BENQTePzPMis97CoN/iMW1St3WN+AWCCRp+TTBRiDg==} - '@cspotcode/source-map-support@0.8.1': - resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} - engines: {node: '>=12'} - '@esbuild/aix-ppc64@0.21.5': resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} engines: {node: '>=12'} @@ -1207,12 +1059,6 @@ packages: cpu: [ppc64] os: [aix] - '@esbuild/aix-ppc64@0.24.0': - resolution: {integrity: sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [aix] - '@esbuild/android-arm64@0.21.5': resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} engines: {node: '>=12'} @@ -1225,12 +1071,6 @@ packages: cpu: [arm64] os: [android] - '@esbuild/android-arm64@0.24.0': - resolution: {integrity: sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==} - engines: {node: '>=18'} - cpu: [arm64] - os: [android] - '@esbuild/android-arm@0.21.5': resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} engines: {node: '>=12'} @@ -1243,12 +1083,6 @@ packages: cpu: [arm] os: [android] - '@esbuild/android-arm@0.24.0': - resolution: {integrity: sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==} - engines: {node: '>=18'} - cpu: [arm] - os: [android] - '@esbuild/android-x64@0.21.5': resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} engines: {node: '>=12'} @@ -1261,12 +1095,6 @@ packages: cpu: [x64] os: [android] - '@esbuild/android-x64@0.24.0': - resolution: {integrity: sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [android] - '@esbuild/darwin-arm64@0.21.5': resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} engines: {node: '>=12'} @@ -1279,12 +1107,6 @@ packages: cpu: [arm64] os: [darwin] - '@esbuild/darwin-arm64@0.24.0': - resolution: {integrity: sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [darwin] - '@esbuild/darwin-x64@0.21.5': resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} engines: {node: '>=12'} @@ -1297,12 +1119,6 @@ packages: cpu: [x64] os: [darwin] - '@esbuild/darwin-x64@0.24.0': - resolution: {integrity: sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==} - engines: {node: '>=18'} - cpu: [x64] - os: [darwin] - '@esbuild/freebsd-arm64@0.21.5': resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} engines: {node: '>=12'} @@ -1315,12 +1131,6 @@ packages: cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-arm64@0.24.0': - resolution: {integrity: sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==} - engines: {node: '>=18'} - cpu: [arm64] - os: [freebsd] - '@esbuild/freebsd-x64@0.21.5': resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} engines: {node: '>=12'} @@ -1333,12 +1143,6 @@ packages: cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.24.0': - resolution: {integrity: sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [freebsd] - '@esbuild/linux-arm64@0.21.5': resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} engines: {node: '>=12'} @@ -1351,12 +1155,6 @@ packages: cpu: [arm64] os: [linux] - '@esbuild/linux-arm64@0.24.0': - resolution: {integrity: sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==} - engines: {node: '>=18'} - cpu: [arm64] - os: [linux] - '@esbuild/linux-arm@0.21.5': resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} engines: {node: '>=12'} @@ -1369,12 +1167,6 @@ packages: cpu: [arm] os: [linux] - '@esbuild/linux-arm@0.24.0': - resolution: {integrity: sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==} - engines: {node: '>=18'} - cpu: [arm] - os: [linux] - '@esbuild/linux-ia32@0.21.5': resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} engines: {node: '>=12'} @@ -1387,12 +1179,6 @@ packages: cpu: [ia32] os: [linux] - '@esbuild/linux-ia32@0.24.0': - resolution: {integrity: sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==} - engines: {node: '>=18'} - cpu: [ia32] - os: [linux] - '@esbuild/linux-loong64@0.21.5': resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} engines: {node: '>=12'} @@ -1405,12 +1191,6 @@ packages: cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.24.0': - resolution: {integrity: sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==} - engines: {node: '>=18'} - cpu: [loong64] - os: [linux] - '@esbuild/linux-mips64el@0.21.5': resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} engines: {node: '>=12'} @@ -1423,12 +1203,6 @@ packages: cpu: [mips64el] os: [linux] - '@esbuild/linux-mips64el@0.24.0': - resolution: {integrity: sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==} - engines: {node: '>=18'} - cpu: [mips64el] - os: [linux] - '@esbuild/linux-ppc64@0.21.5': resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} engines: {node: '>=12'} @@ -1441,12 +1215,6 @@ packages: cpu: [ppc64] os: [linux] - '@esbuild/linux-ppc64@0.24.0': - resolution: {integrity: sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [linux] - '@esbuild/linux-riscv64@0.21.5': resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} engines: {node: '>=12'} @@ -1459,12 +1227,6 @@ packages: cpu: [riscv64] os: [linux] - '@esbuild/linux-riscv64@0.24.0': - resolution: {integrity: sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==} - engines: {node: '>=18'} - cpu: [riscv64] - os: [linux] - '@esbuild/linux-s390x@0.21.5': resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} engines: {node: '>=12'} @@ -1477,12 +1239,6 @@ packages: cpu: [s390x] os: [linux] - '@esbuild/linux-s390x@0.24.0': - resolution: {integrity: sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==} - engines: {node: '>=18'} - cpu: [s390x] - os: [linux] - '@esbuild/linux-x64@0.21.5': resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} engines: {node: '>=12'} @@ -1495,12 +1251,6 @@ packages: cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.24.0': - resolution: {integrity: sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==} - engines: {node: '>=18'} - cpu: [x64] - os: [linux] - '@esbuild/netbsd-x64@0.21.5': resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} engines: {node: '>=12'} @@ -1513,24 +1263,12 @@ packages: cpu: [x64] os: [netbsd] - '@esbuild/netbsd-x64@0.24.0': - resolution: {integrity: sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==} - engines: {node: '>=18'} - cpu: [x64] - os: [netbsd] - '@esbuild/openbsd-arm64@0.23.1': resolution: {integrity: sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-arm64@0.24.0': - resolution: {integrity: sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openbsd] - '@esbuild/openbsd-x64@0.21.5': resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} engines: {node: '>=12'} @@ -1543,12 +1281,6 @@ packages: cpu: [x64] os: [openbsd] - '@esbuild/openbsd-x64@0.24.0': - resolution: {integrity: sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==} - engines: {node: '>=18'} - cpu: [x64] - os: [openbsd] - '@esbuild/sunos-x64@0.21.5': resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} engines: {node: '>=12'} @@ -1561,12 +1293,6 @@ packages: cpu: [x64] os: [sunos] - '@esbuild/sunos-x64@0.24.0': - resolution: {integrity: sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==} - engines: {node: '>=18'} - cpu: [x64] - os: [sunos] - '@esbuild/win32-arm64@0.21.5': resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} engines: {node: '>=12'} @@ -1579,12 +1305,6 @@ packages: cpu: [arm64] os: [win32] - '@esbuild/win32-arm64@0.24.0': - resolution: {integrity: sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==} - engines: {node: '>=18'} - cpu: [arm64] - os: [win32] - '@esbuild/win32-ia32@0.21.5': resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} engines: {node: '>=12'} @@ -1597,12 +1317,6 @@ packages: cpu: [ia32] os: [win32] - '@esbuild/win32-ia32@0.24.0': - resolution: {integrity: sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==} - engines: {node: '>=18'} - cpu: [ia32] - os: [win32] - '@esbuild/win32-x64@0.21.5': resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} engines: {node: '>=12'} @@ -1615,12 +1329,6 @@ packages: cpu: [x64] os: [win32] - '@esbuild/win32-x64@0.24.0': - resolution: {integrity: sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==} - engines: {node: '>=18'} - cpu: [x64] - os: [win32] - '@grpc/grpc-js@1.12.2': resolution: {integrity: sha512-bgxdZmgTrJZX50OjyVwz3+mNEnCTNkh3cIqGPWVNeW9jX6bn1ZkU80uPd+67/ZpIJIjRQ9qaHCjhavyoWYxumg==} engines: {node: '>=12.10.0'} @@ -1694,30 +1402,9 @@ packages: '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} - '@jridgewell/trace-mapping@0.3.9': - resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} - '@js-sdsl/ordered-map@4.4.2': resolution: {integrity: sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==} - '@jsonjoy.com/base64@1.1.2': - resolution: {integrity: sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - - '@jsonjoy.com/json-pack@1.1.0': - resolution: {integrity: sha512-zlQONA+msXPPwHWZMKFVS78ewFczIll5lXiVPwFPCZUsrOKdxc2AvxU1HoNBmMRhqDZUR9HkC3UOm+6pME6Xsg==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - - '@jsonjoy.com/util@1.5.0': - resolution: {integrity: sha512-ojoNsrIuPI9g6o8UxhraZQSyF2ByJanAY4cTFbc8Mf2AXEF4aQRGY1dJxyJpuyav8r9FGflEt/Ff3u5Nt6YMPA==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - '@leichtgewicht/ip-codec@2.0.5': resolution: {integrity: sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==} @@ -1751,9 +1438,6 @@ packages: '@libp2p/logger@5.1.3': resolution: {integrity: sha512-NUVWEWGbXlBDgDE5ntdm51+ZICmaKYI8mor6KrlPeB1WXDyIFxRWIBw6uzt+HgprQJWzLTojeUEGv6OPsj95Dg==} - '@libp2p/mdns@11.0.10': - resolution: {integrity: sha512-9U/byQsGmTC6Vqc+DaIsFPpIWBlh7CHT24PSg4CvUHC8CrypHADlTEGUxQjP5KTW1i50ZR1hkGlQZUC592RQxw==} - '@libp2p/multistream-select@6.0.8': resolution: {integrity: sha512-CSgTXvuw5ObZs/EIa4mtynsYEO+BxyZTNz3AEgjsPyZKxLJ9usrZ8lGxn4sK4g65CKcTI2mVJBmh0duz+sXxBw==} @@ -1987,86 +1671,6 @@ packages: '@types/react': optional: true - '@react-spring/animated@9.7.5': - resolution: {integrity: sha512-Tqrwz7pIlsSDITzxoLS3n/v/YCUHQdOIKtOJf4yL6kYVSDTSmVK1LI1Q3M/uu2Sx4X3pIWF3xLUhlsA6SPNTNg==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - - '@react-spring/core@9.7.5': - resolution: {integrity: sha512-rmEqcxRcu7dWh7MnCcMXLvrf6/SDlSokLaLTxiPlAYi11nN3B5oiCUAblO72o+9z/87j2uzxa2Inm8UbLjXA+w==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - - '@react-spring/konva@9.7.5': - resolution: {integrity: sha512-BelrmyY6w0FGoNSEfSJltjQDUoW0Prxf+FzGjyLuLs+V9M9OM/aHnYqOlvQEfQsZx6C/ZiDOn5BZl8iH8SDf+Q==} - peerDependencies: - konva: '>=2.6' - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-konva: ^16.8.0 || ^16.8.7-0 || ^16.9.0-0 || ^16.10.1-0 || ^16.12.0-0 || ^16.13.0-0 || ^17.0.0-0 || ^17.0.1-0 || ^17.0.2-0 || ^18.0.0-0 - - '@react-spring/native@9.7.5': - resolution: {integrity: sha512-C1S500BNP1I05MftElyLv2nIqaWQ0MAByOAK/p4vuXcUK3XcjFaAJ385gVLgV2rgKfvkqRoz97PSwbh+ZCETEg==} - peerDependencies: - react: 16.8.0 || >=17.0.0 || >=18.0.0 - react-native: '>=0.58' - - '@react-spring/rafz@9.7.5': - resolution: {integrity: sha512-5ZenDQMC48wjUzPAm1EtwQ5Ot3bLIAwwqP2w2owG5KoNdNHpEJV263nGhCeKKmuA3vG2zLLOdu3or6kuDjA6Aw==} - - '@react-spring/shared@9.7.5': - resolution: {integrity: sha512-wdtoJrhUeeyD/PP/zo+np2s1Z820Ohr/BbuVYv+3dVLW7WctoiN7std8rISoYoHpUXtbkpesSKuPIw/6U1w1Pw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - - '@react-spring/three@9.7.5': - resolution: {integrity: sha512-RxIsCoQfUqOS3POmhVHa1wdWS0wyHAUway73uRLp3GAL5U2iYVNdnzQsep6M2NZ994BlW8TcKuMtQHUqOsy6WA==} - peerDependencies: - '@react-three/fiber': '>=6.0' - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - three: '>=0.126' - - '@react-spring/types@9.7.5': - resolution: {integrity: sha512-HVj7LrZ4ReHWBimBvu2SKND3cDVUPWKLqRTmWe/fNY6o1owGOX0cAHbdPDTMelgBlVbrTKrre6lFkhqGZErK/g==} - - '@react-spring/web@9.7.5': - resolution: {integrity: sha512-lmvqGwpe+CSttsWNZVr+Dg62adtKhauGwLyGE/RRyZ8AAMLgb9x3NDMA5RMElXo+IMyTkPp7nxTB8ZQlmhb6JQ==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - - '@react-spring/zdog@9.7.5': - resolution: {integrity: sha512-VV7vmb52wGHgDA1ry6hv+QgxTs78fqjKEQnj+M8hiBg+dwOsTtqqM24ADtc4cMAhPW+eZhVps8ZNKtjt8ouHFA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-zdog: '>=1.0' - zdog: '>=1.0' - - '@react-three/fiber@8.17.10': - resolution: {integrity: sha512-S6bqa4DqUooEkInYv/W+Jklv2zjSYCXAhm6qKpAQyOXhTEt5gBXnA7W6aoJ0bjmp9pAeaSj/AZUoz1HCSof/uA==} - peerDependencies: - expo: '>=43.0' - expo-asset: '>=8.4' - expo-file-system: '>=11.0' - expo-gl: '>=11.0' - react: '>=18.0' - react-dom: '>=18.0' - react-native: '>=0.64' - three: '>=0.133' - peerDependenciesMeta: - expo: - optional: true - expo-asset: - optional: true - expo-file-system: - optional: true - expo-gl: - optional: true - react-dom: - optional: true - react-native: - optional: true - '@release-it-plugins/workspaces@4.2.0': resolution: {integrity: sha512-hzQMdYWFnLBS/7dfasIWyeD2LUKeL7LT8ldxZgpzon90lW1cEU4Kpad78KmpZl1L188YHAbwVnboE+6i14jlEQ==} engines: {node: '>= 16'} @@ -2228,18 +1832,6 @@ packages: '@tootallnate/quickjs-emscripten@0.23.0': resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} - '@tsconfig/node10@1.0.11': - resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} - - '@tsconfig/node12@1.0.11': - resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} - - '@tsconfig/node14@1.0.3': - resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} - - '@tsconfig/node16@1.0.4': - resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} - '@types/babel__core@7.20.5': resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} @@ -2252,18 +1844,9 @@ packages: '@types/babel__traverse@7.20.6': resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} - '@types/debounce@1.2.4': - resolution: {integrity: sha512-jBqiORIzKDOToaF63Fm//haOCHuwQuLa2202RK4MozpA6lh93eCBc+/8+wZn5OzjJt3ySdc+74SXWXB55Ewtyw==} - '@types/dns-packet@5.6.5': resolution: {integrity: sha512-qXOC7XLOEe43ehtWJCMnQXvgcIpv6rPmQ1jXT98Ad8A3TB1Ue50jsCbSSSyuazScEuZ/Q026vHbrOTVkmwA+7Q==} - '@types/eslint-scope@3.7.7': - resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} - - '@types/eslint@9.6.1': - resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} - '@types/estree@1.0.6': resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} @@ -2282,18 +1865,12 @@ packages: '@types/istanbul-reports@3.0.4': resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} - '@types/json-schema@7.0.15': - resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - '@types/mdast@4.0.4': resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} '@types/minimatch@3.0.5': resolution: {integrity: sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==} - '@types/multicast-dns@7.2.4': - resolution: {integrity: sha512-ib5K4cIDR4Ro5SR3Sx/LROkMDa0BHz0OPaCBL/OSPDsAXEGZ3/KQeS6poBKYVN7BfjXDL9lWNwzyHVgt/wkyCw==} - '@types/murmurhash3js-revisited@3.0.3': resolution: {integrity: sha512-QvlqvYtGBYIDeO8dFdY4djkRubcrc+yTJtBc7n8VZPlJDUS/00A+PssbvERM8f9bYRmcaSEHPZgZojeQj7kzAA==} @@ -2306,12 +1883,6 @@ packages: '@types/prop-types@15.7.13': resolution: {integrity: sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==} - '@types/react-reconciler@0.26.7': - resolution: {integrity: sha512-mBDYl8x+oyPX/VBb3E638N0B7xG+SPk/EAMcVPeexqus/5aTpTphQi0curhhshOqRrc9t6OPoJfEUkbymse/lQ==} - - '@types/react-reconciler@0.28.8': - resolution: {integrity: sha512-SN9c4kxXZonFhbX4hJrZy37yw9e7EIxcpHCxQv5JUS18wDE5ovkQKlqQEkufdJCCMfuI9BnjUJvhYeJ9x5Ra7g==} - '@types/react@18.3.12': resolution: {integrity: sha512-D2wOSq/d6Agt28q7rSI3jhU7G6aiuzljDGZ2hTZHIkrTLUI+AF3WMeKkEZ9nN2fkBAlcktT6vcZjDFiIhMYEQw==} @@ -2324,9 +1895,6 @@ packages: '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} - '@types/webxr@0.5.20': - resolution: {integrity: sha512-JGpU6qiIJQKUuVSKx1GtQnHJGxRjtfGIhzO2ilq43VZZS//f1h1Sgexbdk+Lq+7569a6EYhOWrUpIruR/1Enmg==} - '@types/ws@8.5.13': resolution: {integrity: sha512-osM/gWBTPKgHV8XkTunnegTRIsvF6owmf5w+JtAfOw472dptdm0dlGv4xCt6GwQRcC2XVOvvRE/0bAoQcL2QkA==} @@ -2368,57 +1936,6 @@ packages: '@vitest/utils@2.1.4': resolution: {integrity: sha512-MXDnZn0Awl2S86PSNIim5PWXgIAx8CIkzu35mBdSApUip6RFOGXBCf3YFyeEu8n1IHk4bWD46DeYFu9mQlFIRg==} - '@webassemblyjs/ast@1.12.1': - resolution: {integrity: sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==} - - '@webassemblyjs/floating-point-hex-parser@1.11.6': - resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==} - - '@webassemblyjs/helper-api-error@1.11.6': - resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==} - - '@webassemblyjs/helper-buffer@1.12.1': - resolution: {integrity: sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==} - - '@webassemblyjs/helper-numbers@1.11.6': - resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==} - - '@webassemblyjs/helper-wasm-bytecode@1.11.6': - resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==} - - '@webassemblyjs/helper-wasm-section@1.12.1': - resolution: {integrity: sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==} - - '@webassemblyjs/ieee754@1.11.6': - resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==} - - '@webassemblyjs/leb128@1.11.6': - resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==} - - '@webassemblyjs/utf8@1.11.6': - resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==} - - '@webassemblyjs/wasm-edit@1.12.1': - resolution: {integrity: sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==} - - '@webassemblyjs/wasm-gen@1.12.1': - resolution: {integrity: sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==} - - '@webassemblyjs/wasm-opt@1.12.1': - resolution: {integrity: sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==} - - '@webassemblyjs/wasm-parser@1.12.1': - resolution: {integrity: sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==} - - '@webassemblyjs/wast-printer@1.12.1': - resolution: {integrity: sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==} - - '@xtuc/ieee754@1.2.0': - resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} - - '@xtuc/long@4.2.2': - resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} - abort-controller@3.0.0: resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} engines: {node: '>=6.5'} @@ -2427,10 +1944,6 @@ packages: resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} engines: {node: '>= 0.6'} - acorn-walk@8.3.4: - resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} - engines: {node: '>=0.4.0'} - acorn@8.14.0: resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} engines: {node: '>=0.4.0'} @@ -2440,14 +1953,6 @@ packages: resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==} engines: {node: '>= 14'} - ajv-keywords@3.5.2: - resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} - peerDependencies: - ajv: ^6.9.1 - - ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - anser@1.4.10: resolution: {integrity: sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==} @@ -2486,9 +1991,6 @@ packages: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} - arg@4.1.3: - resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} - argparse@1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} @@ -2771,10 +2273,6 @@ packages: engines: {node: '>=12.13.0'} hasBin: true - chrome-trace-event@1.0.4: - resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} - engines: {node: '>=6.0'} - chromium-edge-launcher@0.2.0: resolution: {integrity: sha512-JfJjUnq25y9yg4FABRRVPmBGWPZZi+AQXT4mxupb67766/0UlhG8PAZCz6xzEMXTbW3CsSoE8PcCWA49n35mKg==} @@ -2916,9 +2414,6 @@ packages: datastore-core@10.0.2: resolution: {integrity: sha512-B3WXxI54VxJkpXxnYibiF17si3bLXE1XOjrJB7wM5co9fx2KOEkiePDGiCCEtnapFHTnmAnYCPdA7WZTIpdn/A==} - debounce@1.2.1: - resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==} - debug@2.6.9: resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} peerDependencies: @@ -3036,10 +2531,6 @@ packages: devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} - diff@4.0.2: - resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} - engines: {node: '>=0.3.1'} - diffie-hellman@5.0.3: resolution: {integrity: sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==} @@ -3088,10 +2579,6 @@ packages: end-of-stream@1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} - enhanced-resolve@5.17.1: - resolution: {integrity: sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==} - engines: {node: '>=10.13.0'} - ensure-posix-path@1.1.1: resolution: {integrity: sha512-VWU0/zXzVbeJNXvME/5EmLuEj2TauvoaTz6aFYK1Z92JCBlDlZ3Gu0tuGR42kpW1754ywTs+QB0g5TP0oj9Zaw==} @@ -3117,9 +2604,6 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - es-module-lexer@1.5.4: - resolution: {integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==} - esbuild@0.21.5: resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} engines: {node: '>=12'} @@ -3130,11 +2614,6 @@ packages: engines: {node: '>=18'} hasBin: true - esbuild@0.24.0: - resolution: {integrity: sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==} - engines: {node: '>=18'} - hasBin: true - escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} @@ -3159,23 +2638,11 @@ packages: engines: {node: '>=6.0'} hasBin: true - eslint-scope@5.1.1: - resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} - engines: {node: '>=8.0.0'} - esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} hasBin: true - esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} - - estraverse@4.3.0: - resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} - engines: {node: '>=4.0'} - estraverse@5.3.0: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} @@ -3238,9 +2705,6 @@ packages: resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} engines: {node: '>=4'} - fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - fast-glob@3.3.2: resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} engines: {node: '>=8.6.0'} @@ -3361,9 +2825,6 @@ packages: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} - glob-to-regexp@0.4.1: - resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} - glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} deprecated: Glob versions prior to v9 are no longer supported @@ -3383,9 +2844,6 @@ packages: globrex@0.1.2: resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} - google-protobuf@3.21.4: - resolution: {integrity: sha512-MnG7N936zcKTco4Jd2PX2U96Kf9PxygAPKBug+74LHzmHXmceN16MmRcdgZv+DGef/S9YvQAfRsNCn4cjf9yyQ==} - gopd@1.0.1: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} @@ -3475,10 +2933,6 @@ packages: resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} engines: {node: '>=16.17.0'} - hyperdyperid@1.2.0: - resolution: {integrity: sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==} - engines: {node: '>=10.18'} - iconv-lite@0.4.24: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} @@ -3778,11 +3232,6 @@ packages: resolution: {integrity: sha512-uWjMtpy5HqhSd/LlrlP3fhYrr7rUfJFFMABv0F5d6n13Q+0glhZthwUKpEAVhDrXY95Tb1RB5lLqqef+QbVNaw==} engines: {node: '>=16.0.0', npm: '>=7.0.0'} - its-fine@1.2.5: - resolution: {integrity: sha512-fXtDA0X0t0eBYAGLVM5YsgJGsJ5jEmqZEPrGbzdf5awjv0xE7nqv3TVnvtUF060Tkes15DbDAKW/I48vsb6SyA==} - peerDependencies: - react: '>=18.0' - jest-environment-node@29.7.0: resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -3815,10 +3264,6 @@ packages: resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-worker@27.5.1: - resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} - engines: {node: '>= 10.13.0'} - jest-worker@29.7.0: resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -3860,9 +3305,6 @@ packages: json-parse-even-better-errors@2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - json5@2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} @@ -3875,9 +3317,6 @@ packages: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} - konva@9.3.16: - resolution: {integrity: sha512-qa47cefGDDHzkToGRGDsy24f/Njrz7EHP56jQ8mlDcjAPO7vkfTDeoBDIfmF7PZtpfzDdooafQmEUJMDU2F7FQ==} - ky@1.7.2: resolution: {integrity: sha512-OzIvbHKKDpi60TnF9t7UUVAF1B4mcqc02z5PIvrm08Wyb+yOcz63GRvEuVxNT18a9E1SrNouhB4W2NNLeD7Ykg==} engines: {node: '>=18'} @@ -3902,10 +3341,6 @@ packages: linkify-it@5.0.0: resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} - loader-runner@4.3.0: - resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} - engines: {node: '>=6.11.5'} - locate-path@3.0.0: resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} engines: {node: '>=6'} @@ -3991,9 +3426,6 @@ packages: resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} engines: {node: '>=6'} - make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - makeerror@1.0.12: resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} @@ -4017,10 +3449,6 @@ packages: mdurl@2.0.0: resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} - memfs@4.14.0: - resolution: {integrity: sha512-JUeY0F/fQZgIod31Ja1eJgiSxLn7BfQlCnqhwXFBzFHEw63OdLK7VJUJ7bnzNsWgCyoUP5tEp1VRY8rDaYzqOA==} - engines: {node: '>= 4.0.0'} - memoize-one@5.2.1: resolution: {integrity: sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==} @@ -4189,10 +3617,6 @@ packages: resolution: {integrity: sha512-kh8ARjh8rMN7Du2igDRO9QJnqCb2xYTJxyQYK7vJJS4TvLLmsbyhiKpSW+t+y26gyOyMd0riphX0GeWKU3ky5g==} engines: {node: '>=12.13'} - multicast-dns@7.2.5: - resolution: {integrity: sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==} - hasBin: true - multiformats@13.3.1: resolution: {integrity: sha512-QxowxTNwJ3r5RMctoGA5p13w5RbRT2QDkoM+yFlqfLiioBp78nhDjnRLvmSBI9+KAqN4VdgOVWM9c0CHd86m3g==} @@ -4534,8 +3958,8 @@ packages: resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} engines: {node: '>= 0.4'} - postcss@8.4.49: - resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==} + postcss@8.4.47: + resolution: {integrity: sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==} engines: {node: ^10 || ^12 || >=14} prebuild-install@7.1.2: @@ -4596,10 +4020,6 @@ packages: punycode@1.4.1: resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==} - punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} - pupa@3.1.0: resolution: {integrity: sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==} engines: {node: '>=12.20'} @@ -4648,21 +4068,9 @@ packages: react-devtools-core@5.3.2: resolution: {integrity: sha512-crr9HkVrDiJ0A4zot89oS0Cgv0Oa4OG1Em4jit3P3ZxZSKPMYyMjfwMqgcJna9o625g8oN87rBm8SWWrSTBZxg==} - react-dom@18.3.1: - resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} - peerDependencies: - react: ^18.3.1 - react-is@18.3.1: resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} - react-konva@18.2.10: - resolution: {integrity: sha512-ohcX1BJINL43m4ynjZ24MxFI1syjBdrXhqVxYVDw2rKgr3yuS0x/6m1Y2Z4sl4T/gKhfreBx8KHisd0XC6OT1g==} - peerDependencies: - konva: ^8.0.1 || ^7.2.5 || ^9.0.0 - react: '>=18.0.0' - react-dom: '>=18.0.0' - react-native-webrtc@124.0.4: resolution: {integrity: sha512-ZbhSz1f+kc1v5VE0B84+v6ujIWTHa2fIuocrYzGUIFab7E5izmct7PNHb9dzzs0xhBGqh4c2rUa49jbL+P/e2w==} peerDependencies: @@ -4679,31 +4087,10 @@ packages: '@types/react': optional: true - react-reconciler@0.27.0: - resolution: {integrity: sha512-HmMDKciQjYmBRGuuhIaKA1ba/7a+UsM5FzOZsMO2JYHt9Jh8reCb7j1eDC95NOyUlKM9KRyvdx0flBuDvYSBoA==} - engines: {node: '>=0.10.0'} - peerDependencies: - react: ^18.0.0 - - react-reconciler@0.29.2: - resolution: {integrity: sha512-zZQqIiYgDCTP/f1N/mAR10nJGrPD2ZR+jDSEsKWJHYC7Cm2wodlwbR3upZRdC3cjIjSlTLNVyO7Iu0Yy7t2AYg==} - engines: {node: '>=0.10.0'} - peerDependencies: - react: ^18.3.1 - react-refresh@0.14.2: resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} engines: {node: '>=0.10.0'} - react-spring@9.7.4: - resolution: {integrity: sha512-ypxdsOwmCfbDZGTBRyBo7eLjF55xNFN86e/QkflZ1Rfo8QMzVjCAWocrEEbsuFKkQAg2RRdhNkinWJ6BpCvJoQ==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - - react-zdog@1.2.2: - resolution: {integrity: sha512-Ix7ALha91aOEwiHuxumCeYbARS5XNpc/w0v145oGkM6poF/CvhKJwzLhM5sEZbtrghMA+psAhOJkCTzJoseicA==} - react@18.3.1: resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} engines: {node: '>=0.10.0'} @@ -4773,9 +4160,6 @@ packages: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} - resize-observer-polyfill@1.5.1: - resolution: {integrity: sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==} - resolve-from@3.0.0: resolution: {integrity: sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==} engines: {node: '>=4'} @@ -4859,19 +4243,9 @@ packages: safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - scheduler@0.21.0: - resolution: {integrity: sha512-1r87x5fz9MXqswA2ERLo0EbOAU74DpIUO090gIasYTqlVoJeMcl+Z1Rg7WHz+qtPujhS/hGIt9kxZOYBV3faRQ==} - - scheduler@0.23.2: - resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} - scheduler@0.24.0-canary-efb381bbf-20230505: resolution: {integrity: sha512-ABvovCDe/k9IluqSh4/ISoq8tIJnW8euVAWYt5j/bg6dRnqwQwiGO1F/V4AyK96NGF/FB04FhOUDuWj8IKfABA==} - schema-utils@3.3.0: - resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} - engines: {node: '>= 10.13.0'} - selfsigned@2.4.1: resolution: {integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==} engines: {node: '>=10'} @@ -4897,9 +4271,6 @@ packages: resolution: {integrity: sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==} engines: {node: '>=0.10.0'} - serialize-javascript@6.0.2: - resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} - serve-static@1.16.2: resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} engines: {node: '>= 0.8.0'} @@ -4996,10 +4367,6 @@ packages: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} - source-map@0.7.4: - resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} - engines: {node: '>= 8'} - space-separated-tokens@2.0.2: resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} @@ -5100,15 +4467,6 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - suspend-react@0.1.3: - resolution: {integrity: sha512-aqldKgX9aZqpoDp3e8/BZ8Dm7x1pJl+qI3ZKxDN0i/IQTWUwBx/ManmlVJ3wowqbno6c2bmiIfs+Um6LbsjJyQ==} - peerDependencies: - react: '>=17.0' - - tapable@2.2.1: - resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} - engines: {node: '>=6'} - tar-fs@2.1.1: resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} @@ -5123,22 +4481,6 @@ packages: resolution: {integrity: sha512-s0ZZzd0BzYv5tLSptZooSjK8oj6C+c19p7Vqta9+6NPOf7r+fxq0cJe6/oN4LTC79sy5NY8ucOJNgwsKCSbfqg==} engines: {node: '>=6.0.0'} - terser-webpack-plugin@5.3.10: - resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==} - engines: {node: '>= 10.13.0'} - peerDependencies: - '@swc/core': '*' - esbuild: '*' - uglify-js: '*' - webpack: ^5.1.0 - peerDependenciesMeta: - '@swc/core': - optional: true - esbuild: - optional: true - uglify-js: - optional: true - terser@5.36.0: resolution: {integrity: sha512-IYV9eNMuFAV4THUspIRXkLakHnV6XO7FEdtKjf/mDyrnqUg9LnlOn6/RwRvM9SZjR4GUq8Nk8zj67FzVARr74w==} engines: {node: '>=10'} @@ -5148,24 +4490,12 @@ packages: resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} engines: {node: '>=8'} - thingies@1.21.0: - resolution: {integrity: sha512-hsqsJsFMsV+aD4s3CWKk85ep/3I9XzYV/IXaSouJMYIoDlgyi11cBhsqYe9/geRfB0YIikBQg6raRaM+nIMP9g==} - engines: {node: '>=10.18'} - peerDependencies: - tslib: ^2 - - three@0.170.0: - resolution: {integrity: sha512-FQK+LEpYc0fBD+J8g6oSEyyNzjp+Q7Ks1C568WWaoMRLW+TkNNWmenWeGgJjV105Gd+p/2ql1ZcjYvNiPZBhuQ==} - throat@5.0.0: resolution: {integrity: sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==} through2@2.0.5: resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} - thunky@1.1.0: - resolution: {integrity: sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==} - timers-browserify@2.0.12: resolution: {integrity: sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==} engines: {node: '>=0.6.0'} @@ -5206,36 +4536,9 @@ packages: tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - tree-dump@1.0.2: - resolution: {integrity: sha512-dpev9ABuLWdEubk+cIaI9cHwRNNDjkBBLXTwI4UCUFdQ5xXKqNXoK4FEciw/vxf+NQ7Cb7sGUyeUtORvHIdRXQ==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - trim-lines@3.0.1: resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} - ts-loader@9.5.1: - resolution: {integrity: sha512-rNH3sK9kGZcH9dYzC7CewQm4NtxJTjSEVRJ2DyBZR7f8/wcta+iV44UPCXc5+nzDzivKtlzV6c9P4e+oFhDLYg==} - engines: {node: '>=12.0.0'} - peerDependencies: - typescript: '*' - webpack: ^5.0.0 - - ts-node@10.9.2: - resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} - hasBin: true - peerDependencies: - '@swc/core': '>=1.2.50' - '@swc/wasm': '>=1.2.50' - '@types/node': '*' - typescript: '>=2.7' - peerDependenciesMeta: - '@swc/core': - optional: true - '@swc/wasm': - optional: true - ts-poet@6.9.0: resolution: {integrity: sha512-roe6W6MeZmCjRmppyfOURklO5tQFQ6Sg7swURKkwYJvV7dbGCrK28um5+51iW3twdPRKtwarqFAVMU6G1mvnuQ==} @@ -5373,9 +4676,6 @@ packages: resolution: {integrity: sha512-+dwUY4L35XFYEzE+OAL3sarJdUioVovq+8f7lcIJ7wnmnYQV5UD1Y/lcwaMSyaQ6Bj3JMj1XSTjZbNLHn/19yA==} engines: {node: '>=18'} - uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - url-join@4.0.1: resolution: {integrity: sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==} @@ -5397,9 +4697,6 @@ packages: resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} engines: {node: '>= 0.4.0'} - v8-compile-cache-lib@3.0.1: - resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} - validate-peer-dependencies@1.2.0: resolution: {integrity: sha512-nd2HUpKc6RWblPZQ2GDuI65sxJ2n/UqZwSBVtj64xlWjMx0m7ZB2m9b2JS3v1f+n9VWH/dd1CMhkHfP6pIdckA==} @@ -5458,46 +4755,6 @@ packages: terser: optional: true - vite@6.0.0: - resolution: {integrity: sha512-Q2+5yQV79EdnpbNxjD3/QHVMCBaQ3Kpd4/uL51UGuh38bIIM+s4o3FqyCzRvTRwFb+cWIUeZvaWwS9y2LD2qeQ==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} - hasBin: true - peerDependencies: - '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 - jiti: '>=1.21.0' - less: '*' - lightningcss: ^1.21.0 - sass: '*' - sass-embedded: '*' - stylus: '*' - sugarss: '*' - terser: ^5.16.0 - tsx: ^4.8.1 - yaml: ^2.4.2 - peerDependenciesMeta: - '@types/node': - optional: true - jiti: - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - sass-embedded: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - tsx: - optional: true - yaml: - optional: true - vitest@2.1.4: resolution: {integrity: sha512-eDjxbVAJw1UJJCHr5xr/xM86Zx+YxIEXGAR+bmnEID7z9qWfoxpHw0zdobz+TQAFOLT+nEXz3+gx6nUJ7RgmlQ==} engines: {node: ^18.0.0 || >=20.0.0} @@ -5536,10 +4793,6 @@ packages: walker@1.0.8: resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} - watchpack@2.4.2: - resolution: {integrity: sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==} - engines: {node: '>=10.13.0'} - wcwidth@1.0.1: resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} @@ -5549,20 +4802,6 @@ packages: webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - webpack-sources@3.2.3: - resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} - engines: {node: '>=10.13.0'} - - webpack@5.96.1: - resolution: {integrity: sha512-l2LlBSvVZGhL4ZrPwyr8+37AunkcYj5qh8o6u2/2rzoPc8gxFJkLj1WxNgooi9pnoc06jh0BjuXnamM4qlujZA==} - engines: {node: '>=10.13.0'} - hasBin: true - peerDependencies: - webpack-cli: '*' - peerDependenciesMeta: - webpack-cli: - optional: true - whatwg-fetch@3.6.20: resolution: {integrity: sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==} @@ -5686,10 +4925,6 @@ packages: resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} engines: {node: '>=12'} - yn@3.1.1: - resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} - engines: {node: '>=6'} - yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} @@ -5698,18 +4933,6 @@ packages: resolution: {integrity: sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==} engines: {node: '>=18'} - zdog@1.1.3: - resolution: {integrity: sha512-raRj6r0gPzopFm5XWBJZr/NuV4EEnT4iE+U3dp5FV5pCb588Gmm3zLIp/j9yqqcMiHH8VNQlerLTgOqL7krh6w==} - - zustand@3.7.2: - resolution: {integrity: sha512-PIJDIZKtokhof+9+60cpockVOq05sJzHCriyvaLBmEJixseQ1a5Kdov6fWZfWOu5SK9c+FhH1jU0tntLxRJYMA==} - engines: {node: '>=12.7.0'} - peerDependencies: - react: '>=16.8' - peerDependenciesMeta: - react: - optional: true - zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} @@ -6676,221 +5899,145 @@ snapshots: dependencies: '@chainsafe/is-ip': 2.0.2 - '@cspotcode/source-map-support@0.8.1': - dependencies: - '@jridgewell/trace-mapping': 0.3.9 - '@esbuild/aix-ppc64@0.21.5': optional: true '@esbuild/aix-ppc64@0.23.1': optional: true - '@esbuild/aix-ppc64@0.24.0': - optional: true - '@esbuild/android-arm64@0.21.5': optional: true '@esbuild/android-arm64@0.23.1': optional: true - '@esbuild/android-arm64@0.24.0': - optional: true - '@esbuild/android-arm@0.21.5': optional: true '@esbuild/android-arm@0.23.1': optional: true - '@esbuild/android-arm@0.24.0': - optional: true - '@esbuild/android-x64@0.21.5': optional: true '@esbuild/android-x64@0.23.1': optional: true - '@esbuild/android-x64@0.24.0': - optional: true - '@esbuild/darwin-arm64@0.21.5': optional: true '@esbuild/darwin-arm64@0.23.1': optional: true - '@esbuild/darwin-arm64@0.24.0': - optional: true - '@esbuild/darwin-x64@0.21.5': optional: true '@esbuild/darwin-x64@0.23.1': optional: true - '@esbuild/darwin-x64@0.24.0': - optional: true - '@esbuild/freebsd-arm64@0.21.5': optional: true '@esbuild/freebsd-arm64@0.23.1': optional: true - '@esbuild/freebsd-arm64@0.24.0': - optional: true - '@esbuild/freebsd-x64@0.21.5': optional: true '@esbuild/freebsd-x64@0.23.1': optional: true - '@esbuild/freebsd-x64@0.24.0': - optional: true - '@esbuild/linux-arm64@0.21.5': optional: true '@esbuild/linux-arm64@0.23.1': optional: true - '@esbuild/linux-arm64@0.24.0': - optional: true - '@esbuild/linux-arm@0.21.5': optional: true '@esbuild/linux-arm@0.23.1': optional: true - '@esbuild/linux-arm@0.24.0': - optional: true - '@esbuild/linux-ia32@0.21.5': optional: true '@esbuild/linux-ia32@0.23.1': optional: true - '@esbuild/linux-ia32@0.24.0': - optional: true - '@esbuild/linux-loong64@0.21.5': optional: true '@esbuild/linux-loong64@0.23.1': optional: true - '@esbuild/linux-loong64@0.24.0': - optional: true - '@esbuild/linux-mips64el@0.21.5': optional: true '@esbuild/linux-mips64el@0.23.1': optional: true - '@esbuild/linux-mips64el@0.24.0': - optional: true - '@esbuild/linux-ppc64@0.21.5': optional: true '@esbuild/linux-ppc64@0.23.1': optional: true - '@esbuild/linux-ppc64@0.24.0': - optional: true - '@esbuild/linux-riscv64@0.21.5': optional: true '@esbuild/linux-riscv64@0.23.1': optional: true - '@esbuild/linux-riscv64@0.24.0': - optional: true - '@esbuild/linux-s390x@0.21.5': optional: true '@esbuild/linux-s390x@0.23.1': optional: true - '@esbuild/linux-s390x@0.24.0': - optional: true - '@esbuild/linux-x64@0.21.5': optional: true '@esbuild/linux-x64@0.23.1': optional: true - '@esbuild/linux-x64@0.24.0': - optional: true - '@esbuild/netbsd-x64@0.21.5': optional: true '@esbuild/netbsd-x64@0.23.1': optional: true - '@esbuild/netbsd-x64@0.24.0': - optional: true - '@esbuild/openbsd-arm64@0.23.1': optional: true - '@esbuild/openbsd-arm64@0.24.0': - optional: true - '@esbuild/openbsd-x64@0.21.5': optional: true '@esbuild/openbsd-x64@0.23.1': optional: true - '@esbuild/openbsd-x64@0.24.0': - optional: true - '@esbuild/sunos-x64@0.21.5': optional: true '@esbuild/sunos-x64@0.23.1': optional: true - '@esbuild/sunos-x64@0.24.0': - optional: true - '@esbuild/win32-arm64@0.21.5': optional: true '@esbuild/win32-arm64@0.23.1': optional: true - '@esbuild/win32-arm64@0.24.0': - optional: true - '@esbuild/win32-ia32@0.21.5': optional: true '@esbuild/win32-ia32@0.23.1': optional: true - '@esbuild/win32-ia32@0.24.0': - optional: true - '@esbuild/win32-x64@0.21.5': optional: true - '@esbuild/win32-x64@0.23.1': - optional: true - - '@esbuild/win32-x64@0.24.0': + '@esbuild/win32-x64@0.23.1': optional: true '@grpc/grpc-js@1.12.2': @@ -6996,29 +6143,8 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 - '@jridgewell/trace-mapping@0.3.9': - dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.0 - '@js-sdsl/ordered-map@4.4.2': {} - '@jsonjoy.com/base64@1.1.2(tslib@2.8.1)': - dependencies: - tslib: 2.8.1 - - '@jsonjoy.com/json-pack@1.1.0(tslib@2.8.1)': - dependencies: - '@jsonjoy.com/base64': 1.1.2(tslib@2.8.1) - '@jsonjoy.com/util': 1.5.0(tslib@2.8.1) - hyperdyperid: 1.2.0 - thingies: 1.21.0(tslib@2.8.1) - tslib: 2.8.1 - - '@jsonjoy.com/util@1.5.0(tslib@2.8.1)': - dependencies: - tslib: 2.8.1 - '@leichtgewicht/ip-codec@2.0.5': {} '@libp2p/autonat@2.0.10': @@ -7148,17 +6274,6 @@ snapshots: multiformats: 13.3.1 weald: 1.0.4 - '@libp2p/mdns@11.0.10': - dependencies: - '@libp2p/interface': 2.2.0 - '@libp2p/interface-internal': 2.0.10 - '@libp2p/peer-id': 5.0.7 - '@libp2p/utils': 6.1.3 - '@multiformats/multiaddr': 12.3.1 - '@types/multicast-dns': 7.2.4 - dns-packet: 5.6.1 - multicast-dns: 7.2.5 - '@libp2p/multistream-select@6.0.8': dependencies: '@libp2p/interface': 2.2.0 @@ -7627,98 +6742,6 @@ snapshots: optionalDependencies: '@types/react': 18.3.12 - '@react-spring/animated@9.7.5(react@18.3.1)': - dependencies: - '@react-spring/shared': 9.7.5(react@18.3.1) - '@react-spring/types': 9.7.5 - react: 18.3.1 - - '@react-spring/core@9.7.5(react@18.3.1)': - dependencies: - '@react-spring/animated': 9.7.5(react@18.3.1) - '@react-spring/shared': 9.7.5(react@18.3.1) - '@react-spring/types': 9.7.5 - react: 18.3.1 - - '@react-spring/konva@9.7.5(konva@9.3.16)(react-konva@18.2.10(konva@9.3.16)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)': - dependencies: - '@react-spring/animated': 9.7.5(react@18.3.1) - '@react-spring/core': 9.7.5(react@18.3.1) - '@react-spring/shared': 9.7.5(react@18.3.1) - '@react-spring/types': 9.7.5 - konva: 9.3.16 - react: 18.3.1 - react-konva: 18.2.10(konva@9.3.16)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - - '@react-spring/native@9.7.5(react-native@0.76.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@types/react@18.3.12)(react@18.3.1))(react@18.3.1)': - dependencies: - '@react-spring/animated': 9.7.5(react@18.3.1) - '@react-spring/core': 9.7.5(react@18.3.1) - '@react-spring/shared': 9.7.5(react@18.3.1) - '@react-spring/types': 9.7.5 - react: 18.3.1 - react-native: 0.76.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@types/react@18.3.12)(react@18.3.1) - - '@react-spring/rafz@9.7.5': {} - - '@react-spring/shared@9.7.5(react@18.3.1)': - dependencies: - '@react-spring/rafz': 9.7.5 - '@react-spring/types': 9.7.5 - react: 18.3.1 - - '@react-spring/three@9.7.5(@react-three/fiber@8.17.10(react-dom@18.3.1(react@18.3.1))(react-native@0.76.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@types/react@18.3.12)(react@18.3.1))(react@18.3.1)(three@0.170.0))(react@18.3.1)(three@0.170.0)': - dependencies: - '@react-spring/animated': 9.7.5(react@18.3.1) - '@react-spring/core': 9.7.5(react@18.3.1) - '@react-spring/shared': 9.7.5(react@18.3.1) - '@react-spring/types': 9.7.5 - '@react-three/fiber': 8.17.10(react-dom@18.3.1(react@18.3.1))(react-native@0.76.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@types/react@18.3.12)(react@18.3.1))(react@18.3.1)(three@0.170.0) - react: 18.3.1 - three: 0.170.0 - - '@react-spring/types@9.7.5': {} - - '@react-spring/web@9.7.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@react-spring/animated': 9.7.5(react@18.3.1) - '@react-spring/core': 9.7.5(react@18.3.1) - '@react-spring/shared': 9.7.5(react@18.3.1) - '@react-spring/types': 9.7.5 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - '@react-spring/zdog@9.7.5(react-dom@18.3.1(react@18.3.1))(react-zdog@1.2.2)(react@18.3.1)(zdog@1.1.3)': - dependencies: - '@react-spring/animated': 9.7.5(react@18.3.1) - '@react-spring/core': 9.7.5(react@18.3.1) - '@react-spring/shared': 9.7.5(react@18.3.1) - '@react-spring/types': 9.7.5 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-zdog: 1.2.2 - zdog: 1.1.3 - - '@react-three/fiber@8.17.10(react-dom@18.3.1(react@18.3.1))(react-native@0.76.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@types/react@18.3.12)(react@18.3.1))(react@18.3.1)(three@0.170.0)': - dependencies: - '@babel/runtime': 7.26.0 - '@types/debounce': 1.2.4 - '@types/react-reconciler': 0.26.7 - '@types/webxr': 0.5.20 - base64-js: 1.5.1 - buffer: 6.0.3 - debounce: 1.2.1 - its-fine: 1.2.5(react@18.3.1) - react: 18.3.1 - react-reconciler: 0.27.0(react@18.3.1) - scheduler: 0.21.0 - suspend-react: 0.1.3(react@18.3.1) - three: 0.170.0 - zustand: 3.7.2(react@18.3.1) - optionalDependencies: - react-dom: 18.3.1(react@18.3.1) - react-native: 0.76.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@types/react@18.3.12)(react@18.3.1) - '@release-it-plugins/workspaces@4.2.0(release-it@17.10.0(typescript@5.6.3))': dependencies: detect-indent: 6.1.0 @@ -7852,14 +6875,6 @@ snapshots: '@tootallnate/quickjs-emscripten@0.23.0': {} - '@tsconfig/node10@1.0.11': {} - - '@tsconfig/node12@1.0.11': {} - - '@tsconfig/node14@1.0.3': {} - - '@tsconfig/node16@1.0.4': {} - '@types/babel__core@7.20.5': dependencies: '@babel/parser': 7.26.2 @@ -7881,22 +6896,10 @@ snapshots: dependencies: '@babel/types': 7.26.0 - '@types/debounce@1.2.4': {} - '@types/dns-packet@5.6.5': dependencies: '@types/node': 22.9.0 - '@types/eslint-scope@3.7.7': - dependencies: - '@types/eslint': 9.6.1 - '@types/estree': 1.0.6 - - '@types/eslint@9.6.1': - dependencies: - '@types/estree': 1.0.6 - '@types/json-schema': 7.0.15 - '@types/estree@1.0.6': {} '@types/graceful-fs@4.1.9': @@ -7917,19 +6920,12 @@ snapshots: dependencies: '@types/istanbul-lib-report': 3.0.3 - '@types/json-schema@7.0.15': {} - '@types/mdast@4.0.4': dependencies: '@types/unist': 3.0.3 '@types/minimatch@3.0.5': {} - '@types/multicast-dns@7.2.4': - dependencies: - '@types/dns-packet': 5.6.5 - '@types/node': 22.9.0 - '@types/murmurhash3js-revisited@3.0.3': {} '@types/node-forge@1.3.11': @@ -7940,20 +6936,14 @@ snapshots: dependencies: undici-types: 6.19.8 - '@types/prop-types@15.7.13': {} - - '@types/react-reconciler@0.26.7': - dependencies: - '@types/react': 18.3.12 - - '@types/react-reconciler@0.28.8': - dependencies: - '@types/react': 18.3.12 + '@types/prop-types@15.7.13': + optional: true '@types/react@18.3.12': dependencies: '@types/prop-types': 15.7.13 csstype: 3.1.3 + optional: true '@types/retry@0.12.2': {} @@ -7961,8 +6951,6 @@ snapshots: '@types/unist@3.0.3': {} - '@types/webxr@0.5.20': {} - '@types/ws@8.5.13': dependencies: '@types/node': 22.9.0 @@ -8015,86 +7003,6 @@ snapshots: loupe: 3.1.2 tinyrainbow: 1.2.0 - '@webassemblyjs/ast@1.12.1': - dependencies: - '@webassemblyjs/helper-numbers': 1.11.6 - '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - - '@webassemblyjs/floating-point-hex-parser@1.11.6': {} - - '@webassemblyjs/helper-api-error@1.11.6': {} - - '@webassemblyjs/helper-buffer@1.12.1': {} - - '@webassemblyjs/helper-numbers@1.11.6': - dependencies: - '@webassemblyjs/floating-point-hex-parser': 1.11.6 - '@webassemblyjs/helper-api-error': 1.11.6 - '@xtuc/long': 4.2.2 - - '@webassemblyjs/helper-wasm-bytecode@1.11.6': {} - - '@webassemblyjs/helper-wasm-section@1.12.1': - dependencies: - '@webassemblyjs/ast': 1.12.1 - '@webassemblyjs/helper-buffer': 1.12.1 - '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - '@webassemblyjs/wasm-gen': 1.12.1 - - '@webassemblyjs/ieee754@1.11.6': - dependencies: - '@xtuc/ieee754': 1.2.0 - - '@webassemblyjs/leb128@1.11.6': - dependencies: - '@xtuc/long': 4.2.2 - - '@webassemblyjs/utf8@1.11.6': {} - - '@webassemblyjs/wasm-edit@1.12.1': - dependencies: - '@webassemblyjs/ast': 1.12.1 - '@webassemblyjs/helper-buffer': 1.12.1 - '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - '@webassemblyjs/helper-wasm-section': 1.12.1 - '@webassemblyjs/wasm-gen': 1.12.1 - '@webassemblyjs/wasm-opt': 1.12.1 - '@webassemblyjs/wasm-parser': 1.12.1 - '@webassemblyjs/wast-printer': 1.12.1 - - '@webassemblyjs/wasm-gen@1.12.1': - dependencies: - '@webassemblyjs/ast': 1.12.1 - '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - '@webassemblyjs/ieee754': 1.11.6 - '@webassemblyjs/leb128': 1.11.6 - '@webassemblyjs/utf8': 1.11.6 - - '@webassemblyjs/wasm-opt@1.12.1': - dependencies: - '@webassemblyjs/ast': 1.12.1 - '@webassemblyjs/helper-buffer': 1.12.1 - '@webassemblyjs/wasm-gen': 1.12.1 - '@webassemblyjs/wasm-parser': 1.12.1 - - '@webassemblyjs/wasm-parser@1.12.1': - dependencies: - '@webassemblyjs/ast': 1.12.1 - '@webassemblyjs/helper-api-error': 1.11.6 - '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - '@webassemblyjs/ieee754': 1.11.6 - '@webassemblyjs/leb128': 1.11.6 - '@webassemblyjs/utf8': 1.11.6 - - '@webassemblyjs/wast-printer@1.12.1': - dependencies: - '@webassemblyjs/ast': 1.12.1 - '@xtuc/long': 4.2.2 - - '@xtuc/ieee754@1.2.0': {} - - '@xtuc/long@4.2.2': {} - abort-controller@3.0.0: dependencies: event-target-shim: 5.0.1 @@ -8104,10 +7012,6 @@ snapshots: mime-types: 2.1.35 negotiator: 0.6.3 - acorn-walk@8.3.4: - dependencies: - acorn: 8.14.0 - acorn@8.14.0: {} agent-base@7.1.1: @@ -8116,17 +7020,6 @@ snapshots: transitivePeerDependencies: - supports-color - ajv-keywords@3.5.2(ajv@6.12.6): - dependencies: - ajv: 6.12.6 - - ajv@6.12.6: - dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 - anser@1.4.10: {} ansi-align@3.0.1: @@ -8156,8 +7049,6 @@ snapshots: normalize-path: 3.0.0 picomatch: 2.3.1 - arg@4.1.3: {} - argparse@1.0.10: dependencies: sprintf-js: 1.0.3 @@ -8512,8 +7403,6 @@ snapshots: transitivePeerDependencies: - supports-color - chrome-trace-event@1.0.4: {} - chromium-edge-launcher@0.2.0: dependencies: '@types/node': 22.9.0 @@ -8674,7 +7563,8 @@ snapshots: randombytes: 2.1.0 randomfill: 1.0.4 - csstype@3.1.3: {} + csstype@3.1.3: + optional: true data-uri-to-buffer@6.0.2: {} @@ -8692,8 +7582,6 @@ snapshots: it-sort: 3.0.6 it-take: 3.0.6 - debounce@1.2.1: {} - debug@2.6.9: dependencies: ms: 2.0.0 @@ -8778,8 +7666,6 @@ snapshots: dependencies: dequal: 2.0.3 - diff@4.0.2: {} - diffie-hellman@5.0.3: dependencies: bn.js: 4.12.0 @@ -8828,11 +7714,6 @@ snapshots: dependencies: once: 1.4.0 - enhanced-resolve@5.17.1: - dependencies: - graceful-fs: 4.2.11 - tapable: 2.2.1 - ensure-posix-path@1.1.1: {} entities@4.5.0: {} @@ -8853,8 +7734,6 @@ snapshots: es-errors@1.3.0: {} - es-module-lexer@1.5.4: {} - esbuild@0.21.5: optionalDependencies: '@esbuild/aix-ppc64': 0.21.5 @@ -8908,33 +7787,6 @@ snapshots: '@esbuild/win32-ia32': 0.23.1 '@esbuild/win32-x64': 0.23.1 - esbuild@0.24.0: - optionalDependencies: - '@esbuild/aix-ppc64': 0.24.0 - '@esbuild/android-arm': 0.24.0 - '@esbuild/android-arm64': 0.24.0 - '@esbuild/android-x64': 0.24.0 - '@esbuild/darwin-arm64': 0.24.0 - '@esbuild/darwin-x64': 0.24.0 - '@esbuild/freebsd-arm64': 0.24.0 - '@esbuild/freebsd-x64': 0.24.0 - '@esbuild/linux-arm': 0.24.0 - '@esbuild/linux-arm64': 0.24.0 - '@esbuild/linux-ia32': 0.24.0 - '@esbuild/linux-loong64': 0.24.0 - '@esbuild/linux-mips64el': 0.24.0 - '@esbuild/linux-ppc64': 0.24.0 - '@esbuild/linux-riscv64': 0.24.0 - '@esbuild/linux-s390x': 0.24.0 - '@esbuild/linux-x64': 0.24.0 - '@esbuild/netbsd-x64': 0.24.0 - '@esbuild/openbsd-arm64': 0.24.0 - '@esbuild/openbsd-x64': 0.24.0 - '@esbuild/sunos-x64': 0.24.0 - '@esbuild/win32-arm64': 0.24.0 - '@esbuild/win32-ia32': 0.24.0 - '@esbuild/win32-x64': 0.24.0 - escalade@3.2.0: {} escape-goat@4.0.0: {} @@ -8953,19 +7805,8 @@ snapshots: optionalDependencies: source-map: 0.6.1 - eslint-scope@5.1.1: - dependencies: - esrecurse: 4.3.0 - estraverse: 4.3.0 - esprima@4.0.1: {} - esrecurse@4.3.0: - dependencies: - estraverse: 5.3.0 - - estraverse@4.3.0: {} - estraverse@5.3.0: {} estree-walker@2.0.2: {} @@ -9029,8 +7870,6 @@ snapshots: iconv-lite: 0.4.24 tmp: 0.0.33 - fast-deep-equal@3.1.3: {} - fast-glob@3.3.2: dependencies: '@nodelib/fs.stat': 2.0.5 @@ -9160,8 +7999,6 @@ snapshots: dependencies: is-glob: 4.0.3 - glob-to-regexp@0.4.1: {} - glob@7.2.3: dependencies: fs.realpath: 1.0.0 @@ -9188,8 +8025,6 @@ snapshots: globrex@0.1.2: {} - google-protobuf@3.21.4: {} - gopd@1.0.1: dependencies: get-intrinsic: 1.2.4 @@ -9294,8 +8129,6 @@ snapshots: human-signals@5.0.0: {} - hyperdyperid@1.2.0: {} - iconv-lite@0.4.24: dependencies: safer-buffer: 2.1.2 @@ -9599,11 +8432,6 @@ snapshots: - bufferutil - utf-8-validate - its-fine@1.2.5(react@18.3.1): - dependencies: - '@types/react-reconciler': 0.28.8 - react: 18.3.1 - jest-environment-node@29.7.0: dependencies: '@jest/environment': 29.7.0 @@ -9669,12 +8497,6 @@ snapshots: leven: 3.1.0 pretty-format: 29.7.0 - jest-worker@27.5.1: - dependencies: - '@types/node': 22.9.0 - merge-stream: 2.0.0 - supports-color: 8.1.1 - jest-worker@29.7.0: dependencies: '@types/node': 22.9.0 @@ -9730,8 +8552,6 @@ snapshots: json-parse-even-better-errors@2.3.1: {} - json-schema-traverse@0.4.1: {} - json5@2.2.3: {} jsonfile@6.1.0: @@ -9742,8 +8562,6 @@ snapshots: kind-of@6.0.3: {} - konva@9.3.16: {} - ky@1.7.2: {} latest-version@9.0.0: @@ -9794,8 +8612,6 @@ snapshots: dependencies: uc.micro: 2.1.0 - loader-runner@4.3.0: {} - locate-path@3.0.0: dependencies: p-locate: 3.0.0 @@ -9868,8 +8684,6 @@ snapshots: pify: 4.0.1 semver: 5.7.2 - make-error@1.3.6: {} - makeerror@1.0.12: dependencies: tmpl: 1.0.5 @@ -9910,13 +8724,6 @@ snapshots: mdurl@2.0.0: {} - memfs@4.14.0: - dependencies: - '@jsonjoy.com/json-pack': 1.1.0(tslib@2.8.1) - '@jsonjoy.com/util': 1.5.0(tslib@2.8.1) - tree-dump: 1.0.2(tslib@2.8.1) - tslib: 2.8.1 - memoize-one@5.2.1: {} merge-options@3.0.4: @@ -10185,11 +8992,6 @@ snapshots: ms@3.0.0-canary.1: {} - multicast-dns@7.2.5: - dependencies: - dns-packet: 5.6.1 - thunky: 1.1.0 - multiformats@13.3.1: {} murmurhash3js-revisited@3.0.0: {} @@ -10535,7 +9337,7 @@ snapshots: possible-typed-array-names@1.0.0: {} - postcss@8.4.49: + postcss@8.4.47: dependencies: nanoid: 3.3.7 picocolors: 1.1.1 @@ -10632,8 +9434,6 @@ snapshots: punycode@1.4.1: {} - punycode@2.3.1: {} - pupa@3.1.0: dependencies: escape-goat: 4.0.0 @@ -10686,24 +9486,8 @@ snapshots: - bufferutil - utf-8-validate - react-dom@18.3.1(react@18.3.1): - dependencies: - loose-envify: 1.4.0 - react: 18.3.1 - scheduler: 0.23.2 - react-is@18.3.1: {} - react-konva@18.2.10(konva@9.3.16)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - '@types/react-reconciler': 0.28.8 - its-fine: 1.2.5(react@18.3.1) - konva: 9.3.16 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-reconciler: 0.29.2(react@18.3.1) - scheduler: 0.23.2 - react-native-webrtc@124.0.4(react-native@0.76.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@types/react@18.3.12)(react@18.3.1)): dependencies: base64-js: 1.5.1 @@ -10765,45 +9549,8 @@ snapshots: - supports-color - utf-8-validate - react-reconciler@0.27.0(react@18.3.1): - dependencies: - loose-envify: 1.4.0 - react: 18.3.1 - scheduler: 0.21.0 - - react-reconciler@0.29.2(react@18.3.1): - dependencies: - loose-envify: 1.4.0 - react: 18.3.1 - scheduler: 0.23.2 - react-refresh@0.14.2: {} - react-spring@9.7.4(@react-three/fiber@8.17.10(react-dom@18.3.1(react@18.3.1))(react-native@0.76.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@types/react@18.3.12)(react@18.3.1))(react@18.3.1)(three@0.170.0))(konva@9.3.16)(react-dom@18.3.1(react@18.3.1))(react-konva@18.2.10(konva@9.3.16)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-native@0.76.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@types/react@18.3.12)(react@18.3.1))(react-zdog@1.2.2)(react@18.3.1)(three@0.170.0)(zdog@1.1.3): - dependencies: - '@react-spring/core': 9.7.5(react@18.3.1) - '@react-spring/konva': 9.7.5(konva@9.3.16)(react-konva@18.2.10(konva@9.3.16)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) - '@react-spring/native': 9.7.5(react-native@0.76.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@types/react@18.3.12)(react@18.3.1))(react@18.3.1) - '@react-spring/three': 9.7.5(@react-three/fiber@8.17.10(react-dom@18.3.1(react@18.3.1))(react-native@0.76.1(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@types/react@18.3.12)(react@18.3.1))(react@18.3.1)(three@0.170.0))(react@18.3.1)(three@0.170.0) - '@react-spring/web': 9.7.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-spring/zdog': 9.7.5(react-dom@18.3.1(react@18.3.1))(react-zdog@1.2.2)(react@18.3.1)(zdog@1.1.3) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - '@react-three/fiber' - - konva - - react-konva - - react-native - - react-zdog - - three - - zdog - - react-zdog@1.2.2: - dependencies: - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - resize-observer-polyfill: 1.5.1 - react@18.3.1: dependencies: loose-envify: 1.4.0 @@ -10908,8 +9655,6 @@ snapshots: require-directory@2.1.1: {} - resize-observer-polyfill@1.5.1: {} - resolve-from@3.0.0: {} resolve-from@4.0.0: {} @@ -11000,24 +9745,10 @@ snapshots: safer-buffer@2.1.2: {} - scheduler@0.21.0: - dependencies: - loose-envify: 1.4.0 - - scheduler@0.23.2: - dependencies: - loose-envify: 1.4.0 - scheduler@0.24.0-canary-efb381bbf-20230505: dependencies: loose-envify: 1.4.0 - schema-utils@3.3.0: - dependencies: - '@types/json-schema': 7.0.15 - ajv: 6.12.6 - ajv-keywords: 3.5.2(ajv@6.12.6) - selfsigned@2.4.1: dependencies: '@types/node-forge': 1.3.11 @@ -11049,10 +9780,6 @@ snapshots: serialize-error@2.1.0: {} - serialize-javascript@6.0.2: - dependencies: - randombytes: 2.1.0 - serve-static@1.16.2: dependencies: encodeurl: 2.0.0 @@ -11158,8 +9885,6 @@ snapshots: source-map@0.6.1: {} - source-map@0.7.4: {} - space-separated-tokens@2.0.2: {} sprintf-js@1.0.3: {} @@ -11251,12 +9976,6 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - suspend-react@0.1.3(react@18.3.1): - dependencies: - react: 18.3.1 - - tapable@2.2.1: {} - tar-fs@2.1.1: dependencies: chownr: 1.1.4 @@ -11280,15 +9999,6 @@ snapshots: dependencies: rimraf: 2.6.3 - terser-webpack-plugin@5.3.10(webpack@5.96.1): - dependencies: - '@jridgewell/trace-mapping': 0.3.25 - jest-worker: 27.5.1 - schema-utils: 3.3.0 - serialize-javascript: 6.0.2 - terser: 5.36.0 - webpack: 5.96.1 - terser@5.36.0: dependencies: '@jridgewell/source-map': 0.3.6 @@ -11302,12 +10012,6 @@ snapshots: glob: 7.2.3 minimatch: 3.1.2 - thingies@1.21.0(tslib@2.8.1): - dependencies: - tslib: 2.8.1 - - three@0.170.0: {} - throat@5.0.0: {} through2@2.0.5: @@ -11315,8 +10019,6 @@ snapshots: readable-stream: 2.3.8 xtend: 4.0.2 - thunky@1.1.0: {} - timers-browserify@2.0.12: dependencies: setimmediate: 1.0.5 @@ -11345,40 +10047,8 @@ snapshots: tr46@0.0.3: {} - tree-dump@1.0.2(tslib@2.8.1): - dependencies: - tslib: 2.8.1 - trim-lines@3.0.1: {} - ts-loader@9.5.1(typescript@5.6.3)(webpack@5.96.1): - dependencies: - chalk: 4.1.2 - enhanced-resolve: 5.17.1 - micromatch: 4.0.8 - semver: 7.6.3 - source-map: 0.7.4 - typescript: 5.6.3 - webpack: 5.96.1 - - ts-node@10.9.2(@types/node@22.9.0)(typescript@5.6.3): - dependencies: - '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.11 - '@tsconfig/node12': 1.0.11 - '@tsconfig/node14': 1.0.3 - '@tsconfig/node16': 1.0.4 - '@types/node': 22.9.0 - acorn: 8.14.0 - acorn-walk: 8.3.4 - arg: 4.1.3 - create-require: 1.1.1 - diff: 4.0.2 - make-error: 1.3.6 - typescript: 5.6.3 - v8-compile-cache-lib: 3.0.1 - yn: 3.1.1 - ts-poet@6.9.0: dependencies: dprint-node: 1.0.8 @@ -11512,10 +10182,6 @@ snapshots: semver: 7.6.3 xdg-basedir: 5.1.0 - uri-js@4.4.1: - dependencies: - punycode: 2.3.1 - url-join@4.0.1: {} url-join@5.0.0: {} @@ -11537,8 +10203,6 @@ snapshots: utils-merge@1.0.1: {} - v8-compile-cache-lib@3.0.1: {} - validate-peer-dependencies@1.2.0: dependencies: resolve-package-path: 3.1.0 @@ -11571,21 +10235,21 @@ snapshots: - supports-color - terser - vite-plugin-node-polyfills@0.22.0(rollup@4.24.4)(vite@6.0.0(@types/node@22.9.0)(terser@5.36.0)(tsx@4.19.1)(yaml@2.6.0)): + vite-plugin-node-polyfills@0.22.0(rollup@4.24.4)(vite@5.4.10(@types/node@22.9.0)(terser@5.36.0)): dependencies: '@rollup/plugin-inject': 5.0.5(rollup@4.24.4) node-stdlib-browser: 1.2.1 - vite: 6.0.0(@types/node@22.9.0)(terser@5.36.0)(tsx@4.19.1)(yaml@2.6.0) + vite: 5.4.10(@types/node@22.9.0)(terser@5.36.0) transitivePeerDependencies: - rollup - vite-tsconfig-paths@5.1.0(typescript@5.6.3)(vite@6.0.0(@types/node@22.9.0)(terser@5.36.0)(tsx@4.19.1)(yaml@2.6.0)): + vite-tsconfig-paths@5.1.0(typescript@5.6.3)(vite@5.4.10(@types/node@22.9.0)(terser@5.36.0)): dependencies: debug: 4.3.7 globrex: 0.1.2 tsconfck: 3.1.4(typescript@5.6.3) optionalDependencies: - vite: 6.0.0(@types/node@22.9.0)(terser@5.36.0)(tsx@4.19.1)(yaml@2.6.0) + vite: 5.4.10(@types/node@22.9.0)(terser@5.36.0) transitivePeerDependencies: - supports-color - typescript @@ -11593,24 +10257,12 @@ snapshots: vite@5.4.10(@types/node@22.9.0)(terser@5.36.0): dependencies: esbuild: 0.21.5 - postcss: 8.4.49 - rollup: 4.24.4 - optionalDependencies: - '@types/node': 22.9.0 - fsevents: 2.3.3 - terser: 5.36.0 - - vite@6.0.0(@types/node@22.9.0)(terser@5.36.0)(tsx@4.19.1)(yaml@2.6.0): - dependencies: - esbuild: 0.24.0 - postcss: 8.4.49 + postcss: 8.4.47 rollup: 4.24.4 optionalDependencies: '@types/node': 22.9.0 fsevents: 2.3.3 terser: 5.36.0 - tsx: 4.19.1 - yaml: 2.6.0 vitest@2.1.4(@types/node@22.9.0)(terser@5.36.0): dependencies: @@ -11662,11 +10314,6 @@ snapshots: dependencies: makeerror: 1.0.12 - watchpack@2.4.2: - dependencies: - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.11 - wcwidth@1.0.1: dependencies: defaults: 1.0.4 @@ -11678,38 +10325,6 @@ snapshots: webidl-conversions@3.0.1: {} - webpack-sources@3.2.3: {} - - webpack@5.96.1: - dependencies: - '@types/eslint-scope': 3.7.7 - '@types/estree': 1.0.6 - '@webassemblyjs/ast': 1.12.1 - '@webassemblyjs/wasm-edit': 1.12.1 - '@webassemblyjs/wasm-parser': 1.12.1 - acorn: 8.14.0 - browserslist: 4.24.2 - chrome-trace-event: 1.0.4 - enhanced-resolve: 5.17.1 - es-module-lexer: 1.5.4 - eslint-scope: 5.1.1 - events: 3.3.0 - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.11 - json-parse-even-better-errors: 2.3.1 - loader-runner: 4.3.0 - mime-types: 2.1.35 - neo-async: 2.6.2 - schema-utils: 3.3.0 - tapable: 2.2.1 - terser-webpack-plugin: 5.3.10(webpack@5.96.1) - watchpack: 2.4.2 - webpack-sources: 3.2.3 - transitivePeerDependencies: - - '@swc/core' - - esbuild - - uglify-js - whatwg-fetch@3.6.20: {} whatwg-url@5.0.0: @@ -11811,16 +10426,8 @@ snapshots: y18n: 5.0.8 yargs-parser: 21.1.1 - yn@3.1.1: {} - yocto-queue@0.1.0: {} yoctocolors-cjs@2.1.2: {} - zdog@1.1.3: {} - - zustand@3.7.2(react@18.3.1): - optionalDependencies: - react: 18.3.1 - zwitch@2.0.4: {} diff --git a/typedoc.json b/typedoc.json index 16dc7402..0bee85fb 100644 --- a/typedoc.json +++ b/typedoc.json @@ -2,6 +2,6 @@ "entryPoints": ["packages/*"], "entryPointStrategy": "packages", "includeVersion": true, - "name": "Topology Protocol", + "name": "Distributed Replicated Programs", "readme": "README.md" }