@@ -28,8 +28,8 @@ type private StreamControlMessage =
28
28
offset: int *
29
29
length: int *
30
30
replyChannel: AsyncReplyChannel< OperationResult< unit>>
31
- | StartServiceConnectionProcess of
32
- port : int *
31
+ | StartStreamConnectionProcess of
32
+ address : string *
33
33
streamObj: ITorStream *
34
34
replyChannel: AsyncReplyChannel< OperationResult< Task< uint16>>>
35
35
| StartDirectoryConnectionProcess of
@@ -120,7 +120,10 @@ type TorStream(circuit: TorCircuit) =
120
120
" Unexpected state when trying to send data over stream"
121
121
}
122
122
123
- let startServiceConnectionProcess ( port : int ) ( streamObj : ITorStream ) =
123
+ let startStreamConnectionProcess
124
+ ( address : string )
125
+ ( streamObj : ITorStream )
126
+ =
124
127
async {
125
128
let streamId = circuit.RegisterStream streamObj None
126
129
@@ -139,7 +142,7 @@ type TorStream(circuit: TorCircuit) =
139
142
streamId
140
143
( RelayBegin
141
144
{
142
- RelayBegin.Address = ( sprintf " : %i " port )
145
+ RelayBegin.Address = address
143
146
Flags = 0 u
144
147
})
145
148
None
@@ -236,9 +239,9 @@ type TorStream(circuit: TorCircuit) =
236
239
do !
237
240
safeSend data offset length
238
241
|> TryExecuteAsyncAndReplyAsResult replyChannel
239
- | StartServiceConnectionProcess ( port , streamObj, replyChannel) ->
242
+ | StartStreamConnectionProcess ( address , streamObj, replyChannel) ->
240
243
do !
241
- startServiceConnectionProcess port streamObj
244
+ startStreamConnectionProcess address streamObj
242
245
|> TryExecuteAsyncAndReplyAsResult replyChannel
243
246
| StartDirectoryConnectionProcess( streamObj, replyChannel) ->
244
247
do !
@@ -463,8 +466,8 @@ type TorStream(circuit: TorCircuit) =
463
466
let! completionTaskRes =
464
467
streamControlMailBox.PostAndAsyncReply(
465
468
( fun replyChannel ->
466
- StreamControlMessage.StartServiceConnectionProcess (
467
- port,
469
+ StreamControlMessage.StartStreamConnectionProcess (
470
+ sprintf " : %i " port,
468
471
self,
469
472
replyChannel
470
473
)
@@ -502,6 +505,30 @@ type TorStream(circuit: TorCircuit) =
502
505
member self.ConnectToDirectoryAsync () =
503
506
self.ConnectToDirectory() |> Async.StartAsTask
504
507
508
+ member self.ConnectToOutside ( address : string ) ( port : int ) =
509
+ async {
510
+ let! completionTaskRes =
511
+ streamControlMailBox.PostAndAsyncReply(
512
+ ( fun replyChannel ->
513
+ StreamControlMessage.StartStreamConnectionProcess(
514
+ sprintf " %s :%i " address port,
515
+ self,
516
+ replyChannel
517
+ )
518
+ ),
519
+ Constants.StreamCreationTimeout.TotalMilliseconds |> int
520
+ )
521
+
522
+ return !
523
+ completionTaskRes
524
+ |> UnwrapResult
525
+ |> Async.AwaitTask
526
+ |> FSharpUtil.WithTimeout Constants.StreamCreationTimeout
527
+ }
528
+
529
+ member self.ConnectToOutsideAsync ( address , port ) =
530
+ self.ConnectToOutside address port |> Async.StartAsTask
531
+
505
532
member private self.RegisterIncomingStream ( streamId : uint16 ) =
506
533
async {
507
534
let! registerationResult =
0 commit comments