mirror of
https://github.com/actix/actix-extras.git
synced 2024-11-28 01:32:57 +01:00
Add the start_with_addr() function, to obtain an addr to the target websocket actor (#988)
This commit is contained in:
parent
941241c5f0
commit
e53e9c8ba3
@ -4,6 +4,9 @@
|
|||||||
|
|
||||||
* Allow to use custom ws codec with `WebsocketContext` #925
|
* Allow to use custom ws codec with `WebsocketContext` #925
|
||||||
|
|
||||||
|
* Add `ws::start_with_addr()`, returning the address of the created actor, along
|
||||||
|
with the `HttpResponse`.
|
||||||
|
|
||||||
## [1.0.0] - 2019-05-29
|
## [1.0.0] - 2019-05-29
|
||||||
|
|
||||||
* Update actix-http and actix-web
|
* Update actix-http and actix-web
|
||||||
|
@ -35,6 +35,31 @@ where
|
|||||||
Ok(res.streaming(WebsocketContext::create(actor, stream)))
|
Ok(res.streaming(WebsocketContext::create(actor, stream)))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Do websocket handshake and start ws actor.
|
||||||
|
///
|
||||||
|
/// `req` is an HTTP Request that should be requesting a websocket protocol
|
||||||
|
/// change. `stream` should be a `Bytes` stream (such as
|
||||||
|
/// `actix_web::web::Payload`) that contains a stream of the body request.
|
||||||
|
///
|
||||||
|
/// If there is a problem with the handshake, an error is returned.
|
||||||
|
///
|
||||||
|
/// If successful, returns a pair where the first item is an address for the
|
||||||
|
/// created actor and the second item is the response that should be returned
|
||||||
|
/// from the websocket request.
|
||||||
|
pub fn start_with_addr<A, T>(
|
||||||
|
actor: A,
|
||||||
|
req: &HttpRequest,
|
||||||
|
stream: T,
|
||||||
|
) -> Result<(Addr<A>, HttpResponse), Error>
|
||||||
|
where
|
||||||
|
A: Actor<Context = WebsocketContext<A>> + StreamHandler<Message, ProtocolError>,
|
||||||
|
T: Stream<Item = Bytes, Error = PayloadError> + 'static,
|
||||||
|
{
|
||||||
|
let mut res = handshake(req)?;
|
||||||
|
let (addr, out_stream) = WebsocketContext::create_with_addr(actor, stream);
|
||||||
|
Ok((addr, res.streaming(out_stream)))
|
||||||
|
}
|
||||||
|
|
||||||
/// Prepare `WebSocket` handshake response.
|
/// Prepare `WebSocket` handshake response.
|
||||||
///
|
///
|
||||||
/// This function returns handshake `HttpResponse`, ready to send to peer.
|
/// This function returns handshake `HttpResponse`, ready to send to peer.
|
||||||
@ -168,6 +193,24 @@ where
|
|||||||
#[inline]
|
#[inline]
|
||||||
/// Create a new Websocket context from a request and an actor
|
/// Create a new Websocket context from a request and an actor
|
||||||
pub fn create<S>(actor: A, stream: S) -> impl Stream<Item = Bytes, Error = Error>
|
pub fn create<S>(actor: A, stream: S) -> impl Stream<Item = Bytes, Error = Error>
|
||||||
|
where
|
||||||
|
A: StreamHandler<Message, ProtocolError>,
|
||||||
|
S: Stream<Item = Bytes, Error = PayloadError> + 'static,
|
||||||
|
{
|
||||||
|
let (_, stream) = WebsocketContext::create_with_addr(actor, stream);
|
||||||
|
stream
|
||||||
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
/// Create a new Websocket context from a request and an actor.
|
||||||
|
///
|
||||||
|
/// Returns a pair, where the first item is an addr for the created actor,
|
||||||
|
/// and the second item is a stream intended to be set as part of the
|
||||||
|
/// response via `HttpResponseBuilder::streaming()`.
|
||||||
|
pub fn create_with_addr<S>(
|
||||||
|
actor: A,
|
||||||
|
stream: S,
|
||||||
|
) -> (Addr<A>, impl Stream<Item = Bytes, Error = Error>)
|
||||||
where
|
where
|
||||||
A: StreamHandler<Message, ProtocolError>,
|
A: StreamHandler<Message, ProtocolError>,
|
||||||
S: Stream<Item = Bytes, Error = PayloadError> + 'static,
|
S: Stream<Item = Bytes, Error = PayloadError> + 'static,
|
||||||
@ -179,7 +222,9 @@ where
|
|||||||
};
|
};
|
||||||
ctx.add_stream(WsStream::new(stream, Codec::new()));
|
ctx.add_stream(WsStream::new(stream, Codec::new()));
|
||||||
|
|
||||||
WebsocketContextFut::new(ctx, actor, mb, Codec::new())
|
let addr = ctx.address();
|
||||||
|
|
||||||
|
(addr, WebsocketContextFut::new(ctx, actor, mb, Codec::new()))
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
|
Loading…
Reference in New Issue
Block a user