-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathmailbox.bash
81 lines (71 loc) · 1.6 KB
/
mailbox.bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#!/usr/bin/env bash
mailbox::create() {
local location=$1
if [ -e "$location" ];then
return 1
fi
mkdir -p "$location"
mkfifo "$location/knock"
mkdir "$location/requests"
mkdir "$location/responses"
}
mailbox::send() {
local location=$1
local -n _output_var=$2
local msg=$3
local id="$BASHPID.$RANDOM"
echo -n "$msg" > "$location/requests/$id"
# shellcheck disable=SC2034
_output_var="$id"
}
mailbox::receive() {
local location=$1
local id=$2
local timeout=${3:-30}
while true;do
for ((t=0;t<timeout*10;t++));do
if [ -e "$location/responses/$id" ];then
cat "$location/responses/$id"
rm "$location/responses/$id"
return 0
fi
sleep .1
done
done
return 1
}
mailbox::serve() {
local location=$1
local handler=$2
while true;do
read -r < "$location/knock"
mailbox::_handle_all "$location" "$handler"
done
}
mailbox::handle_all() {
for request in "$location/requests"/*;do
if ! [ -f "$request" ];then
continue
fi
mailbox::handle "$location" "$handler" "${request##$location/requests/}"
done
}
mailbox::handle() {
local location=$1
local handler=$2
local request=$3
$handler < "$location/requests/$request" > "$location/responses/$request"
}
mailbox_test::_echo_srv() {
local msg
read -r msg
echo "$msg"
}
mailbox_test::messaging() {
import tmp
local
tmp::create_dir
}
mailbox_test::all() {
unit::test mailbox_test::handler
}