-
Notifications
You must be signed in to change notification settings - Fork 18
/
Copy pathiracket.rkt
69 lines (61 loc) · 2.42 KB
/
iracket.rkt
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
#lang racket/base
(require racket/list
racket/contract
racket/sandbox
"./iracket-execute.rkt"
"./iracket-connect.rkt"
"./iracket-kernel-info.rkt"
"./iracket-complete.rkt"
(prefix-in ipy: "./ipython-message.rkt")
(prefix-in ipy: "./ipython-services.rkt")
(prefix-in ipy: "./ipython.rkt"))
(provide main)
(define (main config-file-path)
;; ipython hides stdout, but prints stderr, so this is for debugging
(current-output-port (current-error-port))
(display "Kernel starting.\n")
(define cfg (with-input-from-file config-file-path ipy:read-config))
(parameterize ([ipy:connection-key (ipy:config-key cfg)]
[sandbox-eval-limits (list #f #f)]
[sandbox-memory-limit 200]
[sandbox-propagate-exceptions #f]
[sandbox-namespace-specs (list sandbox-make-namespace 'file/convertible)]
[sandbox-path-permissions (list (list 'read "/"))])
(define e (make-evaluator '(begin) #:allow-for-require '(gamble gamble/viz)))
(ipy:call-with-services cfg (λ (services) (work cfg services e))))
(display "Kernel terminating.\n"))
(define (work cfg services e)
(define handlers (create-handlers cfg services e))
(let loop ()
(define-values (msg respond-to) (ipy:receive-request services))
(ipy:send-status services (ipy:message-header msg) 'busy)
(define-values (response shutdown?) (handle handlers msg))
(ipy:send-response services respond-to response)
(ipy:send-status services (ipy:message-header msg) 'idle)
(unless shutdown? (loop))))
(struct handlers
(execute
complete
connect
kernel-info
shutdown)
#:transparent)
(define (create-handlers cfg services e)
(handlers
(make-execute services e)
(λ (msg) (complete e msg))
(λ (_msg) (connect cfg))
(λ (_msg) kernel-info)
(λ (_msg) (hasheq 'restart #f))))
(define (handle handlers msg)
(define msg-type (ipy:header-msg-type (ipy:message-header msg)))
(define handler
(case msg-type
[(kernel_info_request) handlers-kernel-info]
[(connect_request) handlers-connect]
[(execute_request) handlers-execute]
[(complete_request) handlers-complete]
[(shutdown_request) handlers-shutdown]
[else (error (format "unknown message type: ~a" msg-type))]))
(values (ipy:make-response msg ((handler handlers) msg))
(eq? 'shutdown_request msg-type)))