]> 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
6 IN: modules.rpc-server
7
8 SYMBOL: serving-vocabs V{ } clone serving-vocabs set-global
9
10 : do-rpc ( args word -- bytes )
11    [ execute ] curry with-datastack object>bytes ; inline
12
13 MEMO: mem-do-rpc ( args word -- bytes ) do-rpc ; inline
14
15 : process ( vocabspec -- ) vocab-words [ deserialize ] dip deserialize
16    swap at "executer" get execute( args word -- bytes ) write flush ;
17
18 : (serve) ( -- ) deserialize dup serving-vocabs get-global index
19    [ process ] [ drop ] if ;
20
21 : start-serving-vocabs ( -- ) [
22    <threaded-server> 5000 >>insecure binary >>encoding [ (serve) ] >>handler
23    start-server ] in-thread ;
24
25 : (service) ( -- ) serving-vocabs get-global empty? [ start-serving-vocabs ] when
26    current-vocab serving-vocabs get-global adjoin
27    "get-words" create-in
28    in get [ vocab vocab-words [ stack-effect ] { } assoc-map-as ] curry
29    (( -- words )) define-inline ;
30
31 SYNTAX: service \ do-rpc  "executer" set (service) ;
32 SYNTAX: mem-service \ mem-do-rpc "executer" set (service) ;
33
34 load-vocab-hook [
35    [ dup words>> values
36    \ mem-do-rpc "memoize" word-prop [ delete-at ] curry each ]
37 append ] change-global