From a0f4866c17b75110f61c769e258a97aea05da942 Mon Sep 17 00:00:00 2001 From: folex <0xdxdy@gmail.com> Date: Mon, 2 Aug 2021 20:24:24 +0300 Subject: [PATCH 1/6] deduplicate neighbourhood on the client --- aqua/app.aqua | 37 ++-- package-lock.json | 333 ++++++++++++++++++++++++++++++++- package.json | 4 +- src/_aqua/app.js | 468 +++++++++++++++++++++++++++++++--------------- src/index.js | 109 ++++++----- 5 files changed, 734 insertions(+), 217 deletions(-) diff --git a/aqua/app.aqua b/aqua/app.aqua index 896f810..5ca5f6a 100644 --- a/aqua/app.aqua +++ b/aqua/app.aqua @@ -18,23 +18,36 @@ func askAllAndSend(peer: PeerId, collectPeerInfo: PeerInfoCb, collectServiceInte collectPeerInfo(peer, ident, services, blueprints, modules) collectServiceInterfaces(peer, services, collectServiceInterface) +service MyOp("op"): + identity(u: u32) -> u32 -func findAndAskNeighboursSchema(relayPeerId: PeerId, clientId: PeerId, collectPeerInfo: PeerInfoCb, collectServiceInterface: ServiceInterfaceCb): - on relayPeerId: - neighbors <- Kademlia.neighborhood(clientId, false) +func getServicesFromPeers( + peers: []PeerId, + collectPeerInfo: PeerInfoCb, + collectServiceInterface: ServiceInterfaceCb +): + for peer <- peers par: + askAllAndSend(peer, collectPeerInfo, collectServiceInterface) + +func discoverNeighbourhood(relay: PeerId, collectNeighbors: []string -> ()): + on relay: + neighbors <- Kademlia.neighborhood(%init_peer_id%, nil, nil) + co collectNeighbors(neighbors) for n <- neighbors par: on n: - neighbors2 <- Kademlia.neighborhood(clientId, false) - for n2 <- neighbors2 par: - askAllAndSend(n2, collectPeerInfo, collectServiceInterface) + neighbors2 <- Kademlia.neighborhood(%init_peer_id%, nil, nil) + collectNeighbors(neighbors2) -func getAll(relayPeerId: PeerId, knownPeers: []PeerId, collectPeerInfo: PeerInfoCb, collectServiceInterface: ServiceInterfaceCb): - -- co askAllAndSend(relayPeerId, collectPeerInfo, collectServiceInterface) +func getAll( + relay: PeerId, + knownPeers: []PeerId, + collectPeerInfo: PeerInfoCb, + collectServiceInterface: ServiceInterfaceCb, + collectNeighbors: []string -> () +): + co askAllAndSend(relay, collectPeerInfo, collectServiceInterface) - -- in order to temporarily reduce the number of particles sent to client - -- we gather data from the known peers only. - -- Known peers are explicitly represent the whole network atm for peer <- knownPeers par: askAllAndSend(peer, collectPeerInfo, collectServiceInterface) - -- co findAndAskNeighboursSchema(relayPeerId, %init_peer_id%, collectPeerInfo, collectServiceInterface) + co discoverNeighbourhood(relay, collectNeighbors) diff --git a/package-lock.json b/package-lock.json index 7cc303d..b9c7415 100644 --- a/package-lock.json +++ b/package-lock.json @@ -998,15 +998,15 @@ } }, "@fluencelabs/aqua-cli": { - "version": "0.1.8-161", - "resolved": "https://registry.npmjs.org/@fluencelabs/aqua-cli/-/aqua-cli-0.1.8-161.tgz", - "integrity": "sha512-uuzwmKLOB1HgfTOPRSWkpr8ZePRffG0utYxydz73mssDAEDOZcQXxso0X4mWMiQvBBCao4BTtRk3YFCQNmISEQ==", + "version": "0.1.9-165", + "resolved": "https://registry.npmjs.org/@fluencelabs/aqua-cli/-/aqua-cli-0.1.9-165.tgz", + "integrity": "sha512-DBcPRxzJiQCdnur2wVgX47CRccTSoXhDPwURh8IW8RuP0vI+F8MWRcqdxT9DDDMe396e9je3f7g2bT8gfif1SQ==", "dev": true }, "@fluencelabs/aqua-lib": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/@fluencelabs/aqua-lib/-/aqua-lib-0.1.6.tgz", - "integrity": "sha512-SMl6eFvI/6DIMu5RsLk5Uy3HIvy/CIkvbIhSYAba/UMVMc/Yszm6L6FvNXp5R/wogRXtFdZ3WCF7NVPgyiYmRA==", + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/@fluencelabs/aqua-lib/-/aqua-lib-0.1.13.tgz", + "integrity": "sha512-SeNEtuwb/I4/FF4D2wvibyYT1g8fmrBsgiT3xcQCzxuESxeamFd2VLlzD5rLDoVfWdpEnytr22jsmL9DDiLMPQ==", "dev": true }, "@fluencelabs/avm": { @@ -2846,6 +2846,12 @@ } } }, + "charenc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", + "integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=", + "dev": true + }, "check-error": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", @@ -3772,6 +3778,12 @@ "sha.js": "^2.4.8" } }, + "crocks": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/crocks/-/crocks-0.12.1.tgz", + "integrity": "sha512-2qCRJwBmPlRQXzd50k9gt9PaItultOP8lj/cKSH2Eai9aeBuNqAnDuyolAm9TGn6Pw/4BgbxtPJLU1S+tQ4WMQ==", + "dev": true + }, "cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -3782,6 +3794,12 @@ "which": "^2.0.1" } }, + "crypt": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", + "integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs=", + "dev": true + }, "crypto-browserify": { "version": "3.12.0", "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", @@ -4925,6 +4943,258 @@ "elm-hot": "^1.1.5" } }, + "elm-live": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/elm-live/-/elm-live-4.0.2.tgz", + "integrity": "sha512-4I3UvJxF6MubC14VsgtV11B0zBxaaKtdKKsWquoaa5a3UHBIGW83qgTnt/NxOj4omOLfupaftmDaE4yRMTgTcw==", + "dev": true, + "requires": { + "chalk": "^1.1.1", + "chokidar": "3.0.2", + "commander": "2.17.1", + "crocks": "0.12.1", + "cross-spawn": "5.0.1", + "elm-hot": "1.1.4", + "finalhandler": "1.1.2", + "http-proxy": "1.17.0", + "internal-ip": "4.3.0", + "mime": "2.4.3", + "open": "6.4.0", + "pem": "1.14.2", + "serve-static": "1.14.1", + "ws": "7.1.1" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "chokidar": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.0.2.tgz", + "integrity": "sha512-c4PR2egjNjI1um6bamCQ6bUNPDiyofNQruHvKgHQ4gDUP/ITSVSzNsiI5OWtHOsX323i5ha/kk4YmOZ1Ktg7KA==", + "dev": true, + "requires": { + "anymatch": "^3.0.1", + "braces": "^3.0.2", + "fsevents": "^2.0.6", + "glob-parent": "^5.0.0", + "is-binary-path": "^2.1.0", + "is-glob": "^4.0.1", + "normalize-path": "^3.0.0", + "readdirp": "^3.1.1" + } + }, + "commander": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", + "dev": true + }, + "cross-spawn": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.0.1.tgz", + "integrity": "sha1-o7uzAtsil8vqPATt82lB9GE6o5k=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "elm-hot": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/elm-hot/-/elm-hot-1.1.4.tgz", + "integrity": "sha512-qPDP/o/Fkifriaxaf3E7hHFB5L6Ijihyg8is4A6xna6/h/zebUiNssbQrxywI2oxNUkr6W/leEu/WlIC1tmVnw==", + "dev": true + }, + "eventemitter3": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", + "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==", + "dev": true + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "http-proxy": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.17.0.tgz", + "integrity": "sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g==", + "dev": true, + "requires": { + "eventemitter3": "^3.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "mime": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.3.tgz", + "integrity": "sha512-QgrPRJfE+riq5TPZMcHZOtm8c6K/yYrMbKIoRfapfiGLxS8OTeIfRhUGW5LU7MlRa52KOAGCfUNruqLrIBvWZw==", + "dev": true + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "ws": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.1.1.tgz", + "integrity": "sha512-o41D/WmDeca0BqYhsr3nJzQyg9NF5X8l/UdnFNux9cS3lwB+swm8qGWX5rn+aD6xfBU3rGmtHij7g7x6LxFU3A==", + "dev": true, + "requires": { + "async-limiter": "^1.0.0" + } + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + } + } + }, "elm-test": { "version": "0.19.1-revision4", "resolved": "https://registry.npmjs.org/elm-test/-/elm-test-0.19.1-revision4.tgz", @@ -8797,6 +9067,25 @@ "object-visit": "^1.0.0" } }, + "md5": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", + "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", + "dev": true, + "requires": { + "charenc": "0.0.2", + "crypt": "0.0.2", + "is-buffer": "~1.1.6" + }, + "dependencies": { + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + } + } + }, "md5.js": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", @@ -10206,6 +10495,15 @@ "mimic-fn": "^2.1.0" } }, + "open": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz", + "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==", + "dev": true, + "requires": { + "is-wsl": "^1.1.0" + } + }, "opn": { "version": "5.4.0", "resolved": "https://registry.npmjs.org/opn/-/opn-5.4.0.tgz", @@ -10657,6 +10955,29 @@ } } }, + "pem": { + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/pem/-/pem-1.14.2.tgz", + "integrity": "sha512-TOnPtq3ZFnCniOZ+rka4pk8UIze9xG1qI+wNE7EmkiR/cg+53uVvk5QbkWZ7M6RsuOxzz62FW1hlAobJr/lTOA==", + "dev": true, + "requires": { + "es6-promisify": "^6.0.0", + "md5": "^2.2.1", + "os-tmpdir": "^1.0.1", + "which": "^1.3.1" + }, + "dependencies": { + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, "pem-jwk": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/pem-jwk/-/pem-jwk-2.0.0.tgz", diff --git a/package.json b/package.json index f4e2936..3731d14 100644 --- a/package.json +++ b/package.json @@ -38,10 +38,10 @@ "yup": "^0.32.9" }, "devDependencies": { + "@fluencelabs/aqua-cli": "0.1.9-165", + "@fluencelabs/aqua-lib": "0.1.13", "@babel/core": "^7.11.6", "@babel/preset-env": "^7.11.5", - "@fluencelabs/aqua-cli": "^0.1.8-161", - "@fluencelabs/aqua-lib": "0.1.6", "@types/yup": "^0.29.11", "babel-loader": "^8.1.0", "chokidar-cli": "^2.1.0", diff --git a/src/_aqua/app.js b/src/_aqua/app.js index 2b2a1c2..c0e8c7e 100644 --- a/src/_aqua/app.js +++ b/src/_aqua/app.js @@ -3,86 +3,13 @@ * This file is auto-generated. Do not edit manually: changes may be erased. * Generated by Aqua compiler: https://github.com/fluencelabs/aqua/. * If you find any bugs, please write an issue on GitHub: https://github.com/fluencelabs/aqua/issues - * Aqua version: 0.1.8-161 + * Aqua version: 0.1.9-165 * */ import { RequestFlowBuilder } from '@fluencelabs/fluence/dist/api.unstable'; -export async function collectServiceInterfaces(client, peer, services, collectServiceInterface, config) { - let request; - config = config || {}; - const promise = new Promise((resolve, reject) => { - var r = new RequestFlowBuilder() - .disableInjections() - .withRawScript( - ` -(xor - (seq - (seq - (seq - (call %init_peer_id% ("getDataSrv" "-relay-") [] -relay-) - (call %init_peer_id% ("getDataSrv" "peer") [] peer) - ) - (call %init_peer_id% ("getDataSrv" "services") [] services) - ) - (fold services srv - (par - (seq - (call -relay- ("op" "noop") []) - (xor - (seq - (seq - (call peer ("srv" "get_interface") [srv.$.id!] iface) - (call -relay- ("op" "noop") []) - ) - (xor - (call %init_peer_id% ("callbackSrv" "collectServiceInterface") [peer srv.$.id! iface]) - (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 1]) - ) - ) - (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 2]) - ) - ) - (next srv) - ) - ) - ) - (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 3]) -) - - `, - ) - .configHandler((h) => { - h.on('getDataSrv', '-relay-', () => { - return client.relayPeerId; - }); - h.on('getDataSrv', 'peer', () => {return peer;}); -h.on('getDataSrv', 'services', () => {return services;}); -h.on('callbackSrv', 'collectServiceInterface', (args) => {collectServiceInterface(args[0], args[1], args[2]); return {};}); - - h.onEvent('errorHandlingSrv', 'error', (args) => { - // assuming error is the single argument - const [err] = args; - reject(err); - }); - }) - .handleScriptError(reject) - .handleTimeout(() => { - reject('Request timed out for collectServiceInterfaces'); - }) - if(config.ttl) { - r.withTTL(config.ttl) - } - request = r.build(); - }); - await client.initiateFlow(request); - return Promise.race([promise, Promise.resolve()]); -} - - - export async function askAllAndSend(client, peer, collectPeerInfo, collectServiceInterface, config) { let request; config = config || {}; @@ -186,7 +113,7 @@ h.on('callbackSrv', 'collectServiceInterface', (args) => {collectServiceInterfac -export async function findAndAskNeighboursSchema(client, relayPeerId, clientId, collectPeerInfo, collectServiceInterface, config) { +export async function getAll(client, relay, knownPeers, collectPeerInfo, collectServiceInterface, collectNeighbors, config) { let request; config = config || {}; const promise = new Promise((resolve, reject) => { @@ -199,94 +126,174 @@ export async function findAndAskNeighboursSchema(client, relayPeerId, clientId, (seq (seq (seq - (call %init_peer_id% ("getDataSrv" "-relay-") [] -relay-) - (call %init_peer_id% ("getDataSrv" "relayPeerId") [] relayPeerId) + (seq + (call %init_peer_id% ("getDataSrv" "-relay-") [] -relay-) + (call %init_peer_id% ("getDataSrv" "relay") [] relay) + ) + (call %init_peer_id% ("getDataSrv" "knownPeers") [] knownPeers) ) - (call %init_peer_id% ("getDataSrv" "clientId") [] clientId) - ) - (call -relay- ("op" "noop") []) - ) - (xor - (seq - (call relayPeerId ("kad" "neighborhood") [clientId false] neighbors) - (fold neighbors n - (par + (par + (seq + (call -relay- ("op" "noop") []) (xor (seq - (call n ("kad" "neighborhood") [clientId false] neighbors2) - (fold neighbors2 n2 - (par - (xor + (seq + (seq + (seq (seq (seq (seq - (seq - (seq - (seq - (seq - (call n2 ("peer" "identify") [] ident) - (call n2 ("dist" "list_blueprints") [] blueprints) - ) - (call n2 ("dist" "list_modules") [] modules) - ) - (call n2 ("srv" "list") [] services) - ) - (call -relay- ("op" "noop") []) - ) - (xor - (call %init_peer_id% ("callbackSrv" "collectPeerInfo") [n2 ident services blueprints modules]) - (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 1]) - ) + (call relay ("peer" "identify") [] ident) + (call relay ("dist" "list_blueprints") [] blueprints) ) - (call -relay- ("op" "noop") []) + (call relay ("dist" "list_modules") [] modules) ) - (fold services srv - (par - (seq - (call -relay- ("op" "noop") []) - (xor - (seq - (seq - (call n2 ("srv" "get_interface") [srv.$.id!] iface) - (call -relay- ("op" "noop") []) - ) - (xor - (call %init_peer_id% ("callbackSrv" "collectServiceInterface") [n2 srv.$.id! iface]) - (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 2]) - ) - ) - (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 3]) - ) - ) - (seq - (call -relay- ("op" "noop") []) - (next srv) - ) + (call relay ("srv" "list") [] services) + ) + (call -relay- ("op" "noop") []) + ) + (xor + (call %init_peer_id% ("callbackSrv" "collectPeerInfo") [relay ident services blueprints modules]) + (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 1]) + ) + ) + (call -relay- ("op" "noop") []) + ) + (fold services srv + (par + (seq + (call -relay- ("op" "noop") []) + (xor + (seq + (seq + (call relay ("srv" "get_interface") [srv.$.id!] iface) + (call -relay- ("op" "noop") []) + ) + (xor + (call %init_peer_id% ("callbackSrv" "collectServiceInterface") [relay srv.$.id! iface]) + (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 2]) ) ) + (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 3]) ) + ) + (seq + (call -relay- ("op" "noop") []) + (next srv) + ) + ) + ) + ) + (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 4]) + ) + ) + (null) + ) + ) + (fold knownPeers peer + (par + (seq + (call -relay- ("op" "noop") []) + (xor + (seq + (seq + (seq + (seq (seq - (call -relay- ("op" "noop") []) - (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 4]) + (seq + (seq + (call peer ("peer" "identify") [] ident0) + (call peer ("dist" "list_blueprints") [] blueprints0) + ) + (call peer ("dist" "list_modules") [] modules0) + ) + (call peer ("srv" "list") [] services0) + ) + (call -relay- ("op" "noop") []) + ) + (xor + (call %init_peer_id% ("callbackSrv" "collectPeerInfo") [peer ident0 services0 blueprints0 modules0]) + (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 5]) + ) + ) + (call -relay- ("op" "noop") []) + ) + (fold services0 srv0 + (par + (seq + (call -relay- ("op" "noop") []) + (xor + (seq + (seq + (call peer ("srv" "get_interface") [srv0.$.id!] iface0) + (call -relay- ("op" "noop") []) + ) + (xor + (call %init_peer_id% ("callbackSrv" "collectServiceInterface") [peer srv0.$.id! iface0]) + (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 6]) + ) + ) + (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 7]) ) ) - (next n2) + (seq + (call -relay- ("op" "noop") []) + (next srv0) + ) ) ) ) - (seq - (call -relay- ("op" "noop") []) - (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 5]) + (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 8]) + ) + ) + (next peer) + ) + ) + ) + (par + (seq + (call -relay- ("op" "noop") []) + (xor + (seq + (seq + (call relay ("kad" "neighborhood") [%init_peer_id% $nil $nil] neighbors) + (par + (seq + (call -relay- ("op" "noop") []) + (xor + (call %init_peer_id% ("callbackSrv" "collectNeighbors") [neighbors]) + (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 9]) + ) + ) + (null) + ) + ) + (fold neighbors n + (par + (xor + (seq + (seq + (call n ("kad" "neighborhood") [%init_peer_id% $nil $nil] neighbors2) + (call -relay- ("op" "noop") []) + ) + (xor + (call %init_peer_id% ("callbackSrv" "collectNeighbors") [neighbors2]) + (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 10]) + ) + ) + (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 11]) + ) + (next n) ) ) - (next n) ) + (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 12]) ) ) - (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 6]) + (null) ) ) - (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 7]) + (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 13]) ) `, @@ -295,10 +302,11 @@ export async function findAndAskNeighboursSchema(client, relayPeerId, clientId, h.on('getDataSrv', '-relay-', () => { return client.relayPeerId; }); - h.on('getDataSrv', 'relayPeerId', () => {return relayPeerId;}); -h.on('getDataSrv', 'clientId', () => {return clientId;}); + h.on('getDataSrv', 'relay', () => {return relay;}); +h.on('getDataSrv', 'knownPeers', () => {return knownPeers;}); h.on('callbackSrv', 'collectPeerInfo', (args) => {collectPeerInfo(args[0], args[1], args[2], args[3], args[4]); return {};}); h.on('callbackSrv', 'collectServiceInterface', (args) => {collectServiceInterface(args[0], args[1], args[2]); return {};}); +h.on('callbackSrv', 'collectNeighbors', (args) => {collectNeighbors(args[0]); return {};}); h.onEvent('errorHandlingSrv', 'error', (args) => { // assuming error is the single argument @@ -308,7 +316,7 @@ h.on('callbackSrv', 'collectServiceInterface', (args) => {collectServiceInterfac }) .handleScriptError(reject) .handleTimeout(() => { - reject('Request timed out for findAndAskNeighboursSchema'); + reject('Request timed out for getAll'); }) if(config.ttl) { r.withTTL(config.ttl) @@ -321,7 +329,7 @@ h.on('callbackSrv', 'collectServiceInterface', (args) => {collectServiceInterfac -export async function getAll(client, relayPeerId, knownPeers, collectPeerInfo, collectServiceInterface, config) { +export async function getServicesFromPeers(client, peers, collectPeerInfo, collectServiceInterface, config) { let request; config = config || {}; const promise = new Promise((resolve, reject) => { @@ -332,13 +340,10 @@ export async function getAll(client, relayPeerId, knownPeers, collectPeerInfo, c (xor (seq (seq - (seq - (call %init_peer_id% ("getDataSrv" "-relay-") [] -relay-) - (call %init_peer_id% ("getDataSrv" "relayPeerId") [] relayPeerId) - ) - (call %init_peer_id% ("getDataSrv" "knownPeers") [] knownPeers) + (call %init_peer_id% ("getDataSrv" "-relay-") [] -relay-) + (call %init_peer_id% ("getDataSrv" "peers") [] peers) ) - (fold knownPeers peer + (fold peers peer (par (seq (call -relay- ("op" "noop") []) @@ -407,8 +412,7 @@ export async function getAll(client, relayPeerId, knownPeers, collectPeerInfo, c h.on('getDataSrv', '-relay-', () => { return client.relayPeerId; }); - h.on('getDataSrv', 'relayPeerId', () => {return relayPeerId;}); -h.on('getDataSrv', 'knownPeers', () => {return knownPeers;}); + h.on('getDataSrv', 'peers', () => {return peers;}); h.on('callbackSrv', 'collectPeerInfo', (args) => {collectPeerInfo(args[0], args[1], args[2], args[3], args[4]); return {};}); h.on('callbackSrv', 'collectServiceInterface', (args) => {collectServiceInterface(args[0], args[1], args[2]); return {};}); @@ -420,7 +424,167 @@ h.on('callbackSrv', 'collectServiceInterface', (args) => {collectServiceInterfac }) .handleScriptError(reject) .handleTimeout(() => { - reject('Request timed out for getAll'); + reject('Request timed out for getServicesFromPeers'); + }) + if(config.ttl) { + r.withTTL(config.ttl) + } + request = r.build(); + }); + await client.initiateFlow(request); + return Promise.race([promise, Promise.resolve()]); +} + + + +export async function discoverNeighbourhood(client, relay, collectNeighbors, config) { + let request; + config = config || {}; + const promise = new Promise((resolve, reject) => { + var r = new RequestFlowBuilder() + .disableInjections() + .withRawScript( + ` +(xor + (seq + (seq + (seq + (call %init_peer_id% ("getDataSrv" "-relay-") [] -relay-) + (call %init_peer_id% ("getDataSrv" "relay") [] relay) + ) + (call -relay- ("op" "noop") []) + ) + (xor + (seq + (seq + (call relay ("kad" "neighborhood") [%init_peer_id% $nil $nil] neighbors) + (par + (seq + (call -relay- ("op" "noop") []) + (xor + (call %init_peer_id% ("callbackSrv" "collectNeighbors") [neighbors]) + (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 1]) + ) + ) + (null) + ) + ) + (fold neighbors n + (par + (xor + (seq + (seq + (call n ("kad" "neighborhood") [%init_peer_id% $nil $nil] neighbors2) + (call -relay- ("op" "noop") []) + ) + (xor + (call %init_peer_id% ("callbackSrv" "collectNeighbors") [neighbors2]) + (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 2]) + ) + ) + (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 3]) + ) + (next n) + ) + ) + ) + (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 4]) + ) + ) + (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 5]) +) + + `, + ) + .configHandler((h) => { + h.on('getDataSrv', '-relay-', () => { + return client.relayPeerId; + }); + h.on('getDataSrv', 'relay', () => {return relay;}); +h.on('callbackSrv', 'collectNeighbors', (args) => {collectNeighbors(args[0]); return {};}); + + h.onEvent('errorHandlingSrv', 'error', (args) => { + // assuming error is the single argument + const [err] = args; + reject(err); + }); + }) + .handleScriptError(reject) + .handleTimeout(() => { + reject('Request timed out for discoverNeighbourhood'); + }) + if(config.ttl) { + r.withTTL(config.ttl) + } + request = r.build(); + }); + await client.initiateFlow(request); + return Promise.race([promise, Promise.resolve()]); +} + + + +export async function collectServiceInterfaces(client, peer, services, collectServiceInterface, config) { + let request; + config = config || {}; + const promise = new Promise((resolve, reject) => { + var r = new RequestFlowBuilder() + .disableInjections() + .withRawScript( + ` +(xor + (seq + (seq + (seq + (call %init_peer_id% ("getDataSrv" "-relay-") [] -relay-) + (call %init_peer_id% ("getDataSrv" "peer") [] peer) + ) + (call %init_peer_id% ("getDataSrv" "services") [] services) + ) + (fold services srv + (par + (seq + (call -relay- ("op" "noop") []) + (xor + (seq + (seq + (call peer ("srv" "get_interface") [srv.$.id!] iface) + (call -relay- ("op" "noop") []) + ) + (xor + (call %init_peer_id% ("callbackSrv" "collectServiceInterface") [peer srv.$.id! iface]) + (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 1]) + ) + ) + (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 2]) + ) + ) + (next srv) + ) + ) + ) + (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 3]) +) + + `, + ) + .configHandler((h) => { + h.on('getDataSrv', '-relay-', () => { + return client.relayPeerId; + }); + h.on('getDataSrv', 'peer', () => {return peer;}); +h.on('getDataSrv', 'services', () => {return services;}); +h.on('callbackSrv', 'collectServiceInterface', (args) => {collectServiceInterface(args[0], args[1], args[2]); return {};}); + + h.onEvent('errorHandlingSrv', 'error', (args) => { + // assuming error is the single argument + const [err] = args; + reject(err); + }); + }) + .handleScriptError(reject) + .handleTimeout(() => { + reject('Request timed out for collectServiceInterfaces'); }) if(config.ttl) { r.withTTL(config.ttl) diff --git a/src/index.js b/src/index.js index 61ceb49..6c9fabc 100644 --- a/src/index.js +++ b/src/index.js @@ -20,7 +20,7 @@ import './main.css'; // eslint-disable-next-line import/no-extraneous-dependencies import log from 'loglevel'; import Multiaddr from 'multiaddr'; -import { dev, krasnodar } from '@fluencelabs/fluence-network-environment'; +import { dev, krasnodar, Node } from '@fluencelabs/fluence-network-environment'; import { createClient, generatePeerId, @@ -32,16 +32,25 @@ import { import { Elm } from './Main.elm'; import * as serviceWorker from './serviceWorker'; import { interfaceInfo, peerInfo } from './types'; -import { getAll } from './_aqua/app'; +import { getAll, getServicesFromPeers } from './_aqua/app'; const defaultNetworkName = 'krasnodar'; +const localEnv = [ + { + multiaddr: '/ip4/127.0.0.1/tcp/9999/ws/p2p/12D3KooWMvFBVukxFe7dGLNBPA1kL8VdWBx7AESKPCg7KgDpCSoU', + peerId: '12D3KooWMvFBVukxFe7dGLNBPA1kL8VdWBx7AESKPCg7KgDpCSoU', + }, +]; + const defaultEnv = { - relays: krasnodar, - relayIdx: 3, + relays: localEnv, + relayIdx: 0, logLevel: 'error', }; +var knownPeersSet = new Set(); + async function loadScript(script) { return new Promise((resolve, reject) => { var xhr = new XMLHttpRequest(); @@ -133,45 +142,9 @@ function genFlags(peerId, relays, relayIdx) { flags: flags, }); - subscribeToEvent(client, 'event', 'collectPeerInfo', (args, _tetraplets) => { - try { - const peerId = args[0]; - const identify = args[1]; - const services = args[2]; - const blueprints = args[3]; - const modules = args[4]; - const interfaces = args[5]; - const eventRaw = { - peerId, - identify, - services, - blueprints, - modules, - }; - - app.ports.collectPeerInfo.send(eventRaw); - } catch (err) { - log.error('Elm eventreceiver failed: ', err); - } - }); - - subscribeToEvent(client, 'event', 'collectServiceInterface', (args, _tetraplets) => { - try { - const eventRaw = { - peer_id: args[0], - service_id: args[1], - interface: args[2], - }; - - app.ports.collectServiceInterface.send(eventRaw); - } catch (err) { - log.error('Elm eventreceiver failed: ', err); - } - }); - // alias ServiceInterfaceCb: PeerId, string, Interface -> () function collectServiceInterface(peer_id, service_id, iface) { - // console.count(`service interface from ${peer_id}`); + console.count(`service interface from ${peer_id}`); try { const eventRaw = { peer_id, @@ -187,7 +160,7 @@ function genFlags(peerId, relays, relayIdx) { // alias PeerInfoCb: PeerId, Info, []Service, []Blueprint, []Module -> () function collectPeerInfo(peerId, identify, services, blueprints, modules, interfaces) { - // console.log('peer info from %s, %s services', peerId, services.length); + console.log('peer info from %s, %s services', peerId, services.length); try { const eventRaw = { peerId, @@ -203,10 +176,56 @@ function genFlags(peerId, relays, relayIdx) { } } + // Save neighbors to knownPeersSet and return only peers that weren't observed yet + function collectNeighbors(peer_ids) { + try { + let newPeers = removeKnown(peer_ids); + console.dir(getServicesFromPeers); + console.dir(client); + getServicesFromPeers(client, newPeers, collectPeerInfo, collectServiceInterface); + } catch (e) { + console.error('collectNieghbors failed:', e); + } + } + + function removeKnown(peer_ids) { + try { + let set = new Set(); + + for (var peer_id of peer_ids) { + if (!knownPeersSet.has(peer_id)) { + knownPeersSet.add(peer_id); + set.add(peer_id); + } + } + + let result = [...set]; + console.log('removed known peers, got array of', result.length); + return result; + } catch (e) { + console.error('removeKnown failed: ', e); + } + } + app.ports.getAll.subscribe(async (data) => { - await getAll(client, data.relayPeerId, data.knownPeers, collectPeerInfo, collectServiceInterface, { - ttl: 1000000, - }); + console.log('Running getAll'); + + // clear knownPeersSet to ask these peers again + knownPeersSet.clear(); + knownPeersSet.add(...flags.knownPeers); + knownPeersSet.add(flags.relayPeerId); + + await getAll( + client, + data.relayPeerId, + data.knownPeers, + collectPeerInfo, + collectServiceInterface, + collectNeighbors, + { + ttl: 1000000, + }, + ); }); })(); From 253c91493eacc3894fe05d92bd1f0d132237ddb0 Mon Sep 17 00:00:00 2001 From: folex <0xdxdy@gmail.com> Date: Mon, 2 Aug 2021 20:27:54 +0300 Subject: [PATCH 2/6] Add comments --- aqua/app.aqua | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/aqua/app.aqua b/aqua/app.aqua index 5ca5f6a..5f5e659 100644 --- a/aqua/app.aqua +++ b/aqua/app.aqua @@ -3,12 +3,14 @@ import "@fluencelabs/aqua-lib/builtin.aqua" alias PeerInfoCb: PeerId, Info, []Service, []Blueprint, []Module -> () alias ServiceInterfaceCb: PeerId, string, Interface -> () +-- send all found ServiceInterface-s to the client func collectServiceInterfaces(peer: PeerId, services: []Service, collectServiceInterface: ServiceInterfaceCb): for srv <- services par: on peer: iface <- Srv.get_interface(srv.id) collectServiceInterface(peer, srv.id, iface) +-- retrieve PeerInfo & ServiceInterface-s from a single peer func askAllAndSend(peer: PeerId, collectPeerInfo: PeerInfoCb, collectServiceInterface: ServiceInterfaceCb): on peer: ident <- Peer.identify() @@ -18,9 +20,7 @@ func askAllAndSend(peer: PeerId, collectPeerInfo: PeerInfoCb, collectServiceInte collectPeerInfo(peer, ident, services, blueprints, modules) collectServiceInterfaces(peer, services, collectServiceInterface) -service MyOp("op"): - identity(u: u32) -> u32 - +-- retrieve PeerInfo and ServiceInterface-s from each peer in `peers` func getServicesFromPeers( peers: []PeerId, collectPeerInfo: PeerInfoCb, @@ -29,6 +29,7 @@ func getServicesFromPeers( for peer <- peers par: askAllAndSend(peer, collectPeerInfo, collectServiceInterface) +-- discover new nodes in the network and report findings back to client func discoverNeighbourhood(relay: PeerId, collectNeighbors: []string -> ()): on relay: neighbors <- Kademlia.neighborhood(%init_peer_id%, nil, nil) From 58ba6a609f659b4c688eaedda968a19fe1f56f8b Mon Sep 17 00:00:00 2001 From: folex <0xdxdy@gmail.com> Date: Mon, 2 Aug 2021 20:31:43 +0300 Subject: [PATCH 3/6] use krasnodar --- src/index.js | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/src/index.js b/src/index.js index 6c9fabc..5b6e599 100644 --- a/src/index.js +++ b/src/index.js @@ -20,7 +20,7 @@ import './main.css'; // eslint-disable-next-line import/no-extraneous-dependencies import log from 'loglevel'; import Multiaddr from 'multiaddr'; -import { dev, krasnodar, Node } from '@fluencelabs/fluence-network-environment'; +import { dev, krasnodar } from '@fluencelabs/fluence-network-environment'; import { createClient, generatePeerId, @@ -36,15 +36,8 @@ import { getAll, getServicesFromPeers } from './_aqua/app'; const defaultNetworkName = 'krasnodar'; -const localEnv = [ - { - multiaddr: '/ip4/127.0.0.1/tcp/9999/ws/p2p/12D3KooWMvFBVukxFe7dGLNBPA1kL8VdWBx7AESKPCg7KgDpCSoU', - peerId: '12D3KooWMvFBVukxFe7dGLNBPA1kL8VdWBx7AESKPCg7KgDpCSoU', - }, -]; - const defaultEnv = { - relays: localEnv, + relays: krasnodar, relayIdx: 0, logLevel: 'error', }; From 25fe108889ac2e7d562b285b49eacd828dee7594 Mon Sep 17 00:00:00 2001 From: folex <0xdxdy@gmail.com> Date: Mon, 2 Aug 2021 20:51:16 +0300 Subject: [PATCH 4/6] remove a few logs --- src/index.js | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/index.js b/src/index.js index 5b6e599..1272cb0 100644 --- a/src/index.js +++ b/src/index.js @@ -38,7 +38,7 @@ const defaultNetworkName = 'krasnodar'; const defaultEnv = { relays: krasnodar, - relayIdx: 0, + relayIdx: krasnodar.length - 1, logLevel: 'error', }; @@ -137,7 +137,7 @@ function genFlags(peerId, relays, relayIdx) { // alias ServiceInterfaceCb: PeerId, string, Interface -> () function collectServiceInterface(peer_id, service_id, iface) { - console.count(`service interface from ${peer_id}`); + // console.count(`service interface from ${peer_id}`); try { const eventRaw = { peer_id, @@ -173,8 +173,6 @@ function genFlags(peerId, relays, relayIdx) { function collectNeighbors(peer_ids) { try { let newPeers = removeKnown(peer_ids); - console.dir(getServicesFromPeers); - console.dir(client); getServicesFromPeers(client, newPeers, collectPeerInfo, collectServiceInterface); } catch (e) { console.error('collectNieghbors failed:', e); From fb140f666a56d1db45ea29fd19d5d77e2a6ae43f Mon Sep 17 00:00:00 2001 From: folex <0xdxdy@gmail.com> Date: Tue, 3 Aug 2021 14:59:35 +0300 Subject: [PATCH 5/6] Remove getAll --- aqua/app.aqua | 24 ++-- package-lock.json | 6 +- package.json | 2 +- src/_aqua/app.js | 293 ++++++++++------------------------------------ src/index.js | 19 ++- 5 files changed, 84 insertions(+), 260 deletions(-) diff --git a/aqua/app.aqua b/aqua/app.aqua index 5f5e659..e7ff935 100644 --- a/aqua/app.aqua +++ b/aqua/app.aqua @@ -18,7 +18,7 @@ func askAllAndSend(peer: PeerId, collectPeerInfo: PeerInfoCb, collectServiceInte modules <- Dist.list_modules() services <- Srv.list() collectPeerInfo(peer, ident, services, blueprints, modules) - collectServiceInterfaces(peer, services, collectServiceInterface) + -- collectServiceInterfaces(peer, services, collectServiceInterface) -- retrieve PeerInfo and ServiceInterface-s from each peer in `peers` func getServicesFromPeers( @@ -39,16 +39,12 @@ func discoverNeighbourhood(relay: PeerId, collectNeighbors: []string -> ()): neighbors2 <- Kademlia.neighborhood(%init_peer_id%, nil, nil) collectNeighbors(neighbors2) -func getAll( - relay: PeerId, - knownPeers: []PeerId, - collectPeerInfo: PeerInfoCb, - collectServiceInterface: ServiceInterfaceCb, - collectNeighbors: []string -> () -): - co askAllAndSend(relay, collectPeerInfo, collectServiceInterface) - - for peer <- knownPeers par: - askAllAndSend(peer, collectPeerInfo, collectServiceInterface) - - co discoverNeighbourhood(relay, collectNeighbors) +func discoverNeighbourhoodFull(relay: PeerId, knownPeers: []PeerId, collectNeighbors: []string -> ()): + for node <- knownPeers par: + on node via relay: + neighbors <- Kademlia.neighborhood(%init_peer_id%, nil, nil) + co collectNeighbors(neighbors) + for n <- neighbors par: + on n: + neighbors2 <- Kademlia.neighborhood(%init_peer_id%, nil, nil) + collectNeighbors(neighbors2) diff --git a/package-lock.json b/package-lock.json index b9c7415..77f6082 100644 --- a/package-lock.json +++ b/package-lock.json @@ -998,9 +998,9 @@ } }, "@fluencelabs/aqua-cli": { - "version": "0.1.9-165", - "resolved": "https://registry.npmjs.org/@fluencelabs/aqua-cli/-/aqua-cli-0.1.9-165.tgz", - "integrity": "sha512-DBcPRxzJiQCdnur2wVgX47CRccTSoXhDPwURh8IW8RuP0vI+F8MWRcqdxT9DDDMe396e9je3f7g2bT8gfif1SQ==", + "version": "0.1.10-188", + "resolved": "https://registry.npmjs.org/@fluencelabs/aqua-cli/-/aqua-cli-0.1.10-188.tgz", + "integrity": "sha512-3StvE+xevgQVsGwHGpSY+OuXx86N89MxUpguvZfwufRuSLIO++aMmUGUC14GFc7LQelcP86h6pFZ5o7pNYEIVw==", "dev": true }, "@fluencelabs/aqua-lib": { diff --git a/package.json b/package.json index 3731d14..861a4cf 100644 --- a/package.json +++ b/package.json @@ -38,7 +38,7 @@ "yup": "^0.32.9" }, "devDependencies": { - "@fluencelabs/aqua-cli": "0.1.9-165", + "@fluencelabs/aqua-cli": "0.1.10-188", "@fluencelabs/aqua-lib": "0.1.13", "@babel/core": "^7.11.6", "@babel/preset-env": "^7.11.5", diff --git a/src/_aqua/app.js b/src/_aqua/app.js index c0e8c7e..b06a90e 100644 --- a/src/_aqua/app.js +++ b/src/_aqua/app.js @@ -3,7 +3,7 @@ * This file is auto-generated. Do not edit manually: changes may be erased. * Generated by Aqua compiler: https://github.com/fluencelabs/aqua/. * If you find any bugs, please write an issue on GitHub: https://github.com/fluencelabs/aqua/issues - * Aqua version: 0.1.9-165 + * Aqua version: 0.1.10-188 * */ import { RequestFlowBuilder } from '@fluencelabs/fluence/dist/api.unstable'; @@ -33,53 +33,24 @@ export async function askAllAndSend(client, peer, collectPeerInfo, collectServic (seq (seq (seq - (seq - (seq - (call peer ("peer" "identify") [] ident) - (call peer ("dist" "list_blueprints") [] blueprints) - ) - (call peer ("dist" "list_modules") [] modules) - ) - (call peer ("srv" "list") [] services) + (call peer ("peer" "identify") [] ident) + (call peer ("dist" "list_blueprints") [] blueprints) ) - (call -relay- ("op" "noop") []) - ) - (xor - (call %init_peer_id% ("callbackSrv" "collectPeerInfo") [peer ident services blueprints modules]) - (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 1]) + (call peer ("dist" "list_modules") [] modules) ) + (call peer ("srv" "list") [] services) ) (call -relay- ("op" "noop") []) ) - (fold services srv - (par - (seq - (call -relay- ("op" "noop") []) - (xor - (seq - (seq - (call peer ("srv" "get_interface") [srv.$.id!] iface) - (call -relay- ("op" "noop") []) - ) - (xor - (call %init_peer_id% ("callbackSrv" "collectServiceInterface") [peer srv.$.id! iface]) - (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 2]) - ) - ) - (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 3]) - ) - ) - (seq - (call -relay- ("op" "noop") []) - (next srv) - ) - ) + (xor + (call %init_peer_id% ("callbackSrv" "collectPeerInfo") [peer ident services blueprints modules]) + (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 1]) ) ) - (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 4]) + (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 2]) ) ) - (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 5]) + (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 3]) ) `, @@ -113,7 +84,7 @@ h.on('callbackSrv', 'collectServiceInterface', (args) => {collectServiceInterfac -export async function getAll(client, relay, knownPeers, collectPeerInfo, collectServiceInterface, collectNeighbors, config) { +export async function getServicesFromPeers(client, peers, collectPeerInfo, collectServiceInterface, config) { let request; config = config || {}; const promise = new Promise((resolve, reject) => { @@ -124,176 +95,41 @@ export async function getAll(client, relay, knownPeers, collectPeerInfo, collect (xor (seq (seq - (seq + (call %init_peer_id% ("getDataSrv" "-relay-") [] -relay-) + (call %init_peer_id% ("getDataSrv" "peers") [] peers) + ) + (fold peers peer + (par (seq - (seq - (call %init_peer_id% ("getDataSrv" "-relay-") [] -relay-) - (call %init_peer_id% ("getDataSrv" "relay") [] relay) - ) - (call %init_peer_id% ("getDataSrv" "knownPeers") [] knownPeers) - ) - (par - (seq - (call -relay- ("op" "noop") []) - (xor + (call -relay- ("op" "noop") []) + (xor + (seq (seq (seq (seq (seq - (seq - (seq - (seq - (call relay ("peer" "identify") [] ident) - (call relay ("dist" "list_blueprints") [] blueprints) - ) - (call relay ("dist" "list_modules") [] modules) - ) - (call relay ("srv" "list") [] services) - ) - (call -relay- ("op" "noop") []) - ) - (xor - (call %init_peer_id% ("callbackSrv" "collectPeerInfo") [relay ident services blueprints modules]) - (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 1]) + (call peer ("peer" "identify") [] ident) + (call peer ("dist" "list_blueprints") [] blueprints) ) + (call peer ("dist" "list_modules") [] modules) ) - (call -relay- ("op" "noop") []) + (call peer ("srv" "list") [] services) ) - (fold services srv - (par - (seq - (call -relay- ("op" "noop") []) - (xor - (seq - (seq - (call relay ("srv" "get_interface") [srv.$.id!] iface) - (call -relay- ("op" "noop") []) - ) - (xor - (call %init_peer_id% ("callbackSrv" "collectServiceInterface") [relay srv.$.id! iface]) - (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 2]) - ) - ) - (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 3]) - ) - ) - (seq - (call -relay- ("op" "noop") []) - (next srv) - ) - ) - ) - ) - (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 4]) - ) - ) - (null) - ) - ) - (fold knownPeers peer - (par - (seq - (call -relay- ("op" "noop") []) - (xor - (seq - (seq - (seq - (seq - (seq - (seq - (seq - (call peer ("peer" "identify") [] ident0) - (call peer ("dist" "list_blueprints") [] blueprints0) - ) - (call peer ("dist" "list_modules") [] modules0) - ) - (call peer ("srv" "list") [] services0) - ) - (call -relay- ("op" "noop") []) - ) - (xor - (call %init_peer_id% ("callbackSrv" "collectPeerInfo") [peer ident0 services0 blueprints0 modules0]) - (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 5]) - ) - ) - (call -relay- ("op" "noop") []) - ) - (fold services0 srv0 - (par - (seq - (call -relay- ("op" "noop") []) - (xor - (seq - (seq - (call peer ("srv" "get_interface") [srv0.$.id!] iface0) - (call -relay- ("op" "noop") []) - ) - (xor - (call %init_peer_id% ("callbackSrv" "collectServiceInterface") [peer srv0.$.id! iface0]) - (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 6]) - ) - ) - (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 7]) - ) - ) - (seq - (call -relay- ("op" "noop") []) - (next srv0) - ) - ) - ) - ) - (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 8]) - ) - ) - (next peer) - ) - ) - ) - (par - (seq - (call -relay- ("op" "noop") []) - (xor - (seq - (seq - (call relay ("kad" "neighborhood") [%init_peer_id% $nil $nil] neighbors) - (par - (seq - (call -relay- ("op" "noop") []) - (xor - (call %init_peer_id% ("callbackSrv" "collectNeighbors") [neighbors]) - (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 9]) - ) - ) - (null) + (call -relay- ("op" "noop") []) ) - ) - (fold neighbors n - (par - (xor - (seq - (seq - (call n ("kad" "neighborhood") [%init_peer_id% $nil $nil] neighbors2) - (call -relay- ("op" "noop") []) - ) - (xor - (call %init_peer_id% ("callbackSrv" "collectNeighbors") [neighbors2]) - (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 10]) - ) - ) - (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 11]) - ) - (next n) + (xor + (call %init_peer_id% ("callbackSrv" "collectPeerInfo") [peer ident services blueprints modules]) + (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 1]) ) ) + (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 2]) ) - (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 12]) ) + (next peer) ) - (null) ) ) - (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 13]) + (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 3]) ) `, @@ -302,11 +138,9 @@ export async function getAll(client, relay, knownPeers, collectPeerInfo, collect h.on('getDataSrv', '-relay-', () => { return client.relayPeerId; }); - h.on('getDataSrv', 'relay', () => {return relay;}); -h.on('getDataSrv', 'knownPeers', () => {return knownPeers;}); + h.on('getDataSrv', 'peers', () => {return peers;}); h.on('callbackSrv', 'collectPeerInfo', (args) => {collectPeerInfo(args[0], args[1], args[2], args[3], args[4]); return {};}); h.on('callbackSrv', 'collectServiceInterface', (args) => {collectServiceInterface(args[0], args[1], args[2]); return {};}); -h.on('callbackSrv', 'collectNeighbors', (args) => {collectNeighbors(args[0]); return {};}); h.onEvent('errorHandlingSrv', 'error', (args) => { // assuming error is the single argument @@ -316,7 +150,7 @@ h.on('callbackSrv', 'collectNeighbors', (args) => {collectNeighbors(args[0]); re }) .handleScriptError(reject) .handleTimeout(() => { - reject('Request timed out for getAll'); + reject('Request timed out for getServicesFromPeers'); }) if(config.ttl) { r.withTTL(config.ttl) @@ -329,7 +163,7 @@ h.on('callbackSrv', 'collectNeighbors', (args) => {collectNeighbors(args[0]); re -export async function getServicesFromPeers(client, peers, collectPeerInfo, collectServiceInterface, config) { +export async function discoverNeighbourhoodFull(client, relay, knownPeers, collectNeighbors, config) { let request; config = config || {}; const promise = new Promise((resolve, reject) => { @@ -340,66 +174,63 @@ export async function getServicesFromPeers(client, peers, collectPeerInfo, colle (xor (seq (seq - (call %init_peer_id% ("getDataSrv" "-relay-") [] -relay-) - (call %init_peer_id% ("getDataSrv" "peers") [] peers) + (seq + (call %init_peer_id% ("getDataSrv" "-relay-") [] -relay-) + (call %init_peer_id% ("getDataSrv" "relay") [] relay) + ) + (call %init_peer_id% ("getDataSrv" "knownPeers") [] knownPeers) ) - (fold peers peer + (fold knownPeers node (par (seq - (call -relay- ("op" "noop") []) + (seq + (call -relay- ("op" "noop") []) + (call relay ("op" "noop") []) + ) (xor (seq (seq - (seq + (call node ("kad" "neighborhood") [%init_peer_id% $nil $nil] neighbors) + (par (seq (seq - (seq - (seq - (call peer ("peer" "identify") [] ident) - (call peer ("dist" "list_blueprints") [] blueprints) - ) - (call peer ("dist" "list_modules") [] modules) - ) - (call peer ("srv" "list") [] services) + (call relay ("op" "noop") []) + (call -relay- ("op" "noop") []) + ) + (xor + (call %init_peer_id% ("callbackSrv" "collectNeighbors") [neighbors]) + (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 1]) ) - (call -relay- ("op" "noop") []) - ) - (xor - (call %init_peer_id% ("callbackSrv" "collectPeerInfo") [peer ident services blueprints modules]) - (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 1]) ) + (null) ) - (call -relay- ("op" "noop") []) ) - (fold services srv + (fold neighbors n (par (seq - (call -relay- ("op" "noop") []) + (call relay ("op" "noop") []) (xor (seq (seq - (call peer ("srv" "get_interface") [srv.$.id!] iface) + (call n ("kad" "neighborhood") [%init_peer_id% $nil $nil] neighbors2) (call -relay- ("op" "noop") []) ) (xor - (call %init_peer_id% ("callbackSrv" "collectServiceInterface") [peer srv.$.id! iface]) + (call %init_peer_id% ("callbackSrv" "collectNeighbors") [neighbors2]) (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 2]) ) ) (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 3]) ) ) - (seq - (call -relay- ("op" "noop") []) - (next srv) - ) + (next n) ) ) ) (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 4]) ) ) - (next peer) + (next node) ) ) ) @@ -412,9 +243,9 @@ export async function getServicesFromPeers(client, peers, collectPeerInfo, colle h.on('getDataSrv', '-relay-', () => { return client.relayPeerId; }); - h.on('getDataSrv', 'peers', () => {return peers;}); -h.on('callbackSrv', 'collectPeerInfo', (args) => {collectPeerInfo(args[0], args[1], args[2], args[3], args[4]); return {};}); -h.on('callbackSrv', 'collectServiceInterface', (args) => {collectServiceInterface(args[0], args[1], args[2]); return {};}); + h.on('getDataSrv', 'relay', () => {return relay;}); +h.on('getDataSrv', 'knownPeers', () => {return knownPeers;}); +h.on('callbackSrv', 'collectNeighbors', (args) => {collectNeighbors(args[0]); return {};}); h.onEvent('errorHandlingSrv', 'error', (args) => { // assuming error is the single argument @@ -424,7 +255,7 @@ h.on('callbackSrv', 'collectServiceInterface', (args) => {collectServiceInterfac }) .handleScriptError(reject) .handleTimeout(() => { - reject('Request timed out for getServicesFromPeers'); + reject('Request timed out for discoverNeighbourhoodFull'); }) if(config.ttl) { r.withTTL(config.ttl) diff --git a/src/index.js b/src/index.js index 1272cb0..8752def 100644 --- a/src/index.js +++ b/src/index.js @@ -32,7 +32,7 @@ import { import { Elm } from './Main.elm'; import * as serviceWorker from './serviceWorker'; import { interfaceInfo, peerInfo } from './types'; -import { getAll, getServicesFromPeers } from './_aqua/app'; +import { discoverNeighbourhoodFull, getAll, getServicesFromPeers } from './_aqua/app'; const defaultNetworkName = 'krasnodar'; @@ -203,20 +203,17 @@ function genFlags(peerId, relays, relayIdx) { // clear knownPeersSet to ask these peers again knownPeersSet.clear(); - knownPeersSet.add(...flags.knownPeers); - knownPeersSet.add(flags.relayPeerId); - - await getAll( + await getServicesFromPeers( client, - data.relayPeerId, - data.knownPeers, + [data.relayPeerId, ...data.knownPeers], collectPeerInfo, collectServiceInterface, - collectNeighbors, - { - ttl: 1000000, - }, + { ttl: 1000000 }, ); + knownPeersSet.add(...data.knownPeers); + knownPeersSet.add(data.relayPeerId); + + await discoverNeighbourhoodFull(client, data.relayPeerId, data.knownPeers, collectNeighbors, { ttl: 1000000 }); }); })(); From 7c14ef9180e27f9bb16f91e3b571e389e5c6a819 Mon Sep 17 00:00:00 2001 From: folex <0xdxdy@gmail.com> Date: Wed, 18 Aug 2021 20:15:58 +0300 Subject: [PATCH 6/6] WIP --- src/index.js | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/src/index.js b/src/index.js index 8752def..0452f0f 100644 --- a/src/index.js +++ b/src/index.js @@ -32,7 +32,7 @@ import { import { Elm } from './Main.elm'; import * as serviceWorker from './serviceWorker'; import { interfaceInfo, peerInfo } from './types'; -import { discoverNeighbourhoodFull, getAll, getServicesFromPeers } from './_aqua/app'; +import { discoverNeighbourhoodFull, getServicesFromPeers } from './_aqua/app'; const defaultNetworkName = 'krasnodar'; @@ -203,17 +203,16 @@ function genFlags(peerId, relays, relayIdx) { // clear knownPeersSet to ask these peers again knownPeersSet.clear(); - await getServicesFromPeers( - client, - [data.relayPeerId, ...data.knownPeers], - collectPeerInfo, - collectServiceInterface, - { ttl: 1000000 }, - ); - knownPeersSet.add(...data.knownPeers); knownPeersSet.add(data.relayPeerId); + knownPeersSet.add(...data.knownPeers); + + // get services from known peers + await getServicesFromPeers(client, [...knownPeersSet], collectPeerInfo, collectServiceInterface, { + ttl: 30000, + }); - await discoverNeighbourhoodFull(client, data.relayPeerId, data.knownPeers, collectNeighbors, { ttl: 1000000 }); + // discover new peers + await discoverNeighbourhoodFull(client, data.relayPeerId, data.knownPeers, collectNeighbors, { ttl: 30000 }); }); })();