Skip to content

Commit f0316d3

Browse files
feat: Add Promise-based callServiceAsync wrapper for async/await support (#1169)
1 parent de08335 commit f0316d3

2 files changed

Lines changed: 50 additions & 0 deletions

File tree

packages/roslib/src/core/Service.ts

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,29 @@ export default class Service<
9696
timeout: timeout,
9797
});
9898
}
99+
100+
/**
101+
* Wrapper of callService that returns a modern Promise-based interface for use with async/await.
102+
* @see callService
103+
* @param request - The service request to send.
104+
* @param [timeout] - Optional timeout, in seconds, for the service call. A non-positive value means no timeout.
105+
* If not provided, the rosbridge server will use its default value.
106+
*/
107+
callServiceAsync(request: TRequest, timeout?: number): Promise<TResponse> {
108+
return new Promise<TResponse>((resolve, reject) => {
109+
this.callService(
110+
request,
111+
(res) => {
112+
resolve(res);
113+
},
114+
(err) => {
115+
reject(new Error(err));
116+
},
117+
timeout,
118+
);
119+
});
120+
}
121+
99122
/**
100123
* Advertise the service. This turns the Service object from a client
101124
* into a server. The callback will be called with every request

packages/roslib/test/service.test.ts

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,4 +203,31 @@ describe("Service", () => {
203203
await server.unadvertise();
204204
expect(server.isAdvertised).toBe(false);
205205
});
206+
207+
it("Successfully call a service with an asynchronous return", async () => {
208+
const server = new Service<
209+
undefined,
210+
{ success: boolean; message: string }
211+
>({
212+
ros,
213+
serviceType: "std_srvs/Trigger",
214+
name: "/test_service",
215+
});
216+
await server.advertise((_request, response) => {
217+
response.success = true;
218+
response.message = "bar";
219+
return true;
220+
});
221+
const client = new Service({
222+
ros,
223+
serviceType: "std_srvs/Trigger",
224+
name: "/test_service",
225+
});
226+
const response = await client.callServiceAsync({});
227+
228+
expect(response).toEqual({
229+
success: true,
230+
message: "bar",
231+
});
232+
}, 10_000);
206233
});

0 commit comments

Comments
 (0)