如何在 Rust 中发出 gRPC firestore 监听请求?

How to make a gRPC firestore listen request in Rust?

使用来自 https://github.com/gkkachi/firestore-grpc 的 gRPC 绑定,我能够拼凑一些看似有效但未收到任何内容的东西:

正在创建请求:

    let req = ListenRequest {
        database: format!("projects/{}/databases/(default)", project_id),
        labels: HashMap::new(),
        target_change: Some(TargetChange::AddTarget(Target {
            // "Rust" in hex: https://github.com/googleapis/python-firestore/issues/51
            target_id: 0x52757374,
            once: false,
            target_type: Some(TargetType::Documents(DocumentsTarget {
                documents: vec![users_collection],
            })),
            resume_type: None,
        })),
    };

发送中:

    let mut req = Request::new(stream::iter(vec![req]));
    let metadata = req.metadata_mut();
    metadata.insert(
        "google-cloud-resource-prefix",
        MetadataValue::from_str(&db).unwrap(),
    );

    println!("sending request");
    let res = get_client(&token).await?.listen(req).await?;
    let mut res = res.into_inner();
    while let Some(msg) = res.next().await {
        println!("getting response");
        dbg!(msg);
    }

(完整代码 in this repo)。

可以发出请求,但流不包含任何实际内容。我从调试日志中得到的唯一提示是

[2021-10-27T14:54:39Z DEBUG h2::codec::framed_write] send frame=GoAway { error_code: NO_ERROR, last_stream_id: StreamId(0) } 
[2021-10-27T14:54:39Z DEBUG h2::proto::connection] Connection::poll; connection error error=GoAway(b"", NO_ERROR, Library) 

知道缺少什么吗?

正如 rust users forum 中指出的那样,我遗漏的关键是请求流立即结束,这导致连接关闭。 send frame=GoAway实际上是由客户端(facepalm)发送的。

要保持​​连接打开并接收响应,我们可以保持输入流挂起:Request::new(stream::iter(vec![req]).chain(stream::pending()))。将有更好的方法来设置并控制后续输入请求,但这足以修复示例。