aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authors-ol <s-ol@users.noreply.github.com>2020-07-08 15:30:03 +0000
committers-ol <s+removethis@s-ol.nu>2025-03-02 14:24:49 +0000
commit07e2ec3155e027700e7b2e859fccd66766fbf1f8 (patch)
tree0a918081758db9be2322ec1223db1f4846213304
parent(unecessarily) store util/switch index in state (diff)
downloadalive-07e2ec3155e027700e7b2e859fccd66766fbf1f8.tar.gz
alive-07e2ec3155e027700e7b2e859fccd66766fbf1f8.zip
add editor-support UDP server
-rw-r--r--alv/copilot/base.moon8
-rw-r--r--alv/copilot/cli.moon2
-rw-r--r--alv/copilot/udp.moon73
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
+}