diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 0000000..72f4cba --- /dev/null +++ b/.eslintrc @@ -0,0 +1,218 @@ +{ + "parser": "babel-eslint", + + "ecmaFeatures": { + "jsx": true + }, + + "env": { + "es6": true, + "jasmine": true, + }, + + "plugins": [ + "react" + ], + + // Map from global var to bool specifying if it can be redefined + "globals": { + "__DEV__": true, + "__dirname": false, + "__fbBatchedBridgeConfig": false, + "cancelAnimationFrame": false, + "clearImmediate": true, + "clearInterval": false, + "clearTimeout": false, + "console": false, + "document": false, + "escape": false, + "exports": false, + "fetch": false, + "global": false, + "jest": false, + "Map": true, + "module": false, + "navigator": false, + "process": false, + "Promise": true, + "requestAnimationFrame": true, + "require": false, + "Set": true, + "setImmediate": true, + "setInterval": false, + "setTimeout": false, + "window": false, + "XMLHttpRequest": false, + "pit": false + }, + + "rules": { + "comma-dangle": 0, // disallow trailing commas in object literals + "no-cond-assign": 1, // disallow assignment in conditional expressions + "no-console": 0, // disallow use of console (off by default in the node environment) + "no-constant-condition": 0, // disallow use of constant expressions in conditions + "no-control-regex": 1, // disallow control characters in regular expressions + "no-debugger": 1, // disallow use of debugger + "no-dupe-keys": 1, // disallow duplicate keys when creating object literals + "no-empty": 0, // disallow empty statements + "no-ex-assign": 1, // disallow assigning to the exception in a catch block + "no-extra-boolean-cast": 1, // disallow double-negation boolean casts in a boolean context + "no-extra-parens": 0, // disallow unnecessary parentheses (off by default) + "no-extra-semi": 1, // disallow unnecessary semicolons + "no-func-assign": 1, // disallow overwriting functions written as function declarations + "no-inner-declarations": 0, // disallow function or variable declarations in nested blocks + "no-invalid-regexp": 1, // disallow invalid regular expression strings in the RegExp constructor + "no-negated-in-lhs": 1, // disallow negation of the left operand of an in expression + "no-obj-calls": 1, // disallow the use of object properties of the global object (Math and JSON) as functions + "no-regex-spaces": 1, // disallow multiple spaces in a regular expression literal + "no-reserved-keys": 0, // disallow reserved words being used as object literal keys (off by default) + "no-sparse-arrays": 1, // disallow sparse arrays + "no-unreachable": 1, // disallow unreachable statements after a return, throw, continue, or break statement + "use-isnan": 1, // disallow comparisons with the value NaN + "valid-jsdoc": 0, // Ensure JSDoc comments are valid (off by default) + "valid-typeof": 1, // Ensure that the results of typeof are compared against a valid string + + // Best Practices + // These are rules designed to prevent you from making mistakes. They either prescribe a better way of doing something or help you avoid footguns. + + "block-scoped-var": 0, // treat var statements as if they were block scoped (off by default) + "complexity": 0, // specify the maximum cyclomatic complexity allowed in a program (off by default) + "consistent-return": 0, // require return statements to either always or never specify values + "curly": 1, // specify curly brace conventions for all control statements + "default-case": 0, // require default case in switch statements (off by default) + "dot-notation": 1, // encourages use of dot notation whenever possible + "eqeqeq": 1, // require the use of === and !== + "guard-for-in": 0, // make sure for-in loops have an if statement (off by default) + "no-alert": 1, // disallow the use of alert, confirm, and prompt + "no-caller": 1, // disallow use of arguments.caller or arguments.callee + "no-div-regex": 1, // disallow division operators explicitly at beginning of regular expression (off by default) + "no-else-return": 0, // disallow else after a return in an if (off by default) + "no-empty-label": 1, // disallow use of labels for anything other then loops and switches + "no-eq-null": 0, // disallow comparisons to null without a type-checking operator (off by default) + "no-eval": 1, // disallow use of eval() + "no-extend-native": 1, // disallow adding to native types + "no-extra-bind": 1, // disallow unnecessary function binding + "no-fallthrough": 1, // disallow fallthrough of case statements + "no-floating-decimal": 1, // disallow the use of leading or trailing decimal points in numeric literals (off by default) + "no-implied-eval": 1, // disallow use of eval()-like methods + "no-labels": 1, // disallow use of labeled statements + "no-iterator": 1, // disallow usage of __iterator__ property + "no-lone-blocks": 1, // disallow unnecessary nested blocks + "no-loop-func": 0, // disallow creation of functions within loops + "no-multi-str": 0, // disallow use of multiline strings + "no-native-reassign": 0, // disallow reassignments of native objects + "no-new": 1, // disallow use of new operator when not part of the assignment or comparison + "no-new-func": 1, // disallow use of new operator for Function object + "no-new-wrappers": 1, // disallows creating new instances of String,Number, and Boolean + "no-octal": 1, // disallow use of octal literals + "no-octal-escape": 1, // disallow use of octal escape sequences in string literals, such as var foo = "Copyright \251"; + "no-proto": 1, // disallow usage of __proto__ property + "no-redeclare": 0, // disallow declaring the same variable more then once + "no-return-assign": 1, // disallow use of assignment in return statement + "no-script-url": 1, // disallow use of javascript: urls. + "no-self-compare": 1, // disallow comparisons where both sides are exactly the same (off by default) + "no-sequences": 1, // disallow use of comma operator + "no-unused-expressions": 0, // disallow usage of expressions in statement position + "no-void": 1, // disallow use of void operator (off by default) + "no-warning-comments": 0, // disallow usage of configurable warning terms in comments": 1, // e.g. TODO or FIXME (off by default) + "no-with": 1, // disallow use of the with statement + "radix": 1, // require use of the second argument for parseInt() (off by default) + "semi-spacing": 1, // require a space after a semi-colon + "vars-on-top": 0, // requires to declare all vars on top of their containing scope (off by default) + "wrap-iife": 0, // require immediate function invocation to be wrapped in parentheses (off by default) + "yoda": 1, // require or disallow Yoda conditions + + // Strict Mode + // These rules relate to using strict mode. + + "strict": [2, "global"], // require or disallow the "use strict" pragma in the global scope (off by default in the node environment) + + // Variables + // These rules have to do with variable declarations. + + "no-catch-shadow": 1, // disallow the catch clause parameter name being the same as a variable in the outer scope (off by default in the node environment) + "no-delete-var": 1, // disallow deletion of variables + "no-label-var": 1, // disallow labels that share a name with a variable + "no-shadow": 1, // disallow declaration of variables already declared in the outer scope + "no-shadow-restricted-names": 1, // disallow shadowing of names such as arguments + "no-undef": 2, // disallow use of undeclared variables unless mentioned in a /*global */ block + "no-undefined": 0, // disallow use of undefined variable (off by default) + "no-undef-init": 1, // disallow use of undefined when initializing variables + "no-unused-vars": [1, {"vars": "all", "args": "none"}], // disallow declaration of variables that are not used in the code + "no-use-before-define": 0, // disallow use of variables before they are defined + + // Node.js + // These rules are specific to JavaScript running on Node.js. + + "handle-callback-err": 1, // enforces error handling in callbacks (off by default) (on by default in the node environment) + "no-mixed-requires": 1, // disallow mixing regular variable and require declarations (off by default) (on by default in the node environment) + "no-new-require": 1, // disallow use of new operator with the require function (off by default) (on by default in the node environment) + "no-path-concat": 1, // disallow string concatenation with __dirname and __filename (off by default) (on by default in the node environment) + "no-process-exit": 0, // disallow process.exit() (on by default in the node environment) + "no-restricted-modules": 1, // restrict usage of specified node modules (off by default) + "no-sync": 0, // disallow use of synchronous methods (off by default) + + // Stylistic Issues + // These rules are purely matters of style and are quite subjective. + + "key-spacing": 0, + "comma-spacing": 0, + "no-multi-spaces": 0, + "brace-style": 0, // enforce one true brace style (off by default) + "camelcase": 0, // require camel case names + "consistent-this": [1, "self"], // enforces consistent naming when capturing the current execution context (off by default) + "eol-last": 1, // enforce newline at the end of file, with no multiple empty lines + "func-names": 0, // require function expressions to have a name (off by default) + "func-style": 0, // enforces use of function declarations or expressions (off by default) + "new-cap": 0, // require a capital letter for constructors + "new-parens": 1, // disallow the omission of parentheses when invoking a constructor with no arguments + "no-nested-ternary": 0, // disallow nested ternary expressions (off by default) + "no-array-constructor": 1, // disallow use of the Array constructor + "no-lonely-if": 0, // disallow if as the only statement in an else block (off by default) + "no-new-object": 1, // disallow use of the Object constructor + "no-spaced-func": 1, // disallow space between function identifier and application + "no-ternary": 0, // disallow the use of ternary operators (off by default) + "no-trailing-spaces": 1, // disallow trailing whitespace at the end of lines + "no-underscore-dangle": 0, // disallow dangling underscores in identifiers + "no-mixed-spaces-and-tabs": 1, // disallow mixed spaces and tabs for indentation + "quotes": [1, "single", "avoid-escape"], // specify whether double or single quotes should be used + "quote-props": 0, // require quotes around object literal property names (off by default) + "semi": 1, // require or disallow use of semicolons instead of ASI + "sort-vars": 0, // sort variables within the same declaration block (off by default) + "space-after-keywords": 1, // require a space after certain keywords (off by default) + "space-in-brackets": 0, // require or disallow spaces inside brackets (off by default) + "space-in-parens": 0, // require or disallow spaces inside parentheses (off by default) + "space-infix-ops": 1, // require spaces around operators + "space-return-throw-case": 1, // require a space after return, throw, and case + "space-unary-ops": [1, { "words": true, "nonwords": false }], // require or disallow spaces before/after unary operators (words on by default, nonwords off by default) + "max-nested-callbacks": 0, // specify the maximum depth callbacks can be nested (off by default) + "one-var": 0, // allow just one var statement per function (off by default) + "wrap-regex": 0, // require regex literals to be wrapped in parentheses (off by default) + + // Legacy + // The following rules are included for compatibility with JSHint and JSLint. While the names of the rules may not match up with the JSHint/JSLint counterpart, the functionality is the same. + + "max-depth": 0, // specify the maximum depth that blocks can be nested (off by default) + "max-len": 0, // specify the maximum length of a line in your program (off by default) + "max-params": 0, // limits the number of parameters that can be used in the function declaration. (off by default) + "max-statements": 0, // specify the maximum number of statement allowed in a function (off by default) + "no-bitwise": 0, // disallow use of bitwise operators (off by default) + "no-plusplus": 0, // disallow use of unary operators, ++ and -- (off by default) + + "react/display-name": 0, + "react/jsx-boolean-value": 0, + "jsx-quotes": [2, "prefer-single"], + "react/jsx-no-undef": 1, + "react/jsx-sort-props": 0, + "react/jsx-uses-react": 0, + "react/jsx-uses-vars": 1, + "react/no-did-mount-set-state": [1, "allow-in-func"], + "react/no-did-update-set-state": [1, "allow-in-func"], + "react/no-multi-comp": 0, + "react/no-unknown-property": 0, + "react/prop-types": 0, + "react/react-in-jsx-scope": 0, + "react/self-closing-comp": 1, + "react/wrap-multilines": 0 + } +} diff --git a/.flowconfig b/.flowconfig new file mode 100644 index 0000000..89dad58 --- /dev/null +++ b/.flowconfig @@ -0,0 +1,28 @@ +[ignore] + +# Ignore examples +.*/examples/.* + +[include] + +[libs] +interfaces/react-native-interface.js + +[options] +module.system=haste + +munge_underscores=true + +module.name_mapper='^image![a-zA-Z0-9$_-]+$' -> 'GlobalImageStub' +module.name_mapper='^[./a-zA-Z0-9$_-]+\.png$' -> 'RelativeImageStub' + +suppress_type=$FlowIssue +suppress_type=$FlowFixMe +suppress_type=$FixMe + +suppress_comment=\\(.\\|\n\\)*\\$FlowFixMe\\($\\|[^(]\\|(\\(>=0\\.\\(1[0-9]\\|[0-9]\\).[0-9]\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\) +suppress_comment=\\(.\\|\n\\)*\\$FlowIssue\\((\\(>=0\\.\\(1[0-9]\\|[0-9]\\).[0-9]\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\)? #[0-9]+ +suppress_comment=\\(.\\|\n\\)*\\$FlowFixedInNextDeploy + +[version] +^0.19.0 diff --git a/TcpSocket.js b/TcpSocket.js index 4464562..bd12e69 100644 --- a/TcpSocket.js +++ b/TcpSocket.js @@ -76,8 +76,6 @@ TcpSocket.prototype._debug = function() { }; TcpSocket.prototype.connect = function(options, callback) { - var self = this; - if (this._state !== STATE.DISCONNECTED) { throw new Error('Socket is already bound'); } @@ -107,7 +105,7 @@ TcpSocket.prototype.connect = function(options, callback) { throw new RangeError('"port" option should be >= 0 and < 65536: ' + port); } } - port |= 0; + port |= port; this._state = STATE.CONNECTING; this._connecting = true; @@ -204,9 +202,9 @@ TcpSocket.prototype._onEvent = function(info) { this._debug('received', info.event); if (info.event === 'connect') { - self.writable = self.readable = true; - self._state = STATE.CONNECTED; - self._connecting = false; + this.writable = this.readable = true; + this._state = STATE.CONNECTED; + this._connecting = false; } else if (info.event === 'data') { if (this._timeout) { clearTimeout(this._timeout); @@ -218,7 +216,7 @@ TcpSocket.prototype._onEvent = function(info) { ? base64.toByteArray(info.data) : new global.Buffer(info.data, 'base64'); } else if (info.event === 'close') { - self._state = STATE.DISCONNECTED; + this._state = STATE.DISCONNECTED; } this.emit(info.event, info.data); diff --git a/TcpSockets.js b/TcpSockets.js index bb687e7..c04d882 100644 --- a/TcpSockets.js +++ b/TcpSockets.js @@ -35,10 +35,10 @@ function normalizeConnectArgs(args) { if (args[0] !== null && typeof args[0] === 'object') { // connect(options, [cb]) options = args[0]; - } else if (isPipeName(args[0])) { + }/* else if (isPipeName(args[0])) { // connect(path, [cb]); options.path = args[0]; - } else { + }*/ else { // connect(port, [host], [cb]) options.port = args[0]; if (typeof args[1] === 'string') { @@ -48,28 +48,28 @@ function normalizeConnectArgs(args) { var cb = args[args.length - 1]; return typeof cb === 'function' ? [options, cb] : [options]; -}; +} -exports.createConnection = function(options, callback) { +exports.createConnection = function(options: { port: number,host: ?string, localAddress: ?string, localPort: ?number, family: ?number }, callback : ?any) : exports.Socket { var tcpSocket = new exports.Socket(); tcpSocket.connect(options, callback); return tcpSocket; }; -exports.isIP = function(input) { +exports.isIP = function(input: string) : number { var result = 0; if (ipRegex.v4({exact: true}).test(input)) { result = 4; } else if (ipRegex.v6({exact: true}).test(input)) { result = 6; } + return result; }; -exports.isIPv4 = function(input) { +exports.isIPv4 = function(input: string) : boolean { return exports.isIP(input) === 4; }; - -exports.isIPv6 = function(input) { +exports.isIPv6 = function(input: string) : boolean { return exports.isIP(input) === 6; }; diff --git a/interfaces/react-native-interface.js b/interfaces/react-native-interface.js new file mode 100644 index 0000000..623ffd9 --- /dev/null +++ b/interfaces/react-native-interface.js @@ -0,0 +1,26 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @flow + */ + +// see also react-native.js + +declare var __DEV__: boolean; + +declare var __REACT_DEVTOOLS_GLOBAL_HOOK__: any; /*?{ + inject: ?((stuff: Object) => void) +};*/ + +declare var fetch: any; +declare var Headers: any; +declare var Request: any; +declare var Response: any; +declare module requestAnimationFrame { + declare var exports: (callback: any) => any; +} diff --git a/ios/TcpSocketClient.m b/ios/TcpSocketClient.m index 03f57f0..bcfd5d2 100644 --- a/ios/TcpSocketClient.m +++ b/ios/TcpSocketClient.m @@ -19,7 +19,7 @@ NSString *const RCTTCPErrorDomain = @"RCTTCPErrorDomain"; @private GCDAsyncSocket *_tcpSocket; id _clientDelegate; - NSMutableDictionary* _pendingSends; + NSMutableDictionary *_pendingSends; long _sendTag; } diff --git a/ios/TcpSockets.h b/ios/TcpSockets.h index ef8cb04..446e5e9 100644 --- a/ios/TcpSockets.h +++ b/ios/TcpSockets.h @@ -16,6 +16,6 @@ @interface TcpSockets : NSObject -+(NSMutableDictionary *)clients; ++(NSMutableDictionary *)clients; @end diff --git a/ios/TcpSockets.m b/ios/TcpSockets.m index fca25c4..db9bc59 100644 --- a/ios/TcpSockets.m +++ b/ios/TcpSockets.m @@ -27,7 +27,7 @@ RCT_EXPORT_MODULE() object:nil]; } -+(NSMutableDictionary*) clients ++(NSMutableDictionary *) clients { static NSMutableDictionary* c = nil; @@ -42,7 +42,7 @@ RCT_EXPORT_MODULE() RCT_EXPORT_METHOD(createSocket:(nonnull NSNumber*)cId) { - NSMutableDictionary* _clients = [TcpSockets clients]; + NSMutableDictionary *_clients = [TcpSockets clients]; if (!cId) { RCTLogError(@"%@.createSocket called with nil id parameter.", [self class]); return; @@ -104,16 +104,16 @@ RCT_EXPORT_METHOD(destroy:(nonnull NSNumber*)cId) { - (void) onConnect:(TcpSocketClient*) client { - NSMutableDictionary* _clients = [TcpSockets clients]; - NSString *clientID = [[_clients allKeysForObject:client] objectAtIndex:0]; + NSMutableDictionary *_clients = [TcpSockets clients]; + NSNumber *clientID = [[_clients allKeysForObject:client] objectAtIndex:0]; [self.bridge.eventDispatcher sendDeviceEventWithName:[NSString stringWithFormat:@"tcp-%@-event", clientID] body:@{ @"event": @"connect" }]; } - (void) onData:(TcpSocketClient*) client data:(NSData *)data { - NSMutableDictionary* _clients = [TcpSockets clients]; - NSString *clientID = [[_clients allKeysForObject:client] objectAtIndex:0]; + NSMutableDictionary *_clients = [TcpSockets clients]; + NSNumber *clientID = [[_clients allKeysForObject:client] objectAtIndex:0]; NSString *base64String = [data base64EncodedStringWithOptions:0]; [self.bridge.eventDispatcher sendDeviceEventWithName:[NSString stringWithFormat:@"tcp-%@-event", clientID] body:@{ @"event": @"data", @"data": base64String }]; @@ -123,16 +123,16 @@ RCT_EXPORT_METHOD(destroy:(nonnull NSNumber*)cId) { { [self onError:client withError:err]; - NSMutableDictionary* _clients = [TcpSockets clients]; - NSString *clientID = [[_clients allKeysForObject:client] objectAtIndex:0]; + NSMutableDictionary *_clients = [TcpSockets clients]; + NSNumber *clientID = [[_clients allKeysForObject:client] objectAtIndex:0]; [self.bridge.eventDispatcher sendDeviceEventWithName:[NSString stringWithFormat:@"tcp-%@-event", clientID] body:@{ @"event": @"close", @"data": err == nil ? @NO : @YES }]; } - (void)onError:(TcpSocketClient*) client withError:(NSError *)err { - NSMutableDictionary* _clients = [TcpSockets clients]; - NSString *clientID = [[_clients allKeysForObject:client] objectAtIndex:0]; + NSMutableDictionary *_clients = [TcpSockets clients]; + NSNumber *clientID = [[_clients allKeysForObject:client] objectAtIndex:0]; NSString* msg = [[err userInfo] valueForKey:@"NSLocalizedFailureReason"]; [self.bridge.eventDispatcher sendDeviceEventWithName:[NSString stringWithFormat:@"tcp-%@-event", clientID] @@ -142,7 +142,7 @@ RCT_EXPORT_METHOD(destroy:(nonnull NSNumber*)cId) { +(TcpSocketClient*)findClient:(nonnull NSNumber*)cId callback:(RCTResponseSenderBlock)callback { - NSMutableDictionary* _clients = [TcpSockets clients]; + NSMutableDictionary *_clients = [TcpSockets clients]; TcpSocketClient *client = [_clients objectForKey:cId]; if (!client) { if (!callback) { @@ -161,7 +161,7 @@ RCT_EXPORT_METHOD(destroy:(nonnull NSNumber*)cId) { +(void) endClient:(nonnull NSNumber*)cId callback:(RCTResponseSenderBlock)callback { - NSMutableDictionary* _clients = [TcpSockets clients]; + NSMutableDictionary *_clients = [TcpSockets clients]; TcpSocketClient* client = [TcpSockets findClient:cId callback:callback]; if (!client) return; @@ -173,7 +173,7 @@ RCT_EXPORT_METHOD(destroy:(nonnull NSNumber*)cId) { +(void) destroyClient:(nonnull NSNumber*)cId { - NSMutableDictionary* _clients = [TcpSockets clients]; + NSMutableDictionary *_clients = [TcpSockets clients]; TcpSocketClient* client = [TcpSockets findClient:cId callback:nil]; if (!client) return; @@ -182,7 +182,7 @@ RCT_EXPORT_METHOD(destroy:(nonnull NSNumber*)cId) { } +(void) closeAllSockets { - NSMutableDictionary* _clients = [TcpSockets clients]; + NSMutableDictionary *_clients = [TcpSockets clients]; for (NSNumber* cId in _clients) { [TcpSockets endClient:cId callback:nil]; } diff --git a/package.json b/package.json index 5bd5813..d3f8510 100644 --- a/package.json +++ b/package.json @@ -38,5 +38,9 @@ "inherits": "^2.0.1", "ip-regex": "^1.0.3", "util": "^0.10.3" + }, + "devDependencies": { + "babel-eslint": "^4.1.6", + "eslint-plugin-react": "^3.11.3" } }