Skip to content
Open
Show file tree
Hide file tree
Changes from 5 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
39 changes: 31 additions & 8 deletions analysis_options.yaml
Original file line number Diff line number Diff line change
@@ -1,12 +1,35 @@
# This file allows you to configure the Dart analyzer.
# This file configures the static analysis results for your project (errors,
# warnings, and lints).
#
# The commented part below is just for inspiration. Read the guide here:
# https://www.dartlang.org/guides/language/analysis-options
include: package:pedantic/analysis_options.yaml
# This enables the 'recommended' set of lints from `package:lints`.
# This set helps identify many issues that may lead to problems when running
# or consuming Dart code, and enforces writing Dart using a single, idiomatic
# style and format.
#
# If you want a smaller set of lints you can change this to specify
# 'package:lints/core.yaml'. These are just the most critical lints
# (the recommended set includes the core lints).
# The core lints are also what is used by pub.dev for scoring packages.

include: package:lints/recommended.yaml
analyzer:
# exclude:
# - path/to/excluded/files/**
errors:
dangling_library_doc_comments: ignore
implementation_imports: ignore
no_wildcard_variable_uses: ignore

# Uncomment the following section to specify additional rules.

# linter:
# rules:
# # see catalog here: http://dart-lang.github.io/linter/lints/
# - hash_and_equals
# - camel_case_types

# analyzer:
# exclude:
# - path/to/excluded/files/**

# For more information about the core and recommended set of lints, see
# https://dart.dev/go/core-lints

# For additional information about configuring this file, see
# https://dart.dev/guides/language/analysis-options
58 changes: 29 additions & 29 deletions lib/src/adapter/adapter.dart
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,13 @@
/// Copyright (C) 2017 Potix Corporation. All Rights Reserved.
import 'dart:async';
import 'package:socket_io/src/namespace.dart';
import 'package:socket_io/src/socket.dart';
import 'package:socket_io_common/src/parser/parser.dart';
import 'package:socket_io/src/util/event_emitter.dart';

abstract class Adapter {
Map nsps = {};
Map<String, _Room> rooms = {};
Map<String, Room> rooms = {};
Map<String, Map> sids = {};

void add(String id, String room, [dynamic Function([dynamic]) fn]);
Expand All @@ -37,15 +38,14 @@ class _MemoryStoreAdapter extends EventEmitter implements Adapter {
@override
Map nsps = {};
@override
Map<String, _Room> rooms = {};
Map<String, Room> rooms = {};

@override
Map<String, Map> sids = {};
late Encoder encoder;
late Namespace nsp;

_MemoryStoreAdapter(Namespace nsp) {
this.nsp = nsp;
_MemoryStoreAdapter(this.nsp) {
encoder = nsp.server.encoder;
}

Expand All @@ -60,7 +60,7 @@ class _MemoryStoreAdapter extends EventEmitter implements Adapter {
void add(String id, String room, [dynamic Function([dynamic])? fn]) {
sids[id] = sids[id] ?? {};
sids[id]![room] = true;
rooms[room] = rooms[room] ?? _Room();
rooms[room] = rooms[room] ?? Room();
rooms[room]!.add(id);
if (fn != null) scheduleMicrotask(() => fn(null));
}
Expand Down Expand Up @@ -125,34 +125,34 @@ class _MemoryStoreAdapter extends EventEmitter implements Adapter {
'compress': flags['compress']
};
var ids = {};
var socket;
Socket? socket;

packet['nsp'] = nsp.name;
encoder.encode(packet, (encodedPackets) {
if (rooms.isNotEmpty) {
for (var i = 0; i < rooms.length; i++) {
var room = this.rooms[rooms[i]];
if (room == null) continue;
var sockets = room.sockets;
for (var id in sockets.keys) {
if (sockets.containsKey(id)) {
if (ids[id] != null || except.contains(id)) continue;
socket = nsp.connected[id];
if (socket != null) {
socket.packet(encodedPackets, packetOpts);
ids[id] = true;
}
var encodedPackets = encoder.encode(packet);

if (rooms.isNotEmpty) {
for (var i = 0; i < rooms.length; i++) {
var room = this.rooms[rooms[i]];
if (room == null) continue;
var sockets = room.sockets;
for (var id in sockets.keys) {
if (sockets.containsKey(id)) {
if (ids[id] != null || except.contains(id)) continue;
socket = nsp.connected[id];
if (socket != null) {
socket.packet(encodedPackets, packetOpts);
ids[id] = true;
}
}
}
} else {
for (var id in sids.keys) {
if (except.contains(id)) continue;
socket = nsp.connected[id];
if (socket != null) socket.packet(encodedPackets, packetOpts);
}
}
});
} else {
for (var id in sids.keys) {
if (except.contains(id)) continue;
socket = nsp.connected[id];
if (socket != null) socket.packet(encodedPackets, packetOpts);
}
}
}

/// Gets a list of clients by sid.
Expand All @@ -165,7 +165,7 @@ class _MemoryStoreAdapter extends EventEmitter implements Adapter {
[List<String> rooms = const [], dynamic Function([dynamic])? fn]) {
var ids = {};
var sids = [];
var socket;
Socket? socket;

if (rooms.isNotEmpty) {
for (var i = 0; i < rooms.length; i++) {
Expand Down Expand Up @@ -208,7 +208,7 @@ class _MemoryStoreAdapter extends EventEmitter implements Adapter {
/// Room constructor.
///
/// @api private
class _Room {
class Room {
Map<String, bool> sockets = {};
int length = 0;

Expand Down
16 changes: 7 additions & 9 deletions lib/src/client.dart
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ class Client {
_logger.fine('connecting to namespace $name');
if (!server.nsps.containsKey(name)) {
packet(<dynamic, dynamic>{
'type': ERROR,
'type': CONNECT_ERROR,
'nsp': name,
'data': 'Invalid namespace'
});
Expand Down Expand Up @@ -140,10 +140,8 @@ class Client {
_logger.fine('writing packet $packet');
if (opts['preEncoded'] != true) {
// not broadcasting, need to encode
encoder.encode(packet, (encodedPackets) {
// encode, then write results to engine
writeToEngine(encodedPackets);
});
var encodedPackets = encoder.encode(packet);
writeToEngine(encodedPackets);
} else {
// a broadcast pre-encodes a packet
writeToEngine(packet);
Expand Down Expand Up @@ -189,9 +187,9 @@ class Client {
/// @param {Objcet} error object
/// @api private
void onerror(err) {
sockets.forEach((socket) {
for (var socket in sockets) {
socket.onerror(err);
});
}
onclose('client error');
}

Expand All @@ -207,9 +205,9 @@ class Client {

// `nsps` and `sockets` are cleaned up seamlessly
if (sockets.isNotEmpty) {
List.from(sockets).forEach((socket) {
for (var socket in List.from(sockets)) {
socket.onclose(reason);
});
}
sockets.clear();
}
decoder.destroy(); // clean up decoder
Expand Down
20 changes: 8 additions & 12 deletions lib/src/engine/server.dart
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,7 @@ class Server extends Engine {
/// @return {Boolean} whether the request is valid
/// @api private

void verify(SocketConnect connect, bool upgrade, fn) {
dynamic verify(SocketConnect connect, bool upgrade, fn) {
// transport check
var req = connect.request;
var transport = req.uri.queryParameters['transport'];
Expand Down Expand Up @@ -261,7 +261,7 @@ class Server extends Engine {
var id = generateId(connect);

_logger.fine('handshaking client $id');
var transport;
dynamic transport;
var req = connect.request;
try {
transport = Transports.newInstance(transportName, connect);
Expand All @@ -285,11 +285,8 @@ class Server extends Engine {

if (cookie?.isNotEmpty == true) {
transport.on('headers', (headers) {
headers['Set-Cookie'] = '$cookie=${Uri.encodeComponent(id)}' +
(cookiePath?.isNotEmpty == true ? '; Path=$cookiePath' : '') +
(cookiePath?.isNotEmpty == true && cookieHttpOnly == true
? '; HttpOnly'
: '');
headers['Set-Cookie'] =
'$cookie=${Uri.encodeComponent(id)}${cookiePath?.isNotEmpty == true ? '; Path=$cookiePath' : ''}${cookiePath?.isNotEmpty == true && cookieHttpOnly == true ? '; HttpOnly' : ''}';
});
}

Expand Down Expand Up @@ -433,11 +430,10 @@ class Server extends Engine {
: code;
var length = utf8.encode(message).length;
socket!.add('HTTP/1.1 400 Bad Request\r\n'
'Connection: close\r\n'
'Content-type: text/html\r\n'
'Content-Length: $length\r\n'
'\r\n' +
message);
'Connection: close\r\n'
'Content-type: text/html\r\n'
'Content-Length: $length\r\n'
'\r\n$message');
}
socket?.close();
}
Expand Down
49 changes: 26 additions & 23 deletions lib/src/engine/socket.dart
Original file line number Diff line number Diff line change
Expand Up @@ -140,10 +140,10 @@ class Socket extends EventEmitter {
void setTransport(Transport transport) {
var onError = this.onError;
var onPacket = this.onPacket;
var flush = (_) => this.flush();
var onClose = (_) {
flush(_) => this.flush();
onClose(_) {
this.onClose('transport close');
};
}

this.transport = transport;
this.transport.once('error', onError);
Expand Down Expand Up @@ -182,16 +182,16 @@ class Socket extends EventEmitter {
});

// we force a polling cycle to ensure a fast upgrade
var check = () {
check() {
if ('polling' == this.transport.name && this.transport.writable == true) {
_logger.fine('writing a noop packet to polling for fast upgrade');
this.transport.send([
{'type': 'noop'}
]);
}
};
}

var onPacket = (packet) {
onPacket(packet) {
if ('ping' == packet['type'] && 'probe' == packet['data']) {
transport.send([
{'type': 'pong', 'data': 'probe'}
Expand Down Expand Up @@ -221,24 +221,24 @@ class Socket extends EventEmitter {
cleanupFn['cleanup']();
transport.close();
}
};
}

var onError = (err) {
onError(err) {
_logger.fine('client did not complete upgrade - $err');
cleanupFn['cleanup']();
transport.close();
transport = null;
};
}

var onTransportClose = (_) {
onTransportClose(_) {
onError('transport closed');
};
}

var onClose = (_) {
onClose(_) {
onError('socket closed');
};
}

var cleanup = () {
cleanup() {
upgrading = false;
checkIntervalTimer?.cancel();
checkIntervalTimer = null;
Expand All @@ -250,7 +250,8 @@ class Socket extends EventEmitter {
transport.off('close', onTransportClose);
transport.off('error', onError);
off('close', onClose);
};
}

cleanupFn['cleanup'] = cleanup; // define it later
transport.on('packet', onPacket);
transport.once('close', onTransportClose);
Expand All @@ -263,7 +264,7 @@ class Socket extends EventEmitter {
///
/// @api private
void clearTransport() {
var cleanup;
dynamic cleanup;

var toCleanUp = cleanupFn.length;

Expand Down Expand Up @@ -311,13 +312,11 @@ class Socket extends EventEmitter {
/// @api private
void setupSendCallback() {
// the message was sent successfully, execute the callback
var onDrain = (_) {
onDrain(_) {
if (sentCallbackFn.isNotEmpty) {
var seqFn = sentCallbackFn[0];
if (seqFn is Function) {
_logger.fine('executing send callback');
seqFn(transport);
}
_logger.fine('executing send callback');
seqFn(transport);

/// else if (Array.isArray(seqFn)) {
/// _logger.fine('executing batch send callback');
Expand All @@ -328,7 +327,7 @@ class Socket extends EventEmitter {
/// }
/// }
}
};
}

transport.on('drain', onDrain);

Expand Down Expand Up @@ -391,7 +390,11 @@ class Socket extends EventEmitter {
var wbuf = writeBuffer;
writeBuffer = [];
if (transport.supportsFraming == false) {
sentCallbackFn.add((_) => packetsFn.forEach((f) => f(_)));
sentCallbackFn.add((_) {
for (var f in packetsFn) {
return f();
}
});
} else {
sentCallbackFn.addAll(packetsFn);
}
Expand Down
6 changes: 2 additions & 4 deletions lib/src/engine/transport/jsonp_transport.dart
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,8 @@ class JSONPTransport extends PollingTransport {
late String head;
late String foot;
JSONPTransport(SocketConnect connect) : super(connect) {
head = '___eio[' +
(connect.request.uri.queryParameters['j'] ?? '')
.replaceAll(RegExp('[^0-9]'), '') +
'](';
head =
'___eio[${(connect.request.uri.queryParameters['j'] ?? '').replaceAll(RegExp('[^0-9]'), '')}](';
foot = ');';
}

Expand Down
Loading