LINUX.ORG.RU

Ответ на: комментарий от anonymous

На плюсах ты сделаешь такой rpc-сервер, что просто ахренеешь.

По HTTP

Выкинь дерьмо. Какое ещё http для rpc? Вам там чем обрабатывают? Пестицидами?

Смысл rpc - быстро, с минимальной задержкой, параллельно и, самое главное, в обе стороны.

mamos3 ()
Ответ на: комментарий от mamos3

Вам там чем обрабатывают? Пестицидами?

Ахах. Экология плохая в регионе, да

Претензии понятны, но я не об этом. В рантайм прилетает строка с именем метога и массив с аргументами. Возможно ли вызвать соответствующий метод у объекта по имени и передать ему массив? Хотя бы с анфейфом и грязными хаками. Но без говномакросов и говногенерации

anonymous ()
Ответ на: комментарий от anonymous

Даже если это можно как-то закостылить в Расте, это не особо идиоматично: предполагается, что ты сначала десериализуешь эту штуку в статически определенную структуру, а уже потом, когда убедился, что тебе прислали не полную фигню, вызываешь нужный метод. Считается, что паранойя - это хорошо.

anonymous ()
Ответ на: комментарий от anonymous

В том-то и прикол, что в js эти «параноидальные» проверки делаются буквально парой строк:

if (method_name in dogRpc && typeof method_name === 'function') {...}

Вторая строка - валидатор тупла при помощи io-ts или superstruct

const getFrogArgs = tuple([number()]); if (is(args, getFrogArgs)) {…}

anonymous ()
Ответ на: комментарий от mamos3

Смысл rpc - быстро, с минимальной задержкой, параллельно

Насколько я понимаю современный дискурс, HTTP3 таким и будет. По UDP, мультиплексированно, бинарно **е-мое. А websockets, на который ты намекаешь не позвали на этот праздник жизни. Он так и останется одиноко отрытым TCP-сокетом на одно подключение

и, самое главное, в обе стороны

Насколько я понимаю современный дискурс, держать подключение «туды» – моветон, т.к. высаживает батарейку. А удерживать полудуплекс на прием милое дело. Для этого есть SSE

anonymous ()
Ответ на: комментарий от anonymous

Насколько я понимаю современный дискурс, HTTP3 таким и будет. По UDP, мультиплексированно, бинарно **е-мое.

Говно мусорное для птушников.

А websockets, на который ты намекаешь не позвали на этот праздник жизни.

А это не важно.

Он так и останется одиноко отрытым TCP-сокетом на одно подключение

Не останется - добавят udp-сокет.

Насколько я понимаю современный дискурс, держать подключение «туды» – моветон, т.к. высаживает батарейку.

Полная чушня нелепая. Мало того, что хттп-дерьмо и так его держит, потому как иначе оно бы вообще не шевелилось. К тому же никакое соединение не требует какой-то батарейки.

А удерживать полудуплекс на прием милое дело. Для этого есть SSE

Нет, это проблема tcp-говна. Как только это дерьмо сдохнет - всё уйдёт.

mamos3 ()
Ответ на: комментарий от mamos3

Говно мусорное для птушников.

Ого, сцарь замахнулся на современный WEB.

Похоже что бложек сцаря будет доступен только в интернете сцаря через браузер сцаря. Поэтому прочитать его сможт только сцарь.

anonymous ()
Ответ на: комментарий от mamos3

добавят udp-сокет

Что-то не ищется RFC. Только невнятные намёки из 2017

Нет, это проблема tcp-говна. Как только это дерьмо сдохнет - всё уйдёт

Так вроде новый HTTP не привносит в протокол возможность серверу делать запрос на клиента? Советуют всё те же поллинг или SSE

anonymous ()
Ответ на: комментарий от anonymous

Так, ну давай я посмотрю твою дристню.

Для начала:

await - это в С++ не нужно. Можешь юзать асинхронщину без всего этого пердолинга.

dogRpc['method_name'](...args) - это делается без проблем.

class DogRpc {
  getFrog(id: number): Promise<Frog | RpcError> {...}
  lickFrog(id: number): Promise<boolean | RpcError> {...}
}

С этим сложнее, если голые плюсы. Если не голы - без проблем. К тому же, зачем ты засунул ошибку в result?

Если голые - можно сделать как-то так:


rpc dog{
  "get_grog"_f = [](int id) { ... },
  "lick_frog"_f = [](int id) { ... }
};

Далее можно юзать как ты там хотел.

mamos3 ()
Ответ на: комментарий от anonymous

Что-то не ищется RFC. Только невнятные намёки из 2017

Добавят. Не думаю, что они настолько идиоты.

Так вроде новый HTTP не привносит в протокол возможность серверу делать запрос на клиента?

Дак а я не про http - это мусор для птушников.

Советуют всё те же поллинг или SSE

Не советуют, а обезьяны в иное не могут.

mamos3 ()
Ответ на: комментарий от mamos3

dogRpc['method_name'](...args) - это делается без проблем

Собственно и хотелось бы посмотреть как это делается. в плюсах я не бум-бум. В расте, говорят, нельзя. Суть в том, что rpc-либа отдельно, а сервер отдельно. Соответственно, rpc-либа не знает конкретных имен функций. Получает строку в рантайме и вызывает на объекте метод с этим именем, передавая ему полученный массив, как аргументы

«get_grog»_f = [](int id) { ... }

Это оно? То, что я просил?

зачем ты засунул ошибку в result?

Так оказалось проще. Ошибка серилизуется и улетает на клиент как обычное сообщение. На клиенте ее можно бросить, но поскольку у нас там реакт, onGovno-хэндлеры, redux стор и прочее разноцветное месиво, ее легко не поймать. Проще проверять как go. if (isError(result)) {...}

anonymous ()
Ответ на: комментарий от anonymous

Когда-то давно я костылял, по моему даже тут тема есть, если её не выпилил. Думал, как можно было сделать на голых крестах. Лучшее, что у меня тогда вышло - это:



struct dog {
  struct get_frog: reg<get_frog> {
    get_frog(args) {}
    
    static inline bool is_init = reg::is_init;
  };
  
  
  struct lick_frog: reg<lick_frog> {
    lick_frog(args) {}
    
    static inline bool is_init = reg::is_init;
  };
  
};


Это хак, но это работает. Но сила этой дристни не в этом. Там суть в том, что в reg можно передавать всякие мидлвары, которые имеют доступ ко всему и запускаются автоматически.

На самом деле такое писать не особо лень. В жабаскрипте ты писать будешь не меньше, даже если обмажешься декораторами.

mamos3 ()
Ответ на: комментарий от anonymous

https://godbolt.org/z/5gFXtS - вот как-то так запиливается вариант, который я показывал для дефолтных крестов. Там чуть сложнее будет.

Далее к этому приколхоживается обходчик. А с ним можно сделать что угодно - можно сгенерировать мапу и для компилтайма.

Правда для уровня «жс» хватит и обычной мапы.


map rpc{
 cc{"a", [](args){}}
 cc{"b", [](args){}}
};

Если же именно классы выставлять в эфир - это рефлексия, как я уже выше говорил. Либо тот мой вариант.

mamos3 ()
Ответ на: комментарий от anonymous

Там какой-то бессмысленный псевдокод.

То, что ты, птушник, не осилил его понять - не делает его бессмысленным.

Но я помогу тебе. https://godbolt.org/z/S2R6zD - задача в том, что-бы затриггерить инициализацию для структур.

Всё, у тебя есть имя, причём с учётом неймспейса. Его получить ты можешь. Так же тебе доступен конструктор - ты можешь так же получить его сигнатуру на дефолтных крестах.

mamos3 ()
Ответ на: комментарий от mamos3

К сожалению, не могу оценить красоту решения. Слишком сложно для меня) Но, видимо, для юзера так-же читабельно как в скриптухе не получится

class DogRpc {
  kissDog(id: number, withTongue: boolean) {..}
}

router.post('/dogs', rpc(new DogRpc()));
``
anonymous ()
Ответ на: комментарий от anonymous

Собственно и хотелось бы посмотреть как это делается. в плюсах я не бум-бум. В расте, говорят, нельзя.

На макросах все можно, но может быть не просто, хотя и в с++ не тривиально будет.

anonymous ()
Ответ на: комментарий от anonymous

Но, видимо, для юзера так-же читабельно как в скриптухе не получится

всё будет так же, только это:

kissDog(id: number, withTongue: boolean) {..} заменится на это

"kissDog"_f = [](id: number, withTongue: boolean) {..}

К тому же, твоя дрисня не работает. Ты не знаешь типов аргументов - ты не сможешь их валидировать.

mamos3 ()
Ответ на: комментарий от anonymous

На макросах все можно

Я так понимаю, derive на trait не навесишь. А методы же в русте в трейтах определяются.. Остается только пердолинг со «старыми» макросами

anonymous ()
Ответ на: комментарий от mamos3

заменится на это

Ок, понял

ты не знаешь типов аргументов - ты не сможешь их валидировать.

есть у функции сахарок «arguments», есть валидаторы

anonymous ()
Ответ на: комментарий от mamos3

Руками

const kissDogArgs = tuple([number(), boolean()]);
...
kissDog(id: number, withTongue: boolean) {
  if (!is([...arguments], kissDogArgs)) return invalidRequest();
  ...
}

Если предложишь автоматическую валидацию на основе описания класса/интерфейса, буду признателен. Но без всяких там отдельных graphql-ей и генераторов

anonymous ()
Ответ на: комментарий от anonymous

Да нафиг нужна тогда эта дрисня, если типы неизвестны

Хоть какая-то адекватность. Лучше чем голый rest. Проще, чем обмазаться графкуэлем.

А ты бы как сделал? Чтоб не дрисня получилась)

Это что, скриптуха галимая ?

Она самая

anonymous ()
Ответ на: комментарий от anonymous

Хоть какая-то адекватность. Лучше чем голый rest. Проще, чем обмазаться графкуэлем.

Выше писал. трасформер + декораторы + всякое дерьмо. Но в конечном итоге всё это мусор получается. Слишком слабо всё это интегрируется в скриптуху.

Поэтому удивительно, но С++ умеет во всё это в десятки раз лучше. С рефлексией - это будет просто


struct(rpc) dog {
  kissDog(id: number, withTongue: boolean) {}
};

to_inet(dog{});

Всё, всё генерируется само, всё идеально. Вообще ничего писать не нужно.

mamos3 ()
Ответ на: комментарий от mamos3

трасформер + декораторы + всякое дерьмо

Погляжу, спасибо. Когда оследний раз задавался вопросом, у TS небыло никакой апишечки для работы извне. Мусор, согласен

Поэтому удивительно, но С++ умеет во всё это в десятки раз лучше

Ничего удивительного. Никто же не отрицает, что плюсы хороши во всяких забористых штуках. Их за другое не любят)

anonymous ()
Ответ на: комментарий от anonymous

Ну вот первая либа из списка - async-tls. У нее async-std только в dev-dependencies, видимо для запуска examples. Сама либа вроде как от реализации экзекьютора не зависит.

freecoder ()
Последнее исправление: freecoder (всего исправлений: 1)