jonataslaw / dart-server-nano

A light, fast, and friendly server written in Dart.
MIT License
23 stars 4 forks source link

Any way to call external function other than static or top level functions? #18

Closed shajin-screl closed 1 month ago

shajin-screl commented 1 month ago

import 'dart:io'; import 'package:dine_in_dia/helpers/sync/local_network_helpers.dart'; import 'package:flutter/material.dart'; import 'package:server_nano/server_nano.dart' as Server; import 'package:web_socket_client/web_socket_client.dart' as WebSocket;

class LocalNetwork extends ChangeNotifier { WebSocket.WebSocket? clientSocket; Server.Server? serverSocket; static Server.NanoSocket? nanoSocket; bool isWaiting = false; static int clientsCount = 0;

int get connectedClients => clientsCount; Server.NanoSocket? get nanoSocketInstance => nanoSocket;

Future init() async { setIsWaiting(true); List discoveredIPs = await NetworkHelpers.discoverLocalDevices(subnet: await NetworkHelpers.getLocalSubNet()); if (discoveredIPs.isEmpty) { serverSocket = Server.Server(); notifyListeners(); //* Start the server

  // NetworkHelpers.startServer((socket) {
  //   nanoSocket = socket;
  //   clientsCount = socket.length;
  // });

  serverSocket?.ws('/socket', (socket) {
    print('Client connected: ${socket.id}');

    socket.onMessage((message) {
      print("Message from client : $message");
      // Send the message back to the client
      socket.broadcast('Message From server : $message');
      socket.emitToRoom('connected', 'dev-group', 'User ${socket.id} connected to dev-group');
    });

    // rooms support
    socket.join('dev-group');

    socket.emitToRoom('connected', 'dev-group', 'User ${socket.id} connected to dev-group');
    clientsCount = socket.length;
    notifyListeners(); // Calling this will results in an error
    nanoSocket = socket;
  });
  serverSocket?.listen(host: InternetAddress.anyIPv4.address, wsPort: 15300, port: 8080, serverMode: Server.ServerMode.performance, useWebsocketInMainThread: true);

  notifyListeners();
} else {
  //* Connect to the server
  clientSocket = await NetworkHelpers.connect(discoveredIPs.first.removePort());
}
setIsWaiting(false);

}

void sendMessage(String message) { if (clientSocket != null) { clientSocket!.send(message); } else { nanoSocket?.sendToAll("From Server: $message"); } }

void notifyOthers({String? title, String? message, String? type}) {} void setIsWaiting(bool value, {bool isError = false}) async { isWaiting = value; isError = isError;

notifyListeners();

}

void stopServer() { nanoSocket?.close(); nanoSocket = null;

serverSocket = null;
notifyListeners();

} }

[ERROR:flutter/runtime/dart_vm_initializer.cc(41)] Unhandled Exception: Invalid argument(s): Illegal argument in isolate message: object is unsendable - Library:'dart:async' Class: _AsyncCompleter@4048458 (see restrictions listed at SendPort.send() documentation for more information) <- Instance of 'WidgetsFlutterBinding' (from package:flutter/src/widgets/binding.dart) <- Instance of '_BindingPipelineManifold' (from package:flutter/src/rendering/binding.dart) <- _manifold in Instance of 'PipelineOwner' (from package:flutter/src/rendering/object.dart) <- Instance of 'RenderConstrainedBox' (from package:flutter/src/rendering/proxy_box.dart) <- Instance of 'SingleChildRenderObjectElement' (from package:flutter/src/widgets/framework.dart)

shajin-screl commented 1 month ago

This works fine when I remove notifyListeners();

from serverSocket?.ws('/socket', (socket) { print('Client connected: ${socket.id}');

    socket.onMessage((message) {
      print("Message from client : $message");
      // Send the message back to the client
      socket.broadcast('Message From server : $message');
      socket.emitToRoom('connected', 'dev-group', 'User ${socket.id} connected to dev-group');
    });

    // rooms support
    socket.join('dev-group');

    socket.emitToRoom('connected', 'dev-group', 'User ${socket.id} connected to dev-group');
    clientsCount = socket.length;
    notifyListeners();
    nanoSocket = socket;
  });

  But it is required me to rebuild flutter's ui to reflects changes.