LookupResources 的 SpiceDB gRPC 端点使用游标返回资源 ID 的 gRPC 流。
从 Clojure 使用 gRPC 流可能会很困难。我知道我需要具体化
StreamObserver
并消耗流,直到没有任何项目剩余。
我找不到一个很好的独立示例来说明如何使用 io.grpc Java gRPC 库而不引入 core.async 来执行此操作。您将如何使用 gRPC 响应流并返回所有用尽结果的 Clojure 向量?
此时,我们可以假设结果集很小并且可以立即使用而无需任何额外的异步结构。延迟加载有加分,但延迟加载可能需要一些状态管理。
使用阻塞存根时,在阻塞流响应上使用
iterator-seq
,收集原子中的项目,并取消引用原子:
(let [!results (atom [])
request (-> (PermissionService$LookupResourcesRequest/newBuilder)
(.setSubject (make-subject subject-type subject-id))
(.setPermission permission)
(with-consistency consistency)
(.setResourceObjectType resource-type)
(.build))
^PermissionService$LookupResourcesResponse response
(.lookupResources service request)]
(doseq [x (iterator-seq response) ;; note iterator-seq.
:let [resource-id (.getResourceObjectId x)]]
(swap! !results conj [resource-type resource-id]))
@!results)
对于非阻塞 gRPC 服务存根,必须更改实现。