]> gitweb.factorcode.org Git - factor.git/blob - unmaintained/modules/rpc-server/rpc-server.factor
Merge branch 'master' of git://factorcode.org/git/factor
[factor.git] / unmaintained / modules / rpc-server / rpc-server.factor
1 USING: accessors assocs continuations effects io
2 io.encodings.binary io.servers.connection kernel
3 memoize namespaces parser sets sequences serialize
4 threads vocabs vocabs.parser words ;
5 IN: modules.rpc-server
6
7 SYMBOL: serving-vocabs V{ } clone serving-vocabs set-global
8
9 : do-rpc ( args word -- bytes )
10     [ execute ] curry with-datastack object>bytes ; inline
11
12 MEMO: mem-do-rpc ( args word -- bytes ) do-rpc ; inline
13
14 : process ( vocabspec -- )
15     vocab-words [ deserialize ] dip deserialize
16     swap at "executer" get execute( args word -- bytes ) write flush ;
17
18 : (serve) ( -- )
19     deserialize dup serving-vocabs get-global index
20     [ process ] [ drop ] if ;
21
22 : start-serving-vocabs ( -- )
23     [
24         binary <threaded-server>
25         5000 >>insecure
26         [ (serve) ] >>handler
27         start-server
28     ] in-thread ;
29
30 : (service) ( -- )
31     serving-vocabs get-global empty? [ start-serving-vocabs ] when
32     current-vocab serving-vocabs get-global adjoin
33     "get-words" create-in
34     in get [ vocab vocab-words [ stack-effect ] { } assoc-map-as ] curry
35     (( -- words )) define-inline ;
36
37 SYNTAX: service \ do-rpc  "executer" set (service) ;
38 SYNTAX: mem-service \ mem-do-rpc "executer" set (service) ;
39
40 load-vocab-hook [
41     [
42         dup words>> values
43         \ mem-do-rpc "memoize" word-prop [ delete-at ] curry each
44     ] append
45 ] change-global