separate socket events
This commit is contained in:
parent
1c4b0cbf29
commit
e7852fc8c2
17
TcpServer.js
17
TcpServer.js
|
@ -17,7 +17,7 @@ var Sockets = NativeModules.TcpSockets;
|
|||
|
||||
var Socket = require('./TcpSocket');
|
||||
|
||||
function TcpServer(connectionListener: (socket: Socket) => void) {
|
||||
function TcpServer(connectionListener: (socket: Socket) => void) {
|
||||
if (!(this instanceof TcpServer)) {
|
||||
return new TcpServer(connectionListener);
|
||||
}
|
||||
|
@ -33,20 +33,19 @@ function TcpServer(connectionListener: (socket: Socket) => void) {
|
|||
self.emit('listening');
|
||||
});
|
||||
// $FlowFixMe: suppressing this error flow doesn't like EventEmitter
|
||||
this._socket.on('error', function(error) {
|
||||
self.emit('error', error);
|
||||
self._socket.destroy();
|
||||
this._socket.on('connection', function(socket) {
|
||||
self._connections++;
|
||||
|
||||
self.emit('connection', socket);
|
||||
});
|
||||
// $FlowFixMe: suppressing this error flow doesn't like EventEmitter
|
||||
this._socket.on('close', function() {
|
||||
self.emit('close');
|
||||
});
|
||||
// $FlowFixMe: suppressing this error flow doesn't like EventEmitter
|
||||
this._socket.on('connection', function(socketId) {
|
||||
self._connections++;
|
||||
|
||||
var socket = new Socket({ id: socketId });
|
||||
self.emit('connection', socket);
|
||||
this._socket.on('error', function(error) {
|
||||
self.emit('error', error);
|
||||
self._socket.destroy();
|
||||
});
|
||||
|
||||
if (typeof connectionListener === 'function') {
|
||||
|
|
122
TcpSocket.js
122
TcpSocket.js
|
@ -50,9 +50,7 @@ function TcpSocket(options: ?{ id: ?number }) {
|
|||
// these will be set once there is a connection
|
||||
this.readable = this.writable = false;
|
||||
|
||||
this._subscription = DeviceEventEmitter.addListener(
|
||||
'tcp-' + this._id + '-event', this._onEvent.bind(this)
|
||||
);
|
||||
this._registerEvents();
|
||||
|
||||
// ensure compatibility with node's EventEmitter
|
||||
if (!this.on) {
|
||||
|
@ -75,7 +73,7 @@ TcpSocket.prototype._debug = function() {
|
|||
}
|
||||
};
|
||||
|
||||
TcpSocket.prototype.connect = function(options: { port: number, host: ?string, localAddress: ?string, localPort: ?number, family: ?number }, callback: ?() => void) {
|
||||
TcpSocket.prototype.connect = function(options: ?{ port: ?number | ?string, host: ?string, localAddress: ?string, localPort: ?number }, callback: ?() => void) {
|
||||
if (this._state !== STATE.DISCONNECTED) {
|
||||
throw new Error('Socket is already bound');
|
||||
}
|
||||
|
@ -84,8 +82,17 @@ TcpSocket.prototype.connect = function(options: { port: number, host: ?string, l
|
|||
this.once('connect', callback);
|
||||
}
|
||||
|
||||
if (!options) {
|
||||
options = {
|
||||
host: 'localhost',
|
||||
port: 0,
|
||||
localAddress: null,
|
||||
localPort: null
|
||||
};
|
||||
}
|
||||
|
||||
var host = options.host || 'localhost';
|
||||
var port = options.port;
|
||||
var port = options.port || 0;
|
||||
var localAddress = options.localAddress;
|
||||
var localPort = options.localPort;
|
||||
|
||||
|
@ -101,11 +108,13 @@ TcpSocket.prototype.connect = function(options: { port: number, host: ?string, l
|
|||
if (typeof port !== 'number' && typeof port !== 'string') {
|
||||
throw new TypeError('"port" option should be a number or string: ' + port);
|
||||
}
|
||||
|
||||
port = Number(port);
|
||||
|
||||
if (!isLegalPort(port)) {
|
||||
throw new RangeError('"port" option should be >= 0 and < 65536: ' + port);
|
||||
}
|
||||
}
|
||||
port |= port;
|
||||
|
||||
this._state = STATE.CONNECTING;
|
||||
this._debug('connecting, host:', host, 'port:', port);
|
||||
|
@ -145,9 +154,7 @@ TcpSocket.prototype.setTimeout = function(msecs: number, callback: () => void) {
|
|||
};
|
||||
|
||||
TcpSocket.prototype.address = function() : { port: number, address: string, family: string } {
|
||||
return { port: this._port,
|
||||
address: this._address,
|
||||
family: this._family };
|
||||
return this._address;
|
||||
};
|
||||
|
||||
TcpSocket.prototype.end = function(data, encoding) {
|
||||
|
@ -161,46 +168,95 @@ TcpSocket.prototype.end = function(data, encoding) {
|
|||
|
||||
this._destroyed = true;
|
||||
this._debug('closing');
|
||||
this._subscription.remove();
|
||||
|
||||
Sockets.end(this._id, this._debug.bind(this, 'closed'));
|
||||
Sockets.end(this._id, this._debug.bind(this, 'end'));
|
||||
};
|
||||
|
||||
TcpSocket.prototype.destroy = function() {
|
||||
if (!this._destroyed) {
|
||||
this._destroyed = true;
|
||||
this._debug('destroying');
|
||||
this._subscription.remove();
|
||||
|
||||
Sockets.destroy(this._id, this._debug.bind(this, 'closed'));
|
||||
Sockets.destroy(this._id, this._debug.bind(this, 'destroy'));
|
||||
}
|
||||
};
|
||||
|
||||
TcpSocket.prototype._onEvent = function(info: { event: string, data: any }) {
|
||||
this._debug('received', info.event);
|
||||
TcpSocket.prototype._registerEvents = function(): void {
|
||||
this._subs = [
|
||||
DeviceEventEmitter.addListener(
|
||||
'tcp-' + this._id + '-connect', this._onConnect.bind(this)
|
||||
),
|
||||
DeviceEventEmitter.addListener(
|
||||
'tcp-' + this._id + '-connection', this._onConnection.bind(this)
|
||||
),
|
||||
DeviceEventEmitter.addListener(
|
||||
'tcp-' + this._id + '-data', this._onData.bind(this)
|
||||
),
|
||||
DeviceEventEmitter.addListener(
|
||||
'tcp-' + this._id + '-close', this._onClose.bind(this)
|
||||
),
|
||||
DeviceEventEmitter.addListener(
|
||||
'tcp-' + this._id + '-error', this._onError.bind(this)
|
||||
)
|
||||
];
|
||||
};
|
||||
|
||||
if (info.event === 'connect') {
|
||||
this.writable = this.readable = true;
|
||||
this._state = STATE.CONNECTED;
|
||||
TcpSocket.prototype._unregisterEvents = function(): void {
|
||||
this._subs.forEach(function(listener) {
|
||||
listener.remove();
|
||||
});
|
||||
this._subs = [];
|
||||
};
|
||||
|
||||
this._address = info.data.address;
|
||||
this._port = Number(info.data.port);
|
||||
this._family = info.data.family;
|
||||
} else if (info.event === 'data') {
|
||||
if (this._timeout) {
|
||||
clearTimeout(this._timeout);
|
||||
this._timeout = null;
|
||||
}
|
||||
TcpSocket.prototype._onConnect = function(address: { port: string, address: string, family: string }): void {
|
||||
this._debug('received', 'connect');
|
||||
|
||||
// from base64 string
|
||||
info.data = typeof Buffer === 'undefined'
|
||||
? base64.toByteArray(info.data)
|
||||
: new global.Buffer(info.data, 'base64');
|
||||
} else if (info.event === 'close') {
|
||||
this._state = STATE.DISCONNECTED;
|
||||
this.writable = this.readable = true;
|
||||
this._state = STATE.CONNECTED;
|
||||
|
||||
this._address = address;
|
||||
this.address.port = Number(this.address.port);
|
||||
|
||||
this.emit('connect');
|
||||
};
|
||||
|
||||
TcpSocket.prototype._onConnection = function(id: number): void {
|
||||
this._debug('received', 'connection');
|
||||
|
||||
var socket = new TcpSocket({ id: id });
|
||||
this.emit('connection', socket);
|
||||
};
|
||||
|
||||
TcpSocket.prototype._onData = function(data: string): void {
|
||||
this._debug('received', 'data');
|
||||
|
||||
if (this._timeout) {
|
||||
clearTimeout(this._timeout);
|
||||
this._timeout = null;
|
||||
}
|
||||
|
||||
this.emit(info.event, info.data);
|
||||
// from base64 string
|
||||
var buffer = typeof Buffer === 'undefined'
|
||||
? base64.toByteArray(data)
|
||||
: new global.Buffer(data, 'base64');
|
||||
|
||||
this.emit('data', buffer);
|
||||
};
|
||||
|
||||
TcpSocket.prototype._onClose = function(hadError: boolean): void {
|
||||
this._debug('received', 'close');
|
||||
|
||||
this._unregisterEvents();
|
||||
|
||||
this._state = STATE.DISCONNECTED;
|
||||
|
||||
this.emit('close', hadError);
|
||||
};
|
||||
|
||||
TcpSocket.prototype._onError = function(error: string): void {
|
||||
this._debug('received', 'error');
|
||||
|
||||
this.emit('error', normalizeError(error));
|
||||
};
|
||||
|
||||
TcpSocket.prototype.write = function(buffer: any, callback: ?(err: ?Error) => void) : boolean {
|
||||
|
|
|
@ -17,7 +17,7 @@ exports.createServer = function(connectionListener: (socket: Socket) => void) :
|
|||
return new Server(connectionListener);
|
||||
};
|
||||
|
||||
exports.connect = exports.createConnection = function(options: { port: number, host: ?string, localAddress: ?string, localPort: ?number, family: ?number }, callback: ?() => void) : Socket {
|
||||
exports.connect = exports.createConnection = function(options: ?{ port: ?number | ?string, host: ?string, localAddress: ?string, localPort: ?number}, callback: ?() => void) : Socket {
|
||||
var tcpSocket = new Socket();
|
||||
tcpSocket.connect(options, callback);
|
||||
return tcpSocket;
|
||||
|
|
|
@ -0,0 +1,115 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module external.linked.project.id="android" external.linked.project.path="$MODULE_DIR$" external.root.project.path="$MODULE_DIR$" external.system.id="GRADLE" external.system.module.group="" external.system.module.version="unspecified" type="JAVA_MODULE" version="4">
|
||||
<component name="FacetManager">
|
||||
<facet type="android-gradle" name="Android-Gradle">
|
||||
<configuration>
|
||||
<option name="GRADLE_PROJECT_PATH" value=":" />
|
||||
</configuration>
|
||||
</facet>
|
||||
<facet type="android" name="Android">
|
||||
<configuration>
|
||||
<option name="SELECTED_BUILD_VARIANT" value="debug" />
|
||||
<option name="SELECTED_TEST_ARTIFACT" value="_android_test_" />
|
||||
<option name="ASSEMBLE_TASK_NAME" value="assembleDebug" />
|
||||
<option name="COMPILE_JAVA_TASK_NAME" value="compileDebugSources" />
|
||||
<option name="ASSEMBLE_TEST_TASK_NAME" value="assembleDebugAndroidTest" />
|
||||
<option name="COMPILE_JAVA_TEST_TASK_NAME" value="compileDebugAndroidTestSources" />
|
||||
<afterSyncTasks>
|
||||
<task>generateDebugAndroidTestSources</task>
|
||||
<task>generateDebugSources</task>
|
||||
</afterSyncTasks>
|
||||
<option name="ALLOW_USER_CONFIGURATION" value="false" />
|
||||
<option name="MANIFEST_FILE_RELATIVE_PATH" value="/src/main/AndroidManifest.xml" />
|
||||
<option name="RES_FOLDER_RELATIVE_PATH" value="/src/main/res" />
|
||||
<option name="RES_FOLDERS_RELATIVE_PATH" value="" />
|
||||
<option name="ASSETS_FOLDER_RELATIVE_PATH" value="/src/main/assets" />
|
||||
<option name="LIBRARY_PROJECT" value="true" />
|
||||
</configuration>
|
||||
</facet>
|
||||
</component>
|
||||
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_7" inherit-compiler-output="false">
|
||||
<output url="file://$MODULE_DIR$/build/intermediates/classes/debug" />
|
||||
<output-test url="file://$MODULE_DIR$/build/intermediates/classes/androidTest/debug" />
|
||||
<exclude-output />
|
||||
<content url="file://$MODULE_DIR$">
|
||||
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/r/debug" isTestSource="false" generated="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/aidl/debug" isTestSource="false" generated="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/buildConfig/debug" isTestSource="false" generated="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/rs/debug" isTestSource="false" generated="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/build/generated/res/rs/debug" type="java-resource" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/build/generated/res/resValues/debug" type="java-resource" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/r/androidTest/debug" isTestSource="true" generated="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/aidl/androidTest/debug" isTestSource="true" generated="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/buildConfig/androidTest/debug" isTestSource="true" generated="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/rs/androidTest/debug" isTestSource="true" generated="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/build/generated/res/rs/androidTest/debug" type="java-test-resource" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/build/generated/res/resValues/androidTest/debug" type="java-test-resource" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/debug/res" type="java-resource" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/debug/resources" type="java-resource" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/debug/assets" type="java-resource" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/debug/aidl" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/debug/java" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/debug/jni" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/debug/rs" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/main/res" type="java-resource" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/main/assets" type="java-resource" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/main/aidl" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/main/jni" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/main/rs" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/res" type="java-test-resource" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/resources" type="java-test-resource" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/assets" type="java-test-resource" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/aidl" isTestSource="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/java" isTestSource="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/jni" isTestSource="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/rs" isTestSource="true" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/annotations" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/assets" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/bundles" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/classes" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/dependency-cache" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/com.android.support/appcompat-v7/23.0.1/jars" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/com.android.support/recyclerview-v7/23.0.1/jars" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/com.android.support/support-v4/23.0.1/jars" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/com.facebook.fresco/drawee/0.8.1/jars" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/com.facebook.fresco/fbcore/0.8.1/jars" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/com.facebook.fresco/fresco/0.8.1/jars" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/com.facebook.fresco/imagepipeline-okhttp/0.8.1/jars" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/com.facebook.fresco/imagepipeline/0.8.1/jars" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/com.facebook.react/react-native/0.17.1/jars" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/org.webkit/android-jsc/r174650/jars" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/incremental" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/lint" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/res" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/rs" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/symbols" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/outputs" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/tmp" />
|
||||
</content>
|
||||
<orderEntry type="jdk" jdkName="Android API 23 Platform" jdkType="Android SDK" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
<orderEntry type="library" exported="" name="okhttp-ws-2.5.0" level="project" />
|
||||
<orderEntry type="library" exported="" name="library-2.4.0" level="project" />
|
||||
<orderEntry type="library" exported="" name="okio-1.6.0" level="project" />
|
||||
<orderEntry type="library" exported="" name="stetho-okhttp-1.2.0" level="project" />
|
||||
<orderEntry type="library" exported="" name="okhttp-2.5.0" level="project" />
|
||||
<orderEntry type="library" exported="" name="jsr305-3.0.0" level="project" />
|
||||
<orderEntry type="library" exported="" name="stetho-1.2.0" level="project" />
|
||||
<orderEntry type="library" exported="" name="jackson-core-2.2.3" level="project" />
|
||||
<orderEntry type="library" exported="" name="fbcore-0.8.1" level="project" />
|
||||
<orderEntry type="library" exported="" name="commons-cli-1.2" level="project" />
|
||||
<orderEntry type="library" exported="" name="recyclerview-v7-23.0.1" level="project" />
|
||||
<orderEntry type="library" exported="" name="imagepipeline-0.8.1" level="project" />
|
||||
<orderEntry type="library" exported="" name="react-native-0.17.1" level="project" />
|
||||
<orderEntry type="library" exported="" name="android-jsc-r174650" level="project" />
|
||||
<orderEntry type="library" exported="" name="fresco-0.8.1" level="project" />
|
||||
<orderEntry type="library" exported="" name="imagepipeline-okhttp-0.8.1" level="project" />
|
||||
<orderEntry type="library" exported="" name="bolts-android-1.1.4" level="project" />
|
||||
<orderEntry type="library" exported="" name="support-v4-23.0.1" level="project" />
|
||||
<orderEntry type="library" exported="" name="drawee-0.8.1" level="project" />
|
||||
<orderEntry type="library" exported="" name="appcompat-v7-23.0.1" level="project" />
|
||||
<orderEntry type="library" exported="" name="support-annotations-23.0.1" level="project" />
|
||||
</component>
|
||||
</module>
|
|
@ -1,3 +1,13 @@
|
|||
buildscript {
|
||||
repositories {
|
||||
jcenter()
|
||||
}
|
||||
|
||||
dependencies {
|
||||
classpath 'com.android.tools.build:gradle:1.3.1'
|
||||
}
|
||||
}
|
||||
|
||||
apply plugin: 'com.android.library'
|
||||
|
||||
android {
|
||||
|
@ -24,8 +34,10 @@ android {
|
|||
}
|
||||
}
|
||||
|
||||
repositories {
|
||||
mavenCentral()
|
||||
}
|
||||
|
||||
dependencies {
|
||||
compile fileTree(dir: 'libs', include: ['*.jar'])
|
||||
compile 'com.android.support:appcompat-v7:23.0.1'
|
||||
compile 'com.facebook.react:react-native:0.17.+'
|
||||
}
|
||||
|
|
Binary file not shown.
|
@ -0,0 +1,6 @@
|
|||
#Wed Oct 21 11:34:03 PDT 2015
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
|
|
@ -0,0 +1,160 @@
|
|||
#!/usr/bin/env bash
|
||||
|
||||
##############################################################################
|
||||
##
|
||||
## Gradle start up script for UN*X
|
||||
##
|
||||
##############################################################################
|
||||
|
||||
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||
DEFAULT_JVM_OPTS=""
|
||||
|
||||
APP_NAME="Gradle"
|
||||
APP_BASE_NAME=`basename "$0"`
|
||||
|
||||
# Use the maximum available, or set MAX_FD != -1 to use that value.
|
||||
MAX_FD="maximum"
|
||||
|
||||
warn ( ) {
|
||||
echo "$*"
|
||||
}
|
||||
|
||||
die ( ) {
|
||||
echo
|
||||
echo "$*"
|
||||
echo
|
||||
exit 1
|
||||
}
|
||||
|
||||
# OS specific support (must be 'true' or 'false').
|
||||
cygwin=false
|
||||
msys=false
|
||||
darwin=false
|
||||
case "`uname`" in
|
||||
CYGWIN* )
|
||||
cygwin=true
|
||||
;;
|
||||
Darwin* )
|
||||
darwin=true
|
||||
;;
|
||||
MINGW* )
|
||||
msys=true
|
||||
;;
|
||||
esac
|
||||
|
||||
# Attempt to set APP_HOME
|
||||
# Resolve links: $0 may be a link
|
||||
PRG="$0"
|
||||
# Need this for relative symlinks.
|
||||
while [ -h "$PRG" ] ; do
|
||||
ls=`ls -ld "$PRG"`
|
||||
link=`expr "$ls" : '.*-> \(.*\)$'`
|
||||
if expr "$link" : '/.*' > /dev/null; then
|
||||
PRG="$link"
|
||||
else
|
||||
PRG=`dirname "$PRG"`"/$link"
|
||||
fi
|
||||
done
|
||||
SAVED="`pwd`"
|
||||
cd "`dirname \"$PRG\"`/" >/dev/null
|
||||
APP_HOME="`pwd -P`"
|
||||
cd "$SAVED" >/dev/null
|
||||
|
||||
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
|
||||
|
||||
# Determine the Java command to use to start the JVM.
|
||||
if [ -n "$JAVA_HOME" ] ; then
|
||||
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
|
||||
# IBM's JDK on AIX uses strange locations for the executables
|
||||
JAVACMD="$JAVA_HOME/jre/sh/java"
|
||||
else
|
||||
JAVACMD="$JAVA_HOME/bin/java"
|
||||
fi
|
||||
if [ ! -x "$JAVACMD" ] ; then
|
||||
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
|
||||
|
||||
Please set the JAVA_HOME variable in your environment to match the
|
||||
location of your Java installation."
|
||||
fi
|
||||
else
|
||||
JAVACMD="java"
|
||||
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
||||
|
||||
Please set the JAVA_HOME variable in your environment to match the
|
||||
location of your Java installation."
|
||||
fi
|
||||
|
||||
# Increase the maximum file descriptors if we can.
|
||||
if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
|
||||
MAX_FD_LIMIT=`ulimit -H -n`
|
||||
if [ $? -eq 0 ] ; then
|
||||
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
|
||||
MAX_FD="$MAX_FD_LIMIT"
|
||||
fi
|
||||
ulimit -n $MAX_FD
|
||||
if [ $? -ne 0 ] ; then
|
||||
warn "Could not set maximum file descriptor limit: $MAX_FD"
|
||||
fi
|
||||
else
|
||||
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
|
||||
fi
|
||||
fi
|
||||
|
||||
# For Darwin, add options to specify how the application appears in the dock
|
||||
if $darwin; then
|
||||
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
|
||||
fi
|
||||
|
||||
# For Cygwin, switch paths to Windows format before running java
|
||||
if $cygwin ; then
|
||||
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
|
||||
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
|
||||
JAVACMD=`cygpath --unix "$JAVACMD"`
|
||||
|
||||
# We build the pattern for arguments to be converted via cygpath
|
||||
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
|
||||
SEP=""
|
||||
for dir in $ROOTDIRSRAW ; do
|
||||
ROOTDIRS="$ROOTDIRS$SEP$dir"
|
||||
SEP="|"
|
||||
done
|
||||
OURCYGPATTERN="(^($ROOTDIRS))"
|
||||
# Add a user-defined pattern to the cygpath arguments
|
||||
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
|
||||
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
|
||||
fi
|
||||
# Now convert the arguments - kludge to limit ourselves to /bin/sh
|
||||
i=0
|
||||
for arg in "$@" ; do
|
||||
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
|
||||
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
|
||||
|
||||
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
|
||||
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
|
||||
else
|
||||
eval `echo args$i`="\"$arg\""
|
||||
fi
|
||||
i=$((i+1))
|
||||
done
|
||||
case $i in
|
||||
(0) set -- ;;
|
||||
(1) set -- "$args0" ;;
|
||||
(2) set -- "$args0" "$args1" ;;
|
||||
(3) set -- "$args0" "$args1" "$args2" ;;
|
||||
(4) set -- "$args0" "$args1" "$args2" "$args3" ;;
|
||||
(5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
|
||||
(6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
|
||||
(7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
|
||||
(8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
|
||||
(9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
|
||||
esac
|
||||
fi
|
||||
|
||||
# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
|
||||
function splitJvmOpts() {
|
||||
JVM_OPTS=("$@")
|
||||
}
|
||||
eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
|
||||
JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
|
||||
|
||||
exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
|
|
@ -0,0 +1,90 @@
|
|||
@if "%DEBUG%" == "" @echo off
|
||||
@rem ##########################################################################
|
||||
@rem
|
||||
@rem Gradle startup script for Windows
|
||||
@rem
|
||||
@rem ##########################################################################
|
||||
|
||||
@rem Set local scope for the variables with windows NT shell
|
||||
if "%OS%"=="Windows_NT" setlocal
|
||||
|
||||
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||
set DEFAULT_JVM_OPTS=
|
||||
|
||||
set DIRNAME=%~dp0
|
||||
if "%DIRNAME%" == "" set DIRNAME=.
|
||||
set APP_BASE_NAME=%~n0
|
||||
set APP_HOME=%DIRNAME%
|
||||
|
||||
@rem Find java.exe
|
||||
if defined JAVA_HOME goto findJavaFromJavaHome
|
||||
|
||||
set JAVA_EXE=java.exe
|
||||
%JAVA_EXE% -version >NUL 2>&1
|
||||
if "%ERRORLEVEL%" == "0" goto init
|
||||
|
||||
echo.
|
||||
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
||||
echo.
|
||||
echo Please set the JAVA_HOME variable in your environment to match the
|
||||
echo location of your Java installation.
|
||||
|
||||
goto fail
|
||||
|
||||
:findJavaFromJavaHome
|
||||
set JAVA_HOME=%JAVA_HOME:"=%
|
||||
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
|
||||
|
||||
if exist "%JAVA_EXE%" goto init
|
||||
|
||||
echo.
|
||||
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
|
||||
echo.
|
||||
echo Please set the JAVA_HOME variable in your environment to match the
|
||||
echo location of your Java installation.
|
||||
|
||||
goto fail
|
||||
|
||||
:init
|
||||
@rem Get command-line arguments, handling Windowz variants
|
||||
|
||||
if not "%OS%" == "Windows_NT" goto win9xME_args
|
||||
if "%@eval[2+2]" == "4" goto 4NT_args
|
||||
|
||||
:win9xME_args
|
||||
@rem Slurp the command line arguments.
|
||||
set CMD_LINE_ARGS=
|
||||
set _SKIP=2
|
||||
|
||||
:win9xME_args_slurp
|
||||
if "x%~1" == "x" goto execute
|
||||
|
||||
set CMD_LINE_ARGS=%*
|
||||
goto execute
|
||||
|
||||
:4NT_args
|
||||
@rem Get arguments from the 4NT Shell from JP Software
|
||||
set CMD_LINE_ARGS=%$
|
||||
|
||||
:execute
|
||||
@rem Setup the command line
|
||||
|
||||
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
|
||||
|
||||
@rem Execute Gradle
|
||||
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
|
||||
|
||||
:end
|
||||
@rem End local scope for the variables with windows NT shell
|
||||
if "%ERRORLEVEL%"=="0" goto mainEnd
|
||||
|
||||
:fail
|
||||
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
|
||||
rem the _cmd.exe /c_ return code!
|
||||
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
|
||||
exit /b 1
|
||||
|
||||
:mainEnd
|
||||
if "%OS%"=="Windows_NT" endlocal
|
||||
|
||||
:omega
|
|
@ -0,0 +1,7 @@
|
|||
package com.peel.react;
|
||||
|
||||
/**
|
||||
* Created by aprock on 12/23/15.
|
||||
*/
|
||||
public class TcpSocketClient {
|
||||
}
|
|
@ -5,8 +5,6 @@
|
|||
|
||||
package com.peel.react;
|
||||
|
||||
import android.content.Context;
|
||||
import android.net.wifi.WifiManager;
|
||||
import android.support.annotation.Nullable;
|
||||
import android.util.SparseArray;
|
||||
|
||||
|
@ -22,17 +20,13 @@ import com.facebook.react.bridge.ReadableMap;
|
|||
import com.facebook.react.bridge.WritableMap;
|
||||
import com.facebook.react.modules.core.DeviceEventManagerModule;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.SocketException;
|
||||
import java.net.UnknownHostException;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
|
||||
/**
|
||||
* The NativeModule in charge of storing active {@link TcpSocketClient}s, and acting as an api layer.
|
||||
*/
|
||||
public final class TcpSockets extends ReactContextBaseJavaModule {
|
||||
private static final String TAG = "TcpSockets";
|
||||
|
||||
private SparseArray<TcpSocketClient> mClients = new SparseArray<TcpSocketClient>();
|
||||
private boolean mShuttingDown = false;
|
||||
|
||||
public TcpSockets(ReactApplicationContext reactContext) {
|
||||
|
|
|
@ -220,13 +220,14 @@ NSString *const RCTTCPErrorDomain = @"RCTTCPErrorDomain";
|
|||
- (void)socketDidCloseReadStream:(GCDAsyncSocket *)sock
|
||||
{
|
||||
// TODO : investigate for half-closed sockets
|
||||
/* no-op */
|
||||
// for now close the stream completely
|
||||
[sock disconnect];
|
||||
}
|
||||
|
||||
- (void)socketDidDisconnect:(GCDAsyncSocket *)sock withError:(NSError *)err
|
||||
{
|
||||
if (!_clientDelegate) return;
|
||||
[_clientDelegate onClose:self withError:err];
|
||||
[_clientDelegate onClose:self withError:(!err || err.code == GCDAsyncSocketClosedError ? nil : err)];
|
||||
}
|
||||
|
||||
- (NSError *)badParamError:(NSString *)errMsg
|
||||
|
|
|
@ -101,15 +101,22 @@ RCT_EXPORT_METHOD(listen:(nonnull NSNumber*)cId
|
|||
|
||||
- (void)onConnect:(TcpSocketClient*) client
|
||||
{
|
||||
[self.bridge.eventDispatcher sendDeviceEventWithName:[NSString stringWithFormat:@"tcp-%@-event", client.id]
|
||||
body:@{ @"event": @"connect", @"data": [client getAddress] }];
|
||||
[self.bridge.eventDispatcher sendDeviceEventWithName:[NSString stringWithFormat:@"tcp-%@-connect", client.id]
|
||||
body:[client getAddress]];
|
||||
}
|
||||
|
||||
-(void)onConnection:(TcpSocketClient *)client toClient:(NSNumber *)clientID {
|
||||
_clients[client.id] = client;
|
||||
|
||||
[self.bridge.eventDispatcher sendDeviceEventWithName:[NSString stringWithFormat:@"tcp-%@-connection", clientID]
|
||||
body:client.id];
|
||||
}
|
||||
|
||||
- (void)onData:(NSNumber *)clientID data:(NSData *)data
|
||||
{
|
||||
NSString *base64String = [data base64EncodedStringWithOptions:0];
|
||||
[self.bridge.eventDispatcher sendDeviceEventWithName:[NSString stringWithFormat:@"tcp-%@-event", clientID]
|
||||
body:@{ @"event": @"data", @"data": base64String }];
|
||||
[self.bridge.eventDispatcher sendDeviceEventWithName:[NSString stringWithFormat:@"tcp-%@-data", clientID]
|
||||
body:base64String];
|
||||
}
|
||||
|
||||
- (void)onClose:(TcpSocketClient*) client withError:(NSError *)err
|
||||
|
@ -118,8 +125,8 @@ RCT_EXPORT_METHOD(listen:(nonnull NSNumber*)cId
|
|||
[self onError:client withError:err];
|
||||
}
|
||||
|
||||
[self.bridge.eventDispatcher sendDeviceEventWithName:[NSString stringWithFormat:@"tcp-%@-event", client.id]
|
||||
body:@{ @"event": @"close", @"data": err == nil ? @NO : @YES }];
|
||||
[self.bridge.eventDispatcher sendDeviceEventWithName:[NSString stringWithFormat:@"tcp-%@-close", client.id]
|
||||
body:err == nil ? @NO : @YES];
|
||||
|
||||
client.clientDelegate = nil;
|
||||
[_clients removeObjectForKey:client.id];
|
||||
|
@ -127,8 +134,8 @@ RCT_EXPORT_METHOD(listen:(nonnull NSNumber*)cId
|
|||
|
||||
- (void)onError:(TcpSocketClient*) client withError:(NSError *)err {
|
||||
NSString *msg = [err userInfo][@"NSLocalizedFailureReason"] ?: [err userInfo][@"NSLocalizedDescription"];
|
||||
[self.bridge.eventDispatcher sendDeviceEventWithName:[NSString stringWithFormat:@"tcp-%@-event", client.id]
|
||||
body:@{ @"event": @"error", @"data": msg }];
|
||||
[self.bridge.eventDispatcher sendDeviceEventWithName:[NSString stringWithFormat:@"tcp-%@-error", client.id]
|
||||
body:msg];
|
||||
|
||||
}
|
||||
|
||||
|
@ -169,13 +176,6 @@ RCT_EXPORT_METHOD(listen:(nonnull NSNumber*)cId
|
|||
[_clients removeObjectForKey:cId];
|
||||
}
|
||||
|
||||
-(void)onConnection:(TcpSocketClient *)client toClient:(NSNumber *)clientID {
|
||||
_clients[client.id] = client;
|
||||
|
||||
[self.bridge.eventDispatcher sendDeviceEventWithName:[NSString stringWithFormat:@"tcp-%@-event", clientID]
|
||||
body:@{ @"event": @"connection", @"data": client.id }];
|
||||
}
|
||||
|
||||
-(NSNumber*)generateRandomId {
|
||||
int r = 0;
|
||||
do {
|
||||
|
|
Loading…
Reference in New Issue