diff options
| author | s-ol <s-ol@users.noreply.github.com> | 2020-07-08 15:30:03 +0000 |
|---|---|---|
| committer | s-ol <s+removethis@s-ol.nu> | 2025-03-02 14:24:49 +0000 |
| commit | 07e2ec3155e027700e7b2e859fccd66766fbf1f8 (patch) | |
| tree | 0a918081758db9be2322ec1223db1f4846213304 | |
| parent | (unecessarily) store util/switch index in state (diff) | |
| download | alive-07e2ec3155e027700e7b2e859fccd66766fbf1f8.tar.gz alive-07e2ec3155e027700e7b2e859fccd66766fbf1f8.zip | |
add editor-support UDP server
| -rw-r--r-- | alv/copilot/base.moon | 8 | ||||
| -rw-r--r-- | alv/copilot/cli.moon | 2 | ||||
| -rw-r--r-- | alv/copilot/udp.moon | 73 |
3 files changed, 81 insertions, 2 deletions
diff --git a/alv/copilot/base.moon b/alv/copilot/base.moon index f7dc00a..fcd1ff4 100644 --- a/alv/copilot/base.moon +++ b/alv/copilot/base.moon @@ -9,7 +9,7 @@ import Error from require 'alv.error' import RTNode from require 'alv.rtnode' import Constant from require 'alv.result' -parse_args = (args, out={}) -> +parse_args = (args, out={ 'udp-server': false }) -> local key for a in *args if key @@ -40,6 +40,10 @@ class Copilot @last_modules = {} @open @args[1] if @args[1] + if @args['udp-server'] + import UDPServer from require 'alv.copilot.udp' + @adapter = UDPServer @ + --- members -- @section members @@ -94,6 +98,8 @@ class Copilot --- poll for changes and tick. tick: => + @adapter\tick! if @adapter + assert not COPILOT, "another Copilot is already running!" return unless @last_modules.__root diff --git a/alv/copilot/cli.moon b/alv/copilot/cli.moon index ada6f31..e4e633a 100644 --- a/alv/copilot/cli.moon +++ b/alv/copilot/cli.moon @@ -15,7 +15,7 @@ class ColorLogger extends Logger class CLICopilot extends Copilot new: (arg) => - super parse_args arg, { nocolor: false } + super parse_args arg, { nocolor: false, 'udp-server': false } assert @args[1], "no filename given" run: => diff --git a/alv/copilot/udp.moon b/alv/copilot/udp.moon new file mode 100644 index 0000000..3151f1c --- /dev/null +++ b/alv/copilot/udp.moon @@ -0,0 +1,73 @@ +import udp from require 'socket' +import encode, decode from require 'dkjson' +import fn_invoke, op_invoke from require 'alv.invoke' + +encode_res = (copilot) => + return unless @ + + { + metatype: @metatype + value: @value + updated: @updated + type: tostring @type + } + +class UDPServer + new: (@copilot) => + @sock = udp! + @sock\settimeout 0 + assert @sock\setsockname '0.0.0.0', 37123 + + tick: => + while true + msg, ip, port = @sock\receivefrom! + break unless msg + + client = { :ip, :port } + res = if msg = decode msg + @handle msg, client + else + error: 'invalid message' + @sock\sendto (encode res), ip, port + + handle: (msg, client) => + res = { id: msg.id } + switch msg.type + when 'tick' + res.tick = @copilot.T + -- when 'sub' + -- @subs[client] = true + -- res.ok = true + -- when 'unsub' + -- @subs[client] = nil + -- res.ok = true + when 'modules' + res.modules = [name for name in pairs @copilot.last_modules] + when 'info' + mod = @copilot.last_modules[msg.module or '__root'] + builtin = mod.registry\last msg.tag + if builtin and builtin.__class.__name ~= 'DummyReg' + res.head_meta = builtin.head.meta + res.result = encode_res builtin.node.result + res.kind = switch builtin.__class + when op_invoke then 'op' + when fn_invoke then 'fn' + else 'builtin' + else + res.error = 'not_registered' + when 'state' + mod = @copilot.last_modules[msg.module or '__root'] + builtin = mod.registry\last msg.tag + if builtin and builtin.__class.__name ~= 'DummyReg' + res.value = encode_res builtin.node.result, @copilot + if op = builtin.op + res.state = op.state + else + res.error = 'not_registered' + else + res.error = 'unknown_type' + return res + +{ + :UDPServer +} |
