Skip to content
This repository was archived by the owner on Dec 27, 2025. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ export default scenario("example http request")
.step("assert response", (ctx) => {
const response = ctx.previous;
assertEquals(response.status, 200);
assertEquals(response.json().args.hello, "world");
assertEquals(response.json.args.hello, "world");
})
.build();
```
Expand Down
2 changes: 1 addition & 1 deletion packages/probitas-client-connectrpc/client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -292,7 +292,7 @@ function toMethodInfo(
* "echo",
* { message: "Hello!" }
* );
* console.log(response.data());
* console.log(response.data);
*
* await client.close();
* ```
Expand Down
12 changes: 6 additions & 6 deletions packages/probitas-client-connectrpc/integration_test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -189,9 +189,9 @@ Deno.test({

assert(response.ok);
assertEquals(response.statusCode, 0);
assertExists(response.data());
assertExists(response.data);

const data = response.data<{ message: string }>();
const data = response.data as { message: string } | null;
assertExists(data);
assertEquals(data.message, "Hello Reflection!");
});
Expand All @@ -205,8 +205,8 @@ Deno.test({

assert(response.ok);
assertEquals(response.statusCode, 0);
assertExists(response.data());
const data = response.data<{ message: string }>();
assertExists(response.data);
const data = response.data as { message: string } | null;
assertEquals(data?.message, "Test message");
assertLess(response.duration, 5000);
});
Expand Down Expand Up @@ -377,7 +377,7 @@ Deno.test({
)
) {
assert(response.ok);
messages.push(response.data());
messages.push(response.data);
}

assertEquals(messages.length, 3);
Expand Down Expand Up @@ -507,7 +507,7 @@ Deno.test({

assertFalse(response.ok);
assertEquals(response.statusCode !== 0, true);
assertEquals(response.data(), null);
assertEquals(response.data, null);
});
},
});
4 changes: 2 additions & 2 deletions packages/probitas-client-connectrpc/mod.ts
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@
* "echo",
* { message: "Hello!" }
* );
* console.log(response.data());
* console.log(response.data);
*
* await client.close();
* ```
Expand Down Expand Up @@ -77,7 +77,7 @@
* await using client = createConnectRpcClient({ url: "http://localhost:50051" });
*
* const res = await client.call("echo.EchoService", "echo", { message: "test" });
* console.log(res.data());
* console.log(res.data);
* // Client automatically closed when block exits
* ```
*
Expand Down
74 changes: 31 additions & 43 deletions packages/probitas-client-connectrpc/response.ts
Original file line number Diff line number Diff line change
Expand Up @@ -66,17 +66,17 @@ interface ConnectRpcResponseBase<T = any> extends ClientResult {
readonly duration: number;

/**
* Get deserialized response data.
* Returns the response message as-is (already deserialized by Connect).
* Returns null if the response is an error or has no data.
* Deserialized response data.
* The response message as-is (already deserialized by Connect).
* Null if the response is an error or has no data.
*/
data<U = T>(): U | null;
readonly data: T | null;

/**
* Get raw response or error.
* Returns null for failure responses.
* Raw response or error.
* Null for failure responses.
*/
raw(): unknown | null;
readonly raw: unknown | null;
}

/**
Expand All @@ -101,7 +101,11 @@ export interface ConnectRpcResponseSuccess<T = any>
/** Response trailers (sent at end of RPC). */
readonly trailers: Headers;

raw(): unknown;
/** Raw response. */
readonly raw: unknown;

/** Response data. */
readonly data: T | null;
}

/**
Expand All @@ -128,7 +132,11 @@ export interface ConnectRpcResponseError<T = any>
/** Response trailers (sent at end of RPC). */
readonly trailers: Headers;

raw(): ConnectError;
/** Raw ConnectError. */
readonly raw: ConnectError;

/** No data for error responses. */
readonly data: null;
}

/**
Expand All @@ -155,7 +163,11 @@ export interface ConnectRpcResponseFailure<T = any>
/** Response trailers (null for failures). */
readonly trailers: null;

raw(): null;
/** No raw response (request didn't reach server). */
readonly raw: null;

/** No data (request didn't reach server). */
readonly data: null;
}

/**
Expand Down Expand Up @@ -220,25 +232,15 @@ export class ConnectRpcResponseSuccessImpl<T>
readonly headers: Headers;
readonly trailers: Headers;
readonly duration: number;

readonly #response: T | null;
readonly data: T | null;
readonly raw: T | null;

constructor(params: ConnectRpcResponseSuccessParams<T>) {
this.headers = params.headers;
this.trailers = params.trailers;
this.duration = params.duration;
this.#response = params.response;
}

data<U = T>(): U | null {
if (this.#response === null || this.#response === undefined) {
return null;
}
return this.#response as U;
}

raw(): T | null {
return this.#response;
this.data = params.response;
this.raw = params.response;
}
}

Expand All @@ -257,26 +259,18 @@ export class ConnectRpcResponseErrorImpl<T>
readonly headers: Headers;
readonly trailers: Headers;
readonly duration: number;

readonly #connectError: ConnectError;
readonly data = null;
readonly raw: ConnectError;

constructor(params: ConnectRpcResponseErrorParams) {
this.headers = params.headers;
this.trailers = params.trailers;
this.duration = params.duration;
this.error = params.rpcError;
this.#connectError = params.error;
this.raw = params.error;
this.statusCode = params.rpcError.statusCode;
this.statusMessage = params.rpcError.statusMessage;
}

data<U = T>(): U | null {
return null;
}

raw(): ConnectError {
return this.#connectError;
}
}

/**
Expand All @@ -294,17 +288,11 @@ export class ConnectRpcResponseFailureImpl<T>
readonly headers = null;
readonly trailers = null;
readonly duration: number;
readonly data = null;
readonly raw = null;

constructor(params: ConnectRpcResponseFailureParams) {
this.error = params.error;
this.duration = params.duration;
}

data(): null {
return null;
}

raw(): null {
return null;
}
}
28 changes: 14 additions & 14 deletions packages/probitas-client-connectrpc/response_test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ Deno.test("ConnectRpcResponseSuccessImpl", async (t) => {
assertEquals(response.error, null);
assertEquals(response.statusCode, 0);
assertEquals(response.statusMessage, null);
assertEquals(response.data(), { user: { id: 1, name: "John" } });
assertEquals(response.data, { user: { id: 1, name: "John" } });
assertEquals(response.duration, 100);
});

Expand All @@ -51,7 +51,7 @@ Deno.test("ConnectRpcResponseSuccessImpl", async (t) => {
assertEquals(response.trailers.get("grpc-status"), "0");
});

await t.step("raw() returns response data", () => {
await t.step("raw returns response data", () => {
const rawResponse = { nested: { value: 123 } };
const response = new ConnectRpcResponseSuccessImpl({
response: rawResponse,
Expand All @@ -60,10 +60,10 @@ Deno.test("ConnectRpcResponseSuccessImpl", async (t) => {
duration: 10,
});

assertEquals(response.raw(), rawResponse);
assertEquals(response.raw, rawResponse);
});

await t.step("data() method returns typed data", () => {
await t.step("data supports type assertion", () => {
interface User {
id: number;
name: string;
Expand All @@ -75,7 +75,7 @@ Deno.test("ConnectRpcResponseSuccessImpl", async (t) => {
duration: 100,
});

const result = response.data<{ user: User }>();
const result = response.data as { user: User } | null;
assertEquals(result?.user.id, 1);
assertEquals(result?.user.name, "John");
});
Expand All @@ -88,8 +88,8 @@ Deno.test("ConnectRpcResponseSuccessImpl", async (t) => {
duration: 100,
});

assertEquals(response.data(), null);
assertEquals(response.raw(), null);
assertEquals(response.data, null);
assertEquals(response.raw, null);
});
});

Expand All @@ -111,10 +111,10 @@ Deno.test("ConnectRpcResponseErrorImpl", async (t) => {
assertEquals(response.error, rpcError);
assertEquals(response.statusCode, 5);
assertEquals(response.statusMessage, "Not found");
assertEquals(response.data(), null);
assertEquals(response.data, null);
});

await t.step("raw() returns ConnectError", () => {
await t.step("raw returns ConnectError", () => {
const connectError = new ConnectError("Internal error", 13);
const rpcError = fromConnectError(connectError);
const response = new ConnectRpcResponseErrorImpl({
Expand All @@ -125,7 +125,7 @@ Deno.test("ConnectRpcResponseErrorImpl", async (t) => {
duration: 10,
});

assertEquals(response.raw(), connectError);
assertEquals(response.raw, connectError);
});

await t.step("includes headers and trailers", () => {
Expand Down Expand Up @@ -203,23 +203,23 @@ Deno.test("ConnectRpcResponseFailureImpl", async (t) => {
assertEquals(response.trailers, null);
});

await t.step("data() returns null", () => {
await t.step("data is null", () => {
const error = new ConnectRpcNetworkError("Network error");
const response = new ConnectRpcResponseFailureImpl({
error,
duration: 5,
});

assertEquals(response.data(), null);
assertEquals(response.data, null);
});

await t.step("raw() returns null", () => {
await t.step("raw is null", () => {
const error = new ConnectRpcNetworkError("Network error");
const response = new ConnectRpcResponseFailureImpl({
error,
duration: 5,
});

assertEquals(response.raw(), null);
assertEquals(response.raw, null);
});
});
4 changes: 2 additions & 2 deletions packages/probitas-client-graphql/client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -533,7 +533,7 @@ class GraphqlClientImpl implements GraphqlClient {
* }
* `, { id: "123" });
*
* console.log(response.data());
* console.log(response.data);
* await client.close();
* ```
*
Expand All @@ -560,7 +560,7 @@ class GraphqlClientImpl implements GraphqlClient {
* `, { input: { name: "Alice", email: "alice@example.com" } });
*
* if (response.ok) {
* console.log("Created user:", response.data().createUser.id);
* console.log("Created user:", (response.data as any).createUser.id);
* }
*
* await client.close();
Expand Down
14 changes: 7 additions & 7 deletions packages/probitas-client-graphql/client_test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,7 @@ Deno.test("GraphqlClient.query", async (t) => {
await client.close();

assert(response.ok);
assertEquals(response.data(), { user: { id: 1, name: "John" } });
assertEquals(response.data, { user: { id: 1, name: "John" } });
assertEquals(response.error, null);
});

Expand Down Expand Up @@ -271,7 +271,7 @@ Deno.test("GraphqlClient.execute", async (t) => {
const response = await client.execute("query { test }");
await client.close();

assertEquals(response.data(), { test: true });
assertEquals(response.data, { test: true });
});

await t.step("works for mutations", async () => {
Expand All @@ -287,7 +287,7 @@ Deno.test("GraphqlClient.execute", async (t) => {
const response = await client.execute("mutation { updateSomething }");
await client.close();

assertEquals(response.data(), { updated: true });
assertEquals(response.data, { updated: true });
});
});

Expand Down Expand Up @@ -432,7 +432,7 @@ Deno.test("GraphqlClient response", async (t) => {
const response = await client.query("query { test }");
await client.close();

assertInstanceOf(response.raw(), Response);
assertInstanceOf(response.raw, Response);
});
});

Expand All @@ -458,8 +458,8 @@ Deno.test("GraphqlClient network errors", async (t) => {
assertEquals(response.error?.message, "fetch failed");
assertEquals(response.status, null);
assertEquals(response.headers, null);
assertEquals(response.data(), null);
assertEquals(response.raw(), null);
assertEquals(response.data, null);
assertEquals(response.raw, null);
},
);

Expand Down Expand Up @@ -604,7 +604,7 @@ Deno.test("GraphqlClient partial data with errors", async (t) => {
await client.close();

assertFalse(response.ok);
assertEquals(response.data(), { user: { id: 1 }, posts: null });
assertEquals(response.data, { user: { id: 1 }, posts: null });
assertInstanceOf(response.error, GraphqlExecutionError);
},
);
Expand Down
Loading