Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
# Changelog

## 0.5.0

Websocket format is changed.

## 0.4.0

Fix Websockets
Expand Down
24 changes: 18 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,21 @@ void main() {
});

app.ws('/socket').listen((socket) {
socket.on('ping').listen((data) => socket.send('pong'));
socket.on('pong').listen((data) => socket.close(1000, 'requested'));
});

});
socket.onMessage().listen((data) {
print('data: $data');
socket.send(data);
});

socket.onOpen.listen((ws) {
print('new socket opened');
});

socket.onClose.listen((ws) {
print('socket has been closed');
});

});
}
```

Expand All @@ -37,7 +47,7 @@ You start the server with `start()` function. It has 3 named arguments and
returns `Server` future

```dart
start({String host: '127.0.0.1', int port: 80})
start({String host: '127.0.0.1', int port: 80, cors : false})
```

### Server
Expand Down Expand Up @@ -93,7 +103,7 @@ render(viewName, [Map params]) // renders server view

```dart
send(message) // sends message
on(message, action) // adds handler to message
onMessage() // adds handler to message
close(status, reason) // closes socket
```

Expand All @@ -103,6 +113,8 @@ close(status, reason) // closes socket

Copyright (c) 2012 Yehor Lvivski <[email protected]>

Copyright (c) 2020 Benjamin Jung <[email protected]>

Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
'Software'), to deal in the Software without restriction, including
Expand Down
9 changes: 3 additions & 6 deletions example/app.dart
Original file line number Diff line number Diff line change
Expand Up @@ -38,13 +38,10 @@ void main() {
});
});

app.ws('/socket').listen((socket) {
socket.on('connected').listen((data) {
socket.send('ping', 'data-from-ping');
});
app.ws('/').listen((socket) {

socket.on('pong').listen((data) {
print('pong: $data');
socket.onMessage().listen((data) {
print('msg: $data');
socket.close(1000, 'requested');
});

Expand Down
14 changes: 6 additions & 8 deletions lib/socket.dart
Original file line number Diff line number Diff line change
Expand Up @@ -14,19 +14,17 @@ class Socket implements SocketBase {
this._ws = new WebSocket(url) {
_messages = _messageController.stream.asBroadcastStream();
_ws.onMessage.listen((e) {
var msg = new Message.fromPacket(e.data);
var msg = e.data;
_messageController.add(msg);
});
}

void send(String messageName, [ data ]) {
var message = new Message(messageName, data);
_ws.send(message.toPacket());
void send(String message) {
_ws.send(message);
}

Stream on(String messageName) {
return _messages.where((msg) => msg.name == messageName).map((msg) =>
msg.data);
Stream onMessage() {
return _messages;
}

Stream get onOpen => _ws.onOpen;
Expand All @@ -36,4 +34,4 @@ class Socket implements SocketBase {
void close([int status, String reason]) {
_ws.close(status, reason);
}
}
}
35 changes: 0 additions & 35 deletions lib/src/message.dart

This file was deleted.

2 changes: 1 addition & 1 deletion lib/src/request.dart
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ class Request {
.where((name) => name.split(',').indexOf(type) > 0)
.length > 0;

bool isMime(String type, {loose: false}) =>
bool isMime(String type, {loose: true}) =>
_request.headers[HttpHeaders.contentTypeHeader]
.where((value) => loose ? value.contains(type) : value == type)
.isNotEmpty;
Expand Down
13 changes: 5 additions & 8 deletions lib/src/route.dart
Original file line number Diff line number Diff line change
Expand Up @@ -8,21 +8,19 @@ class Route {
Stream<Request> requestStream;
Stream<Socket> socketStream;

Route(String method, path, { List<String> keys })
:
Route(String method, path, { List<String> keys }) :
_method = method.toUpperCase(),
_path = _normalize(path, keys: keys) {
requestStream = _requestController.stream;
}

Route.ws(dynamic path, { List<String> keys })
:
Route.ws(dynamic path, { List<String> keys }) :
_method = 'WS',
_path = _normalize(path, keys: keys) {
socketStream = _socketController.stream
.transform(new WebSocketTransformer())
.map((WebSocket ws) => new Socket(ws));
}
}

bool match(HttpRequest req) {
return ((_method == req.method || _method == 'WS')
Expand All @@ -33,15 +31,14 @@ class Route {
if (_method == 'WS') {
_socketController.add(req);
} else {
var request = new Request(req);
var request = new Request(req);
request.params = _parseParams(req.uri.path, _path);
request.response = new Response(req.response);
_requestController.add(request);
}
}

static Map _normalize(dynamic path,
{ List<String> keys, bool strict: false }) {
static Map _normalize(dynamic path, { List<String> keys, bool strict: false }) {
if (keys == null) {
keys = [];
}
Expand Down
23 changes: 22 additions & 1 deletion lib/src/server.dart
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,18 @@ class Server {
}

Future<Server> listen(String host, num port,
{String certificateChain, String privateKey, String password}) {
{String certificateChain, String privateKey, String password, bool cors}) {

handle(HttpServer server) {
_server = server;
server.listen((HttpRequest req) {
if (cors) {
addCorsHeaders(req.response);
if (req.method.toLowerCase() == 'options') {
_sendDummy(req);
return;
}
}
var route = _routes.firstWhere((Route route) => route.match(req),
orElse: () => null);
if (route != null) {
Expand Down Expand Up @@ -50,6 +57,13 @@ class Server {
return HttpServer.bind(host, port).then(handle);
}

void addCorsHeaders(HttpResponse response) {
response.headers.add('Access-Control-Allow-Origin', '*');
response.headers.add('Access-Control-Allow-Methods', 'GET,HEAD,PUT,PATCH,POST,DELETE');
response.headers.add('Access-Control-Allow-Headers',
'access-control-allow-origin,content-type,x-access-token');
}

void static(path, { listing: true, links: true, jail: true }) {
_staticServer = new VirtualDirectory(path)
..allowDirectoryListing = listing
Expand Down Expand Up @@ -106,6 +120,13 @@ class Server {
return route.requestStream;
}

void _sendDummy(HttpRequest req) {
var msg = {};
msg['status'] = 'ok';
req.response.write(jsonEncode(msg));
req.response.close();
}

void _send404(HttpRequest req) {
req.response
..statusCode = HttpStatus.notFound
Expand Down
13 changes: 5 additions & 8 deletions lib/src/socket.dart
Original file line number Diff line number Diff line change
Expand Up @@ -13,22 +13,19 @@ class Socket implements SocketBase {

_openController.add(_ws);
_ws.listen((data) {
var msg = new Message.fromPacket(data);
_messageController.add(msg);
_messageController.add(data);
},
onDone: () {
_closeController.add(_ws);
});
}

void send(String messageName, [ data ]) {
var message = new Message(messageName, data);
_ws.add(message.toPacket());
void send(String message) {
_ws.add(message);
}

Stream on(String messageName) {
return _messages.where((msg) => msg.name == messageName).map((msg) =>
msg.data);
Stream onMessage() {
return _messages;
}

Stream get onOpen => _openController.stream;
Expand Down
6 changes: 2 additions & 4 deletions lib/src/socket_base.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,10 @@ library start_socket;

import 'dart:async';

export 'message.dart' show Message;

abstract class SocketBase {
void send(String msg_name, [ data ]);
void send(String msg);

Stream on(String message_name);
Stream onMessage();

void close([int status, String reason]);
}
4 changes: 2 additions & 2 deletions lib/start.dart
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,6 @@ part 'src/server.dart';

part 'src/socket.dart';

Future<Server> start({ String host: '127.0.0.1', int port: 80, String certificateChain, String privateKey, String password}) {
return new Server().listen(host, port, certificateChain: certificateChain, privateKey: privateKey, password: password);
Future<Server> start({ String host: '127.0.0.1', int port: 80, String certificateChain, String privateKey, String password, bool cors:false}) {
return new Server().listen(host, port, certificateChain: certificateChain, privateKey: privateKey, password: password, cors: cors);
}
4 changes: 2 additions & 2 deletions pubspec.yaml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
name: start
author: Yehor Lvivski <[email protected]>
version: 0.4.0
author: Yehor Lvivski <[email protected]>, Benjamin Jung <[email protected]>
version: 0.5.0
homepage: http://github.com/lvivski/start
description: Sinatra inspired Web framework
environment:
Expand Down