33import { NativeModules } from 'react-native' ;
44import EventEmitter from 'eventemitter3' ;
55import { Buffer } from 'buffer' ;
6- const Sockets = NativeModules . TcpSockets ;
76import { nativeEventEmitter , getNextId } from './Globals' ;
87
98/**
@@ -30,6 +29,7 @@ import { nativeEventEmitter, getNextId } from './Globals';
3029 * @typedef {object } ReadableEvents
3130 * @property {() => void } pause
3231 * @property {() => void } resume
32+ * @property {() => void } end
3333 *
3434 * @typedef {object } SocketEvents
3535 * @property {(had_error: boolean) => void } close
@@ -95,6 +95,7 @@ export default class Socket extends EventEmitter {
9595 this . remoteAddress = undefined ;
9696 this . remotePort = undefined ;
9797 this . remoteFamily = undefined ;
98+ this . allowHalfOpen = false ;
9899 this . _registerEvents ( ) ;
99100 }
100101
@@ -164,7 +165,7 @@ export default class Socket extends EventEmitter {
164165 } ) ;
165166 this . _connecting = true ;
166167 this . _readyState = 'opening' ;
167- Sockets . connect ( this . _id , customOptions . host , customOptions . port , customOptions ) ;
168+ NativeModules . TcpSockets . connect ( this . _id , customOptions . host , customOptions . port , customOptions ) ;
168169 return this ;
169170 }
170171
@@ -243,7 +244,7 @@ export default class Socket extends EventEmitter {
243244 this . once ( 'connect' , ( ) => this . setNoDelay ( noDelay ) ) ;
244245 return this ;
245246 }
246- Sockets . setNoDelay ( this . _id , noDelay ) ;
247+ NativeModules . TcpSockets . setNoDelay ( this . _id , noDelay ) ;
247248 return this ;
248249 }
249250
@@ -267,7 +268,7 @@ export default class Socket extends EventEmitter {
267268 ) ;
268269 }
269270
270- Sockets . setKeepAlive ( this . _id , enable , Math . floor ( initialDelay ) ) ;
271+ NativeModules . TcpSockets . setKeepAlive ( this . _id , enable , Math . floor ( initialDelay ) ) ;
271272 return this ;
272273 }
273274
@@ -291,14 +292,14 @@ export default class Socket extends EventEmitter {
291292 end ( data , encoding ) {
292293 if ( data ) {
293294 this . write ( data , encoding , ( ) => {
294- Sockets . end ( this . _id ) ;
295+ NativeModules . TcpSockets . end ( this . _id ) ;
295296 } ) ;
296297 return this ;
297298 }
298299 if ( this . _pending || this . _destroyed ) return this ;
299300
300301 this . _clearTimeout ( ) ;
301- Sockets . end ( this . _id ) ;
302+ NativeModules . TcpSockets . end ( this . _id ) ;
302303 return this ;
303304 }
304305
@@ -309,7 +310,7 @@ export default class Socket extends EventEmitter {
309310 if ( this . _destroyed ) return this ;
310311 this . _destroyed = true ;
311312 this . _clearTimeout ( ) ;
312- Sockets . destroy ( this . _id ) ;
313+ NativeModules . TcpSockets . destroy ( this . _id ) ;
313314 return this ;
314315 }
315316
@@ -357,18 +358,19 @@ export default class Socket extends EventEmitter {
357358 if ( ! ok ) this . writableNeedDrain = true ;
358359 this . _lastSentMsgId = currentMsgId ;
359360 this . _bytesWritten += generatedBuffer . byteLength ;
360- Sockets . write ( this . _id , generatedBuffer . toString ( 'base64' ) , currentMsgId ) ;
361+ NativeModules . TcpSockets . write ( this . _id , generatedBuffer . toString ( 'base64' ) , currentMsgId ) ;
361362 return ok ;
362363 }
363364
364365 /**
365366 * Pauses the reading of data. That is, `'data'` events will not be emitted. Useful to throttle back an upload.
366367 */
367368 pause ( ) {
368- if ( this . _paused ) return ;
369+ if ( this . _paused ) return this ;
369370 this . _paused = true ;
370- Sockets . pause ( this . _id ) ;
371+ NativeModules . TcpSockets . pause ( this . _id ) ;
371372 this . emit ( 'pause' ) ;
373+ return this ;
372374 }
373375
374376 /**
@@ -426,7 +428,7 @@ export default class Socket extends EventEmitter {
426428 }
427429 }
428430 this . _resuming = false ;
429- Sockets . resume ( this . _id ) ;
431+ NativeModules . TcpSockets . resume ( this . _id ) ;
430432 }
431433
432434 /**
@@ -462,6 +464,13 @@ export default class Socket extends EventEmitter {
462464 this . _setDisconnected ( ) ;
463465 this . emit ( 'close' , evt . error ) ;
464466 } ) ;
467+ this . _endListener = this . _eventEmitter . addListener ( 'end' , ( evt ) => {
468+ if ( evt . id !== this . _id ) return ;
469+ if ( ! this . allowHalfOpen ) {
470+ this . end ( ) ;
471+ }
472+ this . emit ( 'end' ) ;
473+ } ) ;
465474 this . _connectListener = this . _eventEmitter . addListener ( 'connect' , ( evt ) => {
466475 if ( evt . id !== this . _id ) return ;
467476 this . _setConnected ( evt . connection ) ;
@@ -480,6 +489,7 @@ export default class Socket extends EventEmitter {
480489 this . _dataListener ?. remove ( ) ;
481490 this . _errorListener ?. remove ( ) ;
482491 this . _closeListener ?. remove ( ) ;
492+ this . _endListener ?. remove ( ) ;
483493 this . _connectListener ?. remove ( ) ;
484494 this . _writtenListener ?. remove ( ) ;
485495 }
0 commit comments