diff --git a/package-lock.json b/package-lock.json index 8f10c9c..e3bdc34 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1111,7 +1111,6 @@ "version": "7.12.5", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.5.tgz", "integrity": "sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg==", - "dev": true, "requires": { "regenerator-runtime": "^0.13.4" } @@ -1222,17 +1221,17 @@ } } }, - "@fluencelabs/aquamarine-stepper": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@fluencelabs/aquamarine-stepper/-/aquamarine-stepper-0.3.4.tgz", - "integrity": "sha512-0NPg9dWvANtc3If8C8O8XjKwzMCq2492lA73faKJdCwUv7m+xHX9G3l6UJULTfV1T4mWVtMQZIKopNOlRYSrKA==" + "@fluencelabs/aquamarine-interpreter": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@fluencelabs/aquamarine-interpreter/-/aquamarine-interpreter-0.7.0.tgz", + "integrity": "sha512-2GPsOXSakpRPJFiKAcylK6Q/UhYHrQgrs8a1GCgr/OlrQEYkC4PY4HxnrdErt8fzTUDBHH4veKHKGM+IByYhxA==" }, "@fluencelabs/fluence": { - "version": "0.9.7", - "resolved": "https://registry.npmjs.org/@fluencelabs/fluence/-/fluence-0.9.7.tgz", - "integrity": "sha512-z9l9+nzJASnNfJpOE9iAX/iRbKrFMgZHIFqC0qYTHm0GFEMQe1YApnWNYXCS49f9tJlJte9TclaJ/f5FFwOrjg==", + "version": "0.9.25", + "resolved": "https://registry.npmjs.org/@fluencelabs/fluence/-/fluence-0.9.25.tgz", + "integrity": "sha512-LZRr9qDkkLgxmoQIhlKndPkF/9kX+JiwEmfla8tpU1xXfnz/N+HlE82kJCYZk0b5KHz756SEFYF7amW/uhpArQ==", "requires": { - "@fluencelabs/aquamarine-stepper": "0.3.4", + "@fluencelabs/aquamarine-interpreter": "^0.7.0", "async": "3.2.0", "base64-js": "1.3.1", "bs58": "4.0.1", @@ -1478,6 +1477,11 @@ "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", "dev": true }, + "@types/lodash": { + "version": "4.14.168", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.168.tgz", + "integrity": "sha512-oVfRvqHV/V6D1yifJbVRU3TMp8OT6o6BG+U9MkwuJ3U8/CsDHvalRpsxBqivn71ztOFZBTfJMvETbqHiaNSj7Q==" + }, "@types/minimatch": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", @@ -1577,6 +1581,12 @@ } } }, + "@types/yup": { + "version": "0.29.11", + "resolved": "https://registry.npmjs.org/@types/yup/-/yup-0.29.11.tgz", + "integrity": "sha512-9cwk3c87qQKZrT251EDoibiYRILjCmxBvvcb4meofCmx1vdnNcR9gyildy5vOHASpOKMsn42CugxUvcwK5eu1g==", + "dev": true + }, "@typescript-eslint/eslint-plugin": { "version": "4.9.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.9.0.tgz", @@ -1910,6 +1920,12 @@ "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", "dev": true }, + "@zxing/text-encoding": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@zxing/text-encoding/-/text-encoding-0.9.0.tgz", + "integrity": "sha512-U/4aVJ2mxI0aDNI8Uq0wEhMgY+u4CNtEb0om3+y3+niDAsoTCOB33UF0sxpzqzdqXLqmvc+vZyAt4O8pPdfkwA==", + "optional": true + }, "abab": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", @@ -2740,9 +2756,9 @@ } }, "bl": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.0.3.tgz", - "integrity": "sha512-fs4G6/Hu4/EE+F75J8DuN/0IpQqNjAdC7aEQv7Qt8MHGUH7Ckv2MwTEEeN9QehD0pfIDkMI1bkHYkKy7xHyKIg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", "requires": { "buffer": "^5.5.0", "inherits": "^2.0.4", @@ -3211,9 +3227,9 @@ "dev": true }, "chai": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz", - "integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.0.tgz", + "integrity": "sha512-/BFd2J30EcOwmdOgXvVsmM48l0Br0nmZPlO0uOW4XKh6kpsUumRXBgPV+IlaqFaqr9cYbeoZAM1Npx0i4A+aiA==", "requires": { "assertion-error": "^1.1.0", "check-error": "^1.0.2", @@ -8439,9 +8455,9 @@ "dev": true }, "it-all": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/it-all/-/it-all-1.0.4.tgz", - "integrity": "sha512-7K+gjHHzZ7t+bCkrtulYiow35k3UgqH7miC+iUa9RGiyDRXJ6hVDeFsDrnWrlscjrkLFOJRKHxNOke4FNoQnhw==" + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/it-all/-/it-all-1.0.5.tgz", + "integrity": "sha512-ygD4kA4vp8fi+Y+NBgEKt6W06xSbv6Ub/0V8d1r3uCyJ9Izwa1UspkIOlqY9fOee0Z1w3WRo1+VWyAU4DgtufA==" }, "it-buffer": { "version": "0.1.2", @@ -8453,9 +8469,9 @@ } }, "it-drain": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/it-drain/-/it-drain-1.0.3.tgz", - "integrity": "sha512-KxwHBEpWW+0/EkGCOPR2MaHanvBW2A76tOC5CiitoJGLd8J56FxM6jJX3uow20v5qMidX5lnKgwH5oCIyYDszQ==" + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/it-drain/-/it-drain-1.0.4.tgz", + "integrity": "sha512-coB7mcyZ4lWBQKoQGJuqM+P94pvpn2T3KY27vcVWPqeB1WmoysRC76VZnzAqrBWzpWcoEJMjZ+fsMBslxNaWfQ==" }, "it-glob": { "version": "0.0.8", @@ -8565,9 +8581,9 @@ } }, "it-pushable": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/it-pushable/-/it-pushable-1.4.1.tgz", - "integrity": "sha512-XOnbDxD5YoiVtL/vobQW/ZGkzQzJv9Fs9TJlO2McfkIbolBBO2IGY6XjE1ooLfw8gQeH8XbgpoLajtPUVO8Qew==", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/it-pushable/-/it-pushable-1.4.2.tgz", + "integrity": "sha512-vVPu0CGRsTI8eCfhMknA7KIBqqGFolbRx+1mbQ6XuZ7YCz995Qj7L4XUviwClFunisDq96FdxzF5FnAbw15afg==", "requires": { "fast-fifo": "^1.0.0" } @@ -9333,8 +9349,12 @@ "lodash": { "version": "4.17.20", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", - "dev": true + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" + }, + "lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" }, "lodash._reinterpolate": { "version": "3.0.0", @@ -9948,6 +9968,11 @@ "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==" }, + "nanoclone": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/nanoclone/-/nanoclone-0.2.1.tgz", + "integrity": "sha512-wynEP02LmIbLpcYw8uBKpcfF6dmg2vcpKqxeH5UcoKEYdExslsdUA4ugFauuaeYdTB76ez6gJW8XAZ6CgkXYxA==" + }, "nanoid": { "version": "3.1.18", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.18.tgz", @@ -10003,9 +10028,9 @@ "dev": true }, "nise": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/nise/-/nise-4.0.4.tgz", - "integrity": "sha512-bTTRUNlemx6deJa+ZyoCUTRvH3liK5+N6VQZ4NIw90AgDXY6iPnsqplNFf6STcj+ePk0H/xqxnP75Lr0J0Fq3A==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/nise/-/nise-4.1.0.tgz", + "integrity": "sha512-eQMEmGN/8arp0xsvGoQ+B1qvSkR73B1nWSCh7nOt5neMCtwcQVYQGdzQMhcNscktTsWB54xnlSQFzOAPJD8nXA==", "requires": { "@sinonjs/commons": "^1.7.0", "@sinonjs/fake-timers": "^6.0.0", @@ -11884,6 +11909,11 @@ } } }, + "property-expr": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/property-expr/-/property-expr-2.0.4.tgz", + "integrity": "sha512-sFPkHQjVKheDNnPvotjQmm3KD3uk1fWKUN7CrpdbwmUx3CrG3QiM8QpTSimvig5vTXmTvjz7+TDvXOI9+4rkcg==" + }, "protocol-buffers-schema": { "version": "3.5.1", "resolved": "https://registry.npmjs.org/protocol-buffers-schema/-/protocol-buffers-schema-3.5.1.tgz", @@ -12544,8 +12574,7 @@ "regenerator-runtime": { "version": "0.13.7", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", - "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==", - "dev": true + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" }, "regenerator-transform": { "version": "0.14.5", @@ -14754,6 +14783,11 @@ "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", "dev": true }, + "toposort": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/toposort/-/toposort-2.0.2.tgz", + "integrity": "sha1-riF2gXXRVZ1IvvNUILL0li8JwzA=" + }, "tough-cookie": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", @@ -15729,9 +15763,12 @@ } }, "web-encoding": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/web-encoding/-/web-encoding-1.0.6.tgz", - "integrity": "sha512-26wEnRPEFAc5d5lmH1Q/DuvWEYsRF1D2alX2jlKpdmqv7cj+BbANL7Xlcl9r4s72Eg9kItZa9RWVbBMC9dMv4w==" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/web-encoding/-/web-encoding-1.1.0.tgz", + "integrity": "sha512-KzYonGdJnZB3qvhK8hKca5qXk/wp+hgwGNTY1TnqtF2CzDzpN8szOC3ejhX9+wbhCq3vQs/TjM8BykS1kor0lQ==", + "requires": { + "@zxing/text-encoding": "0.9.0" + } }, "webpack": { "version": "5.7.0", @@ -17463,6 +17500,20 @@ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true + }, + "yup": { + "version": "0.32.9", + "resolved": "https://registry.npmjs.org/yup/-/yup-0.32.9.tgz", + "integrity": "sha512-Ci1qN+i2H0XpY7syDQ0k5zKQ/DoxO0LzPg8PAR/X4Mpj6DqaeCoIYEEjDJwhArh3Fa7GWbQQVDZKeXYlSH4JMg==", + "requires": { + "@babel/runtime": "^7.10.5", + "@types/lodash": "^4.14.165", + "lodash": "^4.17.20", + "lodash-es": "^4.17.15", + "nanoclone": "^0.2.1", + "property-expr": "^2.0.4", + "toposort": "^2.0.2" + } } } } diff --git a/package.json b/package.json index 389b437..26061a3 100644 --- a/package.json +++ b/package.json @@ -20,11 +20,13 @@ }, "homepage": "https://github.com/fluencelabs/fluence-admin#readme", "dependencies": { - "@fluencelabs/fluence": "0.9.7", + "@fluencelabs/fluence": "0.9.25", "@fluencelabs/fluence-network-environment": "1.0.8", - "tachyons": "^4.12.0" + "tachyons": "^4.12.0", + "yup": "^0.32.9" }, "devDependencies": { + "@types/yup": "^0.29.11", "@babel/core": "7.12.9", "@typescript-eslint/eslint-plugin": "^4.9.0", "@typescript-eslint/parser": "^4.9.0", diff --git a/src/AirScripts/DiscoverPeers.elm b/src/AirScripts/DiscoverPeers.elm index 9c2afad..e8d0258 100644 --- a/src/AirScripts/DiscoverPeers.elm +++ b/src/AirScripts/DiscoverPeers.elm @@ -15,13 +15,13 @@ air peerId relayId = airScript = seq - (callBI "relayId" ( "dht", "neighborhood" ) [ "clientId" ] (Just "peers")) + (callBI "relayId" ( "kad", "neighborhood" ) [ "clientId" ] (Just "peers")) (par (relayEvent "peers_discovered" [ "relayId", "peers" ]) (fold "peers" "p" <| par (seq - (callBI "p" ( "dht", "neighborhood" ) [ "clientId" ] (Just "morePeers")) + (callBI "p" ( "kad", "neighborhood" ) [ "clientId" ] (Just "morePeers")) (relayEvent "peers_discovered" [ "p", "morePeers" ]) ) (next "p") diff --git a/src/AirScripts/GetAll.elm b/src/AirScripts/GetAll.elm index 34b653b..323d41a 100644 --- a/src/AirScripts/GetAll.elm +++ b/src/AirScripts/GetAll.elm @@ -54,11 +54,11 @@ findAndAskNeighboursSchema = seq (callBI "relayId" ( "op", "identity" ) [] Nothing) (seq - (callBI "relayId" ( "dht", "neighborhood" ) [ "clientId" ] (Just "neigh")) + (callBI "relayId" ( "kad", "neighborhood" ) [ "clientId" ] (Just "neigh")) (fold "neigh" "n" <| par (seq - (callBI "n" ( "dht", "neighborhood" ) [ "clientId" ] (Just "moreNeigh")) + (callBI "n" ( "kad", "neighborhood" ) [ "clientId" ] (Just "moreNeigh")) (fold "moreNeigh" "mp" <| par (askAllAndSend "mp") @@ -115,14 +115,14 @@ air peerId relayId peers = askAllAndSend : String -> Air askAllAndSend var = seq - (callBI var ( "op", "identify" ) [] (Just "ident")) + (callBI var ( "peer", "identify" ) [] (Just "ident")) (seq - (callBI var ( "dist", "get_blueprints" ) [] (Just "blueprints")) + (callBI var ( "dist", "list_blueprints" ) [] (Just "blueprints")) (seq - (callBI var ( "dist", "get_modules" ) [] (Just "modules")) + (callBI var ( "dist", "list_modules" ) [] (Just "modules")) (seq - (callBI var ( "srv", "get_interfaces" ) [] (Just "interfaces")) - (relayEvent "all_info" [ var, "ident", "interfaces", "blueprints", "modules" ]) + (callBI var ( "srv", "list" ) [] (Just "services")) + (relayEvent "all_info" [ var, "ident", "services", "blueprints", "modules" ]) ) ) ) diff --git a/src/BlueprintPage/View.elm b/src/BlueprintPage/View.elm index f8f37ef..00e820f 100644 --- a/src/BlueprintPage/View.elm +++ b/src/BlueprintPage/View.elm @@ -14,6 +14,7 @@ import Modules.Model exposing (Module) import Msg exposing (Msg(..)) import Palette exposing (classes, darkRed, redFont) import Service.Model exposing (Interface) +import List.Unique exposing (..) view : Model -> String -> Html Msg @@ -49,8 +50,15 @@ blueprintToInfo model id = case Dict.get id model.blueprints of Just bp -> let + hashes = bp.dependencies + |> List.map (\d -> String.split ":" d) + |> List.map (\p -> Maybe.withDefault [] (List.tail p)) + |> List.map (\p -> Maybe.withDefault "" (List.head p)) modules = bp.dependencies |> List.map (\d -> Dict.get d model.modules) |> List.filterMap identity + modulesByHash = + hashes |> List.map (\d -> Dict.get d model.modulesByHash) |> List.filterMap identity + m = List.Unique.filterDuplicates (List.concat [modules, modulesByHash]) in Just { name = bp.name @@ -60,7 +68,7 @@ blueprintToInfo model id = , description = getBlueprintDescription bp.name , website = "https://github.com/fluencelabs/" , blueprint = bp - , modules = modules + , modules = m , openedModule = model.toggledInterface } @@ -82,9 +90,10 @@ viewInfo blueprintInfo = , div [ classes "fl w-100 w-80-ns mv3" ] [ span [ classes "fl w-100 black lucida pv1" ] [ text blueprintInfo.description ] ] , div [ classes "fl w-100 w-20-ns gray-font mv3" ] [ text "MODULES" ] , div [ classes "fl w-100 w-80-ns mv3" ] - (blueprintInfo.modules - |> List.map (\m -> viewToggledInterface (checkToggle m.name) m.name m.interface) - ) + [text (String.join ", " (blueprintInfo.modules |> List.map (\m -> m.name)))] + --(blueprintInfo.modules + -- |> List.map (\m -> viewToggledInterface (checkToggle m.name) m.name) + --) ] @@ -93,28 +102,29 @@ alwaysPreventDefault msg = { message = msg, stopPropagation = True, preventDefault = True } -viewToggledInterface : Bool -> String -> Interface -> Html Msg -viewToggledInterface isOpen name interface = +--viewToggledInterface : Bool -> String -> Interface -> Html Msg +viewToggledInterface : Bool -> String -> Html Msg +viewToggledInterface isOpen name = let interfaceViewEl = if isOpen then - [ div [ classes "fl w-100 ph3" ] (interfaceView interface) ] - + --[ div [ classes "fl w-100 ph3" ] (interfaceView interface) ] + [] else [] in div [] ([ div [ classes "fl w-100 light-shadow bg-near-white pa2 mv2 pointer", onClick (ToggleInterface name) ] [ span [ classes "fl mh2 pv1 tldib v-mid dib v-mid" ] [ text name ] - , a [ attribute "href" ("/module/" ++ name), classes "fl dib v-mid mt1" ] [ img [ attribute "src" "/images/link.svg" ] [] ] - , div [ classes "fl o-40 f4 fr pr3 dib v-mid" ] - [ if isOpen then - text "▲" - - else - text "▼" - ] + --, a [ attribute "href" ("/module/" ++ name), classes "fl dib v-mid mt1" ] [ img [ attribute "src" "/images/link.svg" ] [] ] + --, div [ classes "fl o-40 f4 fr pr3 dib v-mid" ] + -- [ if isOpen then + -- text "▲" + -- + -- else + -- text "▼" + -- ] ] ] - ++ interfaceViewEl + --++ interfaceViewEl ) diff --git a/src/Blueprints/Air.elm b/src/Blueprints/Air.elm index ecddc2e..442f423 100644 --- a/src/Blueprints/Air.elm +++ b/src/Blueprints/Air.elm @@ -6,4 +6,4 @@ import AirScripts.CallPeers air : String -> String -> List String -> Air air peerId relayId peers = - AirScripts.CallPeers.air peerId relayId ( "blueprints_discovered", "dist", "get_blueprints" ) peers + AirScripts.CallPeers.air peerId relayId ( "blueprints_discovered", "dist", "list_blueprints" ) peers diff --git a/src/Info.elm b/src/Info.elm index b18a036..81b2473 100644 --- a/src/Info.elm +++ b/src/Info.elm @@ -42,6 +42,7 @@ modulesDescription = , ( "curl_adapter", { site = "https://github.com/fluencelabs/fce/tree/master/examples/url-downloader/facade", description = "Adapter module for cURL CLI utility" } ) , ( "url_downloader", { site = "https://github.com/fluencelabs/fce/tree/master/examples/url-downloader/facade", description = "Adapter module for cURL CLI utility" } ) , ( "facade_url_downloader", { site = "https://github.com/fluencelabs/fce/tree/master/examples/url-downloader/facade", description = "Adapter module for cURL CLI utility" } ) + , ( "curl_template", { site = "https://github.com/fluencelabs/examples/tree/main/curl_template", description = "Template service to start hacking on Fluence with curl" } ) ] @@ -53,4 +54,7 @@ blueprintsDescription = , ( "User List", { description = "Basically an address book. Used in the Chat application to store chat users" } ) , ( "Redis", { description = "Popular NoSQL K/V storage compiled to WebAssembly, stores data in memory" } ) , ( "URL Downloader", { description = "cURL adapter, allows to download anything by URL" } ) + , ( "history", { description = "Stores message log, used in History service" } ) + , ( "userlist", { description = "Address book implementation module, used in User List service" } ) + , ( "curl_template", { description = "Template service to start hacking on Fluence with curl" } ) ] diff --git a/src/Instances/View.elm b/src/Instances/View.elm index c53892d..0c64a52 100644 --- a/src/Instances/View.elm +++ b/src/Instances/View.elm @@ -30,7 +30,7 @@ toInstance peerId identify blueprints service = --|> Maybe.andThen List.head |> Maybe.withDefault "unknown" in - { name = name, blueprintId = blueprintId, instance = service.service_id, peerId = peerId, ip = ip } + { name = name, blueprintId = blueprintId, instance = service.id, peerId = peerId, ip = ip } view : Model -> (Service -> Bool) -> ( Int, Html msg ) diff --git a/src/Main.elm b/src/Main.elm index 5897189..f108db9 100644 --- a/src/Main.elm +++ b/src/Main.elm @@ -54,6 +54,7 @@ init flags url key = , page = r , discoveredPeers = Dict.empty , modules = Dict.empty + , modulesByHash = Dict.empty , blueprints = Dict.empty , toggledInterface = Nothing , knownPeers = flags.knownPeers diff --git a/src/Model.elm b/src/Model.elm index 374b386..092233c 100644 --- a/src/Model.elm +++ b/src/Model.elm @@ -53,6 +53,7 @@ type alias Model = , page : Route , discoveredPeers : Dict String PeerData , modules : Dict String Module + , modulesByHash : Dict String Module , blueprints : Dict String Blueprint , toggledInterface : Maybe String , knownPeers : List String diff --git a/src/ModulePage/View.elm b/src/ModulePage/View.elm index d869d86..a9497d7 100644 --- a/src/ModulePage/View.elm +++ b/src/ModulePage/View.elm @@ -82,7 +82,10 @@ empty = viewInfo : ModuleViewInfo -> Html msg viewInfo moduleInfo = article [ classes "cf" ] - [ div [ classes "fl w-100 w-20-ns gray mv3" ] [ text "AUTHOR" ] + [ div [ classes "fl w-100 w-20-ns gray mv3" ] [ text "HASH" ] + , div [ classes "fl w-100 w-80-ns mv3" ] + [ span [ classes "fl w-100 black b lucida" ] [ text moduleInfo.moduleInfo.hash ] ] + , div [ classes "fl w-100 w-20-ns gray mv3" ] [ text "AUTHOR" ] , div [ classes "fl w-100 w-80-ns mv3" ] [ span [ classes "fl w-100 black b lucida" ] [ text moduleInfo.author ] ] , div [ classes "fl w-100 w-20-ns gray mv3" ] [ text "WEBSITE" ] @@ -96,7 +99,7 @@ viewInfo moduleInfo = , div [ classes "fl w-100 w-20-ns gray mv3" ] [ text "DESCRIPTION" ] , div [ classes "fl w-100 w-80-ns mv3 lucida" ] [ span [ classes "fl w-100 black", property "innerHTML" (string " 123") ] [ text moduleInfo.description ] ] - , div [ classes "fl w-100 w-20-ns gray mv3" ] [ text "INTERFACE" ] - , div [ classes "fl w-100 w-80-ns mv3" ] - [ span [ classes "fl w-100 black" ] (interfaceView moduleInfo.moduleInfo.interface) ] + --, div [ classes "fl w-100 w-20-ns gray mv3" ] [ text "INTERFACE" ] + --, div [ classes "fl w-100 w-80-ns mv3" ] + -- [ span [ classes "fl w-100 black" ] (interfaceView moduleInfo.moduleInfo.interface) ] ] diff --git a/src/Modules/Air.elm b/src/Modules/Air.elm index 0671168..43390cb 100644 --- a/src/Modules/Air.elm +++ b/src/Modules/Air.elm @@ -6,4 +6,4 @@ import AirScripts.CallPeers air : String -> String -> List String -> Air air peerId relayId peers = - AirScripts.CallPeers.air peerId relayId ( "modules_discovered", "dist", "get_modules" ) peers + AirScripts.CallPeers.air peerId relayId ( "modules_discovered", "dist", "list_modules" ) peers diff --git a/src/Modules/Model.elm b/src/Modules/Model.elm index 61cfadb..d3a1c21 100644 --- a/src/Modules/Model.elm +++ b/src/Modules/Model.elm @@ -5,7 +5,8 @@ import Service.Model exposing (Interface) type alias Module = { name : String - , interface : Interface + , hash: String + --, interface : Interface } diff --git a/src/Nodes/Air.elm b/src/Nodes/Air.elm index c5af162..54cf1c9 100644 --- a/src/Nodes/Air.elm +++ b/src/Nodes/Air.elm @@ -6,4 +6,4 @@ import AirScripts.CallPeers air : String -> String -> List String -> Air air peerId relayId peers = - AirScripts.CallPeers.air peerId relayId ( "peer_identity", "op", "identify" ) peers + AirScripts.CallPeers.air peerId relayId ( "peer_identity", "peer", "identify" ) peers diff --git a/src/Service/Air.elm b/src/Service/Air.elm index e4baa36..865c85f 100644 --- a/src/Service/Air.elm +++ b/src/Service/Air.elm @@ -6,4 +6,4 @@ import AirScripts.CallPeers air : String -> String -> List String -> Air air peerId relayId peers = - AirScripts.CallPeers.air peerId relayId ( "services_discovered", "srv", "get_interfaces" ) peers + AirScripts.CallPeers.air peerId relayId ( "services_discovered", "srv", "list" ) peers diff --git a/src/Service/Model.elm b/src/Service/Model.elm index 9e2dbc7..5d00c0c 100644 --- a/src/Service/Model.elm +++ b/src/Service/Model.elm @@ -22,7 +22,8 @@ type alias Interface = type alias Service = - { service_id : String + { id : String , blueprint_id : String - , interface : Interface + --, interface : Interface + , owner_id : String } diff --git a/src/Update.elm b/src/Update.elm index 159f11a..77722db 100644 --- a/src/Update.elm +++ b/src/Update.elm @@ -117,12 +117,18 @@ updateModel model peer identify services modules blueprints = moduleDict = modules |> List.map (\m -> ( m.name, m )) |> Dict.fromList + moduleDictByHash = + modules |> List.map (\m -> ( m.hash, m )) |> Dict.fromList + blueprintDict = blueprints |> List.map (\b -> ( b.id, b )) |> Dict.fromList updatedModules = Dict.union moduleDict model.modules + updatedModulesByHash = + Dict.union moduleDictByHash model.modulesByHash + updatedBlueprints = Dict.union blueprintDict model.blueprints @@ -132,4 +138,4 @@ updateModel model peer identify services modules blueprints = updated = Dict.insert peer newData model.discoveredPeers in - { model | discoveredPeers = updated, modules = updatedModules, blueprints = updatedBlueprints } + { model | discoveredPeers = updated, modules = updatedModules, modulesByHash = updatedModulesByHash, blueprints = updatedBlueprints } diff --git a/src/index.ts b/src/index.ts index 369c2c3..b8c69eb 100644 --- a/src/index.ts +++ b/src/index.ts @@ -22,10 +22,11 @@ import { Node, dev, testNet } from '@fluencelabs/fluence-network-environment'; import { createClient, generatePeerId, Particle, sendParticle, subscribeToEvent } from '@fluencelabs/fluence'; import { Elm } from './Main.elm'; import * as serviceWorker from './serviceWorker'; +import {EventType, eventType} from "./types"; const relayIdx = 3; -const relays: Node[] = testNet; +const relays: Node[] = dev; // const relays: Node[] = dev; function genFlags(peerId: string): any { @@ -41,10 +42,10 @@ function event( name: string, peer: string, peers?: string[], - identify?: string[], + identify?: any, services?: any[], - blueprints?: string[], - modules?: string[], + modules?: any[], + blueprints?: any[], ) { if (!peers) { peers = null; @@ -67,10 +68,10 @@ function event( /* eslint-enable */ (async () => { - log.setLevel('silent') + log.setLevel('silent'); const pid = await generatePeerId(); const flags = genFlags(pid.toB58String()); - console.log("connect with client: " + pid.toB58String()) + console.log(`connect with client: ${pid.toB58String()}`); // If the relay is ever changed, an event shall be sent to elm const client = await createClient(relays[relayIdx].multiaddr, pid); @@ -90,7 +91,23 @@ function event( subscribeToEvent(client, 'event', 'all_info', (args, _tetraplets) => { try { - app.ports.eventReceiver.send(event('all_info', args[0], undefined, args[1], args[2], args[3], args[4])); + let peerId = args[0]; + let identify = args[1]; + let services = args[2]; + let blueprints = args[3]; + let modules = args[4]; + let eventRaw = { + peerId: peerId, + identify: identify, + services: services, + blueprints: blueprints, + modules: modules, + } + + const inputEventRaw: any = eventType.cast(eventRaw); + const inputEvent = inputEventRaw as EventType; + + app.ports.eventReceiver.send(event('all_info', inputEvent.peerId, undefined, inputEvent.identify, inputEvent.services, inputEvent.modules, inputEvent.blueprints)); } catch (err) { log.error('Elm eventreceiver failed: ', err); } @@ -108,7 +125,7 @@ function event( serviceWorker.unregister(); function setLogLevel(level: any) { - log.setLevel(level) + log.setLevel(level); } declare global { @@ -118,4 +135,4 @@ declare global { } } -window.setLogLevel = setLogLevel +window.setLogLevel = setLogLevel; diff --git a/src/script.ts b/src/script.ts deleted file mode 100644 index 016705c..0000000 --- a/src/script.ts +++ /dev/null @@ -1,93 +0,0 @@ -export const SCRIPT: string = ` -(seq - (call %init_peer_id% ("" "load") ["relayId"] relayId) - (seq - (call %init_peer_id% ("" "load") ["knownPeers"] knownPeers) - (seq - (call %init_peer_id% ("" "load") ["clientId"] clientId) - (par - (seq - (call relayId ("op" "identity") []) - (seq - (call relayId ("op" "identify") [] ident) - (seq - (call relayId ("dist" "get_blueprints") [] blueprints) - (seq - (call relayId ("dist" "get_modules") [] modules) - (seq - (call relayId ("srv" "get_interfaces") [] interfaces) - (seq - (call relayId ("op" "identity") []) - (call %init_peer_id% ("event" "all_info") [relayId ident interfaces blueprints modules]) - ) - ) - ) - ) - ) - ) - (par - (fold knownPeers p - (par - (seq - (call p ("op" "identity") []) - (seq - (call p ("op" "identify") [] ident) - (seq - (call p ("dist" "get_blueprints") [] blueprints) - (seq - (call p ("dist" "get_modules") [] modules) - (seq - (call p ("srv" "get_interfaces") [] interfaces) - (seq - (call relayId ("op" "identity") []) - (call %init_peer_id% ("event" "all_info") [p ident interfaces blueprints modules]) - ) - ) - ) - ) - ) - ) - (next p) - ) - ) - (seq - (call relayId ("op" "identity") []) - (seq - (call relayId ("dht" "neighborhood") [clientId] neigh) - (fold neigh n - (par - (seq - (call n ("dht" "neighborhood") [clientId] moreNeigh) - (fold moreNeigh mp - (par - (seq - (call mp ("op" "identify") [] ident) - (seq - (call mp ("dist" "get_blueprints") [] blueprints) - (seq - (call mp ("dist" "get_modules") [] modules) - (seq - (call mp ("srv" "get_interfaces") [] interfaces) - (seq - (call relayId ("op" "identity") []) - (call %init_peer_id% ("event" "all_info") [mp ident interfaces blueprints modules]) - ) - ) - ) - ) - ) - (next mp) - ) - ) - ) - (next n) - ) - ) - ) - ) - ) - ) - ) - ) -) -` \ No newline at end of file diff --git a/src/types.ts b/src/types.ts new file mode 100644 index 0000000..8cd4e32 --- /dev/null +++ b/src/types.ts @@ -0,0 +1,91 @@ +import { object, number, string, array, SchemaOf, boolean } from "yup"; + +export const service: SchemaOf = object({ + id: string().required(), + owner_id: string().required(), + blueprint_id: string().required(), +}); + +export const blueprint: SchemaOf = object({ + dependencies: array(string()).required(), + id: string().required(), + name: string().required(), + facade: string().nullable().notRequired(), +}); + +export const identify: SchemaOf = object({ + external_addresses: array(string()).required(), +}); + +export const wasi: SchemaOf = object({ + envs: object().notRequired().nullable(), + mapped_dirs: object().notRequired().nullable(), + preopened_files: array(string()).notRequired().nullable(), +}) + +export const config: SchemaOf = object({ + logger_enabled: boolean().notRequired().nullable(), + logging_mask: object().notRequired().nullable(), + mem_pages_count: number().notRequired().nullable(), + mounted_binaries: object().notRequired().nullable(), + wasi: wasi.notRequired().nullable(), +}) + +export const module: SchemaOf = object({ + config: config.required(), + hash: string().required(), + name: string().required(), +}) + +export const eventType: SchemaOf = object({ + peerId: string().required(), + identify: identify.required(), + services: array(service).required(), + blueprints: array(blueprint).required(), + modules: array(module).required(), +}) + +export interface Service { + blueprint_id: string; + id: string; + owner_id: string; +} + +export interface Blueprint { + dependencies: string[]; + facade?: any; + id: string; + name: string; +} + +export interface Wasi { + envs?: any; + mapped_dirs?: any; + preopened_files: any[]; +} + +export interface Config { + logger_enabled?: boolean; + logging_mask?: any; + mem_pages_count?: number; + mounted_binaries?: any; + wasi?: Wasi; +} + +export interface Module { + config: Config; + hash: string; + name: string; +} + +export interface Identify { + external_addresses: string[] +} + +export interface EventType { + peerId: string, + identify: Identify, + services: Service[], + blueprints: Blueprint[], + modules: Module[], +}