Progress report 
- Clean-up
- has been done once long ago
- Documentation
- Error handling
- On error, Julia server sends error message & stack trace (which are parsed by LabVIEW), and continues to run
- In LabVIEW code, all checks I could think of
- Returning binary data
- Utilities to encode/decode some common data types to binary data (arrays of different floats and integer types)
- Data sent as byte array, corresponding data descriptors withing JSON data
- Arrays of most numeric types (namely intersecting set of LV and Julia supported types):
- Float32, Float64 and respective Complex
- Signed and unsigned integer 8, 16, 32, and 64 bit
- Boolean (which is not a numeric type in LV)
- 1, 2, and 3-dimensional arrays (those are different types in LV)
- RGB Images (8 bit/ch.)
- TODO grayscale images; stacks of images
- Timeouts
- LabVIEW server and Julia client
- TODO - shouldnāt be difficult now
On LabVIEW, usage looks like following:
Sending data (2 arrays, 2 scalar arguments):

Receiving processed data (2 arrays, one scalar value):

On Julia side, user provides a script file like following:
function foo(;arg1, arg2_string, arg3_arr_Cx32, arg4_arr_i16)
# doing some stuff, e.g. check if we got the right data type
@assert typeof(arg3_arr_Cx32) == Array{Complex{Float32},2}
@assert typeof(arg4_arr_i16) == Vector{Int16}
# some more stuff
# get data to return, e.g.
resp1 = rand()
resp_arr_I32 = Int32.(vcat(arg4_arr_i16, [1,2,3]))
resp_arr_F64 = arg1.*abs.(vec(arg3_arr_Cx32)) .+ sqrt(2)
return (;resp1, bigarrs=(;resp_arr_I32, resp_arr_F64))
end
function bar(;kwargs...)
# doing some stuff
end
fns = (;foo, bar)
Path to this script to be passed to LabVIEW, which starts Julia server and passes user functions to it.
P.S. LabVIEW is statically typed, which means a lot of boilerplate 
P.P.S. Thanks a due to Covid-19 pandemic, which provided me with sufficient spare time.