diff --git a/aqua/app.aqua b/aqua/app.aqua index 896f810..e7ff935 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() @@ -16,25 +18,33 @@ 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( + peers: []PeerId, + collectPeerInfo: PeerInfoCb, + collectServiceInterface: ServiceInterfaceCb +): + for peer <- peers par: + askAllAndSend(peer, collectPeerInfo, collectServiceInterface) -func findAndAskNeighboursSchema(relayPeerId: PeerId, clientId: PeerId, collectPeerInfo: PeerInfoCb, collectServiceInterface: ServiceInterfaceCb): - on relayPeerId: - neighbors <- Kademlia.neighborhood(clientId, false) +-- 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) + co collectNeighbors(neighbors) for n <- neighbors par: on n: - neighbors2 <- Kademlia.neighborhood(clientId, false) - for n2 <- neighbors2 par: - askAllAndSend(n2, collectPeerInfo, collectServiceInterface) - -func getAll(relayPeerId: PeerId, knownPeers: []PeerId, collectPeerInfo: PeerInfoCb, collectServiceInterface: ServiceInterfaceCb): - -- co askAllAndSend(relayPeerId, 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) + neighbors2 <- Kademlia.neighborhood(%init_peer_id%, nil, nil) + collectNeighbors(neighbors2) - -- co findAndAskNeighboursSchema(relayPeerId, %init_peer_id%, collectPeerInfo, collectServiceInterface) +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 7cc303d..77f6082 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.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": { - "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..861a4cf 100644 --- a/package.json +++ b/package.json @@ -38,10 +38,10 @@ "yup": "^0.32.9" }, "devDependencies": { + "@fluencelabs/aqua-cli": "0.1.10-188", + "@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..b06a90e 100644 --- a/src/_aqua/app.js +++ b/src/_aqua/app.js @@ -3,14 +3,14 @@ * 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.10-188 * */ import { RequestFlowBuilder } from '@fluencelabs/fluence/dist/api.unstable'; -export async function collectServiceInterfaces(client, peer, services, collectServiceInterface, config) { +export async function askAllAndSend(client, peer, collectPeerInfo, collectServiceInterface, config) { let request; config = config || {}; const promise = new Promise((resolve, reject) => { @@ -25,27 +25,107 @@ export async function collectServiceInterfaces(client, peer, services, collectSe (call %init_peer_id% ("getDataSrv" "-relay-") [] -relay-) (call %init_peer_id% ("getDataSrv" "peer") [] peer) ) - (call %init_peer_id% ("getDataSrv" "services") [] services) + (call -relay- ("op" "noop") []) ) - (fold services srv + (xor + (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 -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 %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 2]) + ) + ) + (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('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.onEvent('errorHandlingSrv', 'error', (args) => { + // assuming error is the single argument + const [err] = args; + reject(err); + }); + }) + .handleScriptError(reject) + .handleTimeout(() => { + reject('Request timed out for askAllAndSend'); + }) + if(config.ttl) { + r.withTTL(config.ttl) + } + request = r.build(); + }); + await client.initiateFlow(request); + return Promise.race([promise, Promise.resolve()]); +} + + + +export async function getServicesFromPeers(client, peers, collectPeerInfo, collectServiceInterface, config) { + let request; + config = config || {}; + const promise = new Promise((resolve, reject) => { + var r = new RequestFlowBuilder() + .disableInjections() + .withRawScript( + ` +(xor + (seq + (seq + (call %init_peer_id% ("getDataSrv" "-relay-") [] -relay-) + (call %init_peer_id% ("getDataSrv" "peers") [] peers) + ) + (fold peers peer (par (seq (call -relay- ("op" "noop") []) (xor (seq (seq - (call peer ("srv" "get_interface") [srv.$.id!] iface) + (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") []) ) (xor - (call %init_peer_id% ("callbackSrv" "collectServiceInterface") [peer srv.$.id! iface]) + (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]) ) ) - (next srv) + (next peer) ) ) ) @@ -58,8 +138,8 @@ export async function collectServiceInterfaces(client, peer, services, collectSe h.on('getDataSrv', '-relay-', () => { return client.relayPeerId; }); - h.on('getDataSrv', 'peer', () => {return peer;}); -h.on('getDataSrv', 'services', () => {return services;}); + 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.onEvent('errorHandlingSrv', 'error', (args) => { @@ -70,7 +150,7 @@ h.on('callbackSrv', 'collectServiceInterface', (args) => {collectServiceInterfac }) .handleScriptError(reject) .handleTimeout(() => { - reject('Request timed out for collectServiceInterfaces'); + reject('Request timed out for getServicesFromPeers'); }) if(config.ttl) { r.withTTL(config.ttl) @@ -83,7 +163,7 @@ h.on('callbackSrv', 'collectServiceInterface', (args) => {collectServiceInterfac -export async function askAllAndSend(client, peer, collectPeerInfo, collectServiceInterface, config) { +export async function discoverNeighbourhoodFull(client, relay, knownPeers, collectNeighbors, config) { let request; config = config || {}; const promise = new Promise((resolve, reject) => { @@ -96,60 +176,62 @@ export async function askAllAndSend(client, peer, collectPeerInfo, collectServic (seq (seq (call %init_peer_id% ("getDataSrv" "-relay-") [] -relay-) - (call %init_peer_id% ("getDataSrv" "peer") [] peer) + (call %init_peer_id% ("getDataSrv" "relay") [] relay) ) - (call -relay- ("op" "noop") []) + (call %init_peer_id% ("getDataSrv" "knownPeers") [] knownPeers) ) - (xor - (seq + (fold knownPeers node + (par (seq (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 - (call peer ("peer" "identify") [] ident) - (call peer ("dist" "list_blueprints") [] blueprints) + (seq + (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 peer ("dist" "list_modules") [] modules) + (null) ) - (call peer ("srv" "list") [] services) ) - (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 -relay- ("op" "noop") []) - ) - (fold services srv - (par - (seq - (call -relay- ("op" "noop") []) - (xor - (seq + (fold neighbors n + (par (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 relay ("op" "noop") []) + (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% 3]) ) ) - (seq - (call -relay- ("op" "noop") []) - (next srv) - ) + (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 4]) ) ) + (next node) ) - (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 4]) ) ) (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 5]) @@ -161,9 +243,9 @@ export async function askAllAndSend(client, peer, collectPeerInfo, collectServic h.on('getDataSrv', '-relay-', () => { return client.relayPeerId; }); - h.on('getDataSrv', 'peer', () => {return peer;}); -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 @@ -173,7 +255,7 @@ h.on('callbackSrv', 'collectServiceInterface', (args) => {collectServiceInterfac }) .handleScriptError(reject) .handleTimeout(() => { - reject('Request timed out for askAllAndSend'); + reject('Request timed out for discoverNeighbourhoodFull'); }) if(config.ttl) { r.withTTL(config.ttl) @@ -186,7 +268,7 @@ h.on('callbackSrv', 'collectServiceInterface', (args) => {collectServiceInterfac -export async function findAndAskNeighboursSchema(client, relayPeerId, clientId, collectPeerInfo, collectServiceInterface, config) { +export async function discoverNeighbourhood(client, relay, collectNeighbors, config) { let request; config = config || {}; const promise = new Promise((resolve, reject) => { @@ -198,95 +280,49 @@ export async function findAndAskNeighboursSchema(client, relayPeerId, clientId, (seq (seq (seq - (seq - (call %init_peer_id% ("getDataSrv" "-relay-") [] -relay-) - (call %init_peer_id% ("getDataSrv" "relayPeerId") [] relayPeerId) - ) - (call %init_peer_id% ("getDataSrv" "clientId") [] clientId) + (call %init_peer_id% ("getDataSrv" "-relay-") [] -relay-) + (call %init_peer_id% ("getDataSrv" "relay") [] relay) ) (call -relay- ("op" "noop") []) ) (xor (seq - (call relayPeerId ("kad" "neighborhood") [clientId false] neighbors) + (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 - (call n ("kad" "neighborhood") [clientId false] neighbors2) - (fold neighbors2 n2 - (par - (xor - (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- ("op" "noop") []) - ) - (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) - ) - ) - ) - ) - (seq - (call -relay- ("op" "noop") []) - (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 4]) - ) - ) - (next n2) - ) + (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]) ) ) - (seq - (call -relay- ("op" "noop") []) - (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 5]) - ) + (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 3]) ) (next n) ) ) ) - (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 6]) + (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 4]) ) ) - (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 7]) + (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 5]) ) `, @@ -295,10 +331,8 @@ 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('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('callbackSrv', 'collectNeighbors', (args) => {collectNeighbors(args[0]); return {};}); h.onEvent('errorHandlingSrv', 'error', (args) => { // assuming error is the single argument @@ -308,7 +342,7 @@ h.on('callbackSrv', 'collectServiceInterface', (args) => {collectServiceInterfac }) .handleScriptError(reject) .handleTimeout(() => { - reject('Request timed out for findAndAskNeighboursSchema'); + reject('Request timed out for discoverNeighbourhood'); }) if(config.ttl) { r.withTTL(config.ttl) @@ -321,7 +355,7 @@ h.on('callbackSrv', 'collectServiceInterface', (args) => {collectServiceInterfac -export async function getAll(client, relayPeerId, knownPeers, collectPeerInfo, collectServiceInterface, config) { +export async function collectServiceInterfaces(client, peer, services, collectServiceInterface, config) { let request; config = config || {}; const promise = new Promise((resolve, reject) => { @@ -334,71 +368,33 @@ export async function getAll(client, relayPeerId, knownPeers, collectPeerInfo, c (seq (seq (call %init_peer_id% ("getDataSrv" "-relay-") [] -relay-) - (call %init_peer_id% ("getDataSrv" "relayPeerId") [] relayPeerId) + (call %init_peer_id% ("getDataSrv" "peer") [] peer) ) - (call %init_peer_id% ("getDataSrv" "knownPeers") [] knownPeers) + (call %init_peer_id% ("getDataSrv" "services") [] services) ) - (fold knownPeers peer + (fold services srv (par (seq (call -relay- ("op" "noop") []) (xor (seq (seq - (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 -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 ("srv" "get_interface") [srv.$.id!] iface) (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" "collectServiceInterface") [peer srv.$.id! iface]) + (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]) ) ) - (next peer) + (next srv) ) ) ) - (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 5]) + (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 3]) ) `, @@ -407,9 +403,8 @@ 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('callbackSrv', 'collectPeerInfo', (args) => {collectPeerInfo(args[0], args[1], args[2], args[3], args[4]); return {};}); + 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) => { @@ -420,7 +415,7 @@ h.on('callbackSrv', 'collectServiceInterface', (args) => {collectServiceInterfac }) .handleScriptError(reject) .handleTimeout(() => { - reject('Request timed out for getAll'); + 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..0452f0f 100644 --- a/src/index.js +++ b/src/index.js @@ -32,16 +32,18 @@ import { import { Elm } from './Main.elm'; import * as serviceWorker from './serviceWorker'; import { interfaceInfo, peerInfo } from './types'; -import { getAll } from './_aqua/app'; +import { discoverNeighbourhoodFull, getServicesFromPeers } from './_aqua/app'; const defaultNetworkName = 'krasnodar'; const defaultEnv = { relays: krasnodar, - relayIdx: 3, + relayIdx: krasnodar.length - 1, logLevel: 'error', }; +var knownPeersSet = new Set(); + async function loadScript(script) { return new Promise((resolve, reject) => { var xhr = new XMLHttpRequest(); @@ -133,42 +135,6 @@ 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}`); @@ -187,7 +153,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 +169,50 @@ 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); + 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(data.relayPeerId); + knownPeersSet.add(...data.knownPeers); + + // get services from known peers + await getServicesFromPeers(client, [...knownPeersSet], collectPeerInfo, collectServiceInterface, { + ttl: 30000, }); + + // discover new peers + await discoverNeighbourhoodFull(client, data.relayPeerId, data.knownPeers, collectNeighbors, { ttl: 30000 }); }); })();