mirror of
https://github.com/Green-Sky/crdt_tests.git
synced 2024-12-22 15:53:24 +01:00
more tox, not working yet
This commit is contained in:
parent
2165ab2070
commit
79db39c5d1
@ -11,78 +11,33 @@ extern "C" {
|
|||||||
#include <string_view>
|
#include <string_view>
|
||||||
#include <variant>
|
#include <variant>
|
||||||
#include <thread>
|
#include <thread>
|
||||||
|
#include <future>
|
||||||
#include <atomic>
|
#include <atomic>
|
||||||
#include <chrono>
|
#include <chrono>
|
||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
|
|
||||||
|
//struct ToxPubKey {
|
||||||
|
//std::array<uint8_t, 32> data;
|
||||||
|
|
||||||
|
//bool operator==(const ToxPubKey& other) const {
|
||||||
|
//return data == other.data;
|
||||||
|
//}
|
||||||
|
|
||||||
|
//bool operator<(const ToxPubKey& other) const {
|
||||||
|
//return data < other.data;
|
||||||
|
//}
|
||||||
|
//};
|
||||||
|
using ToxPubKey = std::array<uint8_t, 32>;
|
||||||
|
|
||||||
// single letter agent, for testing only
|
// single letter agent, for testing only
|
||||||
//using Agent = char;
|
//using Agent = char;
|
||||||
using Agent = uint16_t; // tmp local port
|
//using Agent = uint16_t; // tmp local port
|
||||||
|
using Agent = ToxPubKey;
|
||||||
using Doc = GreenCRDT::TextDocument<Agent>;
|
using Doc = GreenCRDT::TextDocument<Agent>;
|
||||||
using ListType = Doc::ListType;
|
using ListType = Doc::ListType;
|
||||||
|
|
||||||
std::ostream& operator<<(std::ostream& out, const std::optional<ListType::ListID>& id) {
|
|
||||||
if (id.has_value()) {
|
|
||||||
out << id.value().id << "-" << id.value().seq;
|
|
||||||
} else {
|
|
||||||
out << "null";
|
|
||||||
}
|
|
||||||
return out;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::ostream& operator<<(std::ostream& out, const ListType::OpAdd& op) {
|
|
||||||
out
|
|
||||||
<< "Add{ id:" << op.id.id
|
|
||||||
<< "-" << op.id.seq
|
|
||||||
<< ", v:" << op.value
|
|
||||||
<< ", l:" << op.parent_left
|
|
||||||
<< ", r:" << op.parent_right
|
|
||||||
<< " }"
|
|
||||||
;
|
|
||||||
return out;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::ostream& operator<<(std::ostream& out, const ListType::OpDel& op) {
|
|
||||||
out
|
|
||||||
<< "Del{ id:" << op.id.id
|
|
||||||
<< "-" << op.id.seq
|
|
||||||
<< " }"
|
|
||||||
;
|
|
||||||
return out;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::ostream& operator<<(std::ostream& out, const Doc::Op& op) {
|
|
||||||
if (std::holds_alternative<ListType::OpAdd>(op)) {
|
|
||||||
out << std::get<ListType::OpAdd>(op);
|
|
||||||
} else if (std::holds_alternative<ListType::OpDel>(op)) {
|
|
||||||
out << std::get<ListType::OpDel>(op);
|
|
||||||
}
|
|
||||||
return out;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::ostream& operator<<(std::ostream& out, const std::optional<char>& id) {
|
|
||||||
if (id.has_value()) {
|
|
||||||
out << id.value();
|
|
||||||
} else {
|
|
||||||
out << "null";
|
|
||||||
}
|
|
||||||
return out;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::ostream& operator<<(std::ostream& out, const ListType::Entry& e) {
|
|
||||||
out
|
|
||||||
<< "{ id:" << e.id.id
|
|
||||||
<< "-" << e.id.seq
|
|
||||||
<< ", v:" << e.value
|
|
||||||
<< ", l:" << e.parent_left
|
|
||||||
<< ", r:" << e.parent_right
|
|
||||||
<< " }"
|
|
||||||
;
|
|
||||||
return out;
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace vim {
|
namespace vim {
|
||||||
|
|
||||||
static bool sendResponse(zed_net_socket_t* remote_socket, const int64_t id, const nlohmann::json& j) {
|
static bool sendResponse(zed_net_socket_t* remote_socket, const int64_t id, const nlohmann::json& j) {
|
||||||
@ -229,6 +184,8 @@ struct SharedContext {
|
|||||||
std::atomic_bool should_quit {false};
|
std::atomic_bool should_quit {false};
|
||||||
|
|
||||||
// tox ngc id for agent
|
// tox ngc id for agent
|
||||||
|
ToxPubKey agent;
|
||||||
|
std::promise<void> agent_set;
|
||||||
|
|
||||||
// remote op queue for receive
|
// remote op queue for receive
|
||||||
// local op list for remote lookups
|
// local op list for remote lookups
|
||||||
@ -237,6 +194,9 @@ struct SharedContext {
|
|||||||
// bool dirty
|
// bool dirty
|
||||||
|
|
||||||
Tox* tox {nullptr};
|
Tox* tox {nullptr};
|
||||||
|
bool tox_dht_online {false};
|
||||||
|
bool tox_group_online {false};
|
||||||
|
uint32_t tox_group_number {-1u};
|
||||||
};
|
};
|
||||||
|
|
||||||
namespace tox {
|
namespace tox {
|
||||||
@ -299,12 +259,31 @@ void toxThread(SharedContext* ctx) {
|
|||||||
CALLBACK_REG(group_custom_private_packet);
|
CALLBACK_REG(group_custom_private_packet);
|
||||||
#undef CALLBACK_REG
|
#undef CALLBACK_REG
|
||||||
|
|
||||||
// dht
|
{ // dht bootstrap
|
||||||
|
struct DHT_node {
|
||||||
|
const char* ip;
|
||||||
|
uint16_t port;
|
||||||
|
const char key_hex[TOX_PUBLIC_KEY_SIZE*2 + 1]; // 1 for null terminator
|
||||||
|
unsigned char key_bin[TOX_PUBLIC_KEY_SIZE];
|
||||||
|
};
|
||||||
|
|
||||||
|
DHT_node nodes[] {
|
||||||
|
{"tox.plastiras.org", 33445, "8E8B63299B3D520FB377FE5100E65E3322F7AE5B20A0ACED2981769FC5B43725", {}}, // 14
|
||||||
|
{"tox2.plastiras.org", 33445, "B6626D386BE7E3ACA107B46F48A5C4D522D29281750D44A0CBA6A2721E79C951", {}}, // 14
|
||||||
|
};
|
||||||
|
|
||||||
|
for (size_t i = 0; i < sizeof(nodes)/sizeof(DHT_node); i ++) {
|
||||||
|
sodium_hex2bin(
|
||||||
|
nodes[i].key_bin, sizeof(nodes[i].key_bin),
|
||||||
|
nodes[i].key_hex, sizeof(nodes[i].key_hex)-1,
|
||||||
|
NULL, NULL, NULL
|
||||||
|
);
|
||||||
|
tox_bootstrap(ctx->tox, nodes[i].ip, nodes[i].port, nodes[i].key_bin, NULL);
|
||||||
|
// TODO: use extra tcp option to avoid error msgs
|
||||||
|
tox_add_tcp_relay(ctx->tox, nodes[i].ip, nodes[i].port, nodes[i].key_bin, NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// public
|
|
||||||
// 87F3EBA4C0D27926F9ED77E2FF9D8F26F9869D71311D0DB4CA857C1E25A40B18 - green_crdt_test1
|
|
||||||
//tox_group_join()
|
|
||||||
//tox_group_self_get_public_key()
|
//tox_group_self_get_public_key()
|
||||||
//tox_group_send_custom_packet()
|
//tox_group_send_custom_packet()
|
||||||
//tox_group_send_custom_private_packet()
|
//tox_group_send_custom_private_packet()
|
||||||
@ -313,7 +292,36 @@ void toxThread(SharedContext* ctx) {
|
|||||||
// tox iterate
|
// tox iterate
|
||||||
tox_iterate(ctx->tox, ctx);
|
tox_iterate(ctx->tox, ctx);
|
||||||
|
|
||||||
// send stuff
|
if (!ctx->tox_dht_online) { // first wait for dht
|
||||||
|
if (tox_self_get_connection_status(ctx->tox) != TOX_CONNECTION::TOX_CONNECTION_NONE) {
|
||||||
|
ctx->tox_dht_online = true;
|
||||||
|
|
||||||
|
std::cout << "tox connected to dht\n";
|
||||||
|
|
||||||
|
// public
|
||||||
|
// 87F3EBA4C0D27926F9ED77E2FF9D8F26F9869D71311D0DB4CA857C1E25A40B18 - green_crdt_test1
|
||||||
|
const auto chat_id = hex2bin("87F3EBA4C0D27926F9ED77E2FF9D8F26F9869D71311D0DB4CA857C1E25A40B18");
|
||||||
|
const std::string_view name {"green_crdt_vim2"};
|
||||||
|
ctx->tox_group_number = tox_group_join(ctx->tox, chat_id.data(), reinterpret_cast<const uint8_t*>(name.data()), name.size(), nullptr, 0, nullptr);
|
||||||
|
|
||||||
|
if (!tox_group_self_get_public_key(ctx->tox, ctx->tox_group_number, ctx->agent.data(), nullptr)) {
|
||||||
|
std::cerr << "failed to get own pub key\n";
|
||||||
|
ctx->should_quit = true;
|
||||||
|
ctx->agent_set.set_value();
|
||||||
|
return; // fuck everything
|
||||||
|
}
|
||||||
|
ctx->agent_set.set_value();
|
||||||
|
}
|
||||||
|
} else if (!ctx->tox_group_online) { // then wait for group to connect
|
||||||
|
if (tox_group_get_number_groups(ctx->tox) != 0) {
|
||||||
|
ctx->tox_group_online = true;
|
||||||
|
std::cout << "tox connected to group\n";
|
||||||
|
}
|
||||||
|
} else { // do the thing
|
||||||
|
// staging?
|
||||||
|
// handle requests
|
||||||
|
// send tip (prio self)
|
||||||
|
}
|
||||||
|
|
||||||
std::this_thread::sleep_for(20ms);
|
std::this_thread::sleep_for(20ms);
|
||||||
}
|
}
|
||||||
@ -323,11 +331,82 @@ void toxThread(SharedContext* ctx) {
|
|||||||
|
|
||||||
} // namespace tox
|
} // namespace tox
|
||||||
|
|
||||||
|
std::ostream& operator<<(std::ostream& out, const ToxPubKey& id) {
|
||||||
|
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::ostream& operator<<(std::ostream& out, const std::optional<ListType::ListID>& id) {
|
||||||
|
if (id.has_value()) {
|
||||||
|
out << id.value().id << "-" << id.value().seq;
|
||||||
|
} else {
|
||||||
|
out << "null";
|
||||||
|
}
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::ostream& operator<<(std::ostream& out, const ListType::OpAdd& op) {
|
||||||
|
out
|
||||||
|
<< "Add{ id:" << op.id.id
|
||||||
|
<< "-" << op.id.seq
|
||||||
|
<< ", v:" << op.value
|
||||||
|
<< ", l:" << op.parent_left
|
||||||
|
<< ", r:" << op.parent_right
|
||||||
|
<< " }"
|
||||||
|
;
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::ostream& operator<<(std::ostream& out, const ListType::OpDel& op) {
|
||||||
|
out
|
||||||
|
<< "Del{ id:" << op.id.id
|
||||||
|
<< "-" << op.id.seq
|
||||||
|
<< " }"
|
||||||
|
;
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::ostream& operator<<(std::ostream& out, const Doc::Op& op) {
|
||||||
|
if (std::holds_alternative<ListType::OpAdd>(op)) {
|
||||||
|
out << std::get<ListType::OpAdd>(op);
|
||||||
|
} else if (std::holds_alternative<ListType::OpDel>(op)) {
|
||||||
|
out << std::get<ListType::OpDel>(op);
|
||||||
|
}
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::ostream& operator<<(std::ostream& out, const std::optional<char>& id) {
|
||||||
|
if (id.has_value()) {
|
||||||
|
out << id.value();
|
||||||
|
} else {
|
||||||
|
out << "null";
|
||||||
|
}
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::ostream& operator<<(std::ostream& out, const ListType::Entry& e) {
|
||||||
|
out
|
||||||
|
<< "{ id:" << e.id.id
|
||||||
|
<< "-" << e.id.seq
|
||||||
|
<< ", v:" << e.value
|
||||||
|
<< ", l:" << e.parent_left
|
||||||
|
<< ", r:" << e.parent_right
|
||||||
|
<< " }"
|
||||||
|
;
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
int main(void) {
|
int main(void) {
|
||||||
SharedContext ctx;
|
SharedContext ctx;
|
||||||
std::cout << "starting tox thread\n";
|
std::cout << "starting tox thread\n";
|
||||||
auto tox_thread = std::thread(tox::toxThread, &ctx);
|
auto tox_thread = std::thread(tox::toxThread, &ctx);
|
||||||
|
|
||||||
|
std::cout << "waiting for agent id\n";
|
||||||
|
ctx.agent_set.get_future().wait();
|
||||||
|
if (ctx.should_quit) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
std::cout << "starting vim ipc server\n";
|
std::cout << "starting vim ipc server\n";
|
||||||
|
|
||||||
if (zed_net_init() != 0) {
|
if (zed_net_init() != 0) {
|
||||||
@ -373,7 +452,7 @@ int main(void) {
|
|||||||
// send doauto text changed for inital buffer
|
// send doauto text changed for inital buffer
|
||||||
|
|
||||||
Doc doc;
|
Doc doc;
|
||||||
doc.local_agent = remote_address.port; // tmp: use local port as id
|
doc.local_agent = ctx.agent;
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
// 100MiB
|
// 100MiB
|
||||||
|
Loading…
Reference in New Issue
Block a user