implementation - modrpc/info GitHub Wiki
considerations
Context
executable
runtime
-
nodeinfo mgt
- self info (lib/node)
- other node info (lib/node)
- nodename -> {rpcaddr, live}
-
module mgt
- each module is a resource mgr
- has wrappers for resource access
- has dynamic argument type checking
- each module is a resource mgr
-
rpc call/return
- rpc basedef (lib/rpcdef)
- call dispatcher (lib/callret)
-
node smurf mgt
- add node (onboarding, accesses w/ source-node/addr)
- simple builtin query
- device mgt function
- nodes in a device (CRUD)
- modules in a node (CRUD)
-
node deployment
system modules
-
wrap node smuft mgt (enabled/disabled)
-
system module #1: node deployer
- node deploy function wrappers (so that RPC can access them)
module compiler
- .mgo -> .go transformation
- server-side code gen (to be imported)
- client-side code gen (to be imported)
node deployer (lib/deploy)
- generate: driver/scaffolding code
- main.go
- all deployment-time customization code
- register.go (for modules)
- registers modules
- registers resources to module
- import server-side code
- import client-side code
- registers modules
- main.go
- invoke "go compile"
=======================================================================================
[mg_runtime]
0. Handles to runtime data structures
- MGRT_RPCAddr
- MGRT_Device
- MGRT_Module
- MGRT_Resource
1. node info
a. self info
- MGRT_Self() string
b. remote node table
- MGRT_LookupDevice("dev0")
- MGRT_AddDevice("dev1")
- MGRT_NewRPCAddr("192.168.8.192') MG_RPCAddr
- MGRT_RegisterDevice("dev1", addr MG_RPCAddr)
2. local modules
a. module CRUD
- MGRT_GetModule()
- MGRT_NewProp()
- MGRT_NewEvent()
- MGRT_NewFunc()
- MGRT_NewProc()
3. local resources
a. resource access
- MGRT_Call()
- MGRT_Return()
- MGRT_Cancel()
=======================================================================================
[mg_security]
a. MG_GetKey() key
=======================================================================================
[mg_resource]
1. registration (not for user)
a. module
- MG_RegisterModule("m0")
b. local resource
- MG_RegisterEvent("m0", "ev0")
- MG_RegisterTimer("m0", "t0", time)
- MG_RegisterProp("m0", "p0", R.GetPropF, R.SetPropF)
- MG_RegisterFunc("m0", "func", R.CallFuncF)
- MG_RegisterProc("m0", "proc", R.ProcF(startchan, stopchan, resumechan))
c. remote resource (proxy)
- MG_RegisterRemoteEvent("erdos:ev0") (or MG_Subscribe)
2. resource access (user)
a. local resource
- MG_Get("erdos:m0", "p0")
- MG_Set("erdos:m0", "p0", 3.14)
- MG_Call(".", "SaveState", GetTime()) retval
- MG_Fire("ev0", value)
- MG_Wait("ev1") value
- MG_Run(".", "proc0")
- MG_Stop(".", "proc0")
- MG_Resume(".", "proc0")
- MG_Quit(".", "proc0")
- MG_Save(".", "proc0", "savename") // save what? values @which time?, if midstate
- MG_Restore(".", "proc0", "restorename")
b. remote resource
- MG_Wait("erdos:ev0") value
3.
===
* Notion of primitives; mg_prim.go; then customize/call it
====
[initiation]
* server
- register.go
- import S0 "github.com/modgo/mods/counter/impl"
- func RegisterModules() {
S0.Register("custom data")
}
- main.go
* client
- my code.go
[callout flow]
* MG_Call("erdos:m0", "foo", 10)
- CODEGEN:
- import X0 "github.com/modgo/mods/counter/export"
- X0.type decls included
- // binding time when (1) compile-time (2) node smurf deploy time (3) run-time
- X0.BindDevice("erdos", "m0")
- ??? C0.foo(arg)
- X0.foo(arg) {
// should be bound already
if Unbound() error()
retval := MGRT_FuncCall("erdos", "m0", "foo", arg)
}
- CODEGEN: retval := MGRT_FuncCall("erdos", "m0", "foo", 10)
- callret.FuncCall()
- calldata := outseq.Leave()
- m := ComposeMessage()
- outputQ <- m
- WaitCallid(calldata) // blocking wait
[callin flow]
* callret.dispatcher
- m := inq;
- res := getmod("m0").getresource(m.body.resource)
- res.Call(tok, m.Body.Args)
- f.callf(args)
- argument type checking(?)
- import X0 "github.com/devel/mods/counter"
- MG_FooWrapper(args) {
at := args.{X0.Type}
}