rpc_dart 1.0.0 copy "rpc_dart: ^1.0.0" to clipboard
rpc_dart: ^1.0.0 copied to clipboard

gRPC-inspired library built on pure Dart, Backend-for-Domain (BfD)

example/example.dart

// SPDX-FileCopyrightText: 2025 Karim "nogipx" Mamatkazin <nogipx@gmail.com>
//
// SPDX-License-Identifier: LGPL-3.0-or-later

// ignore_for_file: unused_element

import 'dart:async';
import 'dart:math';

import 'package:rpc_dart/rpc_dart.dart';

import 'calculator_caller.dart';
import 'calculator_responder.dart';
import 'calculator_contract.dart';

void main(List<String> args) async {
  await runCalculatorDemo();
}

/// Демонстрация использования калькулятора
Future<void> runCalculatorDemo() async {
  print('===== Запуск демонстрации калькулятора =====');

  // Создаем транспорт в памяти для демонстрации
  final transport = RpcInMemoryTransport.pair();
  RpcLoggerSettings.setDefaultMinLogLevel(RpcLoggerLevel.debug);

  // Создаем эндпоинты для клиента и сервера
  final serverEndpoint = RpcResponderEndpoint(
    transport: transport.$1,
    loggerColors: RpcLoggerColors.singleColor(AnsiColor.cyan),
  );
  final clientEndpoint = RpcCallerEndpoint(
    transport: transport.$2,
    loggerColors: RpcLoggerColors.singleColor(AnsiColor.magenta),
  );

  // Создаем сервер и регистрируем его
  final server = CalculatorResponder(simulatedDelayMs: 50);
  serverEndpoint.registerServiceContract(server);

  // Создаем клиента
  final client = CalculatorCaller(clientEndpoint);

  // Проверка типобезопасности: теперь клиентский контракт нельзя зарегистрировать
  // Раскомментируйте строку ниже, чтобы увидеть ошибку компиляции:
  // serverEndpoint.registerServiceContract(client); // ❌ Ошибка компиляции!

  // 1. Демонстрация унарного метода
  // print('\n--- Унарный метод: calculate ---');
  // await _demoUnaryCalculation(client);

  // 3. Демонстрация двунаправленного стрима
  print('\n--- Двунаправленный стрим: streamCalculate ---');
  await _demoBidirectionalStream(client);

  // Закрываем эндпоинты
  await serverEndpoint.close();
  await clientEndpoint.close();

  print('\n===== Демонстрация калькулятора завершена =====');
}

/// Демонстрация унарных вычислений
Future<void> _demoUnaryCalculation(CalculatorCaller client) async {
  try {
    print('DEBUG: Начало _demoUnaryCalculation');

    // Сложение
    print('DEBUG: Вызов client.add(5, 3)');
    final sum = await client.add(5, 3);
    print('5 + 3 = $sum');

    // Вычитание
    print('DEBUG: Вызов client.subtract(10, 4)');
    final diff = await client.subtract(10, 4);
    print('10 - 4 = $diff');

    // Умножение
    print('DEBUG: Вызов client.multiply(6, 7)');
    final product = await client.multiply(6, 7);
    print('6 * 7 = $product');

    // Деление
    print('DEBUG: Вызов client.divide(20, 4)');
    final quotient = await client.divide(20, 4);
    print('20 / 4 = $quotient');

    // Обработка ошибки
    try {
      print('DEBUG: Вызов client.divide(5, 0)');
      await client.divide(5, 0);
    } catch (e) {
      print('Ошибка деления на ноль: $e');
    }

    print('DEBUG: Завершение _demoUnaryCalculation');
  } catch (e) {
    print('Ошибка при выполнении унарных вычислений: $e');
    print('DEBUG: Stack trace: ${StackTrace.current}');
  }
}

/// Демонстрация двунаправленного стрима
Future<void> _demoBidirectionalStream(CalculatorCaller client) async {
  final random = Random();

  // Создаем контроллер для отправки запросов
  final requestController = StreamController<CalculationRequest>();

  final calculateStream = client.streamCalculate(requestController.stream);

  // Подписываемся на стрим ответов
  final responseSubscription = calculateStream.listen(
    (response) {
      if (response.success) {
        print('Результат: ${response.result}');
      } else {
        print('Ошибка: ${response.errorMessage}');
      }
    },
    onError: (e) => print('Ошибка стрима: $e'),
    onDone: () => print('Стрим завершен'),
  );

  // Отправляем серию случайных операций
  final operations = ['add', 'subtract', 'multiply', 'divide'];

  for (int i = 0; i < 5; i++) {
    final a = random.nextDouble() * 10;
    final b = random.nextDouble() * 5;
    final operation = operations[random.nextInt(operations.length)];

    print('Отправка: $a $operation $b');

    requestController.add(CalculationRequest(
      a: a,
      b: b,
      operation: operation,
    ));

    // Небольшая пауза между запросами
    await Future.delayed(Duration(milliseconds: 1000));
  }

  // Завершаем стрим запросов
  await requestController.close();

  // Ждем завершения всех ответов
  await responseSubscription.asFuture();
  await responseSubscription.cancel();
}
5
likes
0
points
388
downloads

Publisher

verified publisherdart.nogipx.dev

Weekly Downloads

gRPC-inspired library built on pure Dart, Backend-for-Domain (BfD)

Homepage
Repository (GitHub)
View/report issues

Topics

#rpc #grpc #streaming #bidirectional #backend-for-domain

Funding

Consider supporting this project:

liberapay.com

License

unknown (license)

Dependencies

meta

More

Packages that depend on rpc_dart