Делите атом между Clojure и Clojurescript?

Предположим, у меня есть пространство имен Clojurescript с именем main с атомом внутри него, называемым состоянием.

(ns main)

(atom state nil)

Я компилирую приложение Clojurescript, запускаю его на сервере, запускаю ответ Clojurescript и затем подключаюсь к своему серверу с помощью браузера. Все работает денди.

В ответе Clojurescript я могу подтвердить обычный

> (+ 1 1) 
2
> (js/alert "Hey there") //shows an alert dialog with "Hey there" in the browser
nil
> main.state
(atom nil)

Ответ Clojurescript отлично подходит для разработки. Итак, ясно, что я могу получить и (используя swap! Или reset!) Установить значение атома Clojurescript из приложения Clojure. Мне было интересно, есть ли способ установить связь между значением атома в моем проекте Clojurescript и работающим приложением Clojure. Возможно, клиент Clojurescript подключается к указанному порту и отправляет результат на какой-то сервер Clojure, ожидающий этого порта. Проще говоря, мне было интересно, возможно ли, чтобы работающее серверное приложение разделяло значение state клиентского атома.

Почему, спросите вы? Ну, я подумал, что было бы неплохо записывать значение атома state в фактический файл (state.clj) всякий раз, когда state изменяется в работающем приложении Clojurescript. Таким образом, я всегда мог видеть текущее значение state. Я мог бы использовать что-то вроде emacs (global-auto-revert-mode t), чтобы убедиться, что буфер state.clj всегда был достаточно свежим. Это немного похоже на отладчик.

Кроме того, мое настоящее желание - сделать так, чтобы работающее приложение Clojure также периодически опрашивало сам state.clj. Когда сервер обнаруживает, что я изменил state.clj, он примет изменение как новое значение атома Clojurescript state. Затем он будет делать что-то вроде того, что делает повтор Clojurescript, проиллюстрированный в следующем псевдокоде:

(send-to-client-for-evaluation
  (compile-into-js 
    (reset! 
      main.state 
      the-read-string-value-of-the-content-of-state.clj)))

По сути, я хочу, чтобы сервер имел что-то вроде общего атома между клиентом и сервером. Я хочу, чтобы значение state распределялось между клиентом и сервером двунаправленно. Возможно ли это, или я просто мечтаю?


person Stephen Cagle    schedule 18.10.2012    source источник


Ответы (1)


Конечно, просто сделайте запросы к API отдыха, отправляющему данные в формате EDN, и вуаля! Если вы хотите избежать опроса, рассмотрите возможность запуска Jetty или Tomcat за экземпляром Nginx, чтобы использовать Nginx HTTP Push Module . У меня есть несколько запутанный пример здесь (это был pre-ClojureScript, поэтому я написал клиент на простом JS) . Также есть gifsockets.

person rplevy    schedule 18.10.2012