755UGKECZ3PFYEA2TFFOUZTF27CRQTBZWO7UYFU6WQDJMZDBVPRAC -module(cable_basic_SUITE).-import(proplists, [get_value/2,get_value/3]).% -include_lib("common_test/include/ct.hrl").-include_lib("eunit/include/eunit.hrl").% -include_lib("cable/include/types.hrl").hash_response_test() ->TestData = testrecs:test_hash_response(),TestObj = proplists:get_value(obj, TestData),Bin = proplists:get_value(binary, TestData),Header = wire:decode_response_header(Bin),?assert(proplists:get_value(msgLen, Header) == maps:get(<<"msgLen">>, TestObj)),?assert(proplists:get_value(msgType, Header) == maps:get(<<"msgType">>, TestObj)),ReqId = hex:hexstr_to_bin(binary_to_list(maps:get(<<"reqid">>, TestObj))),?assert(proplists:get_value(requestId, Header) == ReqId).% ping_test(Config) ->% Host = get_value(hostname, Config, "localhost"),% {ok, NewSbotClient} = ssb_client:start_link(Host, remote_long_pk()),% Now = erlang:system_time(millisecond),% Time = ssb_client:send(NewSbotClient, ping()),% End = binary_to_integer(jiffy:decode(Time)),% ?assert((End - Now) < 5),% Config.% whoami_test(Config) ->% Host = get_value(hostname, Config, "localhost"),% {ok, NewSbotClient} = ssb_client:start_link(Host, remote_long_pk()),% {WhoAmI} = jiffy:decode(ssb_client:send(NewSbotClient, whoami_req())),% ?assert(keys:pub_key_disp() == ?pgv(<<"id">>, WhoAmI)),% Config.% remote_long_pk() ->% base64:decode(keys:pub_key()).% ping() ->% Flags = rpc_processor:create_flags(1,0,2),% Body = jiffy:encode({[{<<"name">>,[<<"gossip">>,<<"ping">>]},% {<<"args">>,[{[{<<"timeout">>, 300000}]}]},% {<<"type">>,<<"duplex">>}]}),% Header = rpc_processor:create_header(Flags, size(Body), 1),% utils:combine(Header, Body).% whoami_req() ->% Flags = rpc_processor:create_flags(1,0,2),% Body = jiffy:encode({[{<<"name">>,[?whoami]},% {<<"args">>,[]},% {<<"type">>,<<"async">>}]}),% Header = rpc_processor:create_header(Flags, size(Body), 1),% utils:combine(Header, Body).
{"1.2.0",[{<<"b">>,{git,"https://github.com/b/hex.git",{ref,"967f059ea49e45b7d0d82e2e1177ef860f5ec4bd"}},0},{<<"enacl">>,{pkg,<<"enacl">>,<<"1.2.1">>},0},{<<"jsone">>,{pkg,<<"jsone">>,<<"1.8.1">>},0}]}.[{pkg_hash,[{<<"enacl">>, <<"7776480B9B3D42A51D66DBBCBF17FA3D79285B3D2ADCB4D5B5BD0B70F0EF1949">>},{<<"jsone">>, <<"6BC74D3863D55D420077346DA97C601711017A057F2FD1DF65D6D65DD562FBAB">>}]},{pkg_hash_ext,[{<<"enacl">>, <<"67BBBEDDD2564DC899A3DCBC3765CD6AD71629134F1E500A50EC071F0F75E552">>},{<<"jsone">>, <<"C78918124148C51A7A84C678E39BBC6281F8CB582F1D88584628A98468E99738">>}]}].
{require_otp_vsn, "R?25"}.%% Tell rebar about this directory's structure{lib_dirs, ["apps", "deps"]}.{sub_dirs, ["apps/*"]}.{erl_opts, [debug_info]}.{deps, [{b, {git, "https://github.com/b/hex.git", {branch, "master"}}},{enacl, "~> 1.2.1"},{jsone, "~> 1.8.1"}]}.{plugins, [rebar3_auto]}.{relx, [{release, { cable, {git, short} },[cable,debugger,runtime_tools]}]}.{profiles, [{dev, [{erl_opts, [debug_info]},{relx, [{dev_mode, true},{include_erts, false}]}]},{prod, [{erl_opts, [no_debug_info, warnings_as_errors]},{relx, [{dev_mode, false},{include_erts, true}]}]}]}.
#!/usr/bin/env escript%%! -noshell -noinput%% -*- mode: erlang;erlang-indent-level: 4;indent-tabs-mode: nil -*-%% ex: ft=erlang ts=4 sw=4 et-define(PRINT(Fmt,Args), io:format(Fmt,Args)).main([Command | CommandArgs]) ->code:add_path("./_build/default/lib/aeon/ebin/"),code:add_path("./_build/default/lib/jsx/ebin/"),code:add_path("./_build/default/lib/parse_trans/ebin/"),code:add_path("./_build/default/lib/cable/ebin/"),% keys:start_link(),% config:start_link(),Args = parse_arguments(CommandArgs),%% invoke the command passed as argumentF = fun(_Args) ->% NewClient = secret_handshake("localhost"),% Req = case Command of% "test" ->% test_req();% "ping" ->% ping_req()% end,% Resp = ssb_client:send(NewClient, Req),?PRINT("~s~n",["test"])end,F(Args);main(Args) ->?PRINT("unknown args: ~p\n", [Args]),erlang:halt(1).parse_arguments(Args) ->parse_arguments(Args, []).parse_arguments([], Acc) -> Acc;parse_arguments(Else, _Acc) ->?PRINT("Args not supported yet ~p \n",[Else]).
set -x CPATH /opt/homebrew/includeset -x LIBRARY_PATH /opt/homebrew/libset -x CFLAGS "-arch arm64"set -x CXXFLAGS "-arch arm64"set -x LDFLAGS "-arch arm64"rebar3 compilerebar3 shell
-module(wire).-export([decode_response_header/1]).-export([decode_varint/1, encode_varint/1]).decode_response_header(Data) ->{MsgLen, Rest} = decode_varint(Data),{MsgType, Rest2} = decode_varint(Rest),<< CircuitId:4/binary, ReqId:4/binary, Rest3/binary >> = Rest2,[{msgLen, MsgLen},{msgType, MsgType},{circuitId, CircuitId},{requestId, ReqId},{payload, Rest3}].% stolen from https://github.com/tomas-abrahamsson/gpb/blob/edda1006d863a09509673778c455d33d88e6edbc/src/gpb.erl#L1074%% @equiv decode_varint(Bin, 64)-spec decode_varint(binary()) -> {non_neg_integer(), Rest::binary()}.decode_varint(Bin) -> decode_varint(Bin, 64).%% @doc Decode an unsigned varint. The decoded integer will have be at most%% `MaxNumBits' bits long. Any higher bits will be masked away. If the binary%% contains an overly long encoded integer, this function will fail.-spec decode_varint(binary(), pos_integer()) -> {non_neg_integer(), binary()}.decode_varint(Bin, MaxNumBits) -> de_vi(Bin, 0, 0, MaxNumBits).de_vi(<<1:1, X:7, Rest/binary>>, N, Acc, MaxNumBits) when N < (64-7) ->de_vi(Rest, N+7, X bsl N + Acc, MaxNumBits);de_vi(<<0:1, X:7, Rest/binary>>, N, Acc, MaxNumBits) ->Mask = (1 bsl MaxNumBits) - 1,{(X bsl N + Acc) band Mask, Rest}.%% @doc Encode an unsigned varint to a binary.-spec encode_varint(integer()) -> binary().encode_varint(N) -> iolist_to_binary(en_vi(N)).en_vi(N) when N =< 127 -> <<N>>;en_vi(N) when N >= 128 -> [<<1:1, (N band 127):7>>, en_vi(N bsr 7)].
-module(testrecs).-export([test_hash_response/0]).test_hash_response() ->D = <<"{\"name\":\"hashresponse\",\"type\":\"response\",\"id\":2,\"binary\":\"6b020000000095050429010320265674e8aac2dfddd78f86fe5a3dd68d976ca3f5ba23645ec7381480921d0d10705340e5528f2ef03a6797b72b1bb9f37f9009ad408247387c4bcc4d2a3371af700793dd51d4cb3c18a6df46f88bfe1665fba9b277487ddecd1e031441d69d\",\"obj\":{\"msgLen\":107,\"msgType\":2,\"reqid\":\"95050429\",\"ttl\":1,\"hashes\":[\"20265674e8aac2dfddd78f86fe5a3dd68d976ca3f5ba23645ec7381480921d0d\",\"10705340e5528f2ef03a6797b72b1bb9f37f9009ad408247387c4bcc4d2a3371\",\"af700793dd51d4cb3c18a6df46f88bfe1665fba9b277487ddecd1e031441d69d\"]}}">>,J = jsone:decode(D),#{ <<"binary">> := Bin, <<"obj">> := Obj } = J,[{binary, hex:hexstr_to_bin(binary_to_list(Bin))},{obj, Obj}].% {% "name": "hash response",% "type": "response",% "id": 2,% "binary": "6b020000000095050429010320265674e8aac2dfddd78f86fe5a3dd68d976ca3f5ba23645ec7381480921d0d10705340e5528f2ef03a6797b72b1bb9f37f9009ad408247387c4bcc4d2a3371af700793dd51d4cb3c18a6df46f88bfe1665fba9b277487ddecd1e031441d69d",% "obj": {% "msgLen": 107,% "msgType": 2,% "reqid": "95050429",% "ttl": 1,% "hashes": [% "20265674e8aac2dfddd78f86fe5a3dd68d976ca3f5ba23645ec7381480921d0d",% "10705340e5528f2ef03a6797b72b1bb9f37f9009ad408247387c4bcc4d2a3371",% "af700793dd51d4cb3c18a6df46f88bfe1665fba9b277487ddecd1e031441d69d"% ]% }% }
{application, cable,[{description, "cable"},{vsn, {cmd, "echo 0.1-`git describe --always --tags`"}},{registered, []},{applications, [kernel,% sasl,stdlib,crypto,observer,% wx,% ranch,enacl,% jiffy,% bitcask,compiler,debugger,syntax_tools,tools]},{env, []}% {mod, {cable_app, [{cable_log_level, notice}]}}]}.
-record(user, {name :: string(), pubkey :: binary()}).-record(channel, {name :: string(), topic :: string()}).-record(channelState, {info, users = [], topic, texts = []}).
_build