diff --git a/aqua/app.aqua b/aqua/app.aqua index 26e12bd..240c87a 100644 --- a/aqua/app.aqua +++ b/aqua/app.aqua @@ -4,11 +4,12 @@ service DashboardEvent("event"): collectPeerInfo(peer: PeerId, ident: Info, services: []Service, blueprints: []Blueprint, modules: []Module) collectServiceInterface(peer: PeerId, serviceId: string, interface: Interface) --- func collectServiceInterfaces(peer: Peer, services: []Service): --- on peer: --- for srv <- services par: --- info <- Srv.get_interface(srv.id) --- DashboardEvent.collectServiceInterface(peer, service.id, info.Interface) +func collectServiceInterfaces(peer: PeerId, services: []Service): + on peer: + for srv <- services par: + info <- Srv.get_interface(srv.id) + on %init_peer_id%: + DashboardEvent.collectServiceInterface(peer, srv.id, info.interface) func askAllAndSend(peer: PeerId): on peer: @@ -17,7 +18,7 @@ func askAllAndSend(peer: PeerId): modules <- Dist.list_modules() services <- Srv.list() DashboardEvent.collectPeerInfo(peer, ident, services, blueprints, modules) - -- collectServiceInterfaces(peer, services) + collectServiceInterfaces(peer, services) func findAndAskNeighboursSchema(relayPeerId: PeerId, clientId: PeerId): diff --git a/src/Main.elm b/src/Main.elm index f108db9..2b614a3 100644 --- a/src/Main.elm +++ b/src/Main.elm @@ -19,7 +19,7 @@ limitations under the License. import Browser exposing (Document) import Browser.Navigation as Navigation import Config exposing (Flags) -import Dict +import Dict exposing (Dict) import Model exposing (Model) import Msg exposing (Msg(..)) import Route @@ -56,6 +56,7 @@ init flags url key = , modules = Dict.empty , modulesByHash = Dict.empty , blueprints = Dict.empty + , services = Dict.empty , toggledInterface = Nothing , knownPeers = flags.knownPeers , isInitialized = False diff --git a/src/Model.elm b/src/Model.elm index 092233c..55d8e80 100644 --- a/src/Model.elm +++ b/src/Model.elm @@ -55,6 +55,7 @@ type alias Model = , modules : Dict String Module , modulesByHash : Dict String Module , blueprints : Dict String Blueprint + , services : Dict String Service , toggledInterface : Maybe String , knownPeers : List String , isInitialized : Bool diff --git a/src/Port.elm b/src/Port.elm index 8058fa8..5144799 100644 --- a/src/Port.elm +++ b/src/Port.elm @@ -5,13 +5,20 @@ import Dict exposing (Dict) import Json.Encode exposing (Value) import Modules.Model exposing (Module) import Nodes.Model exposing (Identify) -import Service.Model exposing (Service) +import Service.Model exposing (Interface, Service) + + +type alias ServiceInfo = + { id : String + , blueprint_id : String + , owner_id : String + } type alias CollectPeerInfo = { peerId : String , identify : Maybe Identify - , services : Maybe (List Service) + , services : Maybe (List ServiceInfo) , modules : Maybe (List Module) , blueprints : Maybe (List Blueprint) } @@ -20,30 +27,10 @@ type alias CollectPeerInfo = port collectPeerInfo : (CollectPeerInfo -> msg) -> Sub msg -type alias FunctionSignature = - { arguments : List String - , name : String - , output_types : List String - } - - -type alias RecordType = - { fields : List String - , id : Int - , name : String - } - - -type alias ServiceInterface = - { function_signatures : List FunctionSignature - , record_types : List RecordType - } - - type alias CollectServiceInterface = - { blueprint_id : String + { peer_id : String , service_id : String - , interface : ServiceInterface + , interface : Interface } diff --git a/src/Service/Model.elm b/src/Service/Model.elm index 38d3102..492d6e4 100644 --- a/src/Service/Model.elm +++ b/src/Service/Model.elm @@ -25,4 +25,10 @@ type alias Service = { id : String , blueprint_id : String , owner_id : String + , interface : Maybe Interface } + + +setInterface : Interface -> Service -> Service +setInterface interface service = + { service | interface = Just interface } diff --git a/src/Update.elm b/src/Update.elm index 66bbe07..20360e1 100644 --- a/src/Update.elm +++ b/src/Update.elm @@ -27,7 +27,7 @@ import Msg exposing (..) import Nodes.Model exposing (Identify) import Port exposing (getAll) import Route exposing (getAllCmd) -import Service.Model exposing (Service) +import Service.Model exposing (Service, setInterface) import Url @@ -55,13 +55,34 @@ update msg model = Browser.External href -> ( model, Nav.load href ) - CollectServiceInterface { blueprint_id, service_id, interface } -> - ( model, Cmd.none ) + CollectServiceInterface { peer_id, service_id, interface } -> + let + service = + Dict.get service_id model.services + + updatedServices = + Dict.update service_id (Maybe.map (setInterface interface)) model.services + + newModel = + { model | services = updatedServices } + in + ( newModel, Cmd.none ) CollectPeerInfo { peerId, identify, services, modules, blueprints } -> let + fromServiceInfo = + \si -> + { id = si.id + , blueprint_id = si.blueprint_id + , owner_id = si.owner_id + , interface = Nothing + } + + servicesCorrectType = + services |> Maybe.map (List.map fromServiceInfo) + updated = - Maybe.map4 (updateModel model peerId) identify services modules blueprints + Maybe.map4 (updateModel model peerId) identify servicesCorrectType modules blueprints updatedModel = withDefault model updated @@ -98,6 +119,9 @@ updateModel model peer identify services modules blueprints = data = Maybe.withDefault emptyPeerData (Dict.get peer model.discoveredPeers) + servicesDict = + services |> List.map (\m -> ( m.id, m )) |> Dict.fromList + moduleDict = modules |> List.map (\m -> ( m.name, m )) |> Dict.fromList @@ -117,9 +141,15 @@ updateModel model peer identify services modules blueprints = Dict.union blueprintDict model.blueprints newData = - { data | identify = identify, services = services, modules = Dict.keys moduleDict, blueprints = Dict.keys blueprintDict } + { data | identify = identify, modules = Dict.keys moduleDict, blueprints = Dict.keys blueprintDict } updated = Dict.insert peer newData model.discoveredPeers in - { model | discoveredPeers = updated, modules = updatedModules, modulesByHash = updatedModulesByHash, blueprints = updatedBlueprints } + { model + | discoveredPeers = updated + , services = servicesDict + , modules = updatedModules + , modulesByHash = updatedModulesByHash + , blueprints = updatedBlueprints + } diff --git a/src/_aqua/app.js b/src/_aqua/app.js index c65cb84..b11f02a 100644 --- a/src/_aqua/app.js +++ b/src/_aqua/app.js @@ -10,6 +10,92 @@ import { RequestFlowBuilder } from '@fluencelabs/fluence/dist/api.unstable'; +export async function collectServiceInterfaces(client, peer, services) { + let request; + const promise = new Promise((resolve, reject) => { + request = new RequestFlowBuilder() + .disableInjections() + .withRawScript( + ` +(xor + (seq + (seq + (seq + (seq + (call %init_peer_id% ("getDataSrv" "-relay-") [] -relay-) + (call %init_peer_id% ("getDataSrv" "peer") [] peer) + ) + (call %init_peer_id% ("getDataSrv" "services") [] services) + ) + (call -relay- ("op" "identity") []) + ) + (xor + (fold services srv + (par + (seq + (call peer ("srv" "get_interface") [srv.$.id!] info) + (xor + (call %init_peer_id% ("event" "collectServiceInterface") [peer srv.$.id! info.$.interface!]) + (seq + (call -relay- ("op" "identity") []) + (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 1]) + ) + ) + ) + (seq + (seq + (seq + (call -relay- ("op" "identity") []) + (next srv) + ) + (call -relay- ("op" "identity") []) + ) + (call %init_peer_id% ("op" "identity") []) + ) + ) + ) + (seq + (seq + (call -relay- ("op" "identity") []) + (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 2]) + ) + (call -relay- ("op" "identity") []) + ) + ) + ) + (seq + (call -relay- ("op" "identity") []) + (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.onEvent('errorHandlingSrv', 'error', (args) => { + // assuming error is the single argument + const [err] = args; + reject(err); + }); + }) + .handleScriptError(reject) + .handleTimeout(() => { + reject('Request timed out for collectServiceInterfaces'); + }) + .build(); + }); + await client.initiateFlow(request); + return Promise.race([promise, Promise.resolve()]); +} + + + export async function askAllAndSend(client, peer) { let request; const promise = new Promise((resolve, reject) => { @@ -23,33 +109,74 @@ export async function askAllAndSend(client, peer) { (seq (seq (seq - (call %init_peer_id% ("getDataSrv" "-relay-") [] -relay-) - (call %init_peer_id% ("getDataSrv" "peer") [] peer) + (seq + (seq + (call %init_peer_id% ("getDataSrv" "-relay-") [] -relay-) + (call %init_peer_id% ("getDataSrv" "peer") [] peer) + ) + (call -relay- ("op" "identity") []) + ) + (xor + (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) + ) + (seq + (call -relay- ("op" "identity") []) + (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 1]) + ) + ) ) (call -relay- ("op" "identity") []) ) - (xor - (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) - ) - (seq - (call -relay- ("op" "identity") []) - (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 1]) - ) - ) + (call %init_peer_id% ("event" "collectPeerInfo") [peer ident services blueprints modules]) ) (call -relay- ("op" "identity") []) ) - (call %init_peer_id% ("event" "collectPeerInfo") [peer ident services blueprints modules]) + (xor + (fold services srv + (par + (seq + (call peer ("srv" "get_interface") [srv.$.id!] info) + (xor + (call %init_peer_id% ("event" "collectServiceInterface") [peer srv.$.id! info.$.interface!]) + (seq + (call -relay- ("op" "identity") []) + (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 2]) + ) + ) + ) + (seq + (seq + (seq + (call -relay- ("op" "identity") []) + (next srv) + ) + (call -relay- ("op" "identity") []) + ) + (call %init_peer_id% ("op" "identity") []) + ) + ) + ) + (seq + (seq + (call -relay- ("op" "identity") []) + (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 3]) + ) + (call -relay- ("op" "identity") []) + ) + ) + ) + (seq + (call -relay- ("op" "identity") []) + (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 4]) ) - (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 2]) ) `, @@ -109,25 +236,60 @@ export async function findAndAskNeighboursSchema(client, relayPeerId, clientId) (seq (seq (seq - (xor + (seq (seq - (seq + (xor (seq - (call n2 ("peer" "identify") [] ident) - (call n2 ("dist" "list_blueprints") [] blueprints) + (seq + (seq + (call n2 ("peer" "identify") [] ident) + (call n2 ("dist" "list_blueprints") [] blueprints) + ) + (call n2 ("dist" "list_modules") [] modules) + ) + (call n2 ("srv" "list") [] services) + ) + (seq + (call -relay- ("op" "identity") []) + (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 1]) + ) + ) + (call -relay- ("op" "identity") []) + ) + (call n ("event" "collectPeerInfo") [n2 ident services blueprints modules]) + ) + (xor + (fold services srv + (par + (seq + (call n2 ("srv" "get_interface") [srv.$.id!] info) + (xor + (call %init_peer_id% ("event" "collectServiceInterface") [n2 srv.$.id! info.$.interface!]) + (seq + (call -relay- ("op" "identity") []) + (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 2]) + ) + ) + ) + (seq + (seq + (seq + (call -relay- ("op" "identity") []) + (next srv) + ) + (call -relay- ("op" "identity") []) + ) + (call %init_peer_id% ("op" "identity") []) ) - (call n2 ("dist" "list_modules") [] modules) ) - (call n2 ("srv" "list") [] services) ) (seq (call -relay- ("op" "identity") []) - (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 1]) + (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 3]) ) ) - (call -relay- ("op" "identity") []) ) - (call n ("event" "collectPeerInfo") [n2 ident services blueprints modules]) + (call -relay- ("op" "identity") []) ) (next n2) ) @@ -135,7 +297,7 @@ export async function findAndAskNeighboursSchema(client, relayPeerId, clientId) ) (seq (call -relay- ("op" "identity") []) - (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 2]) + (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 4]) ) ) (seq @@ -154,7 +316,7 @@ export async function findAndAskNeighboursSchema(client, relayPeerId, clientId) (seq (seq (call -relay- ("op" "identity") []) - (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 3]) + (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 5]) ) (call -relay- ("op" "identity") []) ) @@ -162,7 +324,7 @@ export async function findAndAskNeighboursSchema(client, relayPeerId, clientId) ) (seq (call -relay- ("op" "identity") []) - (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 4]) + (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 6]) ) ) @@ -214,31 +376,6 @@ export async function getAll(client, relayPeerId, knownPeers) { (par (seq (seq - (seq - (call -relay- ("op" "identity") []) - (xor - (seq - (seq - (seq - (call relayPeerId ("peer" "identify") [] ident) - (call relayPeerId ("dist" "list_blueprints") [] blueprints) - ) - (call relayPeerId ("dist" "list_modules") [] modules) - ) - (call relayPeerId ("srv" "list") [] services) - ) - (seq - (call -relay- ("op" "identity") []) - (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 1]) - ) - ) - ) - (call -relay- ("op" "identity") []) - ) - (call %init_peer_id% ("event" "collectPeerInfo") [relayPeerId ident services blueprints modules]) - ) - (fold knownPeers peer - (par (seq (seq (seq @@ -247,26 +384,133 @@ export async function getAll(client, relayPeerId, knownPeers) { (seq (seq (seq - (call peer ("peer" "identify") [] ident0) - (call peer ("dist" "list_blueprints") [] blueprints0) + (call relayPeerId ("peer" "identify") [] ident) + (call relayPeerId ("dist" "list_blueprints") [] blueprints) ) - (call peer ("dist" "list_modules") [] modules0) + (call relayPeerId ("dist" "list_modules") [] modules) ) - (call peer ("srv" "list") [] services0) + (call relayPeerId ("srv" "list") [] services) ) + (seq + (call -relay- ("op" "identity") []) + (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 1]) + ) + ) + ) + (call -relay- ("op" "identity") []) + ) + (call %init_peer_id% ("event" "collectPeerInfo") [relayPeerId ident services blueprints modules]) + ) + (call -relay- ("op" "identity") []) + ) + (xor + (fold services srv + (par + (seq + (call relayPeerId ("srv" "get_interface") [srv.$.id!] info) + (xor + (call %init_peer_id% ("event" "collectServiceInterface") [relayPeerId srv.$.id! info.$.interface!]) (seq (call -relay- ("op" "identity") []) (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 2]) ) ) ) - (call -relay- ("op" "identity") []) + (seq + (seq + (seq + (call -relay- ("op" "identity") []) + (next srv) + ) + (call -relay- ("op" "identity") []) + ) + (call %init_peer_id% ("op" "identity") []) + ) ) - (call %init_peer_id% ("event" "collectPeerInfo") [peer ident0 services0 blueprints0 modules0]) ) - (next peer) + (seq + (call -relay- ("op" "identity") []) + (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 3]) + ) ) ) + (seq + (seq + (seq + (call -relay- ("op" "identity") []) + (fold knownPeers peer + (par + (seq + (seq + (seq + (seq + (seq + (call -relay- ("op" "identity") []) + (xor + (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) + ) + (seq + (call -relay- ("op" "identity") []) + (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 4]) + ) + ) + ) + (call -relay- ("op" "identity") []) + ) + (call %init_peer_id% ("event" "collectPeerInfo") [peer ident0 services0 blueprints0 modules0]) + ) + (call -relay- ("op" "identity") []) + ) + (xor + (fold services0 srv0 + (par + (seq + (call peer ("srv" "get_interface") [srv0.$.id!] info0) + (xor + (call %init_peer_id% ("event" "collectServiceInterface") [peer srv0.$.id! info0.$.interface!]) + (seq + (call -relay- ("op" "identity") []) + (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 5]) + ) + ) + ) + (seq + (seq + (seq + (call -relay- ("op" "identity") []) + (next srv0) + ) + (call -relay- ("op" "identity") []) + ) + (call %init_peer_id% ("op" "identity") []) + ) + ) + ) + (seq + (call -relay- ("op" "identity") []) + (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 6]) + ) + ) + ) + (seq + (call -relay- ("op" "identity") []) + (next peer) + ) + ) + ) + ) + (call -relay- ("op" "identity") []) + ) + (call %init_peer_id% ("op" "identity") []) + ) ) ) (call -relay- ("op" "identity") []) @@ -283,25 +527,60 @@ export async function getAll(client, relayPeerId, knownPeers) { (seq (seq (seq - (xor + (seq (seq - (seq + (xor (seq - (call n2 ("peer" "identify") [] ident1) - (call n2 ("dist" "list_blueprints") [] blueprints1) + (seq + (seq + (call n2 ("peer" "identify") [] ident1) + (call n2 ("dist" "list_blueprints") [] blueprints1) + ) + (call n2 ("dist" "list_modules") [] modules1) + ) + (call n2 ("srv" "list") [] services1) + ) + (seq + (call -relay- ("op" "identity") []) + (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 7]) + ) + ) + (call -relay- ("op" "identity") []) + ) + (call n ("event" "collectPeerInfo") [n2 ident1 services1 blueprints1 modules1]) + ) + (xor + (fold services1 srv1 + (par + (seq + (call n2 ("srv" "get_interface") [srv1.$.id!] info1) + (xor + (call %init_peer_id% ("event" "collectServiceInterface") [n2 srv1.$.id! info1.$.interface!]) + (seq + (call -relay- ("op" "identity") []) + (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 8]) + ) + ) + ) + (seq + (seq + (seq + (call -relay- ("op" "identity") []) + (next srv1) + ) + (call -relay- ("op" "identity") []) + ) + (call %init_peer_id% ("op" "identity") []) ) - (call n2 ("dist" "list_modules") [] modules1) ) - (call n2 ("srv" "list") [] services1) ) (seq (call -relay- ("op" "identity") []) - (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 3]) + (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 9]) ) ) - (call -relay- ("op" "identity") []) ) - (call n ("event" "collectPeerInfo") [n2 ident1 services1 blueprints1 modules1]) + (call -relay- ("op" "identity") []) ) (next n2) ) @@ -309,7 +588,7 @@ export async function getAll(client, relayPeerId, knownPeers) { ) (seq (call -relay- ("op" "identity") []) - (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 4]) + (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 10]) ) ) (seq @@ -328,7 +607,7 @@ export async function getAll(client, relayPeerId, knownPeers) { (seq (seq (call -relay- ("op" "identity") []) - (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 5]) + (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 11]) ) (call -relay- ("op" "identity") []) ) @@ -336,7 +615,7 @@ export async function getAll(client, relayPeerId, knownPeers) { ) (seq (call -relay- ("op" "identity") []) - (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 6]) + (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 12]) ) )