Skip to content

Commit 12d4a72

Browse files
committed
Handle errors in poll()
Signed-off-by: Andrew Stein <steinlink@gmail.com>
1 parent 909b708 commit 12d4a72

6 files changed

Lines changed: 56 additions & 17 deletions

File tree

cpp/perspective/src/cpp/binding_api.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,8 +96,8 @@ psp_handle_request(
9696

9797
PERSPECTIVE_EXPORT
9898
EncodedApiEntries*
99-
psp_poll(ProtoServer* server) {
100-
auto responses = server->poll();
99+
psp_poll(ProtoServer* server, std::uint32_t client_id) {
100+
auto responses = server->poll(client_id);
101101
return encode_api_responses(responses);
102102
}
103103

cpp/perspective/src/cpp/server.cpp

Lines changed: 48 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -799,13 +799,52 @@ ProtoServer::handle_request(
799799
}
800800

801801
std::vector<ProtoServerResp<std::string>>
802-
ProtoServer::poll() {
802+
ProtoServer::poll(std::uint32_t client_id) {
803803
std::vector<ProtoServerResp<std::string>> out;
804-
for (auto& resp : _poll()) {
804+
try {
805+
const auto& responses = _poll();
806+
for (const auto& resp : responses) {
807+
ProtoServerResp<std::string> str_resp;
808+
str_resp.data = resp.data.SerializeAsString();
809+
str_resp.client_id = resp.client_id;
810+
out.emplace_back(str_resp);
811+
}
812+
813+
} catch (const PerspectiveException& e) {
814+
proto::Response resp;
815+
auto* err = resp.mutable_server_error()->mutable_message();
816+
*err = std::string(e.what());
817+
ProtoServerResp<std::string> str_resp;
818+
str_resp.data = resp.SerializeAsString();
819+
str_resp.client_id = client_id;
820+
out.emplace_back(std::move(str_resp));
821+
} catch (const PerspectiveViewNotFoundException& e) {
822+
proto::Response resp;
823+
auto* err = resp.mutable_server_error();
824+
err->set_status_code(proto::StatusCode::VIEW_NOT_FOUND);
825+
auto* msg = err->mutable_message();
826+
*msg = std::string(e.what());
827+
ProtoServerResp<std::string> str_resp;
828+
str_resp.data = resp.SerializeAsString();
829+
str_resp.client_id = client_id;
830+
out.emplace_back(std::move(str_resp));
831+
} catch (const std::exception& e) {
832+
proto::Response resp;
833+
auto* err = resp.mutable_server_error()->mutable_message();
834+
*err = std::string(e.what());
835+
ProtoServerResp<std::string> str_resp;
836+
str_resp.data = resp.SerializeAsString();
837+
str_resp.client_id = client_id;
838+
out.emplace_back(std::move(str_resp));
839+
} catch (...) {
840+
proto::Response resp;
841+
auto* err = resp.mutable_server_error()->mutable_message();
842+
std::exception_ptr p = std::current_exception();
843+
*err = "Unknown exception";
805844
ProtoServerResp<std::string> str_resp;
806-
str_resp.data = resp.data.SerializeAsString();
807-
str_resp.client_id = resp.client_id;
808-
out.emplace_back(str_resp);
845+
str_resp.data = resp.SerializeAsString();
846+
str_resp.client_id = client_id;
847+
out.emplace_back(std::move(str_resp));
809848
}
810849

811850
return out;
@@ -2141,11 +2180,11 @@ ProtoServer::_handle_request(std::uint32_t client_id, Request&& req) {
21412180
auto tm = scalar.get<t_date>();
21422181
std::stringstream ss;
21432182
ss << std::setfill('0') << std::setw(4) << tm.year()
2144-
<< "-" << std::setfill('0') << std::setw(2)
2145-
// Increment month by 1, as date::month is [1-12] but
2146-
// t_date::month() is [0-11]
2147-
<< tm.month() + 1
21482183
<< "-" << std::setfill('0')
2184+
<< std::setw(2)
2185+
// Increment month by 1, as date::month is [1-12]
2186+
// but t_date::month() is [0-11]
2187+
<< tm.month() + 1 << "-" << std::setfill('0')
21492188
<< std::setw(2) << tm.day();
21502189
s->set_string(ss.str());
21512190
break;

cpp/perspective/src/include/perspective/server.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -625,7 +625,7 @@ namespace server {
625625
void close_session(std::uint32_t);
626626
std::vector<ProtoServerResp<std::string>>
627627
handle_request(std::uint32_t client_id, const std::string_view& data);
628-
std::vector<ProtoServerResp<std::string>> poll();
628+
std::vector<ProtoServerResp<std::string>> poll(std::uint32_t client_id);
629629

630630
private:
631631
void handle_process_table(

rust/perspective-js/src/ts/wasm/engine.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ export class PerspectiveSession {
7979
}
8080

8181
poll() {
82-
const polled = this.mod._psp_poll(this.server as any);
82+
const polled = this.mod._psp_poll(this.server as any, this.client_id);
8383
decode_api_responses(this.mod, polled, async (msg: ApiResponse) => {
8484
await this.client_map.get(msg.client_id)!(msg.data);
8585
});

rust/perspective-server/src/ffi.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ unsafe extern "C" {
3535
buffer_ptr: *const u8,
3636
buffer_len: usize,
3737
) -> ResponseBatch;
38-
fn psp_poll(server: *const u8) -> ResponseBatch;
38+
fn psp_poll(server: *const u8, client_id: u32) -> ResponseBatch;
3939
fn psp_close_session(server: *const u8, client_id: u32);
4040
}
4141

@@ -122,8 +122,8 @@ impl Server {
122122
unsafe { psp_handle_request(self.0, client_id, request.0, request.1) }
123123
}
124124

125-
pub fn poll(&self) -> ResponseBatch {
126-
unsafe { psp_poll(self.0) }
125+
pub fn poll(&self, client_id: u32) -> ResponseBatch {
126+
unsafe { psp_poll(self.0, client_id) }
127127
}
128128

129129
pub fn close_session(&self, session_id: u32) {

rust/perspective-server/src/local_session.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ impl Session<ServerError> for LocalSession {
5757
}
5858

5959
async fn poll(&self) -> Result<(), ServerError> {
60-
let responses = self.server.server.poll();
60+
let responses = self.server.server.poll(self.id);
6161
for response in responses.iter_responses() {
6262
let cb = self
6363
.server

0 commit comments

Comments
 (0)