The Disc TypeScript SDK provides a typed HTTP client for querying a Disc server, managing authentication, executing transactions, and subscribing to real-time updates over WebSocket.
Import from the SDK module directly:
import {
AuthManager,
createClient,
createSubscriptionClient,
DiscClient
} from "disc/sdk/mod.ts";
If you have generated a typed client with disc codegen, you can import the generated types alongside the SDK:
import { createClient } from "disc/sdk/mod.ts";
import type { Post, User } from "./dbschema/disc-client/interfaces.ts";
interfaces.tsis emitted only for multi-module schemas; a single-module schema emitstypes.tsinstead, so import from./dbschema/disc-client/types.tsin that case.
Use createClient() to construct a DiscClient instance. All options are optional and have sensible defaults.
import { createClient } from "disc/sdk/mod.ts";
const client = createClient({
baseUrl: "http://localhost:5656",
headers: { "X-Custom-Header": "value" },
retries: 3,
retryDelay: 1000,
timeout: 30000
});
| Option | Type | Default | Description |
|---|---|---|---|
baseUrl |
string |
DISC_SERVER_URL env, else disc.toml, else "http://localhost:5656" |
URL of the Disc server |
headers |
Record<string, string> |
{} |
Custom headers included with every request |
retries |
number |
0 |
Number of retries on network or server errors |
retryDelay |
number |
1000 |
Base delay between retries in milliseconds (linear backoff) |
timeout |
number |
30000 |
Request timeout in milliseconds |
The DiscClient class can also be instantiated directly if you prefer:
import { DiscClient } from "disc/sdk/mod.ts";
const client = new DiscClient({ baseUrl: "https://disc.example.com" });
When baseUrl is omitted, the client resolves the server URL automatically in this order:
config.baseUrl — an explicit value always wins.DISC_SERVER_URL env var — works on any runtime (Deno, Node, Bun). The recommended option for deployed servers, where the working directory and filesystem permissions are unpredictable.disc.toml — on Deno, the client walks up from the current working directory for a disc.toml (the same lookup the CLI uses) and derives http://<host>:<port> from its [server] section.http://localhost:5656 — the final fallback.So a codegen client running inside your project connects on the configured port with no options:
import { DiscClient } from "./dbschema/disc-client/index.ts";
const client = new DiscClient(); // baseUrl from DISC_SERVER_URL, else disc.toml
# Or pin it explicitly for a deployed GraphQL/API server:
DISC_SERVER_URL=http://db.internal:5656 deno run --allow-net --allow-env server.ts
disc.toml resolution is best-effort and Deno-only: a Node or Bun process (e.g. an Apollo/Yoga server) skips step 3 entirely, so set DISC_SERVER_URL there. Within Deno it also needs --allow-read for the project directory and --allow-env to read the variable. If a disc.toml is found but can’t be read (permission denied), the client emits a logger.warn (when a logger is configured) instead of silently falling back — pass { logger: console } while debugging:
const client = new DiscClient({ logger: console });
// → warns: "DiscClient: could not read …/disc.toml; falling back to http://localhost:5656…"
client.query<T>(query, variables?, options?)Executes an EdgeQL query and returns the result data directly. Throws DiscQueryError if the server returns any errors.
The optional options argument accepts { revive, validate }: revive auto-converts wire-encoded scalars (e.g. ISO date strings into Date), and validate runs a validator against the result, throwing DiscValidationError if it rejects.
bigint variables (the type codegen assigns to int64 fields) are supported directly — the client encodes them as numeric strings on the wire, so { count: 0n } works where plain JSON.stringify would throw "Do not know how to serialize a BigInt". Uint8Array values should be wrapped with encodeBytes() before being passed as variables.
// Select all users
const users = await client.query<User[]>("select User { email, name }");
// Select with variables
const user = await client.query<User>(
`select User { email, name }
filter .email = <str>$email`,
{ email: "ada@example.com" }
);
// Insert
const newUser = await client.query<User>(
`insert User {
email := <str>$email,
name := <str>$name
}`,
{ email: "billie@example.com", name: "Billie" }
);
// Update
await client.query(
`update User
filter .email = <str>$email
set { name := <str>$name }`,
{ email: "billie@example.com", name: "Robert" }
);
// Delete
await client.query(
`delete User filter .email = <str>$email`,
{ email: "billie@example.com" }
);
client.queryRaw<T>(query, variables?)Returns the full response envelope including data, errors, and timing extensions. Does not throw on query errors -- you must check response.errors yourself.
const response = await client.queryRaw<User[]>("select User { email, name }");
if (response.errors && response.errors.length > 0) {
for (const err of response.errors) {
console.error(err.message, err.extensions);
}
} else {
console.log(response.data);
}
// Access timing information
console.log(response.extensions?.parseMs);
console.log(response.extensions?.compileMs);
console.log(response.extensions?.executeMs);
console.log(response.extensions?.cacheHit);
The QueryResponse<T> type has this shape:
interface QueryResponse<T = unknown> {
data?: T;
errors?: QueryError[];
extensions?: QueryExtensions;
}
interface QueryError {
extensions?: Record<string, unknown>;
locations?: Array<{ column: number; line: number; }>;
message: string;
path?: Array<string | number>;
}
interface QueryExtensions {
cacheHit?: boolean;
compileMs?: number;
executeMs?: number;
parseMs?: number;
[key: string]: unknown;
}
When you generate a typed client with disc codegen, junction-backed multi links are writable directly through the generated insert() / update() methods — no raw EdgeQL required. Multi links are typed as arrays of target UUIDs.
Given a schema where User has multi link teams -> Team:
// Insert — assign the full set of linked targets
const user = await client.user.insert({
name: "Ada",
teams: [teamId1, teamId2]
});
// Update (replace) — pass an array to replace the whole set
await client.user.update(user.id, { teams: [teamId2, teamId3] });
// Update (delta add) — add members without disturbing the rest
await client.user.update(user.id, { teams: { add: [teamId1] } });
// Update (delta remove) — remove members without disturbing the rest
await client.user.update(user.id, { teams: { remove: [teamId2] } });
The set semantics are:
insert({ link: [...] }) assigns exactly the listed targets.update(id, { link: [...] }) replaces the set with exactly the listed targets.update(id, { link: { add: [...] } }) adds targets (existing members are left in place; re-adding an existing member is a no-op).update(id, { link: { remove: [...] } }) removes the listed targets.add and remove may be combined in a single update call. Each write compiles to a single atomic statement against PostgreSQL, so the junction rows are never left half-applied.
The SDK provides three methods for checking server health, suitable for orchestration systems and monitoring.
client.health()Returns the full health status including database connectivity, connection pool stats, uptime, and extension health.
const health = await client.health();
// health.database?.connected: boolean
// health.database?.latencyMs: number
// health.pool?.active: number
// health.pool?.idle: number
// health.status: "healthy" | "degraded" | "unhealthy"
// health.uptimeMs: number
client.isAlive()Liveness probe. Returns true if the server process is running. Never throws -- returns false on any error.
const alive = await client.isAlive();
client.isReady()Readiness probe. Returns true when the database is connected and the server can accept queries. Returns false if the database is unreachable.
const ready = await client.isReady();
client.stats()Returns detailed server statistics including connection counts, query metrics, transaction counts, memory usage, cache stats, and rate limiter info.
const stats = await client.stats();
console.log("Active connections:", stats.connections.active);
console.log("Total queries:", stats.queries.total);
console.log("Failed queries:", stats.queries.failed);
console.log("Avg query duration:", stats.queries.avgDurationMs, "ms");
console.log("Active transactions:", stats.transactions.active);
console.log("Heap used:", stats.memoryUsage.heapUsed);
console.log("Uptime:", stats.uptimeMs, "ms");
// Cache stats (when available)
if (stats.cache) {
console.log("Compilation cache hit rate:", stats.cache.compilation.hitRate);
console.log("Parse cache size:", stats.cache.parse.size);
}
// Query performance metrics
if (stats.queryMetrics) {
console.log("Avg parse time:", stats.queryMetrics.avgParseMs, "ms");
console.log("Avg compile time:", stats.queryMetrics.avgCompileMs, "ms");
console.log("Avg execute time:", stats.queryMetrics.avgExecuteMs, "ms");
console.log("Cache hit rate:", stats.queryMetrics.cacheHitRate);
}
The AuthManager class handles the full authentication lifecycle: registration, login, logout, token refresh, and profile management. It wraps a DiscClient and automatically sets the JWT token on the client after successful authentication.
import { AuthManager, createClient } from "disc/sdk/mod.ts";
const client = createClient({ baseUrl: "http://localhost:5656" });
const auth = new AuthManager(client, {
autoRefresh: true, // automatically refresh tokens before expiry (default: true)
refreshBuffer: 60 // seconds before expiry to trigger refresh (default: 60)
});
const response = await auth.register({
email: "ada@example.com",
metadata: { department: "engineering" }, // optional
password: "secure-password-123",
username: "ada" // optional
});
// response contains:
// - response.refreshToken: refresh token (optional)
// - response.session: session details (id, userId, expiresAt)
// - response.token: JWT access token
// - response.user: AuthUser object
After registration, the client is automatically authenticated. All subsequent queries include the JWT token.
// Login with email
const response = await auth.login({
email: "ada@example.com",
password: "secure-password-123"
});
// Login with username
const response = await auth.login({
password: "secure-password-123",
username: "ada"
});
auth.isAuthenticated(); // true if a token is set on the client
auth.getUser(); // cached AuthUser from the last login/register call
getUser() returns the user from the most recent successful login() or register() call without making a server request. Returns null if no session is active.
const profile = await auth.getProfile();
// profile.email, profile.id, profile.username
// profile.createdAt, profile.updatedAt
// profile.active, profile.emailVerified
// profile.metadata
getProfile() makes a GET /auth/profile request and updates the cached user.
await auth.updatePassword("old-password", "new-password");
Throws DiscAuthError if not authenticated.
When autoRefresh is enabled (the default), the AuthManager parses the JWT exp claim and schedules a background refresh refreshBuffer seconds before the token expires. This happens automatically -- you do not need to call refreshTokens() manually.
To refresh manually:
const tokens = await auth.refreshTokens();
// tokens.refreshToken: new refresh token (if issued)
// tokens.token: new JWT access token
Throws DiscAuthError if no refresh token is available.
await auth.logout();
This sends a POST /auth/logout request, then clears all local state: tokens, cached user, and the auth header on the client.
When you are done with the AuthManager, call dispose() to cancel any pending auto-refresh timer:
auth.dispose();
This is important in environments where timers would prevent garbage collection or process exit.
Transactions execute multiple queries atomically. The SDK uses a callback pattern: the transaction auto-commits on success and auto-rolls back on error.
const result = await client.transaction(async tx => {
const user = await tx.query<User>(
`insert User { email := <str>$email, name := <str>$name }`,
{ email: "cher@example.com", name: "Cher" }
);
await tx.query(
`insert Post {
author := (select User filter .id = <uuid>$userId),
body := <str>$body,
title := <str>$title
}`,
{ body: "Written atomically.", title: "First Post", userId: user.id }
);
return user;
});
If the callback throws, the transaction is automatically rolled back and the error is re-thrown.
Inside the callback, the tx object provides:
| Method | Description |
|---|---|
tx.query<T>(query, variables?) |
Execute a query within the transaction |
tx.commit() |
Explicitly commit (usually unnecessary) |
tx.rollback() |
Explicitly roll back |
tx.getState() |
Returns "active", "committed", or "rolled_back" |
tx.getId() |
Returns the transaction ID string |
You do not need to call tx.commit() explicitly. The client.transaction() wrapper commits automatically when the callback returns without throwing. Explicit commit and rollback are available for advanced control flows.
A Transaction transitions through these states:
active --> committed
|
+------> rolled_back
Calling query(), commit(), or rollback() on a non-active transaction throws DiscTransactionError.
Under the hood, client.transaction() performs these steps:
POST /transaction/begin -- server allocates a transaction and returns a transactionId.tx.query() sends a POST /query with an X-Transaction-ID header linking the query to the transaction.POST /transaction/{id}/commit.POST /transaction/{id}/rollback, then re-throws.The SubscriptionClient provides real-time data streaming over WebSocket. It supports automatic reconnection with exponential backoff and re-subscribes to all active subscriptions after reconnection.
import { createSubscriptionClient } from "disc/sdk/mod.ts";
const sub = createSubscriptionClient(
{ baseUrl: "http://localhost:5656" },
{
autoReconnect: true, // reconnect on disconnect (default: true)
maxReconnectAttempts: 5, // max reconnect attempts (default: 5)
reconnectDelay: 1000 // base delay in ms (default: 1000)
}
);
await sub.connect();
The SubscriptionClient automatically converts http:// to ws:// and https:// to wss:// when connecting.
const handle = sub.subscribe<User[]>(
"select User { email, name, posts: { title } }",
{
onComplete: () => {
console.log("Subscription stream ended");
},
onData: data => {
console.log("Received update:", data);
},
onError: error => {
console.error("Subscription error:", error.message);
}
},
{ status: "active" } // optional variables
);
The subscribe() method returns a SubscriptionHandle:
interface SubscriptionHandle {
id: string; // unique subscription ID
unsubscribe: () => void; // unsubscribe from this subscription
}
// Via the handle
handle.unsubscribe();
// Or by ID
sub.unsubscribe(handle.id);
sub.isConnected(); // true when WebSocket is in OPEN state
sub.close(); // close the connection and clean up all subscriptions
Calling close() prevents any further reconnection attempts.
When the WebSocket connection drops and autoReconnect is true, the client automatically:
reconnectDelay * 2^attempt milliseconds.If reconnection fails after maxReconnectAttempts, all active subscriptions receive an error via their onError callback.
| Option | Type | Default | Description |
|---|---|---|---|
autoReconnect |
boolean |
true |
Reconnect automatically on disconnect |
maxReconnectAttempts |
number |
5 |
Maximum reconnect attempts before giving up |
reconnectDelay |
number |
1000 |
Base delay between reconnect attempts (ms) |
All SDK errors extend DiscClientError, which carries a code property from the DiscErrorCode enum.
| Error Class | Code | Thrown When |
|---|---|---|
DiscAuthError |
AUTH_ERROR |
401 or 403 response, missing token, expired session |
DiscClientError |
(varies) | Base class for all SDK errors |
DiscConnectionError |
CONNECTION_ERROR |
Server unreachable, connection refused |
DiscNetworkError |
NETWORK_ERROR |
Fetch failed, DNS resolution error |
DiscProtocolError |
PROTOCOL_ERROR |
Server returned an unexpected response format |
DiscQueryError |
QUERY_ERROR |
Server returns one or more query errors |
DiscServerError |
SERVER_ERROR |
Server returned a 5xx status code |
DiscTimeoutError |
TIMEOUT |
Request exceeds the configured timeout |
DiscTransactionError |
TRANSACTION_ERROR |
Operation on a non-active transaction |
DiscValidationError |
VALIDATION_ERROR |
A query() options.validate validator rejects |
import {
DiscAuthError,
DiscConnectionError,
DiscErrorCode,
DiscQueryError,
DiscServerError,
DiscTimeoutError
} from "disc/sdk/mod.ts";
try {
const users = await client.query("select User { email, name }");
} catch (error) {
if (error instanceof DiscQueryError) {
// Query syntax or execution error
console.error("Query failed:", error.message);
for (const qe of error.errors) {
console.error(" -", qe.message, qe.extensions);
}
} else if (error instanceof DiscTimeoutError) {
// Request took too long
console.error(`Timed out after ${error.timeoutMs}ms`);
} else if (error instanceof DiscAuthError) {
// Authentication failure
console.error(`Auth error (HTTP ${error.statusCode}):`, error.message);
} else if (error instanceof DiscConnectionError) {
// Server unreachable
console.error("Connection failed:", error.message);
} else if (error instanceof DiscServerError) {
// 5xx server error
console.error(`Server error (HTTP ${error.statusCode}):`, error.message);
}
}
Every SDK error has a code property from the DiscErrorCode enum:
import { DiscClientError, DiscErrorCode } from "disc/sdk/mod.ts";
try {
await client.query("bad query");
} catch (error) {
if (error instanceof DiscClientError) {
switch (error.code) {
case DiscErrorCode.AUTH_ERROR: {
// handle auth error
break;
}
case DiscErrorCode.CONNECTION_ERROR: {
// handle connection error
break;
}
case DiscErrorCode.NETWORK_ERROR: {
// handle network error
break;
}
case DiscErrorCode.PROTOCOL_ERROR: {
// handle protocol error
break;
}
case DiscErrorCode.QUERY_ERROR: {
// handle query error
break;
}
case DiscErrorCode.SERVER_ERROR: {
// handle server error
break;
}
case DiscErrorCode.TIMEOUT: {
// handle timeout
break;
}
case DiscErrorCode.TRANSACTION_ERROR: {
// handle transaction error
break;
}
case DiscErrorCode.VALIDATION_ERROR: {
// handle validation failure
break;
}
}
}
}
The client retries requests based on the error type:
| Error Type | Retried? | Notes |
|---|---|---|
DiscAuthError |
No | 401/403 will not succeed on retry |
DiscConnectionError |
Yes | Network-level failures are retried |
DiscNetworkError |
Yes | General fetch failures are retried |
DiscProtocolError |
No | Response format issues are not transient |
DiscQueryError |
No | Query errors are deterministic |
DiscServerError (5xx) |
Yes | Retried with linear backoff (retryDelay * attempt) |
DiscTimeoutError |
No | Thrown immediately, not retried |
When the server has multi-database support enabled, you can target a specific database by passing a custom header or by including a query parameter.
const client = createClient({
baseUrl: "http://localhost:5656",
headers: { "X-Database": "analytics" }
});
const data = await client.query("select Event { name, timestamp }");
If you need to query different databases from the same client, set the header on individual requests by using queryRaw with the underlying fetch:
// Default database
const users = await client.query("select User { name }");
// Different database via a second client
const analyticsClient = createClient({
baseUrl: "http://localhost:5656",
headers: { "X-Database": "analytics" }
});
const events = await analyticsClient.query("select Event { name }");
The server resolves the database name in this order:
X-Database header?database= query parameter"disc"A runtime DSL that gives the same end-to-end type safety as disc codegen without producing any generated files. Useful when CI shouldn’t carry a codegen step or when the schema lives in TypeScript next to the application code.
defineSchema() accepts a record of type definitions; field markers come from the t.* namespace:
import { defineSchema, t } from "disc/sdk/mod.ts";
export const schema = defineSchema({
User: {
email: t.str(),
name: t.optional(t.str()),
score: t.int64(),
posts: t.multi("Post")
},
Post: {
title: t.str(),
body: t.optional(t.str()),
author: t.single("User")
}
});
The t.* markers carry compile-time type information; defineSchema() validates at construction (PascalCase type names, valid field names, link targets that resolve to defined types) and throws synchronously on misuse.
createQueryBuilder(client, schema) returns a Proxy where each property is a typed selection chain:
import { createClient, createQueryBuilder } from "disc/sdk/mod.ts";
import { schema } from "./schema.ts";
const client = createClient();
const qb = createQueryBuilder(client, schema);
// Awaiting the chain runs the query through `client.query()`.
const users = await qb
.User
.select({ email: true, name: true })
.filter(u => u.email.eq("alice@example.com"))
.first();
// ^? { email: string; name: string | null } | null
select narrows the awaited row type to the picked shape. filter predicates receive a typed reference where each property accepts only the right comparison operand: u.email.eq(...) requires a string, u.score.gt(...) requires a number. Identifier safety is enforced at construction so schema typos fail before reaching the server.
client.queryThe query builder compiles to the same EdgeQL strings the raw client.query("select User { ... }") path does and runs through the same access-policy + read-only + auth-gate pipeline. The two patterns interoperate freely — pick whichever reads better at the call site, no migration needed. (sdk/query-builder.ts, sdk/schema-types.ts)
When using generated types from disc codegen, you can pass them as type parameters to query() for full type safety:
import { createClient } from "disc/sdk/mod.ts";
import type { Post, User } from "./dbschema/disc-client/interfaces.ts";
const client = createClient();
// Type-safe query results
const users = await client.query<User[]>("select User { email, name }");
// users is typed as User[]
// Type-safe within transactions
const result = await client.transaction(async tx => {
const user = await tx.query<User>(
`insert User { email := <str>$email, name := <str>$name }`,
{ email: "daena@example.com", name: "Daena" }
);
return user; // typed as User
});
// Type-safe subscriptions
const sub = createSubscriptionClient();
await sub.connect();
sub.subscribe<User[]>(
"select User { email, name }",
{
onData: users => {
// users is typed as User[]
for (const user of users) {
console.log(user.email, user.name);
}
}
}
);
The complete list of exports from disc/sdk/mod.ts:
| Export | Description |
|---|---|
AuthManager |
Authentication lifecycle manager |
DiscClient |
Core HTTP client for Disc |
SubscriptionClient |
WebSocket subscription client |
Transaction |
Transaction handle (received in callback) |
| Export | Description |
|---|---|
createClient(config?) |
Create a DiscClient instance |
createSubscriptionClient(config?, options?) |
Create a SubscriptionClient instance |
| Export | Description |
|---|---|
DiscAuthError |
Authentication/authorization failure |
DiscClientError |
Base error class |
DiscConnectionError |
Server unreachable |
DiscErrorCode |
Error code enum |
DiscNetworkError |
Network failure |
DiscProtocolError |
Unexpected response format |
DiscQueryError |
Query execution error |
DiscServerError |
Server 5xx error |
DiscTimeoutError |
Request timeout |
DiscTransactionError |
Invalid transaction state |
DiscValidationError |
Runtime validation failure |
| Export | Description |
|---|---|
AuthManagerOptions |
Auth manager configuration |
AuthResponse |
Login/register response (user, session, token) |
AuthTokens |
JWT token and optional refresh token |
AuthUser |
User profile (id, email, username, metadata) |
CacheStats |
Cache hit/miss/eviction stats |
DiscClientConfig |
Client constructor options |
HealthStatus |
Server health (status, database, pool) |
IsolationLevel |
"read_committed", "repeatable_read", "serializable" |
LoginCredentials |
Email/username and password |
QueryError |
Single query error from the server |
QueryExtensions |
Timing info (parseMs, compileMs, executeMs) |
QueryOptions |
Per-query options (e.g. validator for runtime checks) |
QueryRequest |
Query payload (query, variables, operationName) |
QueryResponse<T> |
Response envelope (data, errors, extensions) |
QueryValidator |
Standard Schema validator applied to query results |
RegisterData |
Email, password, optional username/metadata |
ReviveOptions |
Options for reviveResponse wire-format revival |
ServerStats |
Connections, queries, transactions, memory, cache |
StandardSchemaIssue |
Single validation issue (Standard Schema spec) |
StandardSchemaResult |
Validation result (value or issues; Standard Schema spec) |
StandardSchemaV1 |
Standard Schema v1 validator interface |
SubscriptionCallbacks<T> |
onData, onError, onComplete handlers |
SubscriptionClientConfig |
Subscription client options |
SubscriptionHandle |
Subscription id and unsubscribe function |
SubscriptionMessage<T> |
Incoming subscription message (id, type, payload) |
SubscriptionRequest |
Subscription request (id, query, variables) |
TransactionState |
"active", "committed", "rolled_back" |
Codegen-free query-builder DSL and schema declaration exports.
| Export | Kind | Description |
|---|---|---|
and |
function | Combine predicates with logical AND |
compileFilter |
function | Compile a codegen filter object to EdgeQL |
createQueryBuilder |
function | Construct a runtime query builder |
defineSchema |
function | Declare a schema for typed builder inference |
from |
function | Start a select chain from an object type |
not |
function | Negate a predicate |
or |
function | Combine predicates with logical OR |
t |
object | Field-type helpers used by defineSchema |
SelectChain |
class | Fluent select-chain builder |
CompiledFilter |
type | Result of compileFilter (EdgeQL + params) |
CompiledQuery |
type | Compiled query (EdgeQL string + variables) |
DiscSchema |
type | Schema declared via defineSchema |
Expr |
type | Query-builder expression node |
FilterArg |
type | Accepted filter argument (Expr or codegen filter) |
QueryBuilder |
type | Runtime query-builder interface |
QueryRunner |
type | Executor passed to the builder |
Shape |
type | Selected-shape descriptor |
TypeInfo |
type | Type metadata consumed by the filter compiler |
TypedFieldRef |
type | Typed field reference in filter predicates |
TypedQueryBuilder |
type | Type-inferred query builder |
TypedRef |
type | Typed object reference |
TypedSelectChain |
type | Type-inferred select chain |
Schema-declaration type exports: FieldMarker, FieldType, IsLink, Link, LinkCardinality, LinkStub, LinkTarget, Optional, ResolveSelected, ResolveType, Scalar, SchemaSpec, SelectShape.
Wire-format encode/decode helpers.
| Export | Kind | Description |
|---|---|---|
encodeBytes |
function | Encode a byte string for the wire format |
jsonReplacer |
function | JSON.stringify replacer encoding outbound bigint as a numeric string |
parseBytes |
function | Decode a wire-format byte string |
parseDateTime |
function | Parse a wire-format datetime value |
parseInt64 |
function | Parse a wire-format 64-bit integer |
reviveResponse |
function | Revive typed values in a raw response payload |