From f11ccb7eddd6893fba21a3d06ef5d86a46cf170d Mon Sep 17 00:00:00 2001 From: droak Date: Tue, 23 Jul 2024 15:10:14 +0900 Subject: [PATCH 1/8] protobuf deps and initial object proto file --- packages/object/package.json | 8 + packages/object/src/index.ts | 6 + packages/object/src/proto/object.proto | 11 + yarn.lock | 383 ++++++++++++++++++++++++- 4 files changed, 402 insertions(+), 6 deletions(-) create mode 100644 packages/object/src/proto/object.proto diff --git a/packages/object/package.json b/packages/object/package.json index 88312ab9..3240dff5 100644 --- a/packages/object/package.json +++ b/packages/object/package.json @@ -24,6 +24,14 @@ "build": "tsc -b", "clean": "rm -rf dist/ node_modules/", "prepack": "tsc -b", + "protobuf": "buf generate", "test": "vitest" + }, + "dependencies": { + "protobufjs": "^7.3.2", + "ts-proto": "^1.181.1" + }, + "devDependencies": { + "protobufjs-cli": "^1.1.2" } } diff --git a/packages/object/src/index.ts b/packages/object/src/index.ts index 380bc870..88e2f04a 100644 --- a/packages/object/src/index.ts +++ b/packages/object/src/index.ts @@ -1,4 +1,5 @@ import * as crypto from "crypto"; +import * as protobuf from "protobufjs"; export abstract class TopologyObject { // TODO generate functions from the abi @@ -6,6 +7,11 @@ export abstract class TopologyObject { private id?: string; constructor(peerId: string) { + protobuf.load("abi.proto", (err, _) => { + if (err) { + throw err; + } + }); this.abi = ""; // id = sha256(abi, peer_id, random_nonce) diff --git a/packages/object/src/proto/object.proto b/packages/object/src/proto/object.proto new file mode 100644 index 00000000..e532edec --- /dev/null +++ b/packages/object/src/proto/object.proto @@ -0,0 +1,11 @@ +syntax = "proto3" + +package topology.object; + +message TopologyObject { + string id = 1; + string abi = 2; + string bytecode = 3; + + +} diff --git a/yarn.lock b/yarn.lock index d8264f54..4f3862fb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -33,6 +33,11 @@ js-tokens "^4.0.0" picocolors "^1.0.0" +"@babel/parser@^7.20.15": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.8.tgz#58a4dbbcad7eb1d48930524a3fd93d93e9084c6f" + integrity sha512-WzfbgXOkGzZiXXCqk43kKwZjzwx4oulxZi3nq2TYL9mOjQv6kYwul9mz6ID36njuL7Xkp6nJEfok848Zj10j/w== + "@chainsafe/as-chacha20poly1305@^0.1.0": version "0.1.0" resolved "https://registry.yarnpkg.com/@chainsafe/as-chacha20poly1305/-/as-chacha20poly1305-0.1.0.tgz#7da6f8796f9b42dac6e830a086d964f1f9189e09" @@ -308,6 +313,13 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" +"@jsdoc/salty@^0.2.1": + version "0.2.8" + resolved "https://registry.yarnpkg.com/@jsdoc/salty/-/salty-0.2.8.tgz#8d29923a9429694a437a50ab75004b576131d597" + integrity sha512-5e+SFVavj1ORKlKaKr2BmTOekmXbelU7dC0cDkQLqag7xfuTPuGMUFx7KWJuv4bYZrTsoL2Z18VVCOKYxzoHcg== + dependencies: + lodash "^4.17.21" + "@jsonjoy.com/base64@^1.1.1": version "1.1.2" resolved "https://registry.yarnpkg.com/@jsonjoy.com/base64/-/base64-1.1.2.tgz#cf8ea9dcb849b81c95f14fc0aaa151c6b54d2578" @@ -926,6 +938,59 @@ "@pnpm/network.ca-file" "^1.0.1" config-chain "^1.1.11" +"@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" + integrity sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ== + +"@protobufjs/base64@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/base64/-/base64-1.1.2.tgz#4c85730e59b9a1f1f349047dbf24296034bb2735" + integrity sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg== + +"@protobufjs/codegen@^2.0.4": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@protobufjs/codegen/-/codegen-2.0.4.tgz#7ef37f0d010fb028ad1ad59722e506d9262815cb" + integrity sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg== + +"@protobufjs/eventemitter@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz#355cbc98bafad5978f9ed095f397621f1d066b70" + integrity sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q== + +"@protobufjs/fetch@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/fetch/-/fetch-1.1.0.tgz#ba99fb598614af65700c1619ff06d454b0d84c45" + integrity sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ== + dependencies: + "@protobufjs/aspromise" "^1.1.1" + "@protobufjs/inquire" "^1.1.0" + +"@protobufjs/float@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@protobufjs/float/-/float-1.0.2.tgz#5e9e1abdcb73fc0a7cb8b291df78c8cbd97b87d1" + integrity sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ== + +"@protobufjs/inquire@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/inquire/-/inquire-1.1.0.tgz#ff200e3e7cf2429e2dcafc1140828e8cc638f089" + integrity sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q== + +"@protobufjs/path@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/path/-/path-1.1.2.tgz#6cc2b20c5c9ad6ad0dccfd21ca7673d8d7fbf68d" + integrity sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA== + +"@protobufjs/pool@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/pool/-/pool-1.1.0.tgz#09fd15f2d6d3abfa9b65bc366506d6ad7846ff54" + integrity sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw== + +"@protobufjs/utf8@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" + integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw== + "@release-it-plugins/workspaces@^4.2.0": version "4.2.0" resolved "https://registry.yarnpkg.com/@release-it-plugins/workspaces/-/workspaces-4.2.0.tgz#db4ce50c9f28ccb944b3fff5843d4637e372d2e7" @@ -1180,6 +1245,24 @@ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== +"@types/linkify-it@^5": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@types/linkify-it/-/linkify-it-5.0.0.tgz#21413001973106cda1c3a9b91eedd4ccd5469d76" + integrity sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q== + +"@types/markdown-it@^14.1.1": + version "14.1.1" + resolved "https://registry.yarnpkg.com/@types/markdown-it/-/markdown-it-14.1.1.tgz#06bafb7a4e3f77b62b1f308acf7df76687887e0b" + integrity sha512-4NpsnpYl2Gt1ljyBGrKMxFYAYvpqbnnkgP/i/g+NLpjEUa3obn1XJCur9YbEXKDAkaXqsR1LbDnGEJ0MmKFxfg== + dependencies: + "@types/linkify-it" "^5" + "@types/mdurl" "^2" + +"@types/mdurl@^2": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@types/mdurl/-/mdurl-2.0.0.tgz#d43878b5b20222682163ae6f897b20447233bdfd" + integrity sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg== + "@types/mime@^1": version "1.3.5" resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.5.tgz#1ef302e01cf7d2b5a0fa526790c9123bf1d06690" @@ -1217,6 +1300,13 @@ dependencies: undici-types "~5.26.4" +"@types/node@>=13.7.0": + version "20.14.11" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.14.11.tgz#09b300423343460455043ddd4d0ded6ac579b74b" + integrity sha512-kprQpL8MMeszbz6ojB5/tU8PLN4kesnN8Gjzw349rDlNgsSzg90lAVj3llK99Dh7JON+t9AuscPPFW6mPbTnSA== + dependencies: + undici-types "~5.26.4" + "@types/qs@*": version "6.9.15" resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.15.tgz#adde8a060ec9c305a82de1babc1056e73bd64dce" @@ -1485,6 +1575,11 @@ acorn-import-attributes@^1.9.5: resolved "https://registry.yarnpkg.com/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz#7eb1557b1ba05ef18b5ed0ec67591bfab04688ef" integrity sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ== +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + acorn-walk@^8.1.1: version "8.3.3" resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.3.tgz#9caeac29eefaa0c41e3d4c65137de4d6f34df43e" @@ -1492,7 +1587,7 @@ acorn-walk@^8.1.1: dependencies: acorn "^8.11.0" -acorn@^8.11.0, acorn@^8.4.1, acorn@^8.7.1, acorn@^8.8.2: +acorn@^8.11.0, acorn@^8.4.1, acorn@^8.7.1, acorn@^8.8.2, acorn@^8.9.0: version "8.12.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.12.1.tgz#71616bdccbe25e27a54439e0046e89ca76df2248" integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg== @@ -1695,6 +1790,11 @@ bl@^4.0.3, bl@^4.1.0: inherits "^2.0.4" readable-stream "^3.4.0" +bluebird@^3.7.2: + version "3.7.2" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== + bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9: version "4.12.0" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" @@ -1929,6 +2029,18 @@ caniuse-lite@^1.0.30001640: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001642.tgz#6aa6610eb24067c246d30c57f055a9d0a7f8d05f" integrity sha512-3XQ0DoRgLijXJErLSl+bLnJ+Et4KqV1PY6JJBGAFlsNsz31zeAIncyeZfLCabHK/jtSh+671RM9YMldxjUPZtA== +case-anything@^2.1.13: + version "2.1.13" + resolved "https://registry.yarnpkg.com/case-anything/-/case-anything-2.1.13.tgz#0cdc16278cb29a7fcdeb072400da3f342ba329e9" + integrity sha512-zlOQ80VrQ2Ue+ymH5OuM/DlDq64mEm+B9UTdHULv5osUMD6HalNTblf2b1u/m6QecjsnOkBpqVZ+XPwIVsy7Ng== + +catharsis@^0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/catharsis/-/catharsis-0.9.0.tgz#40382a168be0e6da308c277d3a2b3eb40c7d2121" + integrity sha512-prMTQVpcns/tzFgFVkVp6ak6RykZyWb3gu8ckUpd6YkTlacOd3DXGJjIpD4Q6zJirizvaiAjSSHlOsA+6sNh2A== + dependencies: + lodash "^4.17.15" + chai@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/chai/-/chai-5.1.1.tgz#f035d9792a22b481ead1c65908d14bb62ec1c82c" @@ -1954,7 +2066,7 @@ chalk@^2.4.2: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^4.1.0: +chalk@^4.0.0, chalk@^4.1.0: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -2318,6 +2430,11 @@ deep-extend@^0.6.0: resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== +deep-is@~0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + default-browser-id@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/default-browser-id/-/default-browser-id-5.0.0.tgz#a1d98bf960c15082d8a3fa69e83150ccccc3af26" @@ -2421,6 +2538,11 @@ detect-indent@^6.0.0: resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-6.1.0.tgz#592485ebbbf6b3b1ab2be175c8393d04ca0d57e6" integrity sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA== +detect-libc@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" + integrity sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg== + detect-libc@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.3.tgz#f0cd503b40f9939b894697d19ad50895e30cf700" @@ -2464,6 +2586,13 @@ dot-prop@^6.0.1: dependencies: is-obj "^2.0.0" +dprint-node@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/dprint-node/-/dprint-node-1.0.8.tgz#a02470722d8208a7d7eb3704328afda1d6758625" + integrity sha512-iVKnUtYfGrYcW1ZAlfR/F59cUVL8QIhWoBJoSjkkdua/dkWIgjZfiLMeTjiB06X0ZLkQ0M2C1VbUj/CxkIf1zg== + dependencies: + detect-libc "^1.0.3" + eastasianwidth@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" @@ -2625,6 +2754,23 @@ escape-string-regexp@^1.0.5: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== +escape-string-regexp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== + +escodegen@^1.13.0: + version "1.14.3" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503" + integrity sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw== + dependencies: + esprima "^4.0.1" + estraverse "^4.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + escodegen@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.1.0.tgz#ba93bbb7a43986d29d6041f99f5262da773e2e17" @@ -2644,6 +2790,20 @@ eslint-scope@5.1.1: esrecurse "^4.3.0" estraverse "^4.1.1" +eslint-visitor-keys@^3.4.1: + version "3.4.3" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== + +espree@^9.0.0: + version "9.6.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" + integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== + dependencies: + acorn "^8.9.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.4.1" + esprima@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" @@ -2656,12 +2816,12 @@ esrecurse@^4.3.0: dependencies: estraverse "^5.2.0" -estraverse@^4.1.1: +estraverse@^4.1.1, estraverse@^4.2.0: version "4.3.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== -estraverse@^5.2.0: +estraverse@^5.1.0, estraverse@^5.2.0: version "5.3.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== @@ -2818,6 +2978,11 @@ fast-json-stable-stringify@^2.0.0: resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== +fast-levenshtein@~2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + fast-uri@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.0.1.tgz#cddd2eecfc83a71c1be2cc2ef2061331be8a7134" @@ -3056,6 +3221,17 @@ glob@^7.0.0: once "^1.3.0" path-is-absolute "^1.0.0" +glob@^8.0.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" + integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^5.0.1" + once "^1.3.0" + global-directory@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/global-directory/-/global-directory-4.0.1.tgz#4d7ac7cfd2cb73f304c53b8810891748df5e361e" @@ -3104,7 +3280,7 @@ graceful-fs@4.2.10: resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== -graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.11, graceful-fs@^4.2.4, graceful-fs@^4.2.6: +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0, graceful-fs@^4.2.11, graceful-fs@^4.2.4, graceful-fs@^4.2.6: version "4.2.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== @@ -3820,11 +3996,39 @@ js-yaml@^4.1.0: dependencies: argparse "^2.0.1" +js2xmlparser@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/js2xmlparser/-/js2xmlparser-4.0.2.tgz#2a1fdf01e90585ef2ae872a01bc169c6a8d5e60a" + integrity sha512-6n4D8gLlLf1n5mNLQPRfViYzu9RATblzPEtm1SthMX1Pjao0r9YI9nw7ZIfRxQMERS87mcswrg+r/OYrPRX6jA== + dependencies: + xmlcreate "^2.0.4" + jsbn@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-1.1.0.tgz#b01307cb29b618a1ed26ec79e911f803c4da0040" integrity sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A== +jsdoc@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/jsdoc/-/jsdoc-4.0.3.tgz#bfee86c6a82f6823e12b5e8be698fd99ae46c061" + integrity sha512-Nu7Sf35kXJ1MWDZIMAuATRQTg1iIPdzh7tqJ6jjvaU/GfDf+qi5UV8zJR3Mo+/pYFvm8mzay4+6O5EWigaQBQw== + dependencies: + "@babel/parser" "^7.20.15" + "@jsdoc/salty" "^0.2.1" + "@types/markdown-it" "^14.1.1" + bluebird "^3.7.2" + catharsis "^0.9.0" + escape-string-regexp "^2.0.0" + js2xmlparser "^4.0.2" + klaw "^3.0.0" + markdown-it "^14.1.0" + markdown-it-anchor "^8.6.7" + marked "^4.0.10" + mkdirp "^1.0.4" + requizzle "^0.2.3" + strip-json-comments "^3.1.0" + underscore "~1.13.2" + json-buffer@3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" @@ -3866,6 +4070,13 @@ kind-of@^6.0.2: resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== +klaw@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/klaw/-/klaw-3.0.0.tgz#b11bec9cf2492f06756d6e809ab73a2910259146" + integrity sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g== + dependencies: + graceful-fs "^4.1.9" + ky@^1.2.0: version "1.4.0" resolved "https://registry.yarnpkg.com/ky/-/ky-1.4.0.tgz#68b4a71eccfb4177199fe6ee2d5041b50bb41931" @@ -3886,6 +4097,14 @@ launch-editor@^2.6.1: picocolors "^1.0.0" shell-quote "^1.8.1" +levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA== + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + libp2p@^1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/libp2p/-/libp2p-1.8.1.tgz#fd1bde535d0bbbe535a247d6652498d29f2dee33" @@ -3966,7 +4185,7 @@ lodash.uniqby@^4.7.0: resolved "https://registry.yarnpkg.com/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz#d99c07a669e9e6d24e1362dfe266c67616af1302" integrity sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww== -lodash@4.17.21: +lodash@4.17.21, lodash@^4.17.15, lodash@^4.17.21: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -3987,6 +4206,11 @@ log-symbols@^6.0.0: chalk "^5.3.0" is-unicode-supported "^1.3.0" +long@^5.0.0, long@^5.2.3: + version "5.2.3" + resolved "https://registry.yarnpkg.com/long/-/long-5.2.3.tgz#a3ba97f3877cf1d778eccbcb048525ebb77499e1" + integrity sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q== + loupe@^3.1.0, loupe@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/loupe/-/loupe-3.1.1.tgz#71d038d59007d890e3247c5db97c1ec5a92edc54" @@ -4031,6 +4255,11 @@ make-error@^1.1.1: resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== +markdown-it-anchor@^8.6.7: + version "8.6.7" + resolved "https://registry.yarnpkg.com/markdown-it-anchor/-/markdown-it-anchor-8.6.7.tgz#ee6926daf3ad1ed5e4e3968b1740eef1c6399634" + integrity sha512-FlCHFwNnutLgVTflOYHPW2pPcl2AACqVzExlkGQNsi4CJgqOHN7YTgDd4LuhgN1BFO3TS0vLAruV1Td6dwWPJA== + markdown-it@^14.1.0: version "14.1.0" resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-14.1.0.tgz#3c3c5992883c633db4714ccb4d7b5935d98b7d45" @@ -4043,6 +4272,11 @@ markdown-it@^14.1.0: punycode.js "^2.3.1" uc.micro "^2.1.0" +marked@^4.0.10: + version "4.3.0" + resolved "https://registry.yarnpkg.com/marked/-/marked-4.3.0.tgz#796362821b019f734054582038b116481b456cf3" + integrity sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A== + matcher-collection@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/matcher-collection/-/matcher-collection-2.0.1.tgz#90be1a4cf58d6f2949864f65bb3b0f3e41303b29" @@ -4182,6 +4416,13 @@ minimatch@^3.0.2, minimatch@^3.0.4, minimatch@^3.1.1: dependencies: brace-expansion "^1.1.7" +minimatch@^5.0.1: + version "5.1.6" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== + dependencies: + brace-expansion "^2.0.1" + minimatch@^9.0.4, minimatch@^9.0.5: version "9.0.5" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" @@ -4204,6 +4445,11 @@ mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3: resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== +mkdirp@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + mortice@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/mortice/-/mortice-3.0.4.tgz#34aadef768161e9dc49a7f73637b7858bcb7c6fa" @@ -4419,6 +4665,18 @@ open@10.1.0, open@^10.0.3: is-inside-container "^1.0.0" is-wsl "^3.1.0" +optionator@^0.8.1: + version "0.8.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" + integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.6" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + word-wrap "~1.2.3" + ora@8.0.1: version "8.0.1" resolved "https://registry.yarnpkg.com/ora/-/ora-8.0.1.tgz#6dcb9250a629642cbe0d2df3a6331ad6f7a2af3e" @@ -4725,6 +4983,11 @@ prebuild-install@^7.0.1: tar-fs "^2.0.0" tunnel-agent "^0.6.0" +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== + process-nextick-args@~2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" @@ -4745,6 +5008,40 @@ proto-list@~1.2.1: resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" integrity sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA== +protobufjs-cli@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/protobufjs-cli/-/protobufjs-cli-1.1.2.tgz#b32a7dc6aa3866cc103278539561bb4758249c8b" + integrity sha512-8ivXWxT39gZN4mm4ArQyJrRgnIwZqffBWoLDsE21TmMcKI3XwJMV4lEF2WU02C4JAtgYYc2SfJIltelD8to35g== + dependencies: + chalk "^4.0.0" + escodegen "^1.13.0" + espree "^9.0.0" + estraverse "^5.1.0" + glob "^8.0.0" + jsdoc "^4.0.0" + minimist "^1.2.0" + semver "^7.1.2" + tmp "^0.2.1" + uglify-js "^3.7.7" + +protobufjs@^7.2.4, protobufjs@^7.3.2: + version "7.3.2" + resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.3.2.tgz#60f3b7624968868f6f739430cfbc8c9370e26df4" + integrity sha512-RXyHaACeqXeqAKGLDl68rQKbmObRsTIn4TYVUUug1KfS47YWCo5MacGITEryugIgZqORCvJWEk4l449POg5Txg== + dependencies: + "@protobufjs/aspromise" "^1.1.2" + "@protobufjs/base64" "^1.1.2" + "@protobufjs/codegen" "^2.0.4" + "@protobufjs/eventemitter" "^1.1.0" + "@protobufjs/fetch" "^1.1.0" + "@protobufjs/float" "^1.0.2" + "@protobufjs/inquire" "^1.1.0" + "@protobufjs/path" "^1.1.2" + "@protobufjs/pool" "^1.1.0" + "@protobufjs/utf8" "^1.1.0" + "@types/node" ">=13.7.0" + long "^5.0.0" + protocols@^2.0.0, protocols@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/protocols/-/protocols-2.0.1.tgz#8f155da3fc0f32644e83c5782c8e8212ccf70a86" @@ -5019,6 +5316,13 @@ requires-port@^1.0.0: resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== +requizzle@^0.2.3: + version "0.2.4" + resolved "https://registry.yarnpkg.com/requizzle/-/requizzle-0.2.4.tgz#319eb658b28c370f0c20f968fa8ceab98c13d27c" + integrity sha512-JRrFk1D4OQ4SqovXOgdav+K8EAhSB/LJZqCz8tbX0KObcdeM15Ss59ozWMBWmmINMagCwmqn4ZNryUGpBsl6Jw== + dependencies: + lodash "^4.17.21" + resolve-alpn@^1.2.0: version "1.2.1" resolved "https://registry.yarnpkg.com/resolve-alpn/-/resolve-alpn-1.2.1.tgz#b7adbdac3546aaaec20b45e7d8265927072726f9" @@ -5219,6 +5523,11 @@ semver@7.6.2, semver@^7.1.3, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.2.tgz#1e3b34759f896e8f14d6134732ce798aeb0c6e13" integrity sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w== +semver@^7.1.2: + version "7.6.3" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" + integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== + send@0.18.0: version "0.18.0" resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" @@ -5579,6 +5888,11 @@ strip-final-newline@^3.0.0: resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd" integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== +strip-json-comments@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" @@ -5694,6 +6008,11 @@ tmp@^0.0.33: dependencies: os-tmpdir "~1.0.2" +tmp@^0.2.1: + version "0.2.3" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.3.tgz#eb783cc22bc1e8bebd0671476d46ea4eb32a79ae" + integrity sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w== + to-regex-range@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" @@ -5741,6 +6060,31 @@ ts-node@^10.9.2: v8-compile-cache-lib "^3.0.1" yn "3.1.1" +ts-poet@^6.7.0: + version "6.9.0" + resolved "https://registry.yarnpkg.com/ts-poet/-/ts-poet-6.9.0.tgz#e63ac8d8a9e91a2e0e5d2bf0755db71346728bd2" + integrity sha512-roe6W6MeZmCjRmppyfOURklO5tQFQ6Sg7swURKkwYJvV7dbGCrK28um5+51iW3twdPRKtwarqFAVMU6G1mvnuQ== + dependencies: + dprint-node "^1.0.8" + +ts-proto-descriptors@1.16.0: + version "1.16.0" + resolved "https://registry.yarnpkg.com/ts-proto-descriptors/-/ts-proto-descriptors-1.16.0.tgz#e9f15d5d23774088f8573fa5a2d75130c64a565a" + integrity sha512-3yKuzMLpltdpcyQji1PJZRfoo4OJjNieKTYkQY8pF7xGKsYz/RHe3aEe4KiRxcinoBmnEhmuI+yJTxLb922ULA== + dependencies: + long "^5.2.3" + protobufjs "^7.2.4" + +ts-proto@^1.181.1: + version "1.181.1" + resolved "https://registry.yarnpkg.com/ts-proto/-/ts-proto-1.181.1.tgz#d96707087840870cae4d293f9cd6d52ed66bdede" + integrity sha512-lNmd/KEgqWtwDG9mIM3EpcxBx+URRVHkDP/EEJBgQJaQwmZFTk6VjHg56HNQswd114yXGfF+8pKQvJ2iH9KfWw== + dependencies: + case-anything "^2.1.13" + protobufjs "^7.2.4" + ts-poet "^6.7.0" + ts-proto-descriptors "1.16.0" + tslib@^2.0.0, tslib@^2.0.1, tslib@^2.1.0, tslib@^2.4.0, tslib@^2.6.1: version "2.6.3" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.3.tgz#0438f810ad7a9edcde7a241c3d80db693c8cbfe0" @@ -5763,6 +6107,13 @@ tunnel-agent@^0.6.0: dependencies: safe-buffer "^5.0.1" +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + integrity sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg== + dependencies: + prelude-ls "~1.1.2" + type-fest@^0.21.3: version "0.21.3" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" @@ -5819,6 +6170,11 @@ uc.micro@^2.0.0, uc.micro@^2.1.0: resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-2.1.0.tgz#f8d3f7d0ec4c3dea35a7e3c8efa4cb8b45c9e7ee" integrity sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A== +uglify-js@^3.7.7: + version "3.19.0" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.19.0.tgz#6d45f1cad2c54117fa2fabd87fc2713a83e3bf7b" + integrity sha512-wNKHUY2hYYkf6oSFfhwwiHo4WCHzHmzcXsqXYTN9ja3iApYIFbb2U6ics9hBcYLHcYGQoAlwnZlTrf3oF+BL/Q== + uint8-varint@^2.0.1, uint8-varint@^2.0.2, uint8-varint@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/uint8-varint/-/uint8-varint-2.0.4.tgz#85be52b3849eb30f2c3640a2df8a14364180affb" @@ -5848,6 +6204,11 @@ uint8arrays@^5.0.0, uint8arrays@^5.0.1, uint8arrays@^5.0.2, uint8arrays@^5.1.0: dependencies: multiformats "^13.0.0" +underscore@~1.13.2: + version "1.13.6" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.13.6.tgz#04786a1f589dc6c09f761fc5f45b89e935136441" + integrity sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A== + undici-types@~5.26.4: version "5.26.5" resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" @@ -6216,6 +6577,11 @@ windows-release@^5.0.1: dependencies: execa "^5.1.1" +word-wrap@~1.2.3: + version "1.2.5" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" + integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== + "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" @@ -6268,6 +6634,11 @@ xdg-basedir@^5.0.1, xdg-basedir@^5.1.0: resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-5.1.0.tgz#1efba19425e73be1bc6f2a6ceb52a3d2c884c0c9" integrity sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ== +xmlcreate@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/xmlcreate/-/xmlcreate-2.0.4.tgz#0c5ab0f99cdd02a81065fa9cd8f8ae87624889be" + integrity sha512-nquOebG4sngPmGPICTS5EnxqhKbCmz5Ox5hsszI2T6U5qdrJizBc+0ilYSEjTSzU0yZcmvppztXe/5Al5fUwdg== + yaml@^2.1.1, yaml@^2.4.5: version "2.4.5" resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.4.5.tgz#60630b206dd6d84df97003d33fc1ddf6296cca5e" From 5e70d98b240432f2cc845bd6226cba9a68c98e2f Mon Sep 17 00:00:00 2001 From: droak Date: Thu, 25 Jul 2024 15:03:55 +0900 Subject: [PATCH 2/8] add buf gen config files; modified pb file; generated initial obj file --- buf.gen.yaml | 10 + package.json | 1 + packages/node/src/version.ts | 2 +- packages/object/package.json | 6 +- packages/object/src/index.ts | 44 ++--- packages/object/src/proto/index.ts | 1 + packages/object/src/proto/object.proto | 4 +- packages/object/src/proto/object_pb.ts | 121 ++++++++++++ packages/object/tsconfig.json | 4 +- yarn.lock | 260 +------------------------ 10 files changed, 160 insertions(+), 293 deletions(-) create mode 100644 buf.gen.yaml create mode 100644 packages/object/src/proto/index.ts create mode 100644 packages/object/src/proto/object_pb.ts diff --git a/buf.gen.yaml b/buf.gen.yaml new file mode 100644 index 00000000..2cc56d55 --- /dev/null +++ b/buf.gen.yaml @@ -0,0 +1,10 @@ +version: v2 +plugins: + - local: ./node_modules/ts-proto/protoc-gen-ts_proto + strategy: directory + out: ./packages + opt: + - esModuleInterop=true + - fileSuffix=_pb +inputs: + - directory: ./packages diff --git a/package.json b/package.json index fdc1b3e8..c00bf2e2 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,7 @@ }, "scripts": { "docs": "typedoc", + "proto-gen": "buf generate", "release": "release-it", "test": "vitest" }, diff --git a/packages/node/src/version.ts b/packages/node/src/version.ts index a0994a6a..85ceb686 100644 --- a/packages/node/src/version.ts +++ b/packages/node/src/version.ts @@ -1 +1 @@ -export const VERSION = "0.0.22-2"; +export const VERSION = "0.0.22"; diff --git a/packages/object/package.json b/packages/object/package.json index 3240dff5..ee7d655d 100644 --- a/packages/object/package.json +++ b/packages/object/package.json @@ -24,14 +24,10 @@ "build": "tsc -b", "clean": "rm -rf dist/ node_modules/", "prepack": "tsc -b", - "protobuf": "buf generate", + "proto-gen": "buf generate", "test": "vitest" }, "dependencies": { - "protobufjs": "^7.3.2", "ts-proto": "^1.181.1" - }, - "devDependencies": { - "protobufjs-cli": "^1.1.2" } } diff --git a/packages/object/src/index.ts b/packages/object/src/index.ts index 88e2f04a..255678d8 100644 --- a/packages/object/src/index.ts +++ b/packages/object/src/index.ts @@ -1,35 +1,19 @@ import * as crypto from "crypto"; -import * as protobuf from "protobufjs"; +import { TopologyObject } from "./proto/object_pb.js"; -export abstract class TopologyObject { - // TODO generate functions from the abi - private abi?: string; - private id?: string; +export * from "./proto/index.js"; - constructor(peerId: string) { - protobuf.load("abi.proto", (err, _) => { - if (err) { - throw err; - } - }); - this.abi = ""; +function newTopologyObject(peerId: string, abi?: string, bytecode?: string): TopologyObject { + const id = crypto + .createHash("sha256") + .update(abi ?? "") + .update(peerId) + .update(Math.floor(Math.random() * Number.MAX_VALUE).toString()) + .digest("hex"); - // id = sha256(abi, peer_id, random_nonce) - this.id = crypto - .createHash("sha256") - .update(this.abi) - .update(peerId) - .update(Math.floor(Math.random() * Number.MAX_VALUE).toString()) - .digest("hex"); - } - - getObjectAbi(): string { - return this.abi ?? ""; - } - - getObjectId(): string { - return this.id ?? ""; - } - - abstract merge(other: TopologyObject): void; + return { + id, + abi: abi ?? "", + bytecode: bytecode ?? "" + }; } diff --git a/packages/object/src/proto/index.ts b/packages/object/src/proto/index.ts new file mode 100644 index 00000000..e4b918f8 --- /dev/null +++ b/packages/object/src/proto/index.ts @@ -0,0 +1 @@ +export * from "./object_pb.js"; diff --git a/packages/object/src/proto/object.proto b/packages/object/src/proto/object.proto index e532edec..078676dc 100644 --- a/packages/object/src/proto/object.proto +++ b/packages/object/src/proto/object.proto @@ -1,4 +1,4 @@ -syntax = "proto3" +syntax = "proto3"; package topology.object; @@ -6,6 +6,4 @@ message TopologyObject { string id = 1; string abi = 2; string bytecode = 3; - - } diff --git a/packages/object/src/proto/object_pb.ts b/packages/object/src/proto/object_pb.ts new file mode 100644 index 00000000..cb4c589e --- /dev/null +++ b/packages/object/src/proto/object_pb.ts @@ -0,0 +1,121 @@ +// Code generated by protoc-gen-ts_proto. DO NOT EDIT. +// versions: +// protoc-gen-ts_proto v1.181.1 +// protoc unknown +// source: object/src/proto/object.proto + +/* eslint-disable */ +import _m0 from "protobufjs/minimal"; + +export const protobufPackage = "topology.object"; + +export interface TopologyObject { + id: string; + abi: string; + bytecode: string; +} + +function createBaseTopologyObject(): TopologyObject { + return { id: "", abi: "", bytecode: "" }; +} + +export const TopologyObject = { + encode(message: TopologyObject, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.id !== "") { + writer.uint32(10).string(message.id); + } + if (message.abi !== "") { + writer.uint32(18).string(message.abi); + } + if (message.bytecode !== "") { + writer.uint32(26).string(message.bytecode); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): TopologyObject { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseTopologyObject(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + + message.id = reader.string(); + continue; + case 2: + if (tag !== 18) { + break; + } + + message.abi = reader.string(); + continue; + case 3: + if (tag !== 26) { + break; + } + + message.bytecode = reader.string(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): TopologyObject { + return { + id: isSet(object.id) ? globalThis.String(object.id) : "", + abi: isSet(object.abi) ? globalThis.String(object.abi) : "", + bytecode: isSet(object.bytecode) ? globalThis.String(object.bytecode) : "", + }; + }, + + toJSON(message: TopologyObject): unknown { + const obj: any = {}; + if (message.id !== "") { + obj.id = message.id; + } + if (message.abi !== "") { + obj.abi = message.abi; + } + if (message.bytecode !== "") { + obj.bytecode = message.bytecode; + } + return obj; + }, + + create, I>>(base?: I): TopologyObject { + return TopologyObject.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): TopologyObject { + const message = createBaseTopologyObject(); + message.id = object.id ?? ""; + message.abi = object.abi ?? ""; + message.bytecode = object.bytecode ?? ""; + return message; + }, +}; + +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/object/tsconfig.json b/packages/object/tsconfig.json index 280f82e7..fe2df5cc 100644 --- a/packages/object/tsconfig.json +++ b/packages/object/tsconfig.json @@ -3,5 +3,7 @@ "compilerOptions": { "outDir": "dist" }, - "include": ["src/**/*.ts"] + "include": [ + "src/**/*.ts" + ] } diff --git a/yarn.lock b/yarn.lock index 4f3862fb..22f3cdb9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -33,11 +33,6 @@ js-tokens "^4.0.0" picocolors "^1.0.0" -"@babel/parser@^7.20.15": - version "7.24.8" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.8.tgz#58a4dbbcad7eb1d48930524a3fd93d93e9084c6f" - integrity sha512-WzfbgXOkGzZiXXCqk43kKwZjzwx4oulxZi3nq2TYL9mOjQv6kYwul9mz6ID36njuL7Xkp6nJEfok848Zj10j/w== - "@chainsafe/as-chacha20poly1305@^0.1.0": version "0.1.0" resolved "https://registry.yarnpkg.com/@chainsafe/as-chacha20poly1305/-/as-chacha20poly1305-0.1.0.tgz#7da6f8796f9b42dac6e830a086d964f1f9189e09" @@ -313,13 +308,6 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" -"@jsdoc/salty@^0.2.1": - version "0.2.8" - resolved "https://registry.yarnpkg.com/@jsdoc/salty/-/salty-0.2.8.tgz#8d29923a9429694a437a50ab75004b576131d597" - integrity sha512-5e+SFVavj1ORKlKaKr2BmTOekmXbelU7dC0cDkQLqag7xfuTPuGMUFx7KWJuv4bYZrTsoL2Z18VVCOKYxzoHcg== - dependencies: - lodash "^4.17.21" - "@jsonjoy.com/base64@^1.1.1": version "1.1.2" resolved "https://registry.yarnpkg.com/@jsonjoy.com/base64/-/base64-1.1.2.tgz#cf8ea9dcb849b81c95f14fc0aaa151c6b54d2578" @@ -1245,24 +1233,6 @@ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== -"@types/linkify-it@^5": - version "5.0.0" - resolved "https://registry.yarnpkg.com/@types/linkify-it/-/linkify-it-5.0.0.tgz#21413001973106cda1c3a9b91eedd4ccd5469d76" - integrity sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q== - -"@types/markdown-it@^14.1.1": - version "14.1.1" - resolved "https://registry.yarnpkg.com/@types/markdown-it/-/markdown-it-14.1.1.tgz#06bafb7a4e3f77b62b1f308acf7df76687887e0b" - integrity sha512-4NpsnpYl2Gt1ljyBGrKMxFYAYvpqbnnkgP/i/g+NLpjEUa3obn1XJCur9YbEXKDAkaXqsR1LbDnGEJ0MmKFxfg== - dependencies: - "@types/linkify-it" "^5" - "@types/mdurl" "^2" - -"@types/mdurl@^2": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@types/mdurl/-/mdurl-2.0.0.tgz#d43878b5b20222682163ae6f897b20447233bdfd" - integrity sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg== - "@types/mime@^1": version "1.3.5" resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.5.tgz#1ef302e01cf7d2b5a0fa526790c9123bf1d06690" @@ -1575,11 +1545,6 @@ acorn-import-attributes@^1.9.5: resolved "https://registry.yarnpkg.com/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz#7eb1557b1ba05ef18b5ed0ec67591bfab04688ef" integrity sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ== -acorn-jsx@^5.3.2: - version "5.3.2" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" - integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== - acorn-walk@^8.1.1: version "8.3.3" resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.3.tgz#9caeac29eefaa0c41e3d4c65137de4d6f34df43e" @@ -1587,7 +1552,7 @@ acorn-walk@^8.1.1: dependencies: acorn "^8.11.0" -acorn@^8.11.0, acorn@^8.4.1, acorn@^8.7.1, acorn@^8.8.2, acorn@^8.9.0: +acorn@^8.11.0, acorn@^8.4.1, acorn@^8.7.1, acorn@^8.8.2: version "8.12.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.12.1.tgz#71616bdccbe25e27a54439e0046e89ca76df2248" integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg== @@ -1790,11 +1755,6 @@ bl@^4.0.3, bl@^4.1.0: inherits "^2.0.4" readable-stream "^3.4.0" -bluebird@^3.7.2: - version "3.7.2" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" - integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== - bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9: version "4.12.0" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" @@ -2034,13 +1994,6 @@ case-anything@^2.1.13: resolved "https://registry.yarnpkg.com/case-anything/-/case-anything-2.1.13.tgz#0cdc16278cb29a7fcdeb072400da3f342ba329e9" integrity sha512-zlOQ80VrQ2Ue+ymH5OuM/DlDq64mEm+B9UTdHULv5osUMD6HalNTblf2b1u/m6QecjsnOkBpqVZ+XPwIVsy7Ng== -catharsis@^0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/catharsis/-/catharsis-0.9.0.tgz#40382a168be0e6da308c277d3a2b3eb40c7d2121" - integrity sha512-prMTQVpcns/tzFgFVkVp6ak6RykZyWb3gu8ckUpd6YkTlacOd3DXGJjIpD4Q6zJirizvaiAjSSHlOsA+6sNh2A== - dependencies: - lodash "^4.17.15" - chai@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/chai/-/chai-5.1.1.tgz#f035d9792a22b481ead1c65908d14bb62ec1c82c" @@ -2066,7 +2019,7 @@ chalk@^2.4.2: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^4.0.0, chalk@^4.1.0: +chalk@^4.1.0: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -2430,11 +2383,6 @@ deep-extend@^0.6.0: resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== -deep-is@~0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" - integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== - default-browser-id@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/default-browser-id/-/default-browser-id-5.0.0.tgz#a1d98bf960c15082d8a3fa69e83150ccccc3af26" @@ -2754,23 +2702,6 @@ escape-string-regexp@^1.0.5: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== -escape-string-regexp@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" - integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== - -escodegen@^1.13.0: - version "1.14.3" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503" - integrity sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw== - dependencies: - esprima "^4.0.1" - estraverse "^4.2.0" - esutils "^2.0.2" - optionator "^0.8.1" - optionalDependencies: - source-map "~0.6.1" - escodegen@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.1.0.tgz#ba93bbb7a43986d29d6041f99f5262da773e2e17" @@ -2790,20 +2721,6 @@ eslint-scope@5.1.1: esrecurse "^4.3.0" estraverse "^4.1.1" -eslint-visitor-keys@^3.4.1: - version "3.4.3" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" - integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== - -espree@^9.0.0: - version "9.6.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" - integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== - dependencies: - acorn "^8.9.0" - acorn-jsx "^5.3.2" - eslint-visitor-keys "^3.4.1" - esprima@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" @@ -2816,12 +2733,12 @@ esrecurse@^4.3.0: dependencies: estraverse "^5.2.0" -estraverse@^4.1.1, estraverse@^4.2.0: +estraverse@^4.1.1: version "4.3.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== -estraverse@^5.1.0, estraverse@^5.2.0: +estraverse@^5.2.0: version "5.3.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== @@ -2978,11 +2895,6 @@ fast-json-stable-stringify@^2.0.0: resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== -fast-levenshtein@~2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== - fast-uri@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.0.1.tgz#cddd2eecfc83a71c1be2cc2ef2061331be8a7134" @@ -3221,17 +3133,6 @@ glob@^7.0.0: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^8.0.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" - integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^5.0.1" - once "^1.3.0" - global-directory@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/global-directory/-/global-directory-4.0.1.tgz#4d7ac7cfd2cb73f304c53b8810891748df5e361e" @@ -3280,7 +3181,7 @@ graceful-fs@4.2.10: resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== -graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0, graceful-fs@^4.2.11, graceful-fs@^4.2.4, graceful-fs@^4.2.6: +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.11, graceful-fs@^4.2.4, graceful-fs@^4.2.6: version "4.2.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== @@ -3996,39 +3897,11 @@ js-yaml@^4.1.0: dependencies: argparse "^2.0.1" -js2xmlparser@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/js2xmlparser/-/js2xmlparser-4.0.2.tgz#2a1fdf01e90585ef2ae872a01bc169c6a8d5e60a" - integrity sha512-6n4D8gLlLf1n5mNLQPRfViYzu9RATblzPEtm1SthMX1Pjao0r9YI9nw7ZIfRxQMERS87mcswrg+r/OYrPRX6jA== - dependencies: - xmlcreate "^2.0.4" - jsbn@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-1.1.0.tgz#b01307cb29b618a1ed26ec79e911f803c4da0040" integrity sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A== -jsdoc@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/jsdoc/-/jsdoc-4.0.3.tgz#bfee86c6a82f6823e12b5e8be698fd99ae46c061" - integrity sha512-Nu7Sf35kXJ1MWDZIMAuATRQTg1iIPdzh7tqJ6jjvaU/GfDf+qi5UV8zJR3Mo+/pYFvm8mzay4+6O5EWigaQBQw== - dependencies: - "@babel/parser" "^7.20.15" - "@jsdoc/salty" "^0.2.1" - "@types/markdown-it" "^14.1.1" - bluebird "^3.7.2" - catharsis "^0.9.0" - escape-string-regexp "^2.0.0" - js2xmlparser "^4.0.2" - klaw "^3.0.0" - markdown-it "^14.1.0" - markdown-it-anchor "^8.6.7" - marked "^4.0.10" - mkdirp "^1.0.4" - requizzle "^0.2.3" - strip-json-comments "^3.1.0" - underscore "~1.13.2" - json-buffer@3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" @@ -4070,13 +3943,6 @@ kind-of@^6.0.2: resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== -klaw@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/klaw/-/klaw-3.0.0.tgz#b11bec9cf2492f06756d6e809ab73a2910259146" - integrity sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g== - dependencies: - graceful-fs "^4.1.9" - ky@^1.2.0: version "1.4.0" resolved "https://registry.yarnpkg.com/ky/-/ky-1.4.0.tgz#68b4a71eccfb4177199fe6ee2d5041b50bb41931" @@ -4097,14 +3963,6 @@ launch-editor@^2.6.1: picocolors "^1.0.0" shell-quote "^1.8.1" -levn@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA== - dependencies: - prelude-ls "~1.1.2" - type-check "~0.3.2" - libp2p@^1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/libp2p/-/libp2p-1.8.1.tgz#fd1bde535d0bbbe535a247d6652498d29f2dee33" @@ -4185,7 +4043,7 @@ lodash.uniqby@^4.7.0: resolved "https://registry.yarnpkg.com/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz#d99c07a669e9e6d24e1362dfe266c67616af1302" integrity sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww== -lodash@4.17.21, lodash@^4.17.15, lodash@^4.17.21: +lodash@4.17.21: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -4255,11 +4113,6 @@ make-error@^1.1.1: resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== -markdown-it-anchor@^8.6.7: - version "8.6.7" - resolved "https://registry.yarnpkg.com/markdown-it-anchor/-/markdown-it-anchor-8.6.7.tgz#ee6926daf3ad1ed5e4e3968b1740eef1c6399634" - integrity sha512-FlCHFwNnutLgVTflOYHPW2pPcl2AACqVzExlkGQNsi4CJgqOHN7YTgDd4LuhgN1BFO3TS0vLAruV1Td6dwWPJA== - markdown-it@^14.1.0: version "14.1.0" resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-14.1.0.tgz#3c3c5992883c633db4714ccb4d7b5935d98b7d45" @@ -4272,11 +4125,6 @@ markdown-it@^14.1.0: punycode.js "^2.3.1" uc.micro "^2.1.0" -marked@^4.0.10: - version "4.3.0" - resolved "https://registry.yarnpkg.com/marked/-/marked-4.3.0.tgz#796362821b019f734054582038b116481b456cf3" - integrity sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A== - matcher-collection@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/matcher-collection/-/matcher-collection-2.0.1.tgz#90be1a4cf58d6f2949864f65bb3b0f3e41303b29" @@ -4416,13 +4264,6 @@ minimatch@^3.0.2, minimatch@^3.0.4, minimatch@^3.1.1: dependencies: brace-expansion "^1.1.7" -minimatch@^5.0.1: - version "5.1.6" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" - integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== - dependencies: - brace-expansion "^2.0.1" - minimatch@^9.0.4, minimatch@^9.0.5: version "9.0.5" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" @@ -4445,11 +4286,6 @@ mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3: resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== -mkdirp@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" - integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== - mortice@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/mortice/-/mortice-3.0.4.tgz#34aadef768161e9dc49a7f73637b7858bcb7c6fa" @@ -4665,18 +4501,6 @@ open@10.1.0, open@^10.0.3: is-inside-container "^1.0.0" is-wsl "^3.1.0" -optionator@^0.8.1: - version "0.8.3" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" - integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== - dependencies: - deep-is "~0.1.3" - fast-levenshtein "~2.0.6" - levn "~0.3.0" - prelude-ls "~1.1.2" - type-check "~0.3.2" - word-wrap "~1.2.3" - ora@8.0.1: version "8.0.1" resolved "https://registry.yarnpkg.com/ora/-/ora-8.0.1.tgz#6dcb9250a629642cbe0d2df3a6331ad6f7a2af3e" @@ -4983,11 +4807,6 @@ prebuild-install@^7.0.1: tar-fs "^2.0.0" tunnel-agent "^0.6.0" -prelude-ls@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== - process-nextick-args@~2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" @@ -5008,23 +4827,7 @@ proto-list@~1.2.1: resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" integrity sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA== -protobufjs-cli@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/protobufjs-cli/-/protobufjs-cli-1.1.2.tgz#b32a7dc6aa3866cc103278539561bb4758249c8b" - integrity sha512-8ivXWxT39gZN4mm4ArQyJrRgnIwZqffBWoLDsE21TmMcKI3XwJMV4lEF2WU02C4JAtgYYc2SfJIltelD8to35g== - dependencies: - chalk "^4.0.0" - escodegen "^1.13.0" - espree "^9.0.0" - estraverse "^5.1.0" - glob "^8.0.0" - jsdoc "^4.0.0" - minimist "^1.2.0" - semver "^7.1.2" - tmp "^0.2.1" - uglify-js "^3.7.7" - -protobufjs@^7.2.4, protobufjs@^7.3.2: +protobufjs@^7.2.4: version "7.3.2" resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.3.2.tgz#60f3b7624968868f6f739430cfbc8c9370e26df4" integrity sha512-RXyHaACeqXeqAKGLDl68rQKbmObRsTIn4TYVUUug1KfS47YWCo5MacGITEryugIgZqORCvJWEk4l449POg5Txg== @@ -5316,13 +5119,6 @@ requires-port@^1.0.0: resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== -requizzle@^0.2.3: - version "0.2.4" - resolved "https://registry.yarnpkg.com/requizzle/-/requizzle-0.2.4.tgz#319eb658b28c370f0c20f968fa8ceab98c13d27c" - integrity sha512-JRrFk1D4OQ4SqovXOgdav+K8EAhSB/LJZqCz8tbX0KObcdeM15Ss59ozWMBWmmINMagCwmqn4ZNryUGpBsl6Jw== - dependencies: - lodash "^4.17.21" - resolve-alpn@^1.2.0: version "1.2.1" resolved "https://registry.yarnpkg.com/resolve-alpn/-/resolve-alpn-1.2.1.tgz#b7adbdac3546aaaec20b45e7d8265927072726f9" @@ -5523,11 +5319,6 @@ semver@7.6.2, semver@^7.1.3, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.2.tgz#1e3b34759f896e8f14d6134732ce798aeb0c6e13" integrity sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w== -semver@^7.1.2: - version "7.6.3" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" - integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== - send@0.18.0: version "0.18.0" resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" @@ -5888,11 +5679,6 @@ strip-final-newline@^3.0.0: resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd" integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== -strip-json-comments@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" @@ -6008,11 +5794,6 @@ tmp@^0.0.33: dependencies: os-tmpdir "~1.0.2" -tmp@^0.2.1: - version "0.2.3" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.3.tgz#eb783cc22bc1e8bebd0671476d46ea4eb32a79ae" - integrity sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w== - to-regex-range@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" @@ -6107,13 +5888,6 @@ tunnel-agent@^0.6.0: dependencies: safe-buffer "^5.0.1" -type-check@~0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - integrity sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg== - dependencies: - prelude-ls "~1.1.2" - type-fest@^0.21.3: version "0.21.3" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" @@ -6170,11 +5944,6 @@ uc.micro@^2.0.0, uc.micro@^2.1.0: resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-2.1.0.tgz#f8d3f7d0ec4c3dea35a7e3c8efa4cb8b45c9e7ee" integrity sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A== -uglify-js@^3.7.7: - version "3.19.0" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.19.0.tgz#6d45f1cad2c54117fa2fabd87fc2713a83e3bf7b" - integrity sha512-wNKHUY2hYYkf6oSFfhwwiHo4WCHzHmzcXsqXYTN9ja3iApYIFbb2U6ics9hBcYLHcYGQoAlwnZlTrf3oF+BL/Q== - uint8-varint@^2.0.1, uint8-varint@^2.0.2, uint8-varint@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/uint8-varint/-/uint8-varint-2.0.4.tgz#85be52b3849eb30f2c3640a2df8a14364180affb" @@ -6204,11 +5973,6 @@ uint8arrays@^5.0.0, uint8arrays@^5.0.1, uint8arrays@^5.0.2, uint8arrays@^5.1.0: dependencies: multiformats "^13.0.0" -underscore@~1.13.2: - version "1.13.6" - resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.13.6.tgz#04786a1f589dc6c09f761fc5f45b89e935136441" - integrity sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A== - undici-types@~5.26.4: version "5.26.5" resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" @@ -6577,11 +6341,6 @@ windows-release@^5.0.1: dependencies: execa "^5.1.1" -word-wrap@~1.2.3: - version "1.2.5" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" - integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== - "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" @@ -6634,11 +6393,6 @@ xdg-basedir@^5.0.1, xdg-basedir@^5.1.0: resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-5.1.0.tgz#1efba19425e73be1bc6f2a6ceb52a3d2c884c0c9" integrity sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ== -xmlcreate@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/xmlcreate/-/xmlcreate-2.0.4.tgz#0c5ab0f99cdd02a81065fa9cd8f8ae87624889be" - integrity sha512-nquOebG4sngPmGPICTS5EnxqhKbCmz5Ox5hsszI2T6U5qdrJizBc+0ilYSEjTSzU0yZcmvppztXe/5Al5fUwdg== - yaml@^2.1.1, yaml@^2.4.5: version "2.4.5" resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.4.5.tgz#60630b206dd6d84df97003d33fc1ddf6296cca5e" From 5688d272d686ed7b9d1f27c69213f2e377c484f7 Mon Sep 17 00:00:00 2001 From: droak Date: Thu, 25 Jul 2024 17:21:07 +0900 Subject: [PATCH 3/8] network messages proto; fix node build for proto structure --- examples/canvas/src/objects/canvas.ts | 5 ++--- examples/canvas/src/objects/pixel.ts | 8 +++----- packages/network/src/index.ts | 5 +++-- packages/node/src/index.ts | 9 +++++---- packages/object/src/index.ts | 19 ++++++++++--------- packages/object/src/proto/index.ts | 1 - packages/object/src/proto/object.proto | 1 - 7 files changed, 23 insertions(+), 25 deletions(-) delete mode 100644 packages/object/src/proto/index.ts diff --git a/examples/canvas/src/objects/canvas.ts b/examples/canvas/src/objects/canvas.ts index 708ff1a4..b9cb11cf 100644 --- a/examples/canvas/src/objects/canvas.ts +++ b/examples/canvas/src/objects/canvas.ts @@ -1,7 +1,7 @@ import { TopologyObject } from "@topology-foundation/object"; import { IPixel, Pixel } from "./pixel"; -export interface ICanvas extends TopologyObject { +export interface ICanvas { width: number; height: number; canvas: IPixel[][]; @@ -20,13 +20,12 @@ export interface ICanvas extends TopologyObject { merge(peerCanvas: Canvas): void; } -export class Canvas extends TopologyObject implements ICanvas { +export class Canvas implements TopologyObject, ICanvas { width: number; height: number; canvas: IPixel[][]; constructor(peerId: string, width: number, height: number) { - super(peerId); this.width = width; this.height = height; this.canvas = Array.from(new Array(width), () => diff --git a/examples/canvas/src/objects/pixel.ts b/examples/canvas/src/objects/pixel.ts index 8c5eaf40..f9ec0703 100644 --- a/examples/canvas/src/objects/pixel.ts +++ b/examples/canvas/src/objects/pixel.ts @@ -1,7 +1,6 @@ import { GCounter } from "@topology-foundation/crdt"; -import { TopologyObject } from "@topology-foundation/object"; -export interface IPixel extends TopologyObject { +export interface IPixel { red: GCounter; green: GCounter; blue: GCounter; @@ -11,13 +10,12 @@ export interface IPixel extends TopologyObject { merge(peerPixel: IPixel): void; } -export class Pixel extends TopologyObject implements IPixel { +export class Pixel implements IPixel { red: GCounter; green: GCounter; blue: GCounter; - constructor(peerId: string) { - super(peerId); + constructor() { this.red = new GCounter({}); this.green = new GCounter({}); this.blue = new GCounter({}); diff --git a/packages/network/src/index.ts b/packages/network/src/index.ts index 3d92a68d..dc9314e9 100644 --- a/packages/network/src/index.ts +++ b/packages/network/src/index.ts @@ -1,2 +1,3 @@ -export { TopologyNetworkNodeConfig, TopologyNetworkNode } from "./node.js"; -export { stringToStream, streamToString } from "./stream.js"; +export * from "./node.js"; +export * from "./stream.js"; +export * from "./proto/messages_pb.js"; diff --git a/packages/node/src/index.ts b/packages/node/src/index.ts index 27901166..3c354b1b 100644 --- a/packages/node/src/index.ts +++ b/packages/node/src/index.ts @@ -86,7 +86,8 @@ export class TopologyNode { ); const local = this._objectStore.get(object["id"]); if (local) { - local.merge(object); + // TODO: merge requires a merge function in wasm + // local.merge(object); this._objectStore.put(object["id"], local); } } @@ -99,7 +100,7 @@ export class TopologyNode { } createObject(object: TopologyObject) { - const objectId = object.getObjectId(); + const objectId = object.id; this.networkNode.subscribe(objectId); this._objectStore.put(objectId, object); } @@ -158,14 +159,14 @@ export class TopologyNode { } updateObject(object: TopologyObject, update_data: string) { - this._objectStore.put(object.getObjectId(), object); + this._objectStore.put(object.id, object); // not dialed, emitted through pubsub const message = `{ "type": "object_update", "data": [${uint8ArrayFromString(update_data)}] }`; this.networkNode.broadcastMessage( - object.getObjectId(), + object.id, uint8ArrayFromString(message), ); } diff --git a/packages/object/src/index.ts b/packages/object/src/index.ts index 255678d8..4ac2b96f 100644 --- a/packages/object/src/index.ts +++ b/packages/object/src/index.ts @@ -1,18 +1,19 @@ import * as crypto from "crypto"; import { TopologyObject } from "./proto/object_pb.js"; -export * from "./proto/index.js"; +export * from "./proto/object_pb.js"; -function newTopologyObject(peerId: string, abi?: string, bytecode?: string): TopologyObject { - const id = crypto - .createHash("sha256") - .update(abi ?? "") - .update(peerId) - .update(Math.floor(Math.random() * Number.MAX_VALUE).toString()) - .digest("hex"); +/* Creates a new TopologyObject +*/ +export function newTopologyObject(peerId: string, id?: string, abi?: string, bytecode?: string): TopologyObject { return { - id, + id: id ?? crypto + .createHash("sha256") + .update(abi ?? "") + .update(peerId) + .update(Math.floor(Math.random() * Number.MAX_VALUE).toString()) + .digest("hex"), abi: abi ?? "", bytecode: bytecode ?? "" }; diff --git a/packages/object/src/proto/index.ts b/packages/object/src/proto/index.ts deleted file mode 100644 index e4b918f8..00000000 --- a/packages/object/src/proto/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./object_pb.js"; diff --git a/packages/object/src/proto/object.proto b/packages/object/src/proto/object.proto index 078676dc..8fbe1f39 100644 --- a/packages/object/src/proto/object.proto +++ b/packages/object/src/proto/object.proto @@ -1,5 +1,4 @@ syntax = "proto3"; - package topology.object; message TopologyObject { From a6d5b4d156b3769c1cc2a4130a46473af039b6fb Mon Sep 17 00:00:00 2001 From: droak Date: Thu, 25 Jul 2024 17:25:13 +0900 Subject: [PATCH 4/8] add missing files --- packages/network/src/proto/messages.proto | 16 ++ packages/network/src/proto/messages_pb.ts | 207 ++++++++++++++++++++++ 2 files changed, 223 insertions(+) create mode 100644 packages/network/src/proto/messages.proto create mode 100644 packages/network/src/proto/messages_pb.ts diff --git a/packages/network/src/proto/messages.proto b/packages/network/src/proto/messages.proto new file mode 100644 index 00000000..4eb466b6 --- /dev/null +++ b/packages/network/src/proto/messages.proto @@ -0,0 +1,16 @@ +syntax = "proto3"; +package topology.network; + +message Message { + enum MessageType { + UPDATE = 0; + SYNC = 1; + SYNC_ACCEPT = 2; + SYNC_REJECT = 3; + } + + string id = 1; + string sender = 2; + MessageType type = 3; + bytes data = 4; +} diff --git a/packages/network/src/proto/messages_pb.ts b/packages/network/src/proto/messages_pb.ts new file mode 100644 index 00000000..8bf675de --- /dev/null +++ b/packages/network/src/proto/messages_pb.ts @@ -0,0 +1,207 @@ +// Code generated by protoc-gen-ts_proto. DO NOT EDIT. +// versions: +// protoc-gen-ts_proto v1.181.1 +// protoc unknown +// source: network/src/proto/messages.proto + +/* eslint-disable */ +import _m0 from "protobufjs/minimal"; + +export const protobufPackage = "topology.network"; + +export interface Message { + id: string; + sender: string; + type: Message_MessageType; + data: Uint8Array; +} + +export enum Message_MessageType { + UPDATE = 0, + SYNC = 1, + SYNC_ACCEPT = 2, + SYNC_REJECT = 3, + UNRECOGNIZED = -1, +} + +export function message_MessageTypeFromJSON(object: any): Message_MessageType { + switch (object) { + case 0: + case "UPDATE": + return Message_MessageType.UPDATE; + case 1: + case "SYNC": + return Message_MessageType.SYNC; + case 2: + case "SYNC_ACCEPT": + return Message_MessageType.SYNC_ACCEPT; + case 3: + case "SYNC_REJECT": + return Message_MessageType.SYNC_REJECT; + case -1: + case "UNRECOGNIZED": + default: + return Message_MessageType.UNRECOGNIZED; + } +} + +export function message_MessageTypeToJSON(object: Message_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.UNRECOGNIZED: + default: + return "UNRECOGNIZED"; + } +} + +function createBaseMessage(): Message { + return { id: "", sender: "", type: 0, data: new Uint8Array(0) }; +} + +export const Message = { + encode(message: Message, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.id !== "") { + writer.uint32(10).string(message.id); + } + if (message.sender !== "") { + writer.uint32(18).string(message.sender); + } + if (message.type !== 0) { + writer.uint32(24).int32(message.type); + } + if (message.data.length !== 0) { + writer.uint32(34).bytes(message.data); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): Message { + const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseMessage(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + + message.id = reader.string(); + continue; + case 2: + if (tag !== 18) { + break; + } + + message.sender = reader.string(); + continue; + case 3: + if (tag !== 24) { + break; + } + + message.type = reader.int32() as any; + continue; + case 4: + if (tag !== 34) { + break; + } + + message.data = reader.bytes(); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): Message { + return { + id: isSet(object.id) ? globalThis.String(object.id) : "", + sender: isSet(object.sender) ? globalThis.String(object.sender) : "", + type: isSet(object.type) ? message_MessageTypeFromJSON(object.type) : 0, + data: isSet(object.data) ? bytesFromBase64(object.data) : new Uint8Array(0), + }; + }, + + toJSON(message: Message): unknown { + const obj: any = {}; + if (message.id !== "") { + obj.id = message.id; + } + if (message.sender !== "") { + obj.sender = message.sender; + } + if (message.type !== 0) { + obj.type = message_MessageTypeToJSON(message.type); + } + if (message.data.length !== 0) { + obj.data = base64FromBytes(message.data); + } + return obj; + }, + + create, I>>(base?: I): Message { + return Message.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): Message { + const message = createBaseMessage(); + message.id = object.id ?? ""; + message.sender = object.sender ?? ""; + message.type = object.type ?? 0; + message.data = object.data ?? new Uint8Array(0); + return message; + }, +}; + +function bytesFromBase64(b64: string): Uint8Array { + if ((globalThis as any).Buffer) { + return Uint8Array.from(globalThis.Buffer.from(b64, "base64")); + } else { + const bin = globalThis.atob(b64); + const arr = new Uint8Array(bin.length); + for (let i = 0; i < bin.length; ++i) { + arr[i] = bin.charCodeAt(i); + } + return arr; + } +} + +function base64FromBytes(arr: Uint8Array): string { + if ((globalThis as any).Buffer) { + return globalThis.Buffer.from(arr).toString("base64"); + } else { + const bin: string[] = []; + arr.forEach((byte) => { + bin.push(globalThis.String.fromCharCode(byte)); + }); + return globalThis.btoa(bin.join("")); + } +} + +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; +} From ba6691726bcefbc078b9a9a41d6d6534915dfc0d Mon Sep 17 00:00:00 2001 From: droak Date: Sun, 28 Jul 2024 14:02:09 +0900 Subject: [PATCH 5/8] start using pb Message as input --- packages/network/src/node.ts | 14 ++--- packages/node/src/index.ts | 19 +++---- packages/node/src/operations.ts | 92 +++++++++++++++++++++++++++++---- 3 files changed, 96 insertions(+), 29 deletions(-) diff --git a/packages/network/src/node.ts b/packages/network/src/node.ts index e599d833..f4742e2f 100644 --- a/packages/network/src/node.ts +++ b/packages/network/src/node.ts @@ -24,6 +24,7 @@ import { bootstrap } from "@libp2p/bootstrap"; import { webTransport } from "@libp2p/webtransport"; import { autoNAT } from "@libp2p/autonat"; import { fromString as uint8ArrayFromString } from "uint8arrays/from-string"; +import { Message } from "./proto/messages_pb.js"; // snake_casing to match the JSON config export interface TopologyNetworkNodeConfig { @@ -78,8 +79,8 @@ export class TopologyNetworkNode { this._config && this._config.bootstrap_peers ? this._config.bootstrap_peers : [ - "/dns4/relay.droak.sh/tcp/443/wss/p2p/Qma3GsJmB47xYuyahPZPSadh1avvxfyYQwk8R3UnFrQ6aP", - ], + "/dns4/relay.droak.sh/tcp/443/wss/p2p/Qma3GsJmB47xYuyahPZPSadh1avvxfyYQwk8R3UnFrQ6aP", + ], }), ], services: { @@ -184,7 +185,7 @@ export class TopologyNetworkNode { return peers.map((peer) => peer.toString()); } - async broadcastMessage(topic: string, message: Uint8Array) { + async broadcastMessage(topic: string, message: Message) { try { if (this._pubsub?.getSubscribers(topic)?.length === 0) return; await this._pubsub?.publish(topic, message); @@ -198,7 +199,7 @@ export class TopologyNetworkNode { } } - async sendMessage(peerId: string, protocols: string[], message: string) { + async sendMessage(peerId: string, protocols: string[], message: Message) { try { const connection = await this._node?.dial([multiaddr(`/p2p/${peerId}`)]); const stream = await connection?.newStream(protocols); @@ -215,7 +216,7 @@ export class TopologyNetworkNode { async sendGroupMessageRandomPeer( group: string, protocols: string[], - message: string, + message: Message, ) { try { const peers = this._pubsub?.getSubscribers(group); @@ -224,7 +225,8 @@ export class TopologyNetworkNode { const connection = await this._node?.dial(peerId); const stream: Stream = (await connection?.newStream(protocols)) as Stream; - stringToStream(stream, message); + Message.encode(message, stream.sink) + // stringToStream(stream, message); console.log( `topology::network::sendMessageRandomTopicPeer: Successfuly sent message to peer: ${peerId} with message: ${message}`, diff --git a/packages/node/src/index.ts b/packages/node/src/index.ts index 3c354b1b..d8b20b83 100644 --- a/packages/node/src/index.ts +++ b/packages/node/src/index.ts @@ -20,14 +20,14 @@ export interface TopologyNodeConfig { export class TopologyNode { private _config?: TopologyNodeConfig; - private _objectStore: TopologyObjectStore; + objectStore: TopologyObjectStore; networkNode: TopologyNetworkNode; constructor(config?: TopologyNodeConfig) { this._config = config; this.networkNode = new TopologyNetworkNode(config?.network_config); - this._objectStore = new TopologyObjectStore(); + this.objectStore = new TopologyObjectStore(); } async start(): Promise { @@ -62,7 +62,7 @@ export class TopologyNode { const object = JSON.parse( uint8ArrayToString(new Uint8Array(message["data"])), ); - this._objectStore.put(object["id"], object); + this.objectStore.put(object["id"], object); } case "object_sync": { const objectId = uint8ArrayToString( @@ -84,11 +84,11 @@ export class TopologyNode { const object = JSON.parse( uint8ArrayToString(new Uint8Array(message["data"])), ); - const local = this._objectStore.get(object["id"]); + const local = this.objectStore.get(object["id"]); if (local) { // TODO: merge requires a merge function in wasm // local.merge(object); - this._objectStore.put(object["id"], local); + this.objectStore.put(object["id"], local); } } default: { @@ -99,11 +99,6 @@ export class TopologyNode { ); } - createObject(object: TopologyObject) { - const objectId = object.id; - this.networkNode.subscribe(objectId); - this._objectStore.put(objectId, object); - } /// Subscribe to the object's PubSub group /// and fetch it from a peer @@ -155,11 +150,11 @@ export class TopologyNode { /// Get the object from the local Object Store getObject(objectId: string) { - return this._objectStore.get(objectId); + return this.objectStore.get(objectId); } updateObject(object: TopologyObject, update_data: string) { - this._objectStore.put(object.id, object); + this.objectStore.put(object.id, object); // not dialed, emitted through pubsub const message = `{ "type": "object_update", diff --git a/packages/node/src/operations.ts b/packages/node/src/operations.ts index 4b831b73..93f5da2a 100644 --- a/packages/node/src/operations.ts +++ b/packages/node/src/operations.ts @@ -1,24 +1,94 @@ -/* Object and P2P Network operations */ +import { TopologyObject } from "@topology-foundation/object"; +import { TopologyNode } from "."; +import { Message, Message_MessageType } from "@topology-foundation/network"; + +/* Object operations */ export enum OPERATIONS { - // TODO: Confirm if this needs a network message - // who to send to? /* Create a new CRO */ CREATE, /* Update operation on a CRO */ UPDATE, - // These two are not network messages /* Subscribe to a PubSub group (either CRO or custom) */ SUBSCRIBE, /* Unsubscribe from a PubSub group */ UNSUBSCRIBE, /* Actively send the CRO RIBLT to a random peer */ - SYNC, - /* Accept the sync request and send the RIBLT - after processing the received RIBLT - */ - SYNC_ACCEPT, - /* Reject the sync request */ - SYNC_REJECT, + SYNC +} + +function executeObjectOperation(node: TopologyNode, operation: OPERATIONS, data: Uint8Array) { + switch (operation) { + case OPERATIONS.CREATE: + // data = CRO + createObject(node, data); + break; + case OPERATIONS.UPDATE: + // data = CRO + updateObject(node, data) + break; + case OPERATIONS.SUBSCRIBE: + // data = TopologyObjectId + subscribeObject(node, data) + break; + case OPERATIONS.UNSUBSCRIBE: + // data = ObjectId + unsubscribeObject(node, data) + break; + case OPERATIONS.SYNC: + // data = CRO + // TODO: data = RIBLT + syncObject(node, data) + break; + default: + console.error("topology::node::executeObjectOperation", "Invalid operation"); + break; + } +} + +function createObject(node: TopologyNode, data: Uint8Array) { + const object = TopologyObject.decode(data) + node.networkNode.subscribe(object.id); + node.objectStore.put(object.id, object); +} + +function updateObject(node: TopologyNode, data: Uint8Array) { + // TODO: should just send the object diff, not the full object + // this is handler, we want the action of sending + const object = TopologyObject.decode(data) + node.objectStore.put(object.id, object); + + const message = Message.create({ + type: Message_MessageType.UPDATE, + data: data + }); + + node.networkNode.broadcastMessage( + object.id, + message, + ); +} + +function subscribeObject(node: TopologyNode, data: Uint8Array) { + // process data as only the object id and not the full obj + const object = TopologyObject.decode(data) + node.networkNode.subscribe(object.id); +} + +function unsubscribeObject(node: TopologyNode, data: Uint8Array) { + // process data as only the object id and not the full obj + const object = TopologyObject.decode(data) + node.networkNode.unsubscribe(object.id); +} + +function syncObject(node: TopologyNode, data: Uint8Array) { + // Send sync request to a random peer + const object = TopologyObject.decode(data) + + const message = Message.create({ + type: Message_MessageType.SYNC, + data: data + }) + node.networkNode.sendGroupMessageRandomPeer(object.id, ["/topology/message"], message) } From c4da7ac3f09af32b1fa5f978010e68c388bd9d9a Mon Sep 17 00:00:00 2001 From: droak Date: Wed, 31 Jul 2024 00:29:36 +0900 Subject: [PATCH 6/8] initial restructuring and handlers --- packages/network/src/node.ts | 14 ++++-- packages/network/src/proto/messages.proto | 8 ++-- packages/network/src/proto/messages_pb.ts | 38 ++++++---------- packages/node/src/handlers.ts | 55 +++++++++++++++++++++++ packages/node/src/index.ts | 12 ++++- packages/node/src/operations.ts | 12 ++--- 6 files changed, 101 insertions(+), 38 deletions(-) create mode 100644 packages/node/src/handlers.ts diff --git a/packages/network/src/node.ts b/packages/network/src/node.ts index f4742e2f..a3e34e19 100644 --- a/packages/network/src/node.ts +++ b/packages/network/src/node.ts @@ -24,6 +24,7 @@ import { bootstrap } from "@libp2p/bootstrap"; import { webTransport } from "@libp2p/webtransport"; import { autoNAT } from "@libp2p/autonat"; import { fromString as uint8ArrayFromString } from "uint8arrays/from-string"; +import * as lp from "it-length-prefixed"; import { Message } from "./proto/messages_pb.js"; // snake_casing to match the JSON config @@ -187,8 +188,8 @@ export class TopologyNetworkNode { async broadcastMessage(topic: string, message: Message) { try { - if (this._pubsub?.getSubscribers(topic)?.length === 0) return; - await this._pubsub?.publish(topic, message); + let messageBuffer = Message.encode(message).finish(); + await this._pubsub?.publish(topic, messageBuffer); console.log( "topology::network::broadcastMessage: Successfuly broadcasted message to topic", @@ -203,7 +204,10 @@ export class TopologyNetworkNode { try { const connection = await this._node?.dial([multiaddr(`/p2p/${peerId}`)]); const stream = await connection?.newStream(protocols); - stringToStream(stream, message); + let messageBuffer = Message.encode(message).finish(); + stream.sink(lp.encode([messageBuffer])) + + // stringToStream(stream, message); console.log( `topology::network::sendMessage: Successfuly sent message to peer: ${peerId} with message: ${message}`, @@ -225,7 +229,9 @@ export class TopologyNetworkNode { const connection = await this._node?.dial(peerId); const stream: Stream = (await connection?.newStream(protocols)) as Stream; - Message.encode(message, stream.sink) + let messageBuffer = Message.encode(message).finish(); + stream.sink(lp.encode([messageBuffer])) + // stringToStream(stream, message); console.log( diff --git a/packages/network/src/proto/messages.proto b/packages/network/src/proto/messages.proto index 4eb466b6..6aa971fe 100644 --- a/packages/network/src/proto/messages.proto +++ b/packages/network/src/proto/messages.proto @@ -7,10 +7,10 @@ message Message { SYNC = 1; SYNC_ACCEPT = 2; SYNC_REJECT = 3; + CUSTOM = 4; } - string id = 1; - string sender = 2; - MessageType type = 3; - bytes data = 4; + string sender = 1; + MessageType type = 2; + bytes data = 3; } diff --git a/packages/network/src/proto/messages_pb.ts b/packages/network/src/proto/messages_pb.ts index 8bf675de..da36bdfc 100644 --- a/packages/network/src/proto/messages_pb.ts +++ b/packages/network/src/proto/messages_pb.ts @@ -10,7 +10,6 @@ import _m0 from "protobufjs/minimal"; export const protobufPackage = "topology.network"; export interface Message { - id: string; sender: string; type: Message_MessageType; data: Uint8Array; @@ -21,6 +20,7 @@ export enum Message_MessageType { SYNC = 1, SYNC_ACCEPT = 2, SYNC_REJECT = 3, + CUSTOM = 4, UNRECOGNIZED = -1, } @@ -38,6 +38,9 @@ export function message_MessageTypeFromJSON(object: any): Message_MessageType { case 3: case "SYNC_REJECT": return Message_MessageType.SYNC_REJECT; + case 4: + case "CUSTOM": + return Message_MessageType.CUSTOM; case -1: case "UNRECOGNIZED": default: @@ -55,6 +58,8 @@ export function message_MessageTypeToJSON(object: Message_MessageType): string { return "SYNC_ACCEPT"; case Message_MessageType.SYNC_REJECT: return "SYNC_REJECT"; + case Message_MessageType.CUSTOM: + return "CUSTOM"; case Message_MessageType.UNRECOGNIZED: default: return "UNRECOGNIZED"; @@ -62,22 +67,19 @@ export function message_MessageTypeToJSON(object: Message_MessageType): string { } function createBaseMessage(): Message { - return { id: "", sender: "", type: 0, data: new Uint8Array(0) }; + return { sender: "", type: 0, data: new Uint8Array(0) }; } export const Message = { encode(message: Message, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.id !== "") { - writer.uint32(10).string(message.id); - } if (message.sender !== "") { - writer.uint32(18).string(message.sender); + writer.uint32(10).string(message.sender); } if (message.type !== 0) { - writer.uint32(24).int32(message.type); + writer.uint32(16).int32(message.type); } if (message.data.length !== 0) { - writer.uint32(34).bytes(message.data); + writer.uint32(26).bytes(message.data); } return writer; }, @@ -94,24 +96,17 @@ export const Message = { break; } - message.id = reader.string(); - continue; - case 2: - if (tag !== 18) { - break; - } - message.sender = reader.string(); continue; - case 3: - if (tag !== 24) { + case 2: + if (tag !== 16) { break; } message.type = reader.int32() as any; continue; - case 4: - if (tag !== 34) { + case 3: + if (tag !== 26) { break; } @@ -128,7 +123,6 @@ export const Message = { fromJSON(object: any): Message { return { - id: isSet(object.id) ? globalThis.String(object.id) : "", sender: isSet(object.sender) ? globalThis.String(object.sender) : "", type: isSet(object.type) ? message_MessageTypeFromJSON(object.type) : 0, data: isSet(object.data) ? bytesFromBase64(object.data) : new Uint8Array(0), @@ -137,9 +131,6 @@ export const Message = { toJSON(message: Message): unknown { const obj: any = {}; - if (message.id !== "") { - obj.id = message.id; - } if (message.sender !== "") { obj.sender = message.sender; } @@ -157,7 +148,6 @@ export const Message = { }, fromPartial, I>>(object: I): Message { const message = createBaseMessage(); - message.id = object.id ?? ""; message.sender = object.sender ?? ""; message.type = object.type ?? 0; message.data = object.data ?? new Uint8Array(0); diff --git a/packages/node/src/handlers.ts b/packages/node/src/handlers.ts new file mode 100644 index 00000000..1f92f1ee --- /dev/null +++ b/packages/node/src/handlers.ts @@ -0,0 +1,55 @@ +import { Stream } from "@libp2p/interface"; +import * as lp from "it-length-prefixed"; +import { + Message, + Message_MessageType, +} from "@topology-foundation/network"; +import { TopologyNode } from "."; + +export async function topologyMessageHandler(node: TopologyNode, stream: Stream) { + const buf = (await lp.decode(stream.source).return()).value; + const message = Message.decode(new Uint8Array(buf ? buf.subarray() : [])) + + switch (message.type) { + case Message_MessageType.UPDATE: + updateHandler(node, message.data); + break; + case Message_MessageType.SYNC: + syncHandler(node, stream.protocol ?? "", message.sender, message.data); + break; + case Message_MessageType.SYNC_ACCEPT: + syncAcceptHandler(node, message.data); + break; + case Message_MessageType.SYNC_REJECT: + syncRejectHandler(node, message.data); + break; + default: + console.error("topology::node::messageHandler", "Invalid operation"); + break; + } +} + +function updateHandler(node: TopologyNode, data: Uint8Array) { + // +} + +function syncHandler(node: TopologyNode, protocol: string, sender: string, data: Uint8Array) { + // Receive RBILT & send back + // (might send reject) <- TODO: when should we reject? + const message = Message.create({ + sender: node.networkNode.peerId, + type: Message_MessageType.SYNC_ACCEPT, + // add data here + data: new Uint8Array(0), + }); + + node.networkNode.sendMessage(sender, [protocol], message); +} + +function syncAcceptHandler(node: TopologyNode, data: Uint8Array) { + // Process RBILT +} + +function syncRejectHandler(node: TopologyNode, data: Uint8Array) { + // Ask sync from another peer +} diff --git a/packages/node/src/index.ts b/packages/node/src/index.ts index 75efe54f..995da97e 100644 --- a/packages/node/src/index.ts +++ b/packages/node/src/index.ts @@ -1,6 +1,8 @@ import { GossipsubMessage } from "@chainsafe/libp2p-gossipsub"; import { EventHandler, StreamHandler } from "@libp2p/interface"; import { + Message, + Message_MessageType, TopologyNetworkNode, TopologyNetworkNodeConfig, streamToString, @@ -10,6 +12,7 @@ import { TopologyObjectStore } from "./store"; import { fromString as uint8ArrayFromString } from "uint8arrays/from-string"; import { toString as uint8ArrayToString } from "uint8arrays/to-string"; import { OPERATIONS } from "./operations.js"; +import * as lp from "it-length-prefixed"; export * from "./operations.js"; @@ -39,7 +42,14 @@ export class TopologyNode { let input = await streamToString(stream); if (!input) return; - const message = JSON.parse(input); + // const stream: Stream = (await connection?.newStream(protocols)) as Stream; + // let messageBuffer = Message.encode(message).finish(); + // stream.sink(lp.encode([messageBuffer])) + + const buf = (await lp.decode(stream.source).return()).value; + const message = Message.decode(new Uint8Array(buf ? buf.subarray() : [])) + + // const message = JSON.parse(input); switch (message["type"]) { case "object_fetch": { const objectId = uint8ArrayToString( diff --git a/packages/node/src/operations.ts b/packages/node/src/operations.ts index 93f5da2a..86ee3b82 100644 --- a/packages/node/src/operations.ts +++ b/packages/node/src/operations.ts @@ -18,27 +18,27 @@ export enum OPERATIONS { SYNC } -function executeObjectOperation(node: TopologyNode, operation: OPERATIONS, data: Uint8Array) { +export function executeObjectOperation(node: TopologyNode, operation: OPERATIONS, data: Uint8Array) { switch (operation) { case OPERATIONS.CREATE: // data = CRO createObject(node, data); break; case OPERATIONS.UPDATE: - // data = CRO + // data = [CRO_ID, OPERATION] updateObject(node, data) break; case OPERATIONS.SUBSCRIBE: - // data = TopologyObjectId + // data = CRO_ID subscribeObject(node, data) break; case OPERATIONS.UNSUBSCRIBE: - // data = ObjectId + // data = CRO_ID unsubscribeObject(node, data) break; case OPERATIONS.SYNC: // data = CRO - // TODO: data = RIBLT + // TODO: data = [CRO_ID, RIBLT] syncObject(node, data) break; default: @@ -90,5 +90,7 @@ function syncObject(node: TopologyNode, data: Uint8Array) { type: Message_MessageType.SYNC, data: data }) + + // TODO: check how to do it better node.networkNode.sendGroupMessageRandomPeer(object.id, ["/topology/message"], message) } From 8ee79bbb81b5b85e2c2dab745250cffc565cfb45 Mon Sep 17 00:00:00 2001 From: droak Date: Wed, 31 Jul 2024 11:40:55 +0900 Subject: [PATCH 7/8] cleanup index --- packages/node/src/handlers.ts | 14 ++- packages/node/src/index.ts | 163 ++++---------------------------- packages/node/src/operations.ts | 54 +++++++++-- packages/node/src/version.ts | 2 +- 4 files changed, 79 insertions(+), 154 deletions(-) diff --git a/packages/node/src/handlers.ts b/packages/node/src/handlers.ts index 1f92f1ee..19ca06c2 100644 --- a/packages/node/src/handlers.ts +++ b/packages/node/src/handlers.ts @@ -6,7 +6,7 @@ import { } from "@topology-foundation/network"; import { TopologyNode } from "."; -export async function topologyMessageHandler(node: TopologyNode, stream: Stream) { +export async function topologyMessagesHandler(node: TopologyNode, stream: Stream) { const buf = (await lp.decode(stream.source).return()).value; const message = Message.decode(new Uint8Array(buf ? buf.subarray() : [])) @@ -31,6 +31,18 @@ export async function topologyMessageHandler(node: TopologyNode, stream: Stream) function updateHandler(node: TopologyNode, data: Uint8Array) { // + /* + this.objectStore.put(object.id, object); + // not dialed, emitted through pubsub + const message = `{ + "type": "object_update", + "data": [${uint8ArrayFromString(update_data)}] + }`; + this.networkNode.broadcastMessage( + object.id, + uint8ArrayFromString(message), + ); + */ } function syncHandler(node: TopologyNode, protocol: string, sender: string, data: Uint8Array) { diff --git a/packages/node/src/index.ts b/packages/node/src/index.ts index 995da97e..87c96e87 100644 --- a/packages/node/src/index.ts +++ b/packages/node/src/index.ts @@ -11,8 +11,8 @@ import { TopologyObject } from "@topology-foundation/object"; import { TopologyObjectStore } from "./store"; import { fromString as uint8ArrayFromString } from "uint8arrays/from-string"; import { toString as uint8ArrayToString } from "uint8arrays/to-string"; -import { OPERATIONS } from "./operations.js"; import * as lp from "it-length-prefixed"; +import { topologyMessagesHandler } from "./handlers"; export * from "./operations.js"; @@ -38,143 +38,7 @@ export class TopologyNode { this.networkNode.addMessageHandler( ["/topology/message/0.0.1"], - async ({ stream }) => { - let input = await streamToString(stream); - if (!input) return; - - // const stream: Stream = (await connection?.newStream(protocols)) as Stream; - // let messageBuffer = Message.encode(message).finish(); - // stream.sink(lp.encode([messageBuffer])) - - const buf = (await lp.decode(stream.source).return()).value; - const message = Message.decode(new Uint8Array(buf ? buf.subarray() : [])) - - // const message = JSON.parse(input); - switch (message["type"]) { - case "object_fetch": { - const objectId = uint8ArrayToString( - new Uint8Array(message["data"]), - ); - const object = this.getObject(objectId); - const object_message = `{ - "type": "object", - "data": [${uint8ArrayFromString(JSON.stringify(object, (_key, value) => (value instanceof Set ? [...value] : value)))}] - }`; - await this.networkNode.sendMessage( - message["sender"], - [stream.protocol], - object_message, - ); - // await stringToStream(stream, object_message); - break; - } - case "object": { - const object = JSON.parse( - uint8ArrayToString(new Uint8Array(message["data"])), - ); - this.objectStore.put(object["id"], object); - break; - } - case "object_sync": { - const objectId = uint8ArrayToString( - new Uint8Array(message["data"]), - ); - const object = this.getObject(objectId); - const object_message = `{ - "type": "object_merge", - "data": [${uint8ArrayFromString(JSON.stringify(object))}] - }`; - await this.networkNode.sendMessage( - message["sender"], - [stream.protocol], - object_message, - ); - break; - } - case "object_merge": { - const object = JSON.parse( - uint8ArrayToString(new Uint8Array(message["data"])), - ); - const local = this.objectStore.get(object["id"]); - if (local) { - // TODO: merge requires a merge function in wasm - // local.merge(object); - this.objectStore.put(object["id"], local); - } - break; - } - default: { - return; - } - } - }, - ); - } - - - /// Subscribe to the object's PubSub group - /// and fetch it from a peer - async subscribeObject(objectId: string, fetch = false, peerId = "") { - this.networkNode.subscribe(objectId); - if (!fetch) return; - const message = `{ - "type": "object_fetch", - "sender": "${this.networkNode.peerId}", - "data": [${uint8ArrayFromString(objectId)}] - }`; - - if (!peerId) { - await this.networkNode.sendGroupMessageRandomPeer( - objectId, - ["/topology/message/0.0.1"], - message, - ); - } else { - await this.networkNode.sendMessage( - peerId, - ["/topology/message/0.0.1"], - message, - ); - } - } - - async syncObject(objectId: string, peerId = "") { - const message = `{ - "type": "object_sync", - "sender": "${this.networkNode.peerId}", - "data": [${uint8ArrayFromString(objectId)}] - }`; - - if (!peerId) { - await this.networkNode.sendGroupMessageRandomPeer( - objectId, - ["/topology/message/0.0.1"], - message, - ); - } else { - await this.networkNode.sendMessage( - peerId, - ["/topology/message/0.0.1"], - message, - ); - } - } - - /// Get the object from the local Object Store - getObject(objectId: string) { - return this.objectStore.get(objectId); - } - - updateObject(object: TopologyObject, update_data: string) { - this.objectStore.put(object.id, object); - // not dialed, emitted through pubsub - const message = `{ - "type": "object_update", - "data": [${uint8ArrayFromString(update_data)}] - }`; - this.networkNode.broadcastMessage( - object.id, - uint8ArrayFromString(message), + async ({ stream }) => topologyMessagesHandler(this, stream) ); } @@ -182,17 +46,32 @@ export class TopologyNode { this.networkNode.subscribe(group); } - sendGroupMessage(group: string, message: Uint8Array) { - this.networkNode.broadcastMessage(group, message); - } - addCustomGroupMessageHandler( + group: string, handler: EventHandler>, ) { this.networkNode.addGroupMessageHandler(handler); } + sendGroupMessage(group: string, data: Uint8Array) { + const message = Message.create({ + sender: this.networkNode.peerId, + type: Message_MessageType.CUSTOM, + data, + }) + this.networkNode.broadcastMessage(group, message); + } + addCustomMessageHandler(protocol: string | string[], handler: StreamHandler) { this.networkNode.addMessageHandler(protocol, handler); } + + sendCustomMessage(peerId: string, protocol: string, data: Uint8Array) { + const message = Message.create({ + sender: this.networkNode.peerId, + type: Message_MessageType.CUSTOM, + data, + }); + this.networkNode.sendMessage(peerId, [protocol], message); + } } diff --git a/packages/node/src/operations.ts b/packages/node/src/operations.ts index 86ee3b82..6c256542 100644 --- a/packages/node/src/operations.ts +++ b/packages/node/src/operations.ts @@ -13,12 +13,12 @@ export enum OPERATIONS { SUBSCRIBE, /* Unsubscribe from a PubSub group */ UNSUBSCRIBE, - /* Actively send the CRO RIBLT to a random peer */ SYNC } -export function executeObjectOperation(node: TopologyNode, operation: OPERATIONS, data: Uint8Array) { +/* Utility function to execute object operations apart of calling the functions directly */ +export async function executeObjectOperation(node: TopologyNode, operation: OPERATIONS, data: Uint8Array) { switch (operation) { case OPERATIONS.CREATE: // data = CRO @@ -30,7 +30,7 @@ export function executeObjectOperation(node: TopologyNode, operation: OPERATIONS break; case OPERATIONS.SUBSCRIBE: // data = CRO_ID - subscribeObject(node, data) + await subscribeObject(node, data) break; case OPERATIONS.UNSUBSCRIBE: // data = CRO_ID @@ -39,7 +39,7 @@ export function executeObjectOperation(node: TopologyNode, operation: OPERATIONS case OPERATIONS.SYNC: // data = CRO // TODO: data = [CRO_ID, RIBLT] - syncObject(node, data) + await syncObject(node, data) break; default: console.error("topology::node::executeObjectOperation", "Invalid operation"); @@ -47,13 +47,13 @@ export function executeObjectOperation(node: TopologyNode, operation: OPERATIONS } } -function createObject(node: TopologyNode, data: Uint8Array) { +export function createObject(node: TopologyNode, data: Uint8Array) { const object = TopologyObject.decode(data) node.networkNode.subscribe(object.id); node.objectStore.put(object.id, object); } -function updateObject(node: TopologyNode, data: Uint8Array) { +export function updateObject(node: TopologyNode, data: Uint8Array) { // TODO: should just send the object diff, not the full object // this is handler, we want the action of sending const object = TopologyObject.decode(data) @@ -70,19 +70,41 @@ function updateObject(node: TopologyNode, data: Uint8Array) { ); } -function subscribeObject(node: TopologyNode, data: Uint8Array) { +export async function subscribeObject(node: TopologyNode, data: Uint8Array, fetch?: boolean, peerId?: string) { // process data as only the object id and not the full obj + // need to create the obj anyway to sync empty obj const object = TopologyObject.decode(data) node.networkNode.subscribe(object.id); + + if (!fetch) return; + const message = Message.create({ + sender: node.networkNode.peerId, + type: Message_MessageType.SYNC, + data + }); + + if (!peerId) { + await node.networkNode.sendGroupMessageRandomPeer( + object.id, + ["/topology/message/0.0.1"], + message, + ); + } else { + await node.networkNode.sendMessage( + peerId, + ["/topology/message/0.0.1"], + message, + ); + } } -function unsubscribeObject(node: TopologyNode, data: Uint8Array) { +export function unsubscribeObject(node: TopologyNode, data: Uint8Array) { // process data as only the object id and not the full obj const object = TopologyObject.decode(data) node.networkNode.unsubscribe(object.id); } -function syncObject(node: TopologyNode, data: Uint8Array) { +export async function syncObject(node: TopologyNode, data: Uint8Array, peerId?: string) { // Send sync request to a random peer const object = TopologyObject.decode(data) @@ -92,5 +114,17 @@ function syncObject(node: TopologyNode, data: Uint8Array) { }) // TODO: check how to do it better - node.networkNode.sendGroupMessageRandomPeer(object.id, ["/topology/message"], message) + if (!peerId) { + await node.networkNode.sendGroupMessageRandomPeer( + object.id, + ["/topology/message/0.0.1"], + message, + ); + } else { + await node.networkNode.sendMessage( + peerId, + ["/topology/message/0.0.1"], + message, + ); + } } diff --git a/packages/node/src/version.ts b/packages/node/src/version.ts index 85ceb686..2d05f320 100644 --- a/packages/node/src/version.ts +++ b/packages/node/src/version.ts @@ -1 +1 @@ -export const VERSION = "0.0.22"; +export const VERSION = "0.0.23-5"; From 185b790dd9cc3d528063e8072f6a03537c05a601 Mon Sep 17 00:00:00 2001 From: droak Date: Wed, 31 Jul 2024 17:01:39 +0900 Subject: [PATCH 8/8] start refactoring chat example --- examples/chat/src/index.ts | 211 +++++++++++++++--------------- examples/chat/src/objects/chat.ts | 49 +++---- yarn.lock | 35 ----- 3 files changed, 132 insertions(+), 163 deletions(-) diff --git a/examples/chat/src/index.ts b/examples/chat/src/index.ts index 678da38b..285a9fb8 100644 --- a/examples/chat/src/index.ts +++ b/examples/chat/src/index.ts @@ -1,4 +1,5 @@ import { TopologyNode } from "@topology-foundation/node"; +import * as topology from "@topology-foundation/node"; import { Chat, IChat } from "./objects/chat"; import { handleChatMessages } from "./handlers"; import { GSet } from "@topology-foundation/crdt"; @@ -11,119 +12,119 @@ let discoveryPeers: string[] = []; let objectPeers: string[] = []; const render = () => { - const element_peerId = document.getElementById("peerId"); - element_peerId.innerHTML = node.networkNode.peerId; - - const element_peers = document.getElementById("peers"); - element_peers.innerHTML = "[" + peers.join(", ") + "]"; - - const element_discoveryPeers = document.getElementById("discoveryPeers"); - element_discoveryPeers.innerHTML = "[" + discoveryPeers.join(", ") + "]"; - - const element_objectPeers = document.getElementById("objectPeers"); - element_objectPeers.innerHTML = "[" + objectPeers.join(", ") + "]"; - - if(!chatCRO) return; - const chat = chatCRO.getMessages(); - const element_chat = document.getElementById("chat"); - element_chat.innerHTML = ""; - - if(chat.set().size == 0){ - const div = document.createElement("div"); - div.innerHTML = "No messages yet"; - div.style.padding = "10px"; - element_chat.appendChild(div); - return; - } - Array.from(chat.set()).sort().forEach((message: string) => { - const div = document.createElement("div"); - div.innerHTML = message; - div.style.padding = "10px"; - element_chat.appendChild(div); - }); + const element_peerId = document.getElementById("peerId"); + element_peerId.innerHTML = node.networkNode.peerId; + + const element_peers = document.getElementById("peers"); + element_peers.innerHTML = "[" + peers.join(", ") + "]"; + + const element_discoveryPeers = document.getElementById("discoveryPeers"); + element_discoveryPeers.innerHTML = "[" + discoveryPeers.join(", ") + "]"; + + const element_objectPeers = document.getElementById("objectPeers"); + element_objectPeers.innerHTML = "[" + objectPeers.join(", ") + "]"; + + if (!chatCRO) return; + const chat = chatCRO.getMessages(); + const element_chat = document.getElementById("chat"); + element_chat.innerHTML = ""; + + if (chat.set().size == 0) { + const div = document.createElement("div"); + div.innerHTML = "No messages yet"; + div.style.padding = "10px"; + element_chat.appendChild(div); + return; + } + Array.from(chat.set()).sort().forEach((message: string) => { + const div = document.createElement("div"); + div.innerHTML = message; + div.style.padding = "10px"; + element_chat.appendChild(div); + }); } async function sendMessage(message: string) { - let timestamp: string = Date.now().toString(); - if(!chatCRO) { - console.error("Chat CRO not initialized"); - alert("Please create or join a chat room first"); - return; - } - console.log("Sending message: ", `(${timestamp}, ${message}, ${node.networkNode.peerId})`); - chatCRO.addMessage(timestamp, message, node.networkNode.peerId); - - node.updateObject(chatCRO, `addMessage(${timestamp}, ${message}, ${node.networkNode.peerId})`); - render(); + let timestamp: string = Date.now().toString(); + if (!chatCRO) { + console.error("Chat CRO not initialized"); + alert("Please create or join a chat room first"); + return; + } + console.log("Sending message: ", `(${timestamp}, ${message}, ${node.networkNode.peerId})`); + chatCRO.addMessage(timestamp, message, node.networkNode.peerId); + + // topology.updateObject(node, chatCRO, `addMessage(${timestamp}, ${message}, ${node.networkNode.peerId})`); + render(); } async function main() { - await node.start(); + await node.start(); + render(); + + node.addCustomGroupMessageHandler(chatCRO.cro.id, (e) => { + handleChatMessages(chatCRO, e); + peers = node.networkNode.getAllPeers(); + discoveryPeers = node.networkNode.getGroupPeers("topology::discovery"); + if (chatCRO) objectPeers = node.networkNode.getGroupPeers(chatCRO.cro.id); render(); + }); - node.addCustomGroupMessageHandler((e) => { - handleChatMessages(chatCRO, e); - peers = node.networkNode.getAllPeers(); - discoveryPeers = node.networkNode.getGroupPeers("topology::discovery"); - if(chatCRO) objectPeers = node.networkNode.getGroupPeers(chatCRO.getObjectId()); - render(); - }); - - let button_create = document.getElementById("createRoom"); - button_create.addEventListener("click", () => { - chatCRO = new Chat(node.networkNode.peerId); - node.createObject(chatCRO); - (document.getElementById("chatId")).innerHTML = chatCRO.getObjectId(); - render(); - }); - - let button_connect = document.getElementById("joinRoom"); - button_connect.addEventListener("click", async () => { - let input: HTMLInputElement = document.getElementById("roomInput"); - let objectId = input.value; - if(!objectId){ - alert("Please enter a room id"); - return; - } - await node.subscribeObject(objectId, true); - }); - - let button_fetch = document.getElementById("fetchMessages"); - button_fetch.addEventListener("click", async () => { - let input: HTMLInputElement = document.getElementById("roomInput"); - let objectId = input.value; - try { - - let object: any = node.getObject(objectId); - console.log("Object received: ", object); - - let arr: string[] = Array.from(object["chat"]["_set"]); - object["chat"]["_set"] = new Set(arr); - object["chat"] = Object.assign(new GSet(new Set()), object["chat"]); - chatCRO = Object.assign(new Chat(node.networkNode.peerId), object); - - (document.getElementById("chatId")).innerHTML = chatCRO.getObjectId(); - render(); - } catch (e) { - console.error("Error while connecting to the CRO ", objectId, e); - } - }); - - let button_send = document.getElementById("sendMessage"); - button_send.addEventListener("click", async () => { - let input: HTMLInputElement = document.getElementById("messageInput"); - let message: string = input.value; - input.value = ""; - if(!message){ - console.error("Tried sending an empty message"); - alert("Please enter a message"); - return; - } - await sendMessage(message); - const element_chat = document.getElementById("chat"); - element_chat.scrollTop = element_chat.scrollHeight; - }); + let button_create = document.getElementById("createRoom"); + button_create.addEventListener("click", () => { + chatCRO = new Chat(node.networkNode.peerId); + topology.createObject(node, chatCRO); + (document.getElementById("chatId")).innerHTML = chatCRO.cro.id; + render(); + }); + + let button_connect = document.getElementById("joinRoom"); + button_connect.addEventListener("click", async () => { + let input: HTMLInputElement = document.getElementById("roomInput"); + let objectId = input.value; + if (!objectId) { + alert("Please enter a room id"); + return; + } + await topology.subscribeObject(node, objectId, true); + }); + + let button_fetch = document.getElementById("fetchMessages"); + button_fetch.addEventListener("click", async () => { + let input: HTMLInputElement = document.getElementById("roomInput"); + let objectId = input.value; + try { + + let object: any = node.objectStore.get(objectId); + console.log("Object received: ", object); + + let arr: string[] = Array.from(object["chat"]["_set"]); + object["chat"]["_set"] = new Set(arr); + object["chat"] = Object.assign(new GSet(new Set()), object["chat"]); + chatCRO = Object.assign(new Chat(node.networkNode.peerId), object); + + (document.getElementById("chatId")).innerHTML = chatCRO.cro.id; + render(); + } catch (e) { + console.error("Error while connecting to the CRO ", objectId, e); + } + }); + + let button_send = document.getElementById("sendMessage"); + button_send.addEventListener("click", async () => { + let input: HTMLInputElement = document.getElementById("messageInput"); + let message: string = input.value; + input.value = ""; + if (!message) { + console.error("Tried sending an empty message"); + alert("Please enter a message"); + return; + } + await sendMessage(message); + const element_chat = document.getElementById("chat"); + element_chat.scrollTop = element_chat.scrollHeight; + }); } -main(); \ No newline at end of file +main(); diff --git a/examples/chat/src/objects/chat.ts b/examples/chat/src/objects/chat.ts index d8333df7..d8b9612a 100644 --- a/examples/chat/src/objects/chat.ts +++ b/examples/chat/src/objects/chat.ts @@ -1,32 +1,35 @@ -import { TopologyObject } from "@topology-foundation/object"; +import { newTopologyObject, TopologyObject } from "@topology-foundation/object"; import { GSet } from "@topology-foundation/crdt"; -export interface IChat extends TopologyObject { - chat: GSet; - addMessage(timestamp: string, message: string, node_id: string): void; - getMessages(): GSet; - merge(other: Chat): void; +export interface IChat { + cro: TopologyObject; + chat: GSet; + addMessage(timestamp: string, message: string, node_id: string): void; + getMessages(): GSet; + merge(other: Chat): void; } -export class Chat extends TopologyObject implements IChat { - // store messages as strings in the format (timestamp, message, peerId) - chat: GSet; +export class Chat implements IChat { + // TODO: Change this to build a TopologyObject with the + // wasm compilation inside and just use the topology object + cro: TopologyObject; + // store messages as strings in the format (timestamp, message, peerId) + chat: GSet; - constructor(peerId: string) { - super(peerId); - this.chat = new GSet(new Set()); - } + constructor(peerId: string) { + this.cro = newTopologyObject(peerId); + this.chat = new GSet(new Set()); + } - addMessage(timestamp: string, message: string, node_id: string): void { - this.chat.add(`(${timestamp}, ${message}, ${node_id})`); - } + addMessage(timestamp: string, message: string, node_id: string): void { + this.chat.add(`(${timestamp}, ${message}, ${node_id})`); + } - getMessages(): GSet { - return this.chat; - } - - merge(other: Chat): void { - this.chat.merge(other.chat); - } + getMessages(): GSet { + return this.chat; + } + merge(other: Chat): void { + this.chat.merge(other.chat); + } } diff --git a/yarn.lock b/yarn.lock index e80b833f..7bc289a0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1121,41 +1121,6 @@ resolved "https://registry.yarnpkg.com/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz#db4ecfd499a9765ab24002c3b696d02e6d32a12c" integrity sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA== -"@topology-foundation/crdt@file:packages/crdt": - version "0.0.22" - -"@topology-foundation/network@file:packages/network": - version "0.0.22" - dependencies: - "@chainsafe/libp2p-gossipsub" "^13.1.0" - "@chainsafe/libp2p-noise" "^15.1.0" - "@chainsafe/libp2p-yamux" "^6.0.2" - "@libp2p/autonat" "^1.0.0" - "@libp2p/bootstrap" "^10.1.3" - "@libp2p/circuit-relay-v2" "^1.1.2" - "@libp2p/dcutr" "^1.1.0" - "@libp2p/identify" "^2.1.2" - "@libp2p/interface-pubsub" "^4.0.1" - "@libp2p/mdns" "^10.1.3" - "@libp2p/pubsub-peer-discovery" "^10.0.2" - "@libp2p/webrtc" "^4.1.3" - "@libp2p/websockets" "^8.1.2" - "@libp2p/webtransport" "^4.1.2" - "@multiformats/multiaddr" "^12.3.0" - it-pipe "^3.0.1" - libp2p "^1.8.2" - -"@topology-foundation/node@file:packages/node": - version "0.0.22" - dependencies: - "@topology-foundation/crdt" "0.0.22" - "@topology-foundation/network" "0.0.22" - "@topology-foundation/object" "0.0.22" - commander "^12.1.0" - -"@topology-foundation/object@file:packages/object": - version "0.0.22" - "@tsconfig/node10@^1.0.7": version "1.0.11" resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.11.tgz#6ee46400685f130e278128c7b38b7e031ff5b2f2"