@trevrpc/trevrpc-js 0.2.3 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/README.md +127 -46
  2. package/package.json +12 -45
  3. package/src/bytes.js +10 -0
  4. package/src/call.js +520 -0
  5. package/src/channel.js +258 -288
  6. package/src/client.js +543 -1254
  7. package/src/datagram.js +336 -0
  8. package/src/framing.js +151 -548
  9. package/src/generator.js +66 -109
  10. package/src/index.d.ts +235 -463
  11. package/src/index.js +4 -3
  12. package/src/qmux/frames.js +262 -0
  13. package/src/qmux/params.js +104 -0
  14. package/src/qmux/session.js +739 -0
  15. package/src/race.js +90 -0
  16. package/src/status.js +24 -70
  17. package/src/varint.js +73 -0
  18. package/src/wire.js +21 -89
  19. package/examples/greeter/README.md +0 -35
  20. package/examples/greeter/client.js +0 -172
  21. package/examples/greeter/greeter.node.trevrpc.d.ts +0 -53
  22. package/examples/greeter/greeter.node.trevrpc.js +0 -9
  23. package/examples/greeter/greeter.proto +0 -18
  24. package/examples/greeter/greeter.trevrpc.d.ts +0 -55
  25. package/examples/greeter/greeter.trevrpc.js +0 -103
  26. package/examples/greeter/index.html +0 -140
  27. package/examples/greeter/static-server.js +0 -168
  28. package/src/advanced.d.ts +0 -29
  29. package/src/advanced.js +0 -1
  30. package/src/browser-channel.js +0 -49
  31. package/src/connect.js +0 -6
  32. package/src/connect.node.js +0 -6
  33. package/src/index.node.d.ts +0 -10
  34. package/src/index.node.js +0 -3
  35. package/src/native-loader.js +0 -118
  36. package/src/node-advanced.d.ts +0 -27
  37. package/src/node-advanced.js +0 -1
  38. package/src/node-generated.d.ts +0 -24
  39. package/src/node-generated.js +0 -126
  40. package/src/node-index.d.ts +0 -1
  41. package/src/node-index.js +0 -7
  42. package/src/node.d.ts +0 -298
  43. package/src/node.js +0 -1456
  44. package/src/runtime.js +0 -66
  45. package/src/server-response.js +0 -49
  46. package/src/timer.js +0 -29
  47. package/src/webtransport.js +0 -639
@@ -1,118 +0,0 @@
1
- import { existsSync } from "node:fs";
2
- import { createRequire } from "node:module";
3
- import { dirname, join } from "node:path";
4
- import process from "node:process";
5
- import { fileURLToPath } from "node:url";
6
-
7
- const require = createRequire(import.meta.url);
8
- const packageRoot = join(dirname(fileURLToPath(import.meta.url)), "..");
9
- const packageVersion = (() => {
10
- try {
11
- return require(join(packageRoot, "package.json")).version ?? "unknown";
12
- } catch {
13
- return "unknown";
14
- }
15
- })();
16
- const SupportedOptionalTarget = "linux/x64/glibc";
17
- const LinuxX64GnuPackage = "@trevrpc/trevrpc-js-native-linux-x64-gnu";
18
-
19
- /** Loads the target-specific native addon without building during installation. */
20
- export function loadNativeAddon({ loadOptionalPackage = true, loadBundledAddon = true } = {}) {
21
- const target = nativeTarget();
22
- const packageName = nativePackageName(target);
23
- let packageError;
24
- let packageState = "unsupported";
25
-
26
- if (loadOptionalPackage && packageName != null) {
27
- try {
28
- return require(packageName);
29
- } catch (error) {
30
- packageError = error;
31
- packageState = isMissingPackage(error, packageName) ? "missing" : "failed to load";
32
- }
33
- }
34
-
35
- const bundled = loadBundledAddon ? bundledNativePath() : null;
36
- let bundledError;
37
- if (bundled != null) {
38
- try {
39
- return require(bundled);
40
- } catch (error) {
41
- bundledError = error;
42
- }
43
- }
44
-
45
- const fallback = developmentFallbackPath();
46
- let fallbackError;
47
- if (fallback != null) {
48
- try {
49
- return require(fallback);
50
- } catch (error) {
51
- fallbackError = error;
52
- }
53
- }
54
-
55
- const detected = targetName(target);
56
- const expected = packageName ?? "no optional package (unsupported target)";
57
- const bundledState =
58
- bundled == null ? "no Nix-bundled addon was present" : "the Nix-bundled addon failed to load";
59
- const fallbackState =
60
- fallback == null
61
- ? "no source-checkout fallback was present"
62
- : fallbackError == null
63
- ? "the source-checkout fallback was unavailable"
64
- : "the source-checkout fallback failed to load";
65
- throw new Error(
66
- `TrevRPC native addon is unavailable for detected target ${detected}. ` +
67
- `Supported optional-package targets: ${SupportedOptionalTarget}. Expected optional package: ${expected}@${packageVersion}; ` +
68
- `package state: ${packageState}; ${bundledState}; ${fallbackState}. ` +
69
- "Install the matching optional package or build build/native/trevrpc_native.node explicitly in a source checkout; npm installation never starts a source build.",
70
- { cause: fallbackError ?? bundledError ?? packageError },
71
- );
72
- }
73
-
74
- /** Returns the normalized native npm target. */
75
- export function nativeTarget() {
76
- return Object.freeze({
77
- platform: process.platform,
78
- arch: process.arch,
79
- libc: process.platform === "linux" ? linuxLibc() : undefined,
80
- });
81
- }
82
-
83
- function nativePackageName(target) {
84
- if (target.platform === "linux" && target.arch === "x64" && target.libc === "glibc") {
85
- return LinuxX64GnuPackage;
86
- }
87
- return null;
88
- }
89
-
90
- function bundledNativePath() {
91
- const path = join(packageRoot, "native", "trevrpc_native.node");
92
- return existsSync(path) ? path : null;
93
- }
94
-
95
- function developmentFallbackPath() {
96
- if (!existsSync(join(packageRoot, "native", "CMakeLists.txt"))) {
97
- return null;
98
- }
99
- const path = join(packageRoot, "build", "native", "trevrpc_native.node");
100
- return existsSync(path) ? path : null;
101
- }
102
-
103
- function targetName(target) {
104
- return `${target.platform}/${target.arch}${target.libc == null ? "" : `/${target.libc}`}`;
105
- }
106
-
107
- function linuxLibc() {
108
- const report = process.report?.getReport?.();
109
- return report?.header?.glibcVersionRuntime == null ? "musl" : "glibc";
110
- }
111
-
112
- function isMissingPackage(error, packageName) {
113
- return (
114
- error?.code === "MODULE_NOT_FOUND" &&
115
- typeof error.message === "string" &&
116
- error.message.includes(packageName)
117
- );
118
- }
@@ -1,27 +0,0 @@
1
- import type { RpcResponseMessage, RpcStreamFrameMessage, Transport } from "./index.js";
2
- import type { NodeChannelTarget, NodeConnectOptions } from "./node.js";
3
-
4
- export interface RawNodeCloseInfo {
5
- nativeCode: number;
6
- }
7
-
8
- /** Raw single-connection Node transport backed by trevrpc-c and MsQuic. */
9
- export class RawNodeTransport implements Transport {
10
- maxFrameSize?: number;
11
- readonly closed: Promise<RawNodeCloseInfo>;
12
-
13
- static connect(
14
- target: string | URL | NodeChannelTarget,
15
- options?: NodeConnectOptions,
16
- ): Promise<RawNodeTransport>;
17
- call(
18
- request: Parameters<Transport["call"]>[0],
19
- options?: Parameters<Transport["call"]>[1],
20
- ): Promise<RpcResponseMessage>;
21
- streamingCall(
22
- request: Parameters<Transport["streamingCall"]>[0],
23
- requestBody: AsyncIterable<Uint8Array>,
24
- options?: Parameters<Transport["streamingCall"]>[2],
25
- ): Promise<AsyncIterableIterator<RpcStreamFrameMessage>>;
26
- close(): void;
27
- }
@@ -1 +0,0 @@
1
- export { RawNodeTransport } from "./node.js";
@@ -1,24 +0,0 @@
1
- import type { Root, Type } from "protobufjs";
2
-
3
- import type { RpcMethodKind, RpcServiceDescriptor } from "./index.js";
4
- import type { NodeServer, NodeServerCall } from "./node.js";
5
-
6
- export type { StreamingServerResponse, UnaryServerResponse } from "./index.js";
7
- export type { NodeServer, NodeServerCall } from "./node.js";
8
-
9
- /** Registers typed generated handlers on a Node server. */
10
- export function registerTypedService(
11
- server: NodeServer,
12
- root: Root,
13
- service: RpcServiceDescriptor,
14
- handlers: Record<string, unknown>,
15
- ): NodeServer;
16
-
17
- /** Dispatches one typed generated Node handler. */
18
- export function dispatchTypedNodeHandler(
19
- call: NodeServerCall,
20
- handler: (...args: unknown[]) => unknown,
21
- kind: RpcMethodKind,
22
- requestType: Type,
23
- responseType: Type,
24
- ): Promise<void>;
@@ -1,126 +0,0 @@
1
- import { marshalMessage, unmarshalMessage } from "./framing.js";
2
- import { isStreamingServerResponse, isUnaryServerResponse } from "./server-response.js";
3
- import { Code, statusError } from "./status.js";
4
- import { RpcStreamFrameKind } from "./wire.js";
5
-
6
- /** Registers typed generated handlers on a Node server. */
7
- export function registerTypedService(server, root, service, handlers) {
8
- for (const [jsName, method] of Object.entries(service.methods)) {
9
- const handler = handlers[jsName] ?? handlers[method.name];
10
- if (handler == null) {
11
- continue;
12
- }
13
- const requestType = root.lookupType(method.inputType);
14
- const responseType = root.lookupType(method.outputType);
15
- server.register(service.fullName, method.name, method.kind, async (call) => {
16
- await dispatchTypedNodeHandler(call, handler, method.kind, requestType, responseType);
17
- });
18
- }
19
- return server;
20
- }
21
-
22
- /** Dispatches one typed generated Node handler. */
23
- export async function dispatchTypedNodeHandler(call, handler, kind, requestType, responseType) {
24
- if (kind === "unary") {
25
- const request = unmarshalMessage(requestType, call.request.body ?? new Uint8Array(0));
26
- const response = await handler(request, call);
27
- const envelope = isUnaryServerResponse(response) ? response : null;
28
- await call.respond({
29
- body: marshalMessage(responseType, envelope == null ? response : envelope.message),
30
- metadata: envelope?.metadata ?? {},
31
- });
32
- return;
33
- }
34
-
35
- if (kind === "clientStreaming") {
36
- const response = await handler(decodeTypedNodeRequests(call, requestType), call);
37
- const envelope = isUnaryServerResponse(response) ? response : null;
38
- await call.sendMessage(
39
- marshalMessage(responseType, envelope == null ? response : envelope.message),
40
- );
41
- await call.finishStream(Code.Ok, "", envelope?.metadata ?? {});
42
- return;
43
- }
44
-
45
- const request =
46
- kind === "serverStreaming"
47
- ? unmarshalMessage(requestType, call.request.body ?? new Uint8Array(0))
48
- : decodeTypedNodeRequests(call, requestType);
49
- const response = await handler(request, call);
50
- const envelope = isStreamingServerResponse(response) ? response : null;
51
- await writeTypedResponseMessages(
52
- call,
53
- envelope == null ? response : envelope.messages,
54
- responseType,
55
- );
56
- const status = envelope?.status;
57
- await call.finishStream(status?.code ?? Code.Ok, status?.message ?? "", status?.metadata ?? {});
58
- }
59
-
60
- async function writeTypedResponseMessages(call, messages, responseType) {
61
- const iterator = responseIterator(messages ?? []);
62
- try {
63
- for (;;) {
64
- const result = await nextTypedResponseBatch(iterator, call.writeBatchMaxMessages ?? 16);
65
- if (result.done) {
66
- return;
67
- }
68
- await call.sendMany(result.value.map((message) => marshalMessage(responseType, message)));
69
- }
70
- } catch (error) {
71
- try {
72
- await iterator.return?.();
73
- } catch {
74
- // Preserve the send or iterator error, matching for-await cleanup behavior.
75
- }
76
- throw error;
77
- }
78
- }
79
-
80
- function responseIterator(messages) {
81
- if (typeof messages?.[Symbol.asyncIterator] === "function") {
82
- return messages[Symbol.asyncIterator]();
83
- }
84
- if (typeof messages?.[Symbol.iterator] === "function") {
85
- const iterator = messages[Symbol.iterator]();
86
- return {
87
- next: () => Promise.resolve(iterator.next()),
88
- return: () =>
89
- Promise.resolve(
90
- typeof iterator.return === "function"
91
- ? iterator.return()
92
- : { done: true, value: undefined },
93
- ),
94
- };
95
- }
96
- throw new TypeError("streaming handler must return an iterable or async iterable");
97
- }
98
-
99
- async function nextTypedResponseBatch(iterator, maxMessages) {
100
- if (typeof iterator.nextBatch === "function") {
101
- return await iterator.nextBatch(maxMessages);
102
- }
103
- const result = await iterator.next();
104
- return result.done ? result : { done: false, value: [result.value] };
105
- }
106
-
107
- async function* decodeTypedNodeRequests(call, requestType) {
108
- for (;;) {
109
- const frame = await call.recv();
110
- if (frame == null) {
111
- return;
112
- }
113
- if (frame.kind === RpcStreamFrameKind.Message) {
114
- yield unmarshalMessage(requestType, frame.body ?? new Uint8Array(0));
115
- continue;
116
- }
117
- if (frame.kind === RpcStreamFrameKind.Status) {
118
- const code = frame.status ?? Code.Ok;
119
- if (code !== Code.Ok) {
120
- throw statusError(code, frame.message ?? "", frame.metadata ?? {});
121
- }
122
- return;
123
- }
124
- throw statusError(Code.InvalidArgument, "request stream contained an unknown frame kind");
125
- }
126
- }
@@ -1 +0,0 @@
1
- export * from "./node.js";
package/src/node-index.js DELETED
@@ -1,7 +0,0 @@
1
- export {
2
- Channel,
3
- NodeServer,
4
- NodeServerCall,
5
- bearerAuthorizer,
6
- metadataValueAuthorizer,
7
- } from "./node.js";
package/src/node.d.ts DELETED
@@ -1,298 +0,0 @@
1
- import type {
2
- ChannelLifecycleEvent,
3
- ChannelLifecycleOptions,
4
- ChannelState,
5
- RpcChannel,
6
- MetadataInput,
7
- RpcKindValue,
8
- RpcMethodKind,
9
- RpcResponseMessage,
10
- RpcServiceDescriptor,
11
- RpcStreamFrameMessage,
12
- Transport,
13
- } from "./index.js";
14
-
15
- type TrevRpcEventListener = ((event: Event) => void) | { handleEvent(event: Event): void };
16
- interface TrevRpcEventListenerOptions {
17
- capture?: boolean;
18
- }
19
- interface TrevRpcAddEventListenerOptions extends TrevRpcEventListenerOptions {
20
- once?: boolean;
21
- passive?: boolean;
22
- signal?: AbortSignal;
23
- }
24
-
25
- export interface NodeEndpoint {
26
- host: string;
27
- port: number;
28
- }
29
-
30
- export interface NodeConnectOptions {
31
- caCertFile?: string;
32
- skipCertificateValidation?: boolean;
33
- maxStreamsPerSession?: number;
34
- idleTimeoutMs?: number;
35
- maxFrameSize?: number;
36
- maxPendingSendBytes?: number;
37
- maxPendingSendCount?: number;
38
- signal?: AbortSignal;
39
- }
40
-
41
- export interface NodeChannelOptions extends NodeConnectOptions, ChannelLifecycleOptions {
42
- /** Bounds initial readiness only. Later reconnects continue until close(). */
43
- timeoutMs?: number;
44
- }
45
-
46
- export interface NodeChannelTarget extends NodeChannelOptions {
47
- host: string;
48
- port?: number;
49
- }
50
-
51
- export interface NodeRpcStartedEvent {
52
- service: string;
53
- method: string;
54
- requestBodyLength: number;
55
- kind: RpcKindValue;
56
- }
57
-
58
- export interface NodeRpcFinishedEvent extends NodeRpcStartedEvent {
59
- responseBodyLength: number;
60
- status: number;
61
- elapsedMs?: number;
62
- }
63
-
64
- export interface NodeLogEvent {
65
- level: "debug" | "info" | "warn" | "error" | string;
66
- event: string;
67
- message?: string;
68
- service?: string;
69
- method?: string;
70
- status?: number;
71
- }
72
-
73
- export interface NodeServerMetrics {
74
- rpcStarted?(event: NodeRpcStartedEvent): void;
75
- rpcFinished?(event: NodeRpcFinishedEvent): void;
76
- started?(event: NodeRpcStartedEvent): void;
77
- finished?(event: NodeRpcFinishedEvent): void;
78
- }
79
-
80
- export interface NodeServerLogger {
81
- log?(event: NodeLogEvent): void;
82
- debug?(event: NodeLogEvent): void;
83
- info?(event: NodeLogEvent): void;
84
- warn?(event: NodeLogEvent): void;
85
- error?(event: NodeLogEvent): void;
86
- }
87
-
88
- export type NodeServerAuthorizationResult =
89
- | void
90
- | boolean
91
- | {
92
- code?: number;
93
- status?: number;
94
- message?: string;
95
- statusMessage?: string;
96
- metadata?: MetadataInput;
97
- };
98
-
99
- export type NodeServerAuthorizer = (
100
- call: NodeServerCall,
101
- ) => NodeServerAuthorizationResult | Promise<NodeServerAuthorizationResult>;
102
-
103
- export interface NodeHttp3AdmissionRequest {
104
- path: string;
105
- authority: string;
106
- secure: boolean;
107
- }
108
-
109
- export type NodeHttp3Admission = (request: NodeHttp3AdmissionRequest) => boolean;
110
-
111
- export interface NodeListenOptions extends NodeConnectOptions {
112
- host?: string;
113
- port?: number;
114
- path?: string;
115
- origin?: string;
116
- certFile?: string;
117
- keyFile?: string;
118
- maxSessionsPerConnection?: number;
119
- /** Enables ordinary HTTP/3 POST requests. Disabled by default. */
120
- enableHttp3?: boolean;
121
- /** HTTP/3 POST path. Defaults to /trevrpc. */
122
- http3Path?: string;
123
- /**
124
- * Synchronous request admission hook run before RPC framing is read. The
125
- * native wait is bounded by initialRequestTimeoutMs.
126
- */
127
- http3Admission?: NodeHttp3Admission;
128
- authorizer?: NodeServerAuthorizer;
129
- metrics?: NodeServerMetrics;
130
- logger?: NodeServerLogger | ((event: NodeLogEvent) => void);
131
- maxStreamMessages?: number;
132
- /** Initial HTTP/RPC request timeout. Defaults to 10000 ms. */
133
- initialRequestTimeoutMs?: number;
134
- streamIdleTimeoutMs?: number;
135
- }
136
-
137
- /** Native Node channel with background connection reconnection. */
138
- export class Channel extends EventTarget implements RpcChannel {
139
- readonly endpoint: Readonly<NodeEndpoint>;
140
- readonly options: Readonly<NodeChannelOptions>;
141
- readonly ready: boolean;
142
- readonly state: ChannelState;
143
- readonly generation: number;
144
-
145
- constructor(target: string | URL | NodeChannelTarget, options?: NodeChannelOptions);
146
-
147
- /** Creates a native channel and waits for its first ready generation. */
148
- static connect(
149
- target: string | URL | NodeChannelTarget,
150
- options?: NodeChannelOptions,
151
- ): Promise<Channel>;
152
- /** Waits for the current or next connection generation to become ready. */
153
- waitUntilReady(): Promise<void>;
154
- /** Sends a unary call on the current generation without replaying it. */
155
- call(
156
- request: Parameters<Transport["call"]>[0],
157
- options?: Parameters<Transport["call"]>[1],
158
- ): Promise<RpcResponseMessage>;
159
- /** Starts a streaming call on the current generation without resuming it later. */
160
- streamingCall(
161
- request: Parameters<Transport["streamingCall"]>[0],
162
- requestBody: AsyncIterable<Uint8Array>,
163
- options?: Parameters<Transport["streamingCall"]>[2],
164
- ): Promise<AsyncIterableIterator<RpcStreamFrameMessage>>;
165
- /** Stops reconnecting and closes the current generation. */
166
- close(): void;
167
- addEventListener(
168
- type: "statechange" | ChannelState,
169
- callback: (event: ChannelLifecycleEvent) => void,
170
- options?: boolean | TrevRpcAddEventListenerOptions,
171
- ): void;
172
- addEventListener(
173
- type: string,
174
- callback: TrevRpcEventListener | null,
175
- options?: boolean | TrevRpcAddEventListenerOptions,
176
- ): void;
177
- removeEventListener(
178
- type: "statechange" | ChannelState,
179
- callback: (event: ChannelLifecycleEvent) => void,
180
- options?: boolean | TrevRpcEventListenerOptions,
181
- ): void;
182
- removeEventListener(
183
- type: string,
184
- callback: TrevRpcEventListener | null,
185
- options?: boolean | TrevRpcEventListenerOptions,
186
- ): void;
187
- }
188
-
189
- export type NodeServerUnaryResult =
190
- | RpcResponseMessage
191
- | Uint8Array
192
- | ArrayBuffer
193
- | ArrayBufferView
194
- | readonly number[];
195
- export type NodeServerStreamingResult = AsyncIterable<
196
- Uint8Array | ArrayBuffer | ArrayBufferView | readonly number[]
197
- >;
198
-
199
- export type NodeServerHandler = (
200
- call: NodeServerCall,
201
- ) =>
202
- | void
203
- | NodeServerUnaryResult
204
- | NodeServerStreamingResult
205
- | Promise<void | NodeServerUnaryResult | NodeServerStreamingResult>;
206
-
207
- /** Raw server call passed to NodeServer handlers. */
208
- export class NodeServerCall {
209
- request: {
210
- service: string;
211
- method: string;
212
- body: Uint8Array;
213
- metadata: Record<string, Uint8Array>;
214
- kind: RpcKindValue;
215
- version: number;
216
- timeoutNanos?: string;
217
- };
218
- completed: boolean;
219
- deferred: boolean;
220
- responseBodyLength: number;
221
- finalStatus: number;
222
- startedAt: number;
223
- completedAt: number | null;
224
- /** Aborts when the deadline, cancellation, or server shutdown settles first. */
225
- readonly signal: AbortSignal;
226
- /** Absolute peer deadline captured from the native call context, or null when absent. */
227
- readonly deadline: Date | null;
228
-
229
- /** Keeps the call open after the handler returns. */
230
- defer(): this;
231
- /** Sends a unary response and completes the call. */
232
- respond(
233
- response?: RpcResponseMessage | Uint8Array | ArrayBuffer | ArrayBufferView | readonly number[],
234
- ): Promise<void>;
235
- /** Sends one streaming response message. */
236
- sendMessage(body: Uint8Array | ArrayBuffer | ArrayBufferView | readonly number[]): Promise<void>;
237
- /** Sends multiple streaming response messages. */
238
- sendMany(
239
- bodies: Iterable<Uint8Array | ArrayBuffer | ArrayBufferView | readonly number[]>,
240
- ): Promise<void>;
241
- /** Receives one streaming request frame, or null after EOF. */
242
- recv(): Promise<RpcStreamFrameMessage | null>;
243
- /** Sends the terminal streaming status and completes the call. */
244
- finishStream(status?: number, message?: string, metadata?: MetadataInput): Promise<void>;
245
- /** Cancels and closes the call. */
246
- close(reason?: unknown): void;
247
- }
248
-
249
- /** Native Node server backed by trevrpc-c and MsQuic. */
250
- export class NodeServer {
251
- port: number;
252
- maxFrameSize?: number;
253
- closed: Promise<void> | null;
254
-
255
- /** Creates a native QUIC and WebTransport TrevRPC server backed by trevrpc-c. */
256
- static listen(
257
- urlOrOptions: string | URL | NodeListenOptions,
258
- options?: NodeListenOptions,
259
- ): Promise<NodeServer>;
260
-
261
- /** Registers one raw RPC handler. */
262
- register(
263
- service: string,
264
- method: string,
265
- kind: RpcKindValue | RpcMethodKind,
266
- handler: NodeServerHandler,
267
- ): this;
268
-
269
- /** Registers handlers for a generated service descriptor. */
270
- registerService(service: RpcServiceDescriptor, handlers: Record<string, NodeServerHandler>): this;
271
-
272
- /** Sets an async authorizer that runs before registered handlers. */
273
- setAuthorizer(authorizer?: NodeServerAuthorizer | null): this;
274
- /** Clears the server authorizer. */
275
- clearAuthorizer(): this;
276
- /** Sets metrics callbacks. */
277
- setMetrics(metrics?: NodeServerMetrics | null): this;
278
- /** Clears metrics callbacks. */
279
- clearMetrics(): this;
280
- /** Sets a logger function or logger object. */
281
- setLogger(logger?: NodeServerLogger | ((event: NodeLogEvent) => void) | null): this;
282
- /** Clears the logger. */
283
- clearLogger(): this;
284
-
285
- /** Starts accepting RPCs. The returned promise resolves after close. */
286
- serve(): Promise<void>;
287
- /** Requests graceful server shutdown and drains already admitted calls. */
288
- close(): void;
289
- }
290
-
291
- /** Creates an authorizer requiring one metadata key/value pair. */
292
- export function metadataValueAuthorizer(
293
- key: string,
294
- value: string | Uint8Array | ArrayBuffer | ArrayBufferView | readonly number[],
295
- ): NodeServerAuthorizer;
296
-
297
- /** Creates an authorizer requiring an Authorization: Bearer token metadata value. */
298
- export function bearerAuthorizer(token: string): NodeServerAuthorizer;