fennec
Fennec 是一個多線程、強大的 Dart 伺服器端框架。
Fennec 是一個多線程、強大的 Dart 伺服器端框架。
以下為英文專案原文快照,最新內容請造訪 GitHub。
https://user-images.githubusercontent.com/55693316/173706793-0666f8a8-67d6-4d1b-8b79-78fa4808e72e.png
| Packages | pub |
|---|---|
| fennec (core framework) | fennec |
| fennec_pg | fennec_pg |
| fennec_jwt | fennec_jwt |
| fennec_socket_io_server | fennec_socket_io_server |
you can make a request by creating a [Route] and add it to [Application] instance or create a [Router] and add it to [application] instance.
Router testRouter() {
Router router = Router();
router.get(
path: "/test",
requestHandler: (context, req, res) async {
return res.ok(body: "hello world");
});
return router;
}
it must be a typedef MiddlewareHandler and must return always MiddleWare. here an example how to implement it:
Future<Middleware> testMiddleware(ServerContext serverContext, Request req, Response res) async {
if (1 == 2) {
return Next();
}
return Stop(res.forbidden(body: {"error": "not allowed"}).json());
}
you can use also define a Router Middleware by.
router.useMiddleware((
serverContext, req, res) {
if (1 == 2) {
return Next();
}
return Stop(res.forbidden(body: {"error": "not allowed"}).json());
});
Isolate is an isolated environment, inside which there is memory allocated to it and its EventLoop. but sometimes you want to share Data between Isolates or have the same Data content on all Isolates.
Fennec let you do that by using Actor Concept.
first you need to create your Actor customized class that is a subclass of Actor.
example how to implement it.
class CustomisedActor extends Actor {
final List<String> _strings = [];
CustomisedActor(String name) : super(name);
@override
FutureOr<void> execute(String action,
{Map<String, dynamic> data = const {}}) {
if (action == 'insert') {
_strings.add(" new item");
} else {
if (_strings.isNotEmpty) {
_strings.removeLast();
}
}
}
@override
FutureOr get(String action, {Map<String, dynamic> data = const {}}) {
if (action == "get") {
return _strings;
}
return null;
}
}
after implementing of your needed subclasses of [Actor], you need just to add it/them to your [Application] by using addActor or addActors in [Application] instance.
with [ServerContext] instance you can have access to your Actor/Actors by their name and you can call get and execute methods to return some Data from Actor or execute some operations.
here is an example how to use dynamic path routes
router.get(path: "
/test/{id}
"
,
requestHandler: (
context, req, res) {
return res.ok(body: {"id": req.pathParams['id']}).json();
});
an example how to handle files
router.get(path: "
/getFile
"
,
requestHandler: (
context, req, res) {
return res.ok(body: req.files.first.filename);
});
you can render also html templates with fennec Framework. you need to determine the path for your html files. application.setViewPath(path.current + '/example');
an example how to use it.
router.get(path: "
/template
"
,
requestHandler: (
context, req, res) {
return res.render("file");
});
WebSocket is already integrated in the core of Framework. firstly to use Websocket . you need to make the useWebSocket object at [Application] instance true.
how to use it :
router.ws(path: "
/connect
"
,
websocketHandler: (
context, websocket) {
/// handle new connected websocket client.
});
Fennec Framework supports also Multithreading over isolates. To increase the number of used isolates just call the function setNumberOfIsolates. the default number of isolates is 1
example
application.setNumberOfIsolates(1
);
import 'package:fennec/fennec.dart';
void main(List<String> arguments) async {
Application application = Application();
application.setNumberOfIsolates(1);
application.useWebSocket(true);
application.setPort(8000);
application.addRouters([testRouter()]);
ServerInfo serverInfo = await application.runServer();
print("Server is running at Port ${serverInfo.port}");
}}
heroku cloud: here is heroku-buildpack for dart and inside it an example how to deploy Fennec Framework on heroku cloud for free. to test an example you can try this two endpoints:
https://fennec-deploy.herokuapp.com/healthcheck/servercheck
https://fennec-deploy.herokuapp.com/healthcheck
for next days, another example for aws and goolge run will be uploaded.
after running this endpoint using Fennec Framework on local machine (MacBook Pro (13-inch, 2019, Two Thunderbolt 3 ports), we could gets this data:
router.get(path: "
/test
"
,
requestHandler: (
context, req, res) async {
return res.ok(body: "hello world");
});
wrk -t1 -c100 -d60s http://localhost:8000/example/test
wrk -t10 -c100 -d60s http://localhost:8000/example/test
Fennec Framework after with version >= 1.0.0 doesn't support more annotations because the big discussions about the library mirrors. as alernatives you can use Route or Route as showed in this example.