These are chat archives for synrc/n2o

15th
Sep 2015
Namdak Tonpa
@5HT
Sep 15 2015 03:39
module.exports = {events:index};

var match = require("matches").pattern,
    bert  = require("../bert"),
    tuple = bert.tuple,
    atom  = bert.atom,
    bin   = bert.bin,
    wf    = require("../wf");

var index = match({

    'init' : function () {
        wf.reg('room'); },

    '["client",[sid,msg]]' : function (sid,msg) {
        wf.insert_bottom("history",
                "<span>"+sid+": "+msg+"</span>"); },

    '["chat",msg]' : function (msg) {
        wf.send('room',tuple(atom('client'),
                       tuple(bin(this.sid),bin(msg))))); }

});
n2o.js на node.js
Ilya Gorskin
@Revent
Sep 15 2015 05:09
@5HT переезд на ноду? :)
Namdak Tonpa
@5HT
Sep 15 2015 08:44
расширение горизонтов
чтобы и джаваскриптеры приконснулись к прекрасному
Ilya Gorskin
@Revent
Sep 15 2015 09:21
@5HT я туплю над kvs не понимаю хоть убей как добиться графов таких как например в digraph?
Namdak Tonpa
@5HT
Sep 15 2015 09:25
таких как например в digraph никто не обещал
Ilya Gorskin
@Revent
Sep 15 2015 09:33
то есть линков много к одному нет?
Yuriy Al. Shirokov
@yashrk
Sep 15 2015 11:20
Что-то всё никак не получается у меня с avz. Пример от @fycth у меня так и не завёлся (app id в конфиге указываю реальный, задаю его binary, а не строкой): , а мой пример со вроде-бы-таким-же кодом (выкинул только всю обработку, оставил только вывод событий в лог через wf:info/3) сыплет ошибками в лог:
Error in process <0.273.0> with exit value:
{[{reason,badarg},
  {mfa,{n2o_stream,websocket_handle,3}},
  {stacktrace,
      [{erlang,'++',
           [<<"{ if (validateSources([])) {  ws.send(enc(tuple(atom('pickle'),bin('document'),bin('g2gCaAVkAAJldmQABWxvZ2luZAALc2V0RmJJZnJhbWVrAAhkb2N1bWVudGQACWFwaV9ldmVudGgDYgAABaJiAATQ6WIAAlCZ'),utf8_toByteArray(JSON.stringify(data))))); } else console.log('Validation Error'); }">>,
            "};"],
           []},
…
Error in process <0.273.0> with exit value:
{[{reason,badarg},
  {mfa,{n2o_stream,websocket_handle,3}},
  {stacktrace,
      [{erlang,'++',
           [<<"{ if (validateSources([])) {  ws.send(enc(tuple(atom('pickle'),bin('document'),bin('g2gCaAVkAAJldmQABWxvZ2luZAALc2V0RmJJZnJhbWVrAAhkb2N1bWVudGQACWFwaV9ldmVudGgDYgAABaJiAATQ6WIAAlCZ'),utf8_toByteArray(JSON.stringify(data))))); } else console.log('Validation Error'); }">>,
            "};"],
           []},
Andy
@m-2k
Sep 15 2015 11:27
написано же что бинарь со списком не склеивается
ты не пример в свое приложение впихивай а пример выкачай чистый и запусти для начала
@Revent много к одному - есть
Yuriy Al. Shirokov
@yashrk
Sep 15 2015 11:31
Чистый запускается, но нихрена не делает (что, собственно, я и написал в предыдущей реплике). Какой правильный способ проверять, что нужный js-код для кнопки приехал?
Ilya Gorskin
@Revent
Sep 15 2015 11:31
@m-2k как?
Andy
@m-2k
Sep 15 2015 11:32
@yashrk включить логирование в js или посмотреть навешанные ивенты на элементе в dev tools браузера?
kvs:entries(kvs:get(feed, zoo), animal, undefined).
здесь читается фид zoo из таблицы animal
можно сделать фид {animal, ZooId} и привязывать фиды таблицы с животными к Id зоопарка
Ilya Gorskin
@Revent
Sep 15 2015 11:39
это все равно не то что я хочу
Andy
@m-2k
Sep 15 2015 11:39
фид - это список внутри таблицы объединенный через feed_id поле
ну не хоти
Ilya Gorskin
@Revent
Sep 15 2015 11:39
уже и не хочу ....
твой api для php и js по мотивам?
Yuriy Al. Shirokov
@yashrk
Sep 15 2015 11:57
@m-2k обработчик с wf:send()на кнопке висит. Только вот при нажатии в логах на серваке пусто (при том, что логи включены и в каждую функцию-обработчик я расставил wf:info/3), во вкладке "Сеть" отладчика в браузере тоже пусто, а в консоли браузера сообщение "Во время загрузки страницы соединение с ws://localhost:8000/ws/ было прервано."
Andrii Sergiienko
@fycth
Sep 15 2015 12:15
если "прервано", значит страница рефрешится. А в БД юзер появился?
rr(kvs_user).
kvs:all(user).
Andy
@m-2k
Sep 15 2015 12:15
@yashrk у тебя сафари?
прервано это когда страницу перезагружаешь и браузер не правильно ws подключение закрывает
это баг браузера
а как ты логи включил?
config.erl
log_level() -> info.
log_modules() -> any.
Andrii Sergiienko
@fycth
Sep 15 2015 12:18
а на клиентской стороне как включил?
Yuriy Al. Shirokov
@yashrk
Sep 15 2015 12:19

У меня FF. Логи включил, дописав в web_app.erl строчку:

log_modules() -> [n2o_client,n2o_nitrogen,n2o_stream,wf_convert,example1]. % Так в книжке, кажется

Сейчас попробую так, как ты написал.

А как на клиентской стороне включить?
Andrii Sergiienko
@fycth
Sep 15 2015 12:19
там config.erl кстати по-моему нету в примере...
15:20 src ❯ cat config.erl
-compile(export_all).

log_level() -> info.
log_modules() -> % any
  [
    login,
    index
  ].
и в sys.config в секции n2o надо указать {log_level,config},
как сюда постить чтобы исходник по-людски выглядел, а не вот такой портянкой?
Yuriy Al. Shirokov
@yashrk
Sep 15 2015 12:22
Три апострофа. Здесь полновесный markdown.
В смысле, в начале и в конце исходника на отдельной строчке три апострофа
Andrii Sergiienko
@fycth
Sep 15 2015 12:23
никогда не запомню этот долбанный md. Каждый раз писать ридми на гитхабе - страдания и тысяча комитов
Andy
@m-2k
Sep 15 2015 12:24
да, превью неплохо бы
Andrii Sergiienko
@fycth
Sep 15 2015 12:24
@m-2k как на клиенте сегодня в n2o логи включаются? дебаг и все такое
Andy
@m-2k
Sep 15 2015 12:24
хз, вроде debug=true;
Andrii Sergiienko
@fycth
Sep 15 2015 12:25
точно
Namdak Tonpa
@5HT
Sep 15 2015 12:56
в KVS есть subscription
таблица в которой секондари индексы
{who,whom}
кто на кого подписан
можно выбирать из базы одним запросом
{*,whom}
или {who,*}
Yuriy Al. Shirokov
@yashrk
Sep 15 2015 13:10
Включил логи, как-то всё равно не ходят события. Попробовал переключиться с фейсбука на другие методы логина (Twitter, Google) — та же фигня. Может, я своими экспериментами что-то сломал, сейчас попробую сделать git reset --hard, заново вбить мой ID приложения и попробовать ещё раз.
Andrii Sergiienko
@fycth
Sep 15 2015 13:18
ты на локалхосте пробуешь или вживую уже? он же там окно открывает ФБ - типа "разрешить ли этому приложению" - так мож у тебя попапы блокируются и кажется что ничо не работает?
Andy
@m-2k
Sep 15 2015 13:40
Может стоит отложить, помедитировать и со свежей головой попробовать вновь?
Yuriy Al. Shirokov
@yashrk
Sep 15 2015 14:08
@m-2k уже откладывал вроде
@fycth на локалхосте, у меня сейчас нет торчащей в инет машины с эрлангом
Andrii Sergiienko
@fycth
Sep 15 2015 15:11
@5HT в n2o если на странице не объявлена protos, то в консоли будет 'TypeError: p is undefined' - может есть смысл сделать что-то типа if (typeof protos === 'undefined') console.error ('Define set of protocols: protos=[$bert]'); - или просто дефолтное значение подставлять, если не объявлено?
@yashrk у тебя в консоли браузера появляется 'Connect' при открытии страницы? У меня в некоторых случаях почему-то проходит примерно минута с момента загрузки страницы и до того как n2o откроет соединение по WS. А пока WS нету, то никакой фукнионал не рабоатет естественно
Namdak Tonpa
@5HT
Sep 15 2015 15:15
там есть дефолтное значение в n2o.js
проблемы с конектом ищи в своих джаваскриптах
на примерах такого нет
Andrii Sergiienko
@fycth
Sep 15 2015 15:16
нифига. я твой sample слил с последнего n2o - и там первым делом поймал такую же фигню. Прошло 57 секунд прежде чем ws установился
я не знаю от чего оно зависит. Заскриншотю как словлю еще раз.
может это приколы OS X или файрфокса. @yashrk ну короче ты убедись что у тебя n2o вообще включился. А то может пример не работает потому что его нету на самом деле
Andrii Sergiienko
@fycth
Sep 15 2015 15:25
undefined-protos-error.png
@5HT вот я с твоего примера со страницы убрал protos - дефолтное значение не работает
Yuriy Al. Shirokov
@yashrk
Sep 15 2015 17:34
@fycth в консоли браузера слово «Connect» появляется, ага
Andrii Sergiienko
@fycth
Sep 15 2015 18:13
@5HT в n2o 2.9 поменялось что-то в api_event? Я когда делаю в модуле wf:wire(#api{name=something}). - то страница бесконечно рефрешится
а в n2o происходит такое
=ERROR REPORT==== 15-Sep-2015::21:12:37 === Error in process <0.212.0> with exit value: {[{reason,badarg}, {mfa,{n2o_stream,websocket_handle,3}}, {stacktrace, [{erlang,'++', [<<"{ if (validateSources([])) { ws.send(enc(tuple(atom('pickle'),bin('document'),bin('g2gCaAVkAAJldmQABWluZGV4ZAALZG9TaWduYWxpbmdrAAhkb2N1bWVudGQACWFwaV9ldmVudGgDYgAABaJiAAUzFWIACcOF'),utf8_toByteArray(JSON.stringify(data))))); } else console.log('Validation Error'); }">>, "};"], []}, {action_api,render_action,1, [{file, "/Users/andreysergienko/dev/WebRTCO/samples/n2o/deps/nitro/src/actions/action_api.erl"}, {line,10}]},
Namdak Tonpa
@5HT
Sep 15 2015 18:13
action_api:render_action надо пофиксать
Andrii Sergiienko
@fycth
Sep 15 2015 18:13
я пробовал на твоем примере из review - та же фигня
а
Namdak Tonpa
@5HT
Sep 15 2015 18:13
там ошибка
Andrii Sergiienko
@fycth
Sep 15 2015 18:13
понял
ок
Yuriy Al. Shirokov
@yashrk
Sep 15 2015 18:16
@5HT о, о, вот у меня то же самое было.
Namdak Tonpa
@5HT
Sep 15 2015 18:17
> wf:render(#api{name=something}).
** exception error: bad argument
     in operator  ++/2
        called as <<"{ if (validateSources([])) {  ws.send(enc(tuple(atom('pickle'),bin('document'),bin('g2gCaAVkAAJldmQABWluZGV4ZAAJc29t"...>> ++ "};"
     in call from action_api:render_action/1 (/Users/5HT/depot/privat48/moneybox/deps/nitro/src/actions/action_api.erl, line 10)
     in call from wf_render_actions:render_action/1 (/Users/5HT/depot/privat48/moneybox/deps/nitro/src/render/wf_render_actions.erl, line 8)
8>
воспроизводится
iolist_to_binary([A,B])
счас закомичу
Andrii Sergiienko
@fycth
Sep 15 2015 18:17
ага
оно самое
Namdak Tonpa
@5HT
Sep 15 2015 18:33
не лучший вариант фикса но пусть будет это #api редко используемое
спасибо!
Andrii Sergiienko
@fycth
Sep 15 2015 19:00
JavaScript> ws.send(enc(tuple(atom('client'),
                   tuple(atom('phone_auth'),"+380.."))));

event({client,{phone_auth,Phone}}) ->
      io:format("Phone: ~p~n",[Phone]).
вот этот пример из книги у меня тоже не работает: Phone - всегда пустой список - []
ну то есть месадж приезжает и ловится на сервере, - но всегда приезжает пустой список в качестве аргумента
Andy
@m-2k
Sep 15 2015 19:05
делай bin("phone") и лови бинарь
Namdak Tonpa
@5HT
Sep 15 2015 19:05
о спасибо счас попровлю
или я поправил уже
Andy
@m-2k
Sep 15 2015 19:06
а ты фиксал? твои слова были что стринги как то не оч работают
Namdak Tonpa
@5HT
Sep 15 2015 19:07
все ж теперь надо оборачивать в типы
Andrii Sergiienko
@fycth
Sep 15 2015 19:10
вопрос наверно глупый, но все же: а как правильно из JS передать в erlang нечто типа {field1: "123", field2: "456"} ? Во что это можно обернуть чтобы в ерланге потом принять в какой-нибудь ерланговой конструкции?
Namdak Tonpa
@5HT
Sep 15 2015 19:15
а ты именно как JSON хочешь ?
т.е. как проплист?
Andrii Sergiienko
@fycth
Sep 15 2015 19:15
можно проплист. Мне собсно нужно конструкции вида {a: 1, b: 2} слать из JS в ерланг, там с ними что-то делать - и сать их потом обратно в JS (на ту же страницу или на другую)
Namdak Tonpa
@5HT
Sep 15 2015 19:16
а чем протокол N2O не подходит?
{client,_} ?
{client,{ab,1,2}} ?
проплисты ж нельзя матчить в функциях
а таплы можно
таплы юзай
Andrii Sergiienko
@fycth
Sep 15 2015 19:17
возможно я просто неправильно его использую...
         ws.send(enc(tuple(atom('client'),tuple(atom('packet'),{a: 1, b: 2}))));
Namdak Tonpa
@5HT
Sep 15 2015 19:28
давай конретный пример
мы же на эрланге пишем а на JavaScript
шо за рекорд это {Atom?,a,b} ?
вот этот tuple(atom('RecordName'),number(1),number(2)) и передавай
нахуй тебе слать нетипизированное говно которое нельзя отматчить на эрланге ?
если только это не список опций (проплист)
тогда можно так tuple(atom('proplist'),[tuple(bin('a'),bin('1')),tuple(bin('b'),bin('2'))])
Andrii Sergiienko
@fycth
Sep 15 2015 19:30

на стороне JS есть пакеты SDP - Session Description Protocol. Оно представляет из себ я JS-объект типа

var o = {field1: 1, field2: 2, property3: 34}

вот это хозяйство можно как=то обернуть во что-то на стооне JS, чтобы в ерланге потом принять в каком-то ивенте в виде чего-то схедобного? тупла какого-то.

Namdak Tonpa
@5HT
Sep 15 2015 19:31
ну вот я тебе показал как
это же тапл из трех полей
просто назови его как-то
и передавай 4-тапл где первое поле имя рекорда
Andrii Sergiienko
@fycth
Sep 15 2015 19:31
ну это вручную. это если я знаю какой он там у меня - каков его формат хотя бы.
nponeccop
@nponeccop
Sep 15 2015 19:32
@5HT я так понял у него 100500 полей иерархических, т.е. хочет json2bert рекурсивный
Andrii Sergiienko
@fycth
Sep 15 2015 19:32
ну что-то такое, да
Namdak Tonpa
@5HT
Sep 15 2015 19:32
ты пишешь SDP протокол
ты все пакеты должен знать наперед
я тебе показал как проплист передавать
Andrii Sergiienko
@fycth
Sep 15 2015 19:32
проблема не столько вт ом что их 100500, а в том что там поля могут быть разные - какие-то есть, каких-то нет. Оно не константное
Namdak Tonpa
@5HT
Sep 15 2015 19:32
tuple(atom('proplist'),[tuple(bin('a'),bin('1')),tuple(bin('b'),bin('2'))])
Andrii Sergiienko
@fycth
Sep 15 2015 19:33
ясно ок. спасибо. буду с этим что-то рожать
Namdak Tonpa
@5HT
Sep 15 2015 19:33
но я не рекомендую это делать
так именно поля с форм приезжают
если ты посмотришь внимательно
но если ты пишешь свой SDP протокол то ни о каких JSON не может быть и речи :-)
Т.е. где-то это ок
но врядли что у тебя
на странице я не знаю сколько у меня input полей
и их имена
поэтому я проплисты ганяю
вот так как написано выше
Andrii Sergiienko
@fycth
Sep 15 2015 19:35

ладно, другой вопрос: я это в ерланге получил. что-то сделал с этим добром (поменял одно поле). Как мне праивльно это засунуть обратно в JS?

я сйечас делаю это через wf:wire("someFunction") и описываю в JS эту someFunction, - это ок или более праивльно как-то можно делать такое?

Namdak Tonpa
@5HT
Sep 15 2015 19:36
нужно испльзовать {client,_}протокол
и слать это в поле {io,_,Data} как Data в бинарном формате
и на клиенте ловить $io.do = function (x) { console.log(x.v[2].v); }
Andrii Sergiienko
@fycth
Sep 15 2015 19:37
ага ок
спасибо
Namdak Tonpa
@5HT
Sep 15 2015 19:38
ws.send(enc(tuple(atom('client'),...))) запрос
попадаешь в event({client,...}) ->
что эта функция вернет, то и попадет в поле Data в {io,_,Data}
соотв после декодера BERT будет x.v[2].v
x.v[0].v == 'io'
Andrii Sergiienko
@fycth
Sep 15 2015 19:40
проясняется. спасибо!
Namdak Tonpa
@5HT
Sep 15 2015 19:40
можешь конечно и в джваскрипте слать команды
но это не место когда речь идет о сигнальных протоколах
Andrii Sergiienko
@fycth
Sep 15 2015 19:40
совершенно верно
Namdak Tonpa
@5HT
Sep 15 2015 19:41
ебашь все бинарно
именно для этого и сделаны эти протоколы
Namdak Tonpa
@5HT
Sep 15 2015 19:46
есть еще bin протокол
он вместо io шлет тупо то что ты вернешь event({bin,_}) ->
Andrii Sergiienko
@fycth
Sep 15 2015 19:48
ага я понял. я тут поигрался уже немного. щас пойму что мне лучше будет
спасибо
Andrii Sergiienko
@fycth
Sep 15 2015 20:40
@5HT AVZ использует n2o_json - который в 2.9 выпилен. Как лучше на 2.9 сделать - юзать jsone:decode просто напрямую или через n2o как-то?
Namdak Tonpa
@5HT
Sep 15 2015 20:40
надо сдлать так как в n2o переключалку
-ifndef(AVZ_JSON).
-define(AVZ_JSON, (application:get_env(avz,json,jsone))).
-endif.
Andrii Sergiienko
@fycth
Sep 15 2015 20:41
ага увидел уже. ок
Namdak Tonpa
@5HT
Sep 15 2015 20:41
прямо в avz.erl
или в avz.hrl
Andrii Sergiienko
@fycth
Sep 15 2015 20:43
только в старом и новом json вывод decode отличается. Одной переключалкой не ободёшься.
Namdak Tonpa
@5HT
Sep 15 2015 20:43
что именно отличается?
struct надо мочивские нахуй убирать
Andrii Sergiienko
@fycth
Sep 15 2015 20:44
щас покажу
Namdak Tonpa
@5HT
Sep 15 2015 20:44
я в rest уже убрал нахуй и там все работает уже
#struct рекорд нахуй убирай
это особенности мочивского json
Andrii Sergiienko
@fycth
Sep 15 2015 20:46

старый

{struct,[{<<"a">>,2},{<<"b">>,3}]}

новый

{[{<<"a">>,2},{<<"b">>,3}]}
Namdak Tonpa
@5HT
Sep 15 2015 20:46
я ж говорю убирай struct везде в коде
Andrii Sergiienko
@fycth
Sep 15 2015 20:47
он оборачивает его еще в {} - и если внутри был вложенный проплист, он тоже будет обернут в {}
Namdak Tonpa
@5HT
Sep 15 2015 20:47
ну и нахуй это?
jsx так делает?
jsonx ?
Andrii Sergiienko
@fycth
Sep 15 2015 20:47
jsone
Namdak Tonpa
@5HT
Sep 15 2015 20:47
jsone так не делает
так делает только йобаный мочивеб json
Andrii Sergiienko
@fycth
Sep 15 2015 20:48
jsone:decode(<<"{\"a\":2,\"b\":3}">>).
{[{<<"a">>,2},{<<"b">>,3}]}
если просто его вывод взять еще можно, то вложенные проплисты превращаются в ад - надо каждый вынимать из {}
Namdak Tonpa
@5HT
Sep 15 2015 20:49
ну JSON это ж объект
а объект это всегда {}
а не []
посмотри как jsonx делает
и если так же то это не спроста
а то что struct обернуто то типа нормально?
Andrii Sergiienko
@fycth
Sep 15 2015 20:54
не, struct точно не нормально
Namdak Tonpa
@5HT
Sep 15 2015 20:55
1> jsonx:decode(<<"{\"name\":\"Ivan\",\"age\":33,\"phones\":[3332211,4443322]}">>).
{[{<<"name">>,<<"Ivan">>},
  {<<"age">>,33},
  {<<"phones">>,[3332211,4443322]}]}
я ж наоборот перешел на универсальный формат JSON от мочивского
чтобы можно было переключать форматеры
> jsone:decode(<<"{\"name\":\"Ivan\",\"age\":33,\"phones\":[3332211,4443322]}">>).
{[{<<"name">>,<<"Ivan">>},
  {<<"age">>,33},
  {<<"phones">>,[3332211,4443322]}]}
теперь панимаешь?
Andrii Sergiienko
@fycth
Sep 15 2015 20:57
увидел уже
Namdak Tonpa
@5HT
Sep 15 2015 20:57
мочи говно