New Research: Supply Chain Attack on Axios Pulls Malicious Dependency from npm.Details
Socket
Book a DemoSign in
Socket

nggorpc

Package Overview
Dependencies
Maintainers
1
Versions
4
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

nggorpc - npm Package Compare versions

Comparing version
1.0.0
to
1.1.0
+59
-2
fesm2022/nggorpc.mjs

@@ -521,8 +521,65 @@ import { BehaviorSubject, Subject, Observable } from 'rxjs';

*
* @param token - The authentication token (e.g., JWT bearer token)
* When called with `options.reconnect: true`, this will gracefully close the
* current WebSocket connection and immediately reconnect, ensuring subsequent
* requests use the new token. This is useful for token refresh flows (e.g.,
* Auth0 token rotation) where the server validates the token per-connection.
*
* @param token - The authentication token (e.g., JWT bearer token), or null to clear
* @param options - Optional settings. `reconnect: true` triggers a graceful reconnect.
*/
setAuthToken(token) {
setAuthToken(token, options) {
const tokenChanged = this.authToken !== token;
this.authToken = token;
if (options?.reconnect && tokenChanged && this.connected) {
this.reconnect();
}
}
/**
* Gracefully closes the current WebSocket connection and immediately reconnects.
*
* Unlike `disconnect()`, this preserves the reconnection-enabled state and the
* current URL. Active streams will receive an UNAVAILABLE error and must be retried
* by the caller. The reconnection bypasses the exponential backoff since it is
* an intentional reconnect, not a failure.
*
* Common use cases:
* - Token refresh: call `setAuthToken(newToken, { reconnect: true })` instead
* - Force re-authentication after permissions change
* - Reset stream state after a known server-side deployment
*/
reconnect() {
if (!this.currentUrl) {
return;
}
if (this.enableLogging) {
console.log('[NgGoRpcClient] Initiating graceful reconnect...');
}
// Stop keep-alive
this.stopPingInterval();
// Clear any pending scheduled reconnection
if (this.reconnectTimeoutId) {
clearTimeout(this.reconnectTimeoutId);
this.reconnectTimeoutId = null;
}
// Close the existing socket without disabling reconnection
if (this.socket) {
// Temporarily disable the onclose handler's reconnection scheduling
// because we'll connect immediately ourselves
const wasReconnectionEnabled = this.reconnectionEnabled;
this.reconnectionEnabled = false;
this.socket.close(1000, 'Reconnecting with new credentials');
this.socket = null;
this.connected = false;
// Error out active streams so callers know to retry
this.errorOutActiveStreams();
this._connectionState$.next(ConnectionState.Reconnecting);
// Restore reconnection flag
this.reconnectionEnabled = wasReconnectionEnabled;
}
// Reset reconnect counter (this is intentional, not a failure)
this.reconnectAttempt = 0;
// Immediately attempt a new connection
this.attemptConnection();
}
/**
* Creates an RPC transport that can be used with ts-proto generated clients.

@@ -529,0 +586,0 @@ */

+1
-1

@@ -1,1 +0,1 @@

{"version":3,"file":"nggorpc.mjs","sources":["../../../projects/client/src/lib/frame.ts","../../../projects/client/src/lib/transport.ts","../../../projects/client/src/lib/errors.ts","../../../projects/client/src/lib/client.ts","../../../projects/client/src/lib/providers.ts","../../../projects/client/src/public-api.ts","../../../projects/client/src/nggorpc.ts"],"sourcesContent":["/**\n * Frame Codec for NgGoRPC Protocol\n * \n * Implements encoding and decoding of binary frames according to the NgGoRPC protocol specification.\n * \n * Frame Layout (9-byte header + payload):\n * - Byte 0: Flags (uint8)\n * - Bytes 1-4: Stream ID (uint32, Big Endian)\n * - Bytes 5-8: Length (uint32, Big Endian)\n * - Bytes 9+: Payload (byte array)\n */\n\n/**\n * Frame flag constants\n */\nexport const FrameFlags = {\n HEADERS: 0x01, // Frame contains RPC metadata\n DATA: 0x02, // Frame contains serialized Protobuf message\n TRAILERS: 0x04, // Frame contains final RPC status\n RST_STREAM: 0x08, // Control signal to terminate stream abnormally\n EOS: 0x10, // End of Stream - no further frames on this stream\n PING: 0x20, // Keep-alive ping frame\n PONG: 0x40, // Keep-alive pong response frame\n} as const;\n\n/**\n * Decoded frame structure\n */\nexport interface Frame {\n flags: number;\n streamId: number;\n payload: Uint8Array;\n}\n\n/**\n * Encodes a frame into a binary format according to NgGoRPC protocol.\n * \n * @param streamId - The unique stream identifier (uint32)\n * @param flags - Frame flags (uint8)\n * @param payload - The payload data\n * @returns A Uint8Array containing the complete frame (header + payload)\n */\nexport function encodeFrame(streamId: number, flags: number, payload: Uint8Array): Uint8Array {\n const headerSize = 9;\n const payloadLength = payload.length;\n const frame = new Uint8Array(headerSize + payloadLength);\n const view = new DataView(frame.buffer);\n\n // Byte 0: Flags (uint8)\n view.setUint8(0, flags);\n\n // Bytes 1-4: Stream ID (uint32, Big Endian)\n view.setUint32(1, streamId, false); // false = Big Endian\n\n // Bytes 5-8: Length (uint32, Big Endian)\n view.setUint32(5, payloadLength, false); // false = Big Endian\n\n // Bytes 9+: Payload\n frame.set(payload, headerSize);\n\n return frame;\n}\n\n/**\n * Decodes a binary frame into its components.\n * \n * @param buffer - The ArrayBuffer or ArrayBufferLike containing the frame data\n * @returns A Frame object with parsed streamId, flags, and payload\n * @throws Error if the buffer is too small to contain a valid frame\n */\nexport function decodeFrame(buffer: ArrayBufferLike): Frame {\n const headerSize = 9;\n\n if (buffer.byteLength < headerSize) {\n throw new Error(`Frame too small: expected at least ${headerSize} bytes, got ${buffer.byteLength}`);\n }\n\n const view = new DataView(buffer);\n\n // Byte 0: Flags (uint8)\n const flags = view.getUint8(0);\n\n // Bytes 1-4: Stream ID (uint32, Big Endian)\n const streamId = view.getUint32(1, false); // false = Big Endian\n\n // Bytes 5-8: Length (uint32, Big Endian)\n const length = view.getUint32(5, false); // false = Big Endian\n\n // Validate payload length\n const expectedSize = headerSize + length;\n if (buffer.byteLength < expectedSize) {\n throw new Error(\n `Incomplete frame: header specifies ${length} bytes payload, but only ${buffer.byteLength - headerSize} bytes available`\n );\n }\n\n // Bytes 9+: Payload (create a view, not a copy)\n const payload = new Uint8Array(buffer, headerSize, length);\n\n return {\n flags,\n streamId,\n payload,\n };\n}\n","import {Observable} from 'rxjs';\nimport {map} from 'rxjs/operators';\nimport {toSignal, ToSignalOptions} from '@angular/core/rxjs-interop';\nimport {Signal} from '@angular/core';\nimport {NgGoRpcClient} from './client';\n\n/**\n * Represents a message type with encoding/decoding capabilities\n */\nexport interface MessageFns<T> {\n encode(message: T, writer?: unknown): { finish(): Uint8Array };\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n decode(input: any, length?: number): T;\n\n fromJSON(object: unknown): T;\n\n toJSON(message: T): unknown;\n\n create(base?: Partial<T>): T;\n\n fromPartial(object: Partial<T>): T;\n}\n\n/**\n * Represents a method descriptor in a service definition\n */\nexport interface MethodDescriptor<TRequest, TResponse> {\n name: string;\n requestType: MessageFns<TRequest>;\n requestStream: boolean;\n responseType: MessageFns<TResponse>;\n responseStream: boolean;\n options: Record<string, unknown>;\n}\n\n/**\n * Represents a service definition with methods\n */\nexport interface ServiceDefinition {\n name: string;\n fullName: string;\n methods: Record<string, MethodDescriptor<unknown, unknown>>;\n}\n\n/**\n * Rpc interface compatible with ts-proto generated clients\n */\nexport interface Rpc {\n request(\n service: string,\n method: string,\n data: Uint8Array,\n metadata?: Record<string, string>\n ): Observable<Uint8Array>;\n}\n\n/**\n * WebSocket-based RPC transport implementation\n */\nexport class WebSocketRpcTransport {\n constructor(private client: NgGoRpcClient) {\n }\n\n /**\n * Makes an RPC request using the typed API with service definition and method descriptor.\n * Automatically encodes the request and decodes the response.\n *\n * @param service - The service definition\n * @param method - The method descriptor from the service definition\n * @param data - The request data (optional, will use empty message if not provided)\n * @param metadata - Optional metadata headers to send with the request (e.g., authorization, request-id)\n * @returns An Observable that emits the decoded response\n */\n request<TRequest, TResponse>(\n service: ServiceDefinition,\n method: MethodDescriptor<TRequest, TResponse>,\n data?: TRequest,\n metadata?: Record<string, string>\n ): Observable<TResponse> {\n const serviceDef = service as ServiceDefinition;\n const methodDesc = method as MethodDescriptor<TRequest, TResponse>;\n\n // Encode request data if provided, otherwise use empty message\n let encodedData: Uint8Array;\n if (data !== undefined) {\n encodedData = methodDesc.requestType.encode(data as TRequest).finish();\n } else {\n // Create empty message\n const emptyMessage = methodDesc.requestType.create({});\n encodedData = methodDesc.requestType.encode(emptyMessage).finish();\n }\n\n // Make request and automatically decode response\n const resp$ = metadata\n ? this.client.request(serviceDef.fullName, methodDesc.name, encodedData, metadata)\n : this.client.request(serviceDef.fullName, methodDesc.name, encodedData);\n\n return resp$.pipe(\n map((responseData: Uint8Array) => methodDesc.responseType.decode(responseData))\n );\n }\n\n /**\n * Makes an RPC request and returns the response as an Angular Signal.\n * This method automatically encodes the request and decodes the response.\n *\n * @param service - The service definition\n * @param method - The method descriptor from the service definition\n * @param data - The request data (optional, will use empty message if not provided)\n * @param options - Options for toSignal conversion (optional)\n * @returns A Signal that emits the decoded response\n */\n requestSignal<TRequest, TResponse>(\n service: ServiceDefinition,\n method: MethodDescriptor<TRequest, TResponse>,\n data?: TRequest,\n options?: ToSignalOptions<unknown>\n ): Signal<TResponse | undefined> {\n const observable = this.request(service, method, data);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return toSignal(observable, options as any);\n }\n}\n","/** gRPC status codes aligned with google.golang.org/grpc/codes */\nexport enum GrpcStatus {\n OK = 0,\n CANCELLED = 1,\n UNKNOWN = 2,\n INVALID_ARGUMENT = 3,\n DEADLINE_EXCEEDED = 4,\n NOT_FOUND = 5,\n ALREADY_EXISTS = 6,\n PERMISSION_DENIED = 7,\n RESOURCE_EXHAUSTED = 8,\n FAILED_PRECONDITION = 9,\n ABORTED = 10,\n OUT_OF_RANGE = 11,\n UNIMPLEMENTED = 12,\n INTERNAL = 13,\n UNAVAILABLE = 14,\n DATA_LOSS = 15,\n UNAUTHENTICATED = 16,\n}\n\n/** Typed gRPC error surfaced to consumers */\nexport class GrpcError extends Error {\n constructor(public readonly code: GrpcStatus, message?: string) {\n super(message ?? GrpcStatus[code] ?? 'gRPC Error');\n this.name = 'GrpcError';\n }\n}\n","import {NgZone} from '@angular/core';\nimport {BehaviorSubject, Observable, Subject} from 'rxjs';\nimport {decodeFrame, encodeFrame, FrameFlags} from './frame';\nimport {WebSocketRpcTransport} from './transport';\nimport {GrpcError, GrpcStatus} from './errors';\n\n/**\n * Configuration options for NgGoRpcClient\n */\nexport interface NgGoRpcConfig {\n /** Keep-alive ping interval in milliseconds (default: 30000) */\n pingInterval?: number;\n /** Base delay for reconnection backoff in milliseconds (default: 1000) */\n baseReconnectDelay?: number;\n /** Maximum delay for reconnection backoff in milliseconds (default: 30000) */\n maxReconnectDelay?: number;\n /** Maximum frame size in bytes (default: 4194304 = 4MB) */\n maxFrameSize?: number;\n /** Enable debug logging (default: false) */\n enableLogging?: boolean;\n}\n\n/**\n * NgGoRPC Client\n *\n * Manages WebSocket connections for gRPC over WebSocket communication.\n * Uses Angular's NgZone to optimize performance by running WebSocket operations\n * outside the Angular change detection zone.\n *\n * Note: This class is NOT a service. It must be manually instantiated with config.\n */\nexport class NgGoRpcClient {\n private socket: WebSocket | null = null;\n private connected = false;\n private streamMap: Map<number, Subject<Uint8Array>> = new Map();\n private nextStreamId = 1; // Client-initiated streams use odd numbers\n private reconnectTimeoutId: ReturnType<typeof setTimeout> | null = null;\n private reconnectAttempt = 0;\n private readonly maxReconnectDelay: number;\n private readonly baseReconnectDelay: number;\n private currentUrl: string | null = null;\n private reconnectionEnabled = false;\n private pingIntervalId: ReturnType<typeof setInterval> | null = null;\n private pongTimeoutId: ReturnType<typeof setTimeout> | null = null;\n private readonly pingInterval: number;\n private readonly maxFrameSize: number;\n private readonly pingStreamId = 0; // Reserved stream ID for keep-alive\n private authToken: string | null = null;\n private readonly pongTimeout = 5000; // 5 seconds timeout for PONG response\n private readonly enableLogging: boolean;\n\n // Connection state tracking\n private readonly _connectionState$ = new BehaviorSubject<ConnectionState>(ConnectionState.Disconnected);\n readonly connectionState$ = this._connectionState$.asObservable();\n\n constructor(private ngZone?: NgZone, config?: NgGoRpcConfig) {\n // Apply configuration with defaults\n this.pingInterval = config?.pingInterval ?? 30000;\n this.baseReconnectDelay = config?.baseReconnectDelay ?? 1000;\n this.maxReconnectDelay = config?.maxReconnectDelay ?? 30000;\n this.maxFrameSize = config?.maxFrameSize ?? 4 * 1024 * 1024; // 4MB\n this.enableLogging = config?.enableLogging ?? false;\n }\n\n /**\n * Establishes a WebSocket connection to the specified URL with automatic reconnection.\n *\n * The connection is established outside the Angular zone to prevent\n * high-frequency WebSocket events from triggering unnecessary change detection cycles.\n *\n * @param url - The WebSocket URL to connect to (e.g., 'ws://localhost:8080' or 'wss://example.com')\n * @param enableReconnection - Whether to enable automatic reconnection (default: true)\n */\n connect(url: string, enableReconnection: boolean = true): void {\n this.currentUrl = url;\n this.reconnectionEnabled = enableReconnection;\n this.attemptConnection();\n }\n\n /**\n * Internal method to attempt a WebSocket connection\n */\n private attemptConnection(): void {\n if (!this.currentUrl) {\n return;\n }\n\n // SSR Safety: Check if WebSocket is available (browser-only)\n if (typeof WebSocket === 'undefined') {\n if (this.enableLogging) {\n console.warn('[NgGoRpcClient] WebSocket not available (SSR environment). Connection skipped.');\n }\n return;\n }\n\n // Run WebSocket operations outside Angular zone for better performance if NgZone exists\n const runOutside = (fn: () => void) => this.ngZone ? this.ngZone.runOutsideAngular(fn) : fn();\n runOutside(() => {\n this.socket = new WebSocket(this.currentUrl!);\n\n // Set binary type to arraybuffer for efficient binary frame processing\n this.socket.binaryType = 'arraybuffer';\n\n this.socket.onopen = () => {\n if (this.enableLogging) {\n console.log('[NgGoRpcClient] WebSocket connection established');\n }\n this.connected = true;\n this.reconnectAttempt = 0; // Reset reconnection counter on successful connection\n this.startPingInterval();\n this._connectionState$.next(ConnectionState.Connected);\n };\n\n this.socket.onmessage = (event: MessageEvent) => {\n try {\n // Decode the incoming frame\n const frame = decodeFrame(event.data as ArrayBuffer);\n\n // Log decoded frame for validation\n if (this.enableLogging) {\n console.log('[NgGoRpcClient] Received frame:', {\n streamId: frame.streamId,\n flags: `0x${frame.flags.toString(16).padStart(2, '0')}`,\n payloadSize: frame.payload.length\n });\n }\n\n // Handle PING frames - respond with PONG\n if (frame.flags & FrameFlags.PING) {\n this.sendPong();\n return;\n }\n\n // Handle PONG frames - clear watchdog timeout\n if (frame.flags & FrameFlags.PONG) {\n if (this.enableLogging) {\n console.log('[NgGoRpcClient] Received PONG from server');\n }\n if (this.pongTimeoutId !== null) {\n clearTimeout(this.pongTimeoutId);\n this.pongTimeoutId = null;\n }\n return;\n }\n\n // Dispatch frame to the appropriate stream\n const subject = this.streamMap.get(frame.streamId);\n if (subject) {\n // Re-enter Angular zone only when delivering data to components\n const runInside = (fn: () => void) => this.ngZone ? this.ngZone.run(fn) : fn();\n runInside(() => {\n if (frame.flags & FrameFlags.DATA) {\n subject.next(frame.payload);\n }\n\n if (frame.flags & FrameFlags.TRAILERS) {\n // Parse grpc-status from trailers payload\n const trailersText = new TextDecoder().decode(frame.payload);\n const statusMatch = trailersText.match(/grpc-status:\\s*(\\d+)/);\n const messageMatch = trailersText.match(/grpc-message:\\s*([^\\n]+)/);\n\n const grpcStatus = statusMatch ? parseInt(statusMatch[1], 10) : 0;\n const grpcMessage = messageMatch ? messageMatch[1].trim() : '';\n\n if (grpcStatus === 0) {\n // Status OK - complete successfully\n subject.complete();\n } else {\n // Non-OK status - emit error\n const errorMsg = grpcMessage || `gRPC error with status code ${grpcStatus}`;\n subject.error(new GrpcError(grpcStatus as GrpcStatus, errorMsg));\n }\n this.streamMap.delete(frame.streamId);\n }\n\n if (frame.flags & FrameFlags.RST_STREAM) {\n let status = GrpcStatus.CANCELLED;\n let message = 'Stream reset by server';\n\n if (frame.payload.length >= 4) {\n const view = new DataView(frame.payload.buffer, frame.payload.byteOffset, frame.payload.byteLength);\n const code = view.getUint32(0, false); // Big Endian\n\n switch (code) {\n case 0: // NO_ERROR\n subject.complete();\n this.streamMap.delete(frame.streamId);\n return;\n case 1: // PROTOCOL_ERROR\n status = GrpcStatus.INTERNAL;\n message = 'Protocol error';\n break;\n case 2: // INTERNAL_ERROR\n status = GrpcStatus.INTERNAL;\n message = 'Internal server error';\n break;\n case 3: // FLOW_CONTROL_ERROR\n status = GrpcStatus.INTERNAL;\n message = 'Flow control error';\n break;\n case 4: // STREAM_CLOSED\n status = GrpcStatus.INTERNAL;\n message = 'Stream closed';\n break;\n case 5: // FRAME_SIZE_ERROR\n status = GrpcStatus.RESOURCE_EXHAUSTED;\n message = 'Frame size error';\n break;\n case 6: // REFUSED_STREAM\n status = GrpcStatus.UNAVAILABLE;\n message = 'Stream refused';\n break;\n case 7: // CANCEL\n status = GrpcStatus.CANCELLED;\n message = 'Stream cancelled';\n break;\n case 8: // RESOURCE_EXHAUSTED\n status = GrpcStatus.RESOURCE_EXHAUSTED;\n message = 'Resource exhausted';\n break;\n case 9: // UNAVAILABLE\n status = GrpcStatus.UNAVAILABLE;\n message = 'Service unavailable';\n break;\n default:\n message = `Stream reset with code ${code}`;\n }\n }\n\n subject.error(new GrpcError(status, message));\n this.streamMap.delete(frame.streamId);\n }\n });\n }\n } catch (error) {\n console.error('[NgGoRpcClient] Frame decoding error:', error);\n }\n };\n\n this.socket.onerror = (error) => {\n console.error('[NgGoRpcClient] WebSocket error:', error);\n };\n\n this.socket.onclose = (event) => {\n if (this.enableLogging) {\n console.log('[NgGoRpcClient] WebSocket connection closed:', {\n code: event.code,\n reason: event.reason,\n wasClean: event.wasClean\n });\n }\n this.connected = false;\n this.socket = null;\n\n // Stop keep-alive ping interval\n this.stopPingInterval();\n\n // Error out all active streams with UNAVAILABLE status\n this.errorOutActiveStreams();\n this._connectionState$.next(ConnectionState.Disconnected);\n\n // Attempt reconnection if enabled\n if (this.reconnectionEnabled) {\n this._connectionState$.next(ConnectionState.Reconnecting);\n this.scheduleReconnection();\n }\n };\n });\n }\n\n /**\n * Errors out all active streams when disconnection occurs\n */\n private errorOutActiveStreams(): void {\n const runInside = (fn: () => void) => this.ngZone ? this.ngZone.run(fn) : fn();\n runInside(() => {\n this.streamMap.forEach((subject) => {\n subject.error(new GrpcError(GrpcStatus.UNAVAILABLE, 'Connection lost'));\n });\n this.streamMap.clear();\n });\n }\n\n /**\n * Schedules a reconnection attempt with exponential backoff\n */\n private scheduleReconnection(): void {\n // Calculate delay with exponential backoff: min(cap, base * 2^attempt)\n const delay = Math.min(\n this.maxReconnectDelay,\n this.baseReconnectDelay * Math.pow(2, this.reconnectAttempt)\n );\n\n if (this.enableLogging) {\n console.log(`[NgGoRpcClient] Scheduling reconnection attempt ${this.reconnectAttempt + 1} in ${delay}ms`);\n }\n\n this.reconnectAttempt++;\n\n this.reconnectTimeoutId = setTimeout(() => {\n if (this.reconnectionEnabled && this.currentUrl) {\n if (this.enableLogging) {\n console.log('[NgGoRpcClient] Attempting reconnection...');\n }\n this.attemptConnection();\n }\n }, delay);\n }\n\n /**\n * Starts the keep-alive ping interval\n */\n private startPingInterval(): void {\n // Run outside Angular zone to avoid triggering change detection\n const runOutside = (fn: () => void) => this.ngZone ? this.ngZone.runOutsideAngular(fn) : fn();\n runOutside(() => {\n this.pingIntervalId = setInterval(() => {\n this.sendPing();\n }, this.pingInterval);\n });\n if (this.enableLogging) {\n console.log('[NgGoRpcClient] Keep-alive ping interval started');\n }\n }\n\n /**\n * Stops the keep-alive ping interval\n */\n private stopPingInterval(): void {\n if (this.pingIntervalId) {\n clearInterval(this.pingIntervalId);\n this.pingIntervalId = null;\n if (this.enableLogging) {\n console.log('[NgGoRpcClient] Keep-alive ping interval stopped');\n }\n }\n // Also clear any pending PONG timeout\n if (this.pongTimeoutId !== null) {\n clearTimeout(this.pongTimeoutId);\n this.pongTimeoutId = null;\n }\n }\n\n /**\n * Sends a PING frame to the server and starts a watchdog timeout\n */\n private sendPing(): void {\n if (this.socket && this.connected) {\n const pingFrame = encodeFrame(this.pingStreamId, FrameFlags.PING, new Uint8Array(0));\n this.socket.send(pingFrame);\n if (this.enableLogging) {\n console.log('[NgGoRpcClient] Sent PING to server');\n }\n\n // Clear any existing timeout\n if (this.pongTimeoutId !== null) {\n clearTimeout(this.pongTimeoutId);\n }\n\n // Start watchdog timeout - close socket if no PONG arrives within 5 seconds\n this.pongTimeoutId = setTimeout(() => {\n console.warn('[NgGoRpcClient] No PONG received within timeout, closing connection');\n if (this.socket) {\n // Close with code 4000 to trigger reconnection\n this.socket.close(4000, 'PONG timeout');\n }\n }, this.pongTimeout);\n }\n }\n\n /**\n * Sends a PONG frame in response to a server PING\n */\n private sendPong(): void {\n if (this.socket && this.connected) {\n const pongFrame = encodeFrame(this.pingStreamId, FrameFlags.PONG, new Uint8Array(0));\n this.socket.send(pongFrame);\n if (this.enableLogging) {\n console.log('[NgGoRpcClient] Sent PONG to server');\n }\n }\n }\n\n /**\n * Closes the WebSocket connection and disables reconnection.\n */\n disconnect(): void {\n this.reconnectionEnabled = false; // Disable auto-reconnection\n this.stopPingInterval();\n\n // Clear reconnection timer\n if (this.reconnectTimeoutId) {\n clearTimeout(this.reconnectTimeoutId);\n this.reconnectTimeoutId = null;\n }\n\n if (this.socket) {\n this.socket.close();\n this.socket = null;\n this.connected = false;\n }\n }\n\n /**\n * Returns whether the client is currently connected.\n */\n isConnected(): boolean {\n return this.connected;\n }\n\n /**\n * Sets the authentication token to be included in RPC headers.\n *\n * @param token - The authentication token (e.g., JWT bearer token)\n */\n setAuthToken(token: string | null): void {\n this.authToken = token;\n }\n\n /**\n * Creates an RPC transport that can be used with ts-proto generated clients.\n */\n createTransport(): WebSocketRpcTransport {\n return new WebSocketRpcTransport(this);\n }\n\n /**\n * Sends an RPC request over the WebSocket connection.\n *\n * @param service - The service name (e.g., 'mypackage.Greeter')\n * @param method - The method name (e.g., 'SayHello')\n * @param data - The serialized Protobuf request data\n * @param metadata - Optional metadata headers to send with the request (e.g., x-request-id, custom headers)\n * @returns An Observable that emits the response data\n */\n request(service: string, method: string, data: Uint8Array, metadata?: Record<string, string>): Observable<Uint8Array> {\n if (!this.socket || !this.connected) {\n throw new Error('WebSocket is not connected');\n }\n\n // Generate a new odd-numbered stream ID\n if (this.nextStreamId > 0xFFFFFFFF) {\n // Stream ID exhaustion protection\n // PROTOCOL.md: \"Stream IDs MUST NOT be reused within the lifespan of a single WebSocket connection\"\n const errorMsg = 'Stream ID exhaustion';\n console.error(`[NgGoRpcClient] ${errorMsg}`);\n this.socket.close(4000, errorMsg);\n throw new Error(errorMsg);\n }\n\n const streamId = this.nextStreamId;\n this.nextStreamId += 2; // Increment by 2 to keep odd numbers\n\n // Create a subject for this stream\n const subject = new Subject<Uint8Array>();\n this.streamMap.set(streamId, subject);\n\n // Send HEADERS frame with method path and optional auth token\n const methodPath = `/${service}/${method}`;\n let headersText = `path: ${methodPath}`;\n\n // Include authorization header if token is set\n if (this.authToken) {\n headersText += `\\nauthorization: Bearer ${this.authToken}`;\n }\n if (metadata) {\n for (const [k, v] of Object.entries(metadata)) {\n headersText += `\\n${k}: ${v}`;\n }\n }\n\n const headersPayload = new TextEncoder().encode(headersText);\n const headersFrame = encodeFrame(streamId, FrameFlags.HEADERS, headersPayload);\n this.socket.send(headersFrame);\n\n if (this.enableLogging) {\n console.log(`[NgGoRpcClient] Sending HEADERS for stream ${streamId}: ${truncateForLog(methodPath)}`);\n }\n\n // Send DATA frame with request payload (with EOS flag for unary calls)\n const dataFrame = encodeFrame(streamId, FrameFlags.DATA | FrameFlags.EOS, data);\n this.socket.send(dataFrame);\n\n if (this.enableLogging) {\n console.log(`[NgGoRpcClient] Sending DATA for stream ${streamId}, size: ${data.length} bytes`);\n }\n\n // Return an Observable with proper teardown logic for cancellation\n return new Observable<Uint8Array>(observer => {\n // Subscribe the internal Subject to the output Observer\n const subscription = subject.subscribe(observer);\n\n // Teardown logic - executes when the Observable is unsubscribed\n return () => {\n subscription.unsubscribe();\n // Remove from map\n this.streamMap.delete(streamId);\n\n // Send RST_STREAM to server if connection is still open\n if (this.socket && this.socket.readyState === WebSocket.OPEN) {\n // 0x07 is CANCEL error code, 0x08 is FlagRST_STREAM\n const cancelPayload = new Uint8Array(4);\n new DataView(cancelPayload.buffer).setUint32(0, 7, false); // Error code 7 (CANCEL)\n\n const rstFrame = encodeFrame(streamId, FrameFlags.RST_STREAM, cancelPayload);\n this.socket.send(rstFrame);\n if (this.enableLogging) {\n console.log(`[NgGoRpcClient] Sent RST_STREAM (CANCEL) for stream ${streamId}`);\n }\n }\n };\n });\n }\n}\n\n/**\n * Helper function to truncate strings for logging\n * If string is longer than 20 characters, returns first 20 chars plus size info\n */\nfunction truncateForLog(s: string): string {\n if (s.length <= 20) {\n return s;\n }\n return `${s.substring(0, 20)}... (size: ${s.length})`;\n}\n\nexport enum ConnectionState {\n Disconnected = 'Disconnected',\n Reconnecting = 'Reconnecting',\n Connected = 'Connected',\n}\n","import { makeEnvironmentProviders, NgZone, inject, InjectionToken } from '@angular/core';\nimport { NgGoRpcClient, NgGoRpcConfig } from './client';\n\n/**\n * Injection token for NgGoRpcClient\n */\nexport const NG_GO_RPC_CLIENT = new InjectionToken<NgGoRpcClient>('NG_GO_RPC_CLIENT');\n\n/**\n * Injection token for NgGoRpcConfig\n */\nexport const NG_GO_RPC_CONFIG = new InjectionToken<NgGoRpcConfig>('NG_GO_RPC_CONFIG');\n\n/**\n * Factory function to create NgGoRpcClient instance\n * @internal\n */\nfunction createNgGoRpcClient(): NgGoRpcClient {\n const ngZone = inject(NgZone);\n const config = inject(NG_GO_RPC_CONFIG, { optional: true });\n return new NgGoRpcClient(ngZone, config ?? undefined);\n}\n\n/**\n * Provides NgGoRPC client with dependency injection support.\n *\n * This function uses Angular's makeEnvironmentProviders to configure\n * the NgGoRPC client in your application. The client is automatically\n * instantiated with the correct NgZone and optional configuration.\n *\n * SSR Safe: The provider can be used in Server-Side Rendering environments\n * without issues. WebSocket connections should only be initiated in the browser.\n *\n * @param config Optional configuration for the NgGoRPC client\n * @returns Environment providers for NgGoRPC\n *\n * @example\n * ```typescript\n * // In your app.config.ts or main.ts\n * import { provideNgGoRpc } from '@nggorpc/client';\n *\n * export const appConfig: ApplicationConfig = {\n * providers: [\n * provideNgGoRpc({\n * pingInterval: 30000,\n * baseReconnectDelay: 1000,\n * maxReconnectDelay: 30000,\n * enableLogging: true\n * }),\n * // ... other providers\n * ]\n * };\n * ```\n *\n * @example\n * ```typescript\n * // In your component or service\n * import { inject } from '@angular/core';\n * import { NG_GO_RPC_CLIENT } from '@nggorpc/client';\n *\n * export class MyComponent {\n * private client = inject(NG_GO_RPC_CLIENT);\n *\n * ngOnInit() {\n * this.client.connect('ws://localhost:8080');\n * }\n * }\n * ```\n */\nexport function provideNgGoRpc(config?: NgGoRpcConfig) {\n return makeEnvironmentProviders([\n config ? { provide: NG_GO_RPC_CONFIG, useValue: config } : [],\n {\n provide: NG_GO_RPC_CLIENT,\n useFactory: createNgGoRpcClient\n }\n ]);\n}\n","/*\n * Public API Surface of client\n */\n\nexport { NgGoRpcClient } from './lib/client';\nexport type { NgGoRpcConfig } from './lib/client';\nexport { ConnectionState } from './lib/client';\nexport { WebSocketRpcTransport } from './lib/transport';\nexport type { Rpc, ServiceDefinition, MethodDescriptor, MessageFns } from './lib/transport';\nexport * from './lib/frame';\nexport { provideNgGoRpc, NG_GO_RPC_CLIENT, NG_GO_RPC_CONFIG } from './lib/providers';\nexport { GrpcError, GrpcStatus } from './lib/errors';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
{"version":3,"file":"nggorpc.mjs","sources":["../../../projects/client/src/lib/frame.ts","../../../projects/client/src/lib/transport.ts","../../../projects/client/src/lib/errors.ts","../../../projects/client/src/lib/client.ts","../../../projects/client/src/lib/providers.ts","../../../projects/client/src/public-api.ts","../../../projects/client/src/nggorpc.ts"],"sourcesContent":["/**\n * Frame Codec for NgGoRPC Protocol\n * \n * Implements encoding and decoding of binary frames according to the NgGoRPC protocol specification.\n * \n * Frame Layout (9-byte header + payload):\n * - Byte 0: Flags (uint8)\n * - Bytes 1-4: Stream ID (uint32, Big Endian)\n * - Bytes 5-8: Length (uint32, Big Endian)\n * - Bytes 9+: Payload (byte array)\n */\n\n/**\n * Frame flag constants\n */\nexport const FrameFlags = {\n HEADERS: 0x01, // Frame contains RPC metadata\n DATA: 0x02, // Frame contains serialized Protobuf message\n TRAILERS: 0x04, // Frame contains final RPC status\n RST_STREAM: 0x08, // Control signal to terminate stream abnormally\n EOS: 0x10, // End of Stream - no further frames on this stream\n PING: 0x20, // Keep-alive ping frame\n PONG: 0x40, // Keep-alive pong response frame\n} as const;\n\n/**\n * Decoded frame structure\n */\nexport interface Frame {\n flags: number;\n streamId: number;\n payload: Uint8Array;\n}\n\n/**\n * Encodes a frame into a binary format according to NgGoRPC protocol.\n * \n * @param streamId - The unique stream identifier (uint32)\n * @param flags - Frame flags (uint8)\n * @param payload - The payload data\n * @returns A Uint8Array containing the complete frame (header + payload)\n */\nexport function encodeFrame(streamId: number, flags: number, payload: Uint8Array): Uint8Array {\n const headerSize = 9;\n const payloadLength = payload.length;\n const frame = new Uint8Array(headerSize + payloadLength);\n const view = new DataView(frame.buffer);\n\n // Byte 0: Flags (uint8)\n view.setUint8(0, flags);\n\n // Bytes 1-4: Stream ID (uint32, Big Endian)\n view.setUint32(1, streamId, false); // false = Big Endian\n\n // Bytes 5-8: Length (uint32, Big Endian)\n view.setUint32(5, payloadLength, false); // false = Big Endian\n\n // Bytes 9+: Payload\n frame.set(payload, headerSize);\n\n return frame;\n}\n\n/**\n * Decodes a binary frame into its components.\n * \n * @param buffer - The ArrayBuffer or ArrayBufferLike containing the frame data\n * @returns A Frame object with parsed streamId, flags, and payload\n * @throws Error if the buffer is too small to contain a valid frame\n */\nexport function decodeFrame(buffer: ArrayBufferLike): Frame {\n const headerSize = 9;\n\n if (buffer.byteLength < headerSize) {\n throw new Error(`Frame too small: expected at least ${headerSize} bytes, got ${buffer.byteLength}`);\n }\n\n const view = new DataView(buffer);\n\n // Byte 0: Flags (uint8)\n const flags = view.getUint8(0);\n\n // Bytes 1-4: Stream ID (uint32, Big Endian)\n const streamId = view.getUint32(1, false); // false = Big Endian\n\n // Bytes 5-8: Length (uint32, Big Endian)\n const length = view.getUint32(5, false); // false = Big Endian\n\n // Validate payload length\n const expectedSize = headerSize + length;\n if (buffer.byteLength < expectedSize) {\n throw new Error(\n `Incomplete frame: header specifies ${length} bytes payload, but only ${buffer.byteLength - headerSize} bytes available`\n );\n }\n\n // Bytes 9+: Payload (create a view, not a copy)\n const payload = new Uint8Array(buffer, headerSize, length);\n\n return {\n flags,\n streamId,\n payload,\n };\n}\n","import {Observable} from 'rxjs';\nimport {map} from 'rxjs/operators';\nimport {toSignal, ToSignalOptions} from '@angular/core/rxjs-interop';\nimport {Signal} from '@angular/core';\nimport {NgGoRpcClient} from './client';\n\n/**\n * Represents a message type with encoding/decoding capabilities\n */\nexport interface MessageFns<T> {\n encode(message: T, writer?: unknown): { finish(): Uint8Array };\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n decode(input: any, length?: number): T;\n\n fromJSON(object: unknown): T;\n\n toJSON(message: T): unknown;\n\n create(base?: Partial<T>): T;\n\n fromPartial(object: Partial<T>): T;\n}\n\n/**\n * Represents a method descriptor in a service definition\n */\nexport interface MethodDescriptor<TRequest, TResponse> {\n name: string;\n requestType: MessageFns<TRequest>;\n requestStream: boolean;\n responseType: MessageFns<TResponse>;\n responseStream: boolean;\n options: Record<string, unknown>;\n}\n\n/**\n * Represents a service definition with methods\n */\nexport interface ServiceDefinition {\n name: string;\n fullName: string;\n methods: Record<string, MethodDescriptor<unknown, unknown>>;\n}\n\n/**\n * Rpc interface compatible with ts-proto generated clients\n */\nexport interface Rpc {\n request(\n service: string,\n method: string,\n data: Uint8Array,\n metadata?: Record<string, string>\n ): Observable<Uint8Array>;\n}\n\n/**\n * WebSocket-based RPC transport implementation\n */\nexport class WebSocketRpcTransport {\n constructor(private client: NgGoRpcClient) {\n }\n\n /**\n * Makes an RPC request using the typed API with service definition and method descriptor.\n * Automatically encodes the request and decodes the response.\n *\n * @param service - The service definition\n * @param method - The method descriptor from the service definition\n * @param data - The request data (optional, will use empty message if not provided)\n * @param metadata - Optional metadata headers to send with the request (e.g., authorization, request-id)\n * @returns An Observable that emits the decoded response\n */\n request<TRequest, TResponse>(\n service: ServiceDefinition,\n method: MethodDescriptor<TRequest, TResponse>,\n data?: TRequest,\n metadata?: Record<string, string>\n ): Observable<TResponse> {\n const serviceDef = service as ServiceDefinition;\n const methodDesc = method as MethodDescriptor<TRequest, TResponse>;\n\n // Encode request data if provided, otherwise use empty message\n let encodedData: Uint8Array;\n if (data !== undefined) {\n encodedData = methodDesc.requestType.encode(data as TRequest).finish();\n } else {\n // Create empty message\n const emptyMessage = methodDesc.requestType.create({});\n encodedData = methodDesc.requestType.encode(emptyMessage).finish();\n }\n\n // Make request and automatically decode response\n const resp$ = metadata\n ? this.client.request(serviceDef.fullName, methodDesc.name, encodedData, metadata)\n : this.client.request(serviceDef.fullName, methodDesc.name, encodedData);\n\n return resp$.pipe(\n map((responseData: Uint8Array) => methodDesc.responseType.decode(responseData))\n );\n }\n\n /**\n * Makes an RPC request and returns the response as an Angular Signal.\n * This method automatically encodes the request and decodes the response.\n *\n * @param service - The service definition\n * @param method - The method descriptor from the service definition\n * @param data - The request data (optional, will use empty message if not provided)\n * @param options - Options for toSignal conversion (optional)\n * @returns A Signal that emits the decoded response\n */\n requestSignal<TRequest, TResponse>(\n service: ServiceDefinition,\n method: MethodDescriptor<TRequest, TResponse>,\n data?: TRequest,\n options?: ToSignalOptions<unknown>\n ): Signal<TResponse | undefined> {\n const observable = this.request(service, method, data);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return toSignal(observable, options as any);\n }\n}\n","/** gRPC status codes aligned with google.golang.org/grpc/codes */\nexport enum GrpcStatus {\n OK = 0,\n CANCELLED = 1,\n UNKNOWN = 2,\n INVALID_ARGUMENT = 3,\n DEADLINE_EXCEEDED = 4,\n NOT_FOUND = 5,\n ALREADY_EXISTS = 6,\n PERMISSION_DENIED = 7,\n RESOURCE_EXHAUSTED = 8,\n FAILED_PRECONDITION = 9,\n ABORTED = 10,\n OUT_OF_RANGE = 11,\n UNIMPLEMENTED = 12,\n INTERNAL = 13,\n UNAVAILABLE = 14,\n DATA_LOSS = 15,\n UNAUTHENTICATED = 16,\n}\n\n/** Typed gRPC error surfaced to consumers */\nexport class GrpcError extends Error {\n constructor(public readonly code: GrpcStatus, message?: string) {\n super(message ?? GrpcStatus[code] ?? 'gRPC Error');\n this.name = 'GrpcError';\n }\n}\n","import {NgZone} from '@angular/core';\nimport {BehaviorSubject, Observable, Subject} from 'rxjs';\nimport {decodeFrame, encodeFrame, FrameFlags} from './frame';\nimport {WebSocketRpcTransport} from './transport';\nimport {GrpcError, GrpcStatus} from './errors';\n\n/**\n * Configuration options for NgGoRpcClient\n */\nexport interface NgGoRpcConfig {\n /** Keep-alive ping interval in milliseconds (default: 30000) */\n pingInterval?: number;\n /** Base delay for reconnection backoff in milliseconds (default: 1000) */\n baseReconnectDelay?: number;\n /** Maximum delay for reconnection backoff in milliseconds (default: 30000) */\n maxReconnectDelay?: number;\n /** Maximum frame size in bytes (default: 4194304 = 4MB) */\n maxFrameSize?: number;\n /** Enable debug logging (default: false) */\n enableLogging?: boolean;\n}\n\n/**\n * NgGoRPC Client\n *\n * Manages WebSocket connections for gRPC over WebSocket communication.\n * Uses Angular's NgZone to optimize performance by running WebSocket operations\n * outside the Angular change detection zone.\n *\n * Note: This class is NOT a service. It must be manually instantiated with config.\n */\nexport class NgGoRpcClient {\n private socket: WebSocket | null = null;\n private connected = false;\n private streamMap: Map<number, Subject<Uint8Array>> = new Map();\n private nextStreamId = 1; // Client-initiated streams use odd numbers\n private reconnectTimeoutId: ReturnType<typeof setTimeout> | null = null;\n private reconnectAttempt = 0;\n private readonly maxReconnectDelay: number;\n private readonly baseReconnectDelay: number;\n private currentUrl: string | null = null;\n private reconnectionEnabled = false;\n private pingIntervalId: ReturnType<typeof setInterval> | null = null;\n private pongTimeoutId: ReturnType<typeof setTimeout> | null = null;\n private readonly pingInterval: number;\n private readonly maxFrameSize: number;\n private readonly pingStreamId = 0; // Reserved stream ID for keep-alive\n private authToken: string | null = null;\n private readonly pongTimeout = 5000; // 5 seconds timeout for PONG response\n private readonly enableLogging: boolean;\n\n // Connection state tracking\n private readonly _connectionState$ = new BehaviorSubject<ConnectionState>(ConnectionState.Disconnected);\n readonly connectionState$ = this._connectionState$.asObservable();\n\n constructor(private ngZone?: NgZone, config?: NgGoRpcConfig) {\n // Apply configuration with defaults\n this.pingInterval = config?.pingInterval ?? 30000;\n this.baseReconnectDelay = config?.baseReconnectDelay ?? 1000;\n this.maxReconnectDelay = config?.maxReconnectDelay ?? 30000;\n this.maxFrameSize = config?.maxFrameSize ?? 4 * 1024 * 1024; // 4MB\n this.enableLogging = config?.enableLogging ?? false;\n }\n\n /**\n * Establishes a WebSocket connection to the specified URL with automatic reconnection.\n *\n * The connection is established outside the Angular zone to prevent\n * high-frequency WebSocket events from triggering unnecessary change detection cycles.\n *\n * @param url - The WebSocket URL to connect to (e.g., 'ws://localhost:8080' or 'wss://example.com')\n * @param enableReconnection - Whether to enable automatic reconnection (default: true)\n */\n connect(url: string, enableReconnection: boolean = true): void {\n this.currentUrl = url;\n this.reconnectionEnabled = enableReconnection;\n this.attemptConnection();\n }\n\n /**\n * Internal method to attempt a WebSocket connection\n */\n private attemptConnection(): void {\n if (!this.currentUrl) {\n return;\n }\n\n // SSR Safety: Check if WebSocket is available (browser-only)\n if (typeof WebSocket === 'undefined') {\n if (this.enableLogging) {\n console.warn('[NgGoRpcClient] WebSocket not available (SSR environment). Connection skipped.');\n }\n return;\n }\n\n // Run WebSocket operations outside Angular zone for better performance if NgZone exists\n const runOutside = (fn: () => void) => this.ngZone ? this.ngZone.runOutsideAngular(fn) : fn();\n runOutside(() => {\n this.socket = new WebSocket(this.currentUrl!);\n\n // Set binary type to arraybuffer for efficient binary frame processing\n this.socket.binaryType = 'arraybuffer';\n\n this.socket.onopen = () => {\n if (this.enableLogging) {\n console.log('[NgGoRpcClient] WebSocket connection established');\n }\n this.connected = true;\n this.reconnectAttempt = 0; // Reset reconnection counter on successful connection\n this.startPingInterval();\n this._connectionState$.next(ConnectionState.Connected);\n };\n\n this.socket.onmessage = (event: MessageEvent) => {\n try {\n // Decode the incoming frame\n const frame = decodeFrame(event.data as ArrayBuffer);\n\n // Log decoded frame for validation\n if (this.enableLogging) {\n console.log('[NgGoRpcClient] Received frame:', {\n streamId: frame.streamId,\n flags: `0x${frame.flags.toString(16).padStart(2, '0')}`,\n payloadSize: frame.payload.length\n });\n }\n\n // Handle PING frames - respond with PONG\n if (frame.flags & FrameFlags.PING) {\n this.sendPong();\n return;\n }\n\n // Handle PONG frames - clear watchdog timeout\n if (frame.flags & FrameFlags.PONG) {\n if (this.enableLogging) {\n console.log('[NgGoRpcClient] Received PONG from server');\n }\n if (this.pongTimeoutId !== null) {\n clearTimeout(this.pongTimeoutId);\n this.pongTimeoutId = null;\n }\n return;\n }\n\n // Dispatch frame to the appropriate stream\n const subject = this.streamMap.get(frame.streamId);\n if (subject) {\n // Re-enter Angular zone only when delivering data to components\n const runInside = (fn: () => void) => this.ngZone ? this.ngZone.run(fn) : fn();\n runInside(() => {\n if (frame.flags & FrameFlags.DATA) {\n subject.next(frame.payload);\n }\n\n if (frame.flags & FrameFlags.TRAILERS) {\n // Parse grpc-status from trailers payload\n const trailersText = new TextDecoder().decode(frame.payload);\n const statusMatch = trailersText.match(/grpc-status:\\s*(\\d+)/);\n const messageMatch = trailersText.match(/grpc-message:\\s*([^\\n]+)/);\n\n const grpcStatus = statusMatch ? parseInt(statusMatch[1], 10) : 0;\n const grpcMessage = messageMatch ? messageMatch[1].trim() : '';\n\n if (grpcStatus === 0) {\n // Status OK - complete successfully\n subject.complete();\n } else {\n // Non-OK status - emit error\n const errorMsg = grpcMessage || `gRPC error with status code ${grpcStatus}`;\n subject.error(new GrpcError(grpcStatus as GrpcStatus, errorMsg));\n }\n this.streamMap.delete(frame.streamId);\n }\n\n if (frame.flags & FrameFlags.RST_STREAM) {\n let status = GrpcStatus.CANCELLED;\n let message = 'Stream reset by server';\n\n if (frame.payload.length >= 4) {\n const view = new DataView(frame.payload.buffer, frame.payload.byteOffset, frame.payload.byteLength);\n const code = view.getUint32(0, false); // Big Endian\n\n switch (code) {\n case 0: // NO_ERROR\n subject.complete();\n this.streamMap.delete(frame.streamId);\n return;\n case 1: // PROTOCOL_ERROR\n status = GrpcStatus.INTERNAL;\n message = 'Protocol error';\n break;\n case 2: // INTERNAL_ERROR\n status = GrpcStatus.INTERNAL;\n message = 'Internal server error';\n break;\n case 3: // FLOW_CONTROL_ERROR\n status = GrpcStatus.INTERNAL;\n message = 'Flow control error';\n break;\n case 4: // STREAM_CLOSED\n status = GrpcStatus.INTERNAL;\n message = 'Stream closed';\n break;\n case 5: // FRAME_SIZE_ERROR\n status = GrpcStatus.RESOURCE_EXHAUSTED;\n message = 'Frame size error';\n break;\n case 6: // REFUSED_STREAM\n status = GrpcStatus.UNAVAILABLE;\n message = 'Stream refused';\n break;\n case 7: // CANCEL\n status = GrpcStatus.CANCELLED;\n message = 'Stream cancelled';\n break;\n case 8: // RESOURCE_EXHAUSTED\n status = GrpcStatus.RESOURCE_EXHAUSTED;\n message = 'Resource exhausted';\n break;\n case 9: // UNAVAILABLE\n status = GrpcStatus.UNAVAILABLE;\n message = 'Service unavailable';\n break;\n default:\n message = `Stream reset with code ${code}`;\n }\n }\n\n subject.error(new GrpcError(status, message));\n this.streamMap.delete(frame.streamId);\n }\n });\n }\n } catch (error) {\n console.error('[NgGoRpcClient] Frame decoding error:', error);\n }\n };\n\n this.socket.onerror = (error) => {\n console.error('[NgGoRpcClient] WebSocket error:', error);\n };\n\n this.socket.onclose = (event) => {\n if (this.enableLogging) {\n console.log('[NgGoRpcClient] WebSocket connection closed:', {\n code: event.code,\n reason: event.reason,\n wasClean: event.wasClean\n });\n }\n this.connected = false;\n this.socket = null;\n\n // Stop keep-alive ping interval\n this.stopPingInterval();\n\n // Error out all active streams with UNAVAILABLE status\n this.errorOutActiveStreams();\n this._connectionState$.next(ConnectionState.Disconnected);\n\n // Attempt reconnection if enabled\n if (this.reconnectionEnabled) {\n this._connectionState$.next(ConnectionState.Reconnecting);\n this.scheduleReconnection();\n }\n };\n });\n }\n\n /**\n * Errors out all active streams when disconnection occurs\n */\n private errorOutActiveStreams(): void {\n const runInside = (fn: () => void) => this.ngZone ? this.ngZone.run(fn) : fn();\n runInside(() => {\n this.streamMap.forEach((subject) => {\n subject.error(new GrpcError(GrpcStatus.UNAVAILABLE, 'Connection lost'));\n });\n this.streamMap.clear();\n });\n }\n\n /**\n * Schedules a reconnection attempt with exponential backoff\n */\n private scheduleReconnection(): void {\n // Calculate delay with exponential backoff: min(cap, base * 2^attempt)\n const delay = Math.min(\n this.maxReconnectDelay,\n this.baseReconnectDelay * Math.pow(2, this.reconnectAttempt)\n );\n\n if (this.enableLogging) {\n console.log(`[NgGoRpcClient] Scheduling reconnection attempt ${this.reconnectAttempt + 1} in ${delay}ms`);\n }\n\n this.reconnectAttempt++;\n\n this.reconnectTimeoutId = setTimeout(() => {\n if (this.reconnectionEnabled && this.currentUrl) {\n if (this.enableLogging) {\n console.log('[NgGoRpcClient] Attempting reconnection...');\n }\n this.attemptConnection();\n }\n }, delay);\n }\n\n /**\n * Starts the keep-alive ping interval\n */\n private startPingInterval(): void {\n // Run outside Angular zone to avoid triggering change detection\n const runOutside = (fn: () => void) => this.ngZone ? this.ngZone.runOutsideAngular(fn) : fn();\n runOutside(() => {\n this.pingIntervalId = setInterval(() => {\n this.sendPing();\n }, this.pingInterval);\n });\n if (this.enableLogging) {\n console.log('[NgGoRpcClient] Keep-alive ping interval started');\n }\n }\n\n /**\n * Stops the keep-alive ping interval\n */\n private stopPingInterval(): void {\n if (this.pingIntervalId) {\n clearInterval(this.pingIntervalId);\n this.pingIntervalId = null;\n if (this.enableLogging) {\n console.log('[NgGoRpcClient] Keep-alive ping interval stopped');\n }\n }\n // Also clear any pending PONG timeout\n if (this.pongTimeoutId !== null) {\n clearTimeout(this.pongTimeoutId);\n this.pongTimeoutId = null;\n }\n }\n\n /**\n * Sends a PING frame to the server and starts a watchdog timeout\n */\n private sendPing(): void {\n if (this.socket && this.connected) {\n const pingFrame = encodeFrame(this.pingStreamId, FrameFlags.PING, new Uint8Array(0));\n this.socket.send(pingFrame);\n if (this.enableLogging) {\n console.log('[NgGoRpcClient] Sent PING to server');\n }\n\n // Clear any existing timeout\n if (this.pongTimeoutId !== null) {\n clearTimeout(this.pongTimeoutId);\n }\n\n // Start watchdog timeout - close socket if no PONG arrives within 5 seconds\n this.pongTimeoutId = setTimeout(() => {\n console.warn('[NgGoRpcClient] No PONG received within timeout, closing connection');\n if (this.socket) {\n // Close with code 4000 to trigger reconnection\n this.socket.close(4000, 'PONG timeout');\n }\n }, this.pongTimeout);\n }\n }\n\n /**\n * Sends a PONG frame in response to a server PING\n */\n private sendPong(): void {\n if (this.socket && this.connected) {\n const pongFrame = encodeFrame(this.pingStreamId, FrameFlags.PONG, new Uint8Array(0));\n this.socket.send(pongFrame);\n if (this.enableLogging) {\n console.log('[NgGoRpcClient] Sent PONG to server');\n }\n }\n }\n\n /**\n * Closes the WebSocket connection and disables reconnection.\n */\n disconnect(): void {\n this.reconnectionEnabled = false; // Disable auto-reconnection\n this.stopPingInterval();\n\n // Clear reconnection timer\n if (this.reconnectTimeoutId) {\n clearTimeout(this.reconnectTimeoutId);\n this.reconnectTimeoutId = null;\n }\n\n if (this.socket) {\n this.socket.close();\n this.socket = null;\n this.connected = false;\n }\n }\n\n /**\n * Returns whether the client is currently connected.\n */\n isConnected(): boolean {\n return this.connected;\n }\n\n /**\n * Sets the authentication token to be included in RPC headers.\n *\n * When called with `options.reconnect: true`, this will gracefully close the\n * current WebSocket connection and immediately reconnect, ensuring subsequent\n * requests use the new token. This is useful for token refresh flows (e.g.,\n * Auth0 token rotation) where the server validates the token per-connection.\n *\n * @param token - The authentication token (e.g., JWT bearer token), or null to clear\n * @param options - Optional settings. `reconnect: true` triggers a graceful reconnect.\n */\n setAuthToken(token: string | null, options?: { reconnect?: boolean }): void {\n const tokenChanged = this.authToken !== token;\n this.authToken = token;\n\n if (options?.reconnect && tokenChanged && this.connected) {\n this.reconnect();\n }\n }\n\n /**\n * Gracefully closes the current WebSocket connection and immediately reconnects.\n *\n * Unlike `disconnect()`, this preserves the reconnection-enabled state and the\n * current URL. Active streams will receive an UNAVAILABLE error and must be retried\n * by the caller. The reconnection bypasses the exponential backoff since it is\n * an intentional reconnect, not a failure.\n *\n * Common use cases:\n * - Token refresh: call `setAuthToken(newToken, { reconnect: true })` instead\n * - Force re-authentication after permissions change\n * - Reset stream state after a known server-side deployment\n */\n reconnect(): void {\n if (!this.currentUrl) {\n return;\n }\n\n if (this.enableLogging) {\n console.log('[NgGoRpcClient] Initiating graceful reconnect...');\n }\n\n // Stop keep-alive\n this.stopPingInterval();\n\n // Clear any pending scheduled reconnection\n if (this.reconnectTimeoutId) {\n clearTimeout(this.reconnectTimeoutId);\n this.reconnectTimeoutId = null;\n }\n\n // Close the existing socket without disabling reconnection\n if (this.socket) {\n // Temporarily disable the onclose handler's reconnection scheduling\n // because we'll connect immediately ourselves\n const wasReconnectionEnabled = this.reconnectionEnabled;\n this.reconnectionEnabled = false;\n\n this.socket.close(1000, 'Reconnecting with new credentials');\n this.socket = null;\n this.connected = false;\n\n // Error out active streams so callers know to retry\n this.errorOutActiveStreams();\n this._connectionState$.next(ConnectionState.Reconnecting);\n\n // Restore reconnection flag\n this.reconnectionEnabled = wasReconnectionEnabled;\n }\n\n // Reset reconnect counter (this is intentional, not a failure)\n this.reconnectAttempt = 0;\n\n // Immediately attempt a new connection\n this.attemptConnection();\n }\n\n /**\n * Creates an RPC transport that can be used with ts-proto generated clients.\n */\n createTransport(): WebSocketRpcTransport {\n return new WebSocketRpcTransport(this);\n }\n\n /**\n * Sends an RPC request over the WebSocket connection.\n *\n * @param service - The service name (e.g., 'mypackage.Greeter')\n * @param method - The method name (e.g., 'SayHello')\n * @param data - The serialized Protobuf request data\n * @param metadata - Optional metadata headers to send with the request (e.g., x-request-id, custom headers)\n * @returns An Observable that emits the response data\n */\n request(service: string, method: string, data: Uint8Array, metadata?: Record<string, string>): Observable<Uint8Array> {\n if (!this.socket || !this.connected) {\n throw new Error('WebSocket is not connected');\n }\n\n // Generate a new odd-numbered stream ID\n if (this.nextStreamId > 0xFFFFFFFF) {\n // Stream ID exhaustion protection\n // PROTOCOL.md: \"Stream IDs MUST NOT be reused within the lifespan of a single WebSocket connection\"\n const errorMsg = 'Stream ID exhaustion';\n console.error(`[NgGoRpcClient] ${errorMsg}`);\n this.socket.close(4000, errorMsg);\n throw new Error(errorMsg);\n }\n\n const streamId = this.nextStreamId;\n this.nextStreamId += 2; // Increment by 2 to keep odd numbers\n\n // Create a subject for this stream\n const subject = new Subject<Uint8Array>();\n this.streamMap.set(streamId, subject);\n\n // Send HEADERS frame with method path and optional auth token\n const methodPath = `/${service}/${method}`;\n let headersText = `path: ${methodPath}`;\n\n // Include authorization header if token is set\n if (this.authToken) {\n headersText += `\\nauthorization: Bearer ${this.authToken}`;\n }\n if (metadata) {\n for (const [k, v] of Object.entries(metadata)) {\n headersText += `\\n${k}: ${v}`;\n }\n }\n\n const headersPayload = new TextEncoder().encode(headersText);\n const headersFrame = encodeFrame(streamId, FrameFlags.HEADERS, headersPayload);\n this.socket.send(headersFrame);\n\n if (this.enableLogging) {\n console.log(`[NgGoRpcClient] Sending HEADERS for stream ${streamId}: ${truncateForLog(methodPath)}`);\n }\n\n // Send DATA frame with request payload (with EOS flag for unary calls)\n const dataFrame = encodeFrame(streamId, FrameFlags.DATA | FrameFlags.EOS, data);\n this.socket.send(dataFrame);\n\n if (this.enableLogging) {\n console.log(`[NgGoRpcClient] Sending DATA for stream ${streamId}, size: ${data.length} bytes`);\n }\n\n // Return an Observable with proper teardown logic for cancellation\n return new Observable<Uint8Array>(observer => {\n // Subscribe the internal Subject to the output Observer\n const subscription = subject.subscribe(observer);\n\n // Teardown logic - executes when the Observable is unsubscribed\n return () => {\n subscription.unsubscribe();\n // Remove from map\n this.streamMap.delete(streamId);\n\n // Send RST_STREAM to server if connection is still open\n if (this.socket && this.socket.readyState === WebSocket.OPEN) {\n // 0x07 is CANCEL error code, 0x08 is FlagRST_STREAM\n const cancelPayload = new Uint8Array(4);\n new DataView(cancelPayload.buffer).setUint32(0, 7, false); // Error code 7 (CANCEL)\n\n const rstFrame = encodeFrame(streamId, FrameFlags.RST_STREAM, cancelPayload);\n this.socket.send(rstFrame);\n if (this.enableLogging) {\n console.log(`[NgGoRpcClient] Sent RST_STREAM (CANCEL) for stream ${streamId}`);\n }\n }\n };\n });\n }\n}\n\n/**\n * Helper function to truncate strings for logging\n * If string is longer than 20 characters, returns first 20 chars plus size info\n */\nfunction truncateForLog(s: string): string {\n if (s.length <= 20) {\n return s;\n }\n return `${s.substring(0, 20)}... (size: ${s.length})`;\n}\n\nexport enum ConnectionState {\n Disconnected = 'Disconnected',\n Reconnecting = 'Reconnecting',\n Connected = 'Connected',\n}\n","import { makeEnvironmentProviders, NgZone, inject, InjectionToken } from '@angular/core';\nimport { NgGoRpcClient, NgGoRpcConfig } from './client';\n\n/**\n * Injection token for NgGoRpcClient\n */\nexport const NG_GO_RPC_CLIENT = new InjectionToken<NgGoRpcClient>('NG_GO_RPC_CLIENT');\n\n/**\n * Injection token for NgGoRpcConfig\n */\nexport const NG_GO_RPC_CONFIG = new InjectionToken<NgGoRpcConfig>('NG_GO_RPC_CONFIG');\n\n/**\n * Factory function to create NgGoRpcClient instance\n * @internal\n */\nfunction createNgGoRpcClient(): NgGoRpcClient {\n const ngZone = inject(NgZone);\n const config = inject(NG_GO_RPC_CONFIG, { optional: true });\n return new NgGoRpcClient(ngZone, config ?? undefined);\n}\n\n/**\n * Provides NgGoRPC client with dependency injection support.\n *\n * This function uses Angular's makeEnvironmentProviders to configure\n * the NgGoRPC client in your application. The client is automatically\n * instantiated with the correct NgZone and optional configuration.\n *\n * SSR Safe: The provider can be used in Server-Side Rendering environments\n * without issues. WebSocket connections should only be initiated in the browser.\n *\n * @param config Optional configuration for the NgGoRPC client\n * @returns Environment providers for NgGoRPC\n *\n * @example\n * ```typescript\n * // In your app.config.ts or main.ts\n * import { provideNgGoRpc } from '@nggorpc/client';\n *\n * export const appConfig: ApplicationConfig = {\n * providers: [\n * provideNgGoRpc({\n * pingInterval: 30000,\n * baseReconnectDelay: 1000,\n * maxReconnectDelay: 30000,\n * enableLogging: true\n * }),\n * // ... other providers\n * ]\n * };\n * ```\n *\n * @example\n * ```typescript\n * // In your component or service\n * import { inject } from '@angular/core';\n * import { NG_GO_RPC_CLIENT } from '@nggorpc/client';\n *\n * export class MyComponent {\n * private client = inject(NG_GO_RPC_CLIENT);\n *\n * ngOnInit() {\n * this.client.connect('ws://localhost:8080');\n * }\n * }\n * ```\n */\nexport function provideNgGoRpc(config?: NgGoRpcConfig) {\n return makeEnvironmentProviders([\n config ? { provide: NG_GO_RPC_CONFIG, useValue: config } : [],\n {\n provide: NG_GO_RPC_CLIENT,\n useFactory: createNgGoRpcClient\n }\n ]);\n}\n","/*\n * Public API Surface of client\n */\n\nexport { NgGoRpcClient } from './lib/client';\nexport type { NgGoRpcConfig } from './lib/client';\nexport { ConnectionState } from './lib/client';\nexport { WebSocketRpcTransport } from './lib/transport';\nexport type { Rpc, ServiceDefinition, MethodDescriptor, MessageFns } from './lib/transport';\nexport * from './lib/frame';\nexport { provideNgGoRpc, NG_GO_RPC_CLIENT, NG_GO_RPC_CONFIG } from './lib/providers';\nexport { GrpcError, GrpcStatus } from './lib/errors';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;AAAA;;;;;;;;;;AAUG;AAEH;;AAEG;AACI,MAAM,UAAU,GAAG;IACxB,OAAO,EAAE,IAAI;IACb,IAAI,EAAE,IAAI;IACV,QAAQ,EAAE,IAAI;IACd,UAAU,EAAE,IAAI;IAChB,GAAG,EAAE,IAAI;IACT,IAAI,EAAE,IAAI;IACV,IAAI,EAAE,IAAI;;AAYZ;;;;;;;AAOG;SACa,WAAW,CAAC,QAAgB,EAAE,KAAa,EAAE,OAAmB,EAAA;IAC9E,MAAM,UAAU,GAAG,CAAC;AACpB,IAAA,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM;IACpC,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,UAAU,GAAG,aAAa,CAAC;IACxD,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC;;AAGvC,IAAA,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,KAAK,CAAC;;IAGvB,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;;IAGnC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,aAAa,EAAE,KAAK,CAAC,CAAC;;AAGxC,IAAA,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,UAAU,CAAC;AAE9B,IAAA,OAAO,KAAK;AACd;AAEA;;;;;;AAMG;AACG,SAAU,WAAW,CAAC,MAAuB,EAAA;IACjD,MAAM,UAAU,GAAG,CAAC;AAEpB,IAAA,IAAI,MAAM,CAAC,UAAU,GAAG,UAAU,EAAE;QAClC,MAAM,IAAI,KAAK,CAAC,CAAA,mCAAA,EAAsC,UAAU,CAAA,YAAA,EAAe,MAAM,CAAC,UAAU,CAAA,CAAE,CAAC;IACrG;AAEA,IAAA,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC;;IAGjC,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;;AAG9B,IAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;;AAG1C,IAAA,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;;AAGxC,IAAA,MAAM,YAAY,GAAG,UAAU,GAAG,MAAM;AACxC,IAAA,IAAI,MAAM,CAAC,UAAU,GAAG,YAAY,EAAE;AACpC,QAAA,MAAM,IAAI,KAAK,CACb,CAAA,mCAAA,EAAsC,MAAM,CAAA,yBAAA,EAA4B,MAAM,CAAC,UAAU,GAAG,UAAU,CAAA,gBAAA,CAAkB,CACzH;IACH;;IAGA,MAAM,OAAO,GAAG,IAAI,UAAU,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC;IAE1D,OAAO;QACL,KAAK;QACL,QAAQ;QACR,OAAO;KACR;AACH;;AC/CA;;AAEG;MACU,qBAAqB,CAAA;AACZ,IAAA,MAAA;AAApB,IAAA,WAAA,CAAoB,MAAqB,EAAA;QAArB,IAAA,CAAA,MAAM,GAAN,MAAM;IAC1B;AAEA;;;;;;;;;AASG;AACH,IAAA,OAAO,CACL,OAA0B,EAC1B,MAA6C,EAC7C,IAAe,EACf,QAAiC,EAAA;QAEjC,MAAM,UAAU,GAAG,OAA4B;QAC/C,MAAM,UAAU,GAAG,MAA+C;;AAGlE,QAAA,IAAI,WAAuB;AAC3B,QAAA,IAAI,IAAI,KAAK,SAAS,EAAE;AACtB,YAAA,WAAW,GAAG,UAAU,CAAC,WAAW,CAAC,MAAM,CAAC,IAAgB,CAAC,CAAC,MAAM,EAAE;QACxE;aAAO;;YAEL,MAAM,YAAY,GAAG,UAAU,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC;AACtD,YAAA,WAAW,GAAG,UAAU,CAAC,WAAW,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,MAAM,EAAE;QACpE;;QAGA,MAAM,KAAK,GAAG;AACZ,cAAE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,QAAQ,EAAE,UAAU,CAAC,IAAI,EAAE,WAAW,EAAE,QAAQ;AACjF,cAAE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,QAAQ,EAAE,UAAU,CAAC,IAAI,EAAE,WAAW,CAAC;QAE1E,OAAO,KAAK,CAAC,IAAI,CACf,GAAG,CAAC,CAAC,YAAwB,KAAK,UAAU,CAAC,YAAY,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAChF;IACH;AAEA;;;;;;;;;AASG;AACH,IAAA,aAAa,CACX,OAA0B,EAC1B,MAA6C,EAC7C,IAAe,EACf,OAAkC,EAAA;AAElC,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC;;AAEtD,QAAA,OAAO,QAAQ,CAAC,UAAU,EAAE,OAAc,CAAC;IAC7C;AACD;;AC3HD;IACY;AAAZ,CAAA,UAAY,UAAU,EAAA;AACpB,IAAA,UAAA,CAAA,UAAA,CAAA,IAAA,CAAA,GAAA,CAAA,CAAA,GAAA,IAAM;AACN,IAAA,UAAA,CAAA,UAAA,CAAA,WAAA,CAAA,GAAA,CAAA,CAAA,GAAA,WAAa;AACb,IAAA,UAAA,CAAA,UAAA,CAAA,SAAA,CAAA,GAAA,CAAA,CAAA,GAAA,SAAW;AACX,IAAA,UAAA,CAAA,UAAA,CAAA,kBAAA,CAAA,GAAA,CAAA,CAAA,GAAA,kBAAoB;AACpB,IAAA,UAAA,CAAA,UAAA,CAAA,mBAAA,CAAA,GAAA,CAAA,CAAA,GAAA,mBAAqB;AACrB,IAAA,UAAA,CAAA,UAAA,CAAA,WAAA,CAAA,GAAA,CAAA,CAAA,GAAA,WAAa;AACb,IAAA,UAAA,CAAA,UAAA,CAAA,gBAAA,CAAA,GAAA,CAAA,CAAA,GAAA,gBAAkB;AAClB,IAAA,UAAA,CAAA,UAAA,CAAA,mBAAA,CAAA,GAAA,CAAA,CAAA,GAAA,mBAAqB;AACrB,IAAA,UAAA,CAAA,UAAA,CAAA,oBAAA,CAAA,GAAA,CAAA,CAAA,GAAA,oBAAsB;AACtB,IAAA,UAAA,CAAA,UAAA,CAAA,qBAAA,CAAA,GAAA,CAAA,CAAA,GAAA,qBAAuB;AACvB,IAAA,UAAA,CAAA,UAAA,CAAA,SAAA,CAAA,GAAA,EAAA,CAAA,GAAA,SAAY;AACZ,IAAA,UAAA,CAAA,UAAA,CAAA,cAAA,CAAA,GAAA,EAAA,CAAA,GAAA,cAAiB;AACjB,IAAA,UAAA,CAAA,UAAA,CAAA,eAAA,CAAA,GAAA,EAAA,CAAA,GAAA,eAAkB;AAClB,IAAA,UAAA,CAAA,UAAA,CAAA,UAAA,CAAA,GAAA,EAAA,CAAA,GAAA,UAAa;AACb,IAAA,UAAA,CAAA,UAAA,CAAA,aAAA,CAAA,GAAA,EAAA,CAAA,GAAA,aAAgB;AAChB,IAAA,UAAA,CAAA,UAAA,CAAA,WAAA,CAAA,GAAA,EAAA,CAAA,GAAA,WAAc;AACd,IAAA,UAAA,CAAA,UAAA,CAAA,iBAAA,CAAA,GAAA,EAAA,CAAA,GAAA,iBAAoB;AACtB,CAAC,EAlBW,UAAU,KAAV,UAAU,GAAA,EAAA,CAAA,CAAA;AAoBtB;AACM,MAAO,SAAU,SAAQ,KAAK,CAAA;AACN,IAAA,IAAA;IAA5B,WAAA,CAA4B,IAAgB,EAAE,OAAgB,EAAA;QAC5D,KAAK,CAAC,OAAO,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,YAAY,CAAC;QADxB,IAAA,CAAA,IAAI,GAAJ,IAAI;AAE9B,QAAA,IAAI,CAAC,IAAI,GAAG,WAAW;IACzB;AACD;;ACLD;;;;;;;;AAQG;MACU,aAAa,CAAA;AAwBF,IAAA,MAAA;IAvBZ,MAAM,GAAqB,IAAI;IAC/B,SAAS,GAAG,KAAK;AACjB,IAAA,SAAS,GAAqC,IAAI,GAAG,EAAE;AACvD,IAAA,YAAY,GAAG,CAAC,CAAC;IACjB,kBAAkB,GAAyC,IAAI;IAC/D,gBAAgB,GAAG,CAAC;AACX,IAAA,iBAAiB;AACjB,IAAA,kBAAkB;IAC3B,UAAU,GAAkB,IAAI;IAChC,mBAAmB,GAAG,KAAK;IAC3B,cAAc,GAA0C,IAAI;IAC5D,aAAa,GAAyC,IAAI;AACjD,IAAA,YAAY;AACZ,IAAA,YAAY;AACZ,IAAA,YAAY,GAAG,CAAC,CAAC;IAC1B,SAAS,GAAkB,IAAI;AACtB,IAAA,WAAW,GAAG,IAAI,CAAC;AACnB,IAAA,aAAa;;IAGb,iBAAiB,GAAG,IAAI,eAAe,CAAkB,eAAe,CAAC,YAAY,CAAC;AAC9F,IAAA,gBAAgB,GAAG,IAAI,CAAC,iBAAiB,CAAC,YAAY,EAAE;IAEjE,WAAA,CAAoB,MAAe,EAAE,MAAsB,EAAA;QAAvC,IAAA,CAAA,MAAM,GAAN,MAAM;;QAEtB,IAAI,CAAC,YAAY,GAAG,MAAM,EAAE,YAAY,IAAI,KAAK;QACjD,IAAI,CAAC,kBAAkB,GAAG,MAAM,EAAE,kBAAkB,IAAI,IAAI;QAC5D,IAAI,CAAC,iBAAiB,GAAG,MAAM,EAAE,iBAAiB,IAAI,KAAK;AAC3D,QAAA,IAAI,CAAC,YAAY,GAAG,MAAM,EAAE,YAAY,IAAI,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;QAC5D,IAAI,CAAC,aAAa,GAAG,MAAM,EAAE,aAAa,IAAI,KAAK;IACvD;AAEA;;;;;;;;AAQG;AACH,IAAA,OAAO,CAAC,GAAW,EAAE,kBAAA,GAA8B,IAAI,EAAA;AACnD,QAAA,IAAI,CAAC,UAAU,GAAG,GAAG;AACrB,QAAA,IAAI,CAAC,mBAAmB,GAAG,kBAAkB;QAC7C,IAAI,CAAC,iBAAiB,EAAE;IAC5B;AAEA;;AAEG;IACK,iBAAiB,GAAA;AACrB,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;YAClB;QACJ;;AAGA,QAAA,IAAI,OAAO,SAAS,KAAK,WAAW,EAAE;AAClC,YAAA,IAAI,IAAI,CAAC,aAAa,EAAE;AACpB,gBAAA,OAAO,CAAC,IAAI,CAAC,gFAAgF,CAAC;YAClG;YACA;QACJ;;QAGA,MAAM,UAAU,GAAG,CAAC,EAAc,KAAK,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE;QAC7F,UAAU,CAAC,MAAK;YACZ,IAAI,CAAC,MAAM,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,UAAW,CAAC;;AAG7C,YAAA,IAAI,CAAC,MAAM,CAAC,UAAU,GAAG,aAAa;AAEtC,YAAA,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,MAAK;AACtB,gBAAA,IAAI,IAAI,CAAC,aAAa,EAAE;AACpB,oBAAA,OAAO,CAAC,GAAG,CAAC,kDAAkD,CAAC;gBACnE;AACA,gBAAA,IAAI,CAAC,SAAS,GAAG,IAAI;AACrB,gBAAA,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC;gBAC1B,IAAI,CAAC,iBAAiB,EAAE;gBACxB,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC;AAC1D,YAAA,CAAC;YAED,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,CAAC,KAAmB,KAAI;AAC5C,gBAAA,IAAI;;oBAEA,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,IAAmB,CAAC;;AAGpD,oBAAA,IAAI,IAAI,CAAC,aAAa,EAAE;AACpB,wBAAA,OAAO,CAAC,GAAG,CAAC,iCAAiC,EAAE;4BAC3C,QAAQ,EAAE,KAAK,CAAC,QAAQ;AACxB,4BAAA,KAAK,EAAE,CAAA,EAAA,EAAK,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA,CAAE;AACvD,4BAAA,WAAW,EAAE,KAAK,CAAC,OAAO,CAAC;AAC9B,yBAAA,CAAC;oBACN;;oBAGA,IAAI,KAAK,CAAC,KAAK,GAAG,UAAU,CAAC,IAAI,EAAE;wBAC/B,IAAI,CAAC,QAAQ,EAAE;wBACf;oBACJ;;oBAGA,IAAI,KAAK,CAAC,KAAK,GAAG,UAAU,CAAC,IAAI,EAAE;AAC/B,wBAAA,IAAI,IAAI,CAAC,aAAa,EAAE;AACpB,4BAAA,OAAO,CAAC,GAAG,CAAC,2CAA2C,CAAC;wBAC5D;AACA,wBAAA,IAAI,IAAI,CAAC,aAAa,KAAK,IAAI,EAAE;AAC7B,4BAAA,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC;AAChC,4BAAA,IAAI,CAAC,aAAa,GAAG,IAAI;wBAC7B;wBACA;oBACJ;;AAGA,oBAAA,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC;oBAClD,IAAI,OAAO,EAAE;;wBAET,MAAM,SAAS,GAAG,CAAC,EAAc,KAAK,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE;wBAC9E,SAAS,CAAC,MAAK;4BACX,IAAI,KAAK,CAAC,KAAK,GAAG,UAAU,CAAC,IAAI,EAAE;AAC/B,gCAAA,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;4BAC/B;4BAEA,IAAI,KAAK,CAAC,KAAK,GAAG,UAAU,CAAC,QAAQ,EAAE;;AAEnC,gCAAA,MAAM,YAAY,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC;gCAC5D,MAAM,WAAW,GAAG,YAAY,CAAC,KAAK,CAAC,sBAAsB,CAAC;gCAC9D,MAAM,YAAY,GAAG,YAAY,CAAC,KAAK,CAAC,0BAA0B,CAAC;AAEnE,gCAAA,MAAM,UAAU,GAAG,WAAW,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC;AACjE,gCAAA,MAAM,WAAW,GAAG,YAAY,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE;AAE9D,gCAAA,IAAI,UAAU,KAAK,CAAC,EAAE;;oCAElB,OAAO,CAAC,QAAQ,EAAE;gCACtB;qCAAO;;AAEH,oCAAA,MAAM,QAAQ,GAAG,WAAW,IAAI,CAAA,4BAAA,EAA+B,UAAU,EAAE;oCAC3E,OAAO,CAAC,KAAK,CAAC,IAAI,SAAS,CAAC,UAAwB,EAAE,QAAQ,CAAC,CAAC;gCACpE;gCACA,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC;4BACzC;4BAEA,IAAI,KAAK,CAAC,KAAK,GAAG,UAAU,CAAC,UAAU,EAAE;AACrC,gCAAA,IAAI,MAAM,GAAG,UAAU,CAAC,SAAS;gCACjC,IAAI,OAAO,GAAG,wBAAwB;gCAEtC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,EAAE;oCAC3B,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC;AACnG,oCAAA,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;oCAEtC,QAAQ,IAAI;wCACR,KAAK,CAAC;4CACF,OAAO,CAAC,QAAQ,EAAE;4CAClB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC;4CACrC;wCACJ,KAAK,CAAC;AACF,4CAAA,MAAM,GAAG,UAAU,CAAC,QAAQ;4CAC5B,OAAO,GAAG,gBAAgB;4CAC1B;wCACJ,KAAK,CAAC;AACF,4CAAA,MAAM,GAAG,UAAU,CAAC,QAAQ;4CAC5B,OAAO,GAAG,uBAAuB;4CACjC;wCACJ,KAAK,CAAC;AACF,4CAAA,MAAM,GAAG,UAAU,CAAC,QAAQ;4CAC5B,OAAO,GAAG,oBAAoB;4CAC9B;wCACJ,KAAK,CAAC;AACF,4CAAA,MAAM,GAAG,UAAU,CAAC,QAAQ;4CAC5B,OAAO,GAAG,eAAe;4CACzB;wCACJ,KAAK,CAAC;AACF,4CAAA,MAAM,GAAG,UAAU,CAAC,kBAAkB;4CACtC,OAAO,GAAG,kBAAkB;4CAC5B;wCACJ,KAAK,CAAC;AACF,4CAAA,MAAM,GAAG,UAAU,CAAC,WAAW;4CAC/B,OAAO,GAAG,gBAAgB;4CAC1B;wCACJ,KAAK,CAAC;AACF,4CAAA,MAAM,GAAG,UAAU,CAAC,SAAS;4CAC7B,OAAO,GAAG,kBAAkB;4CAC5B;wCACJ,KAAK,CAAC;AACF,4CAAA,MAAM,GAAG,UAAU,CAAC,kBAAkB;4CACtC,OAAO,GAAG,oBAAoB;4CAC9B;wCACJ,KAAK,CAAC;AACF,4CAAA,MAAM,GAAG,UAAU,CAAC,WAAW;4CAC/B,OAAO,GAAG,qBAAqB;4CAC/B;AACJ,wCAAA;AACI,4CAAA,OAAO,GAAG,CAAA,uBAAA,EAA0B,IAAI,CAAA,CAAE;;gCAEtD;gCAEA,OAAO,CAAC,KAAK,CAAC,IAAI,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;gCAC7C,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC;4BACzC;AACJ,wBAAA,CAAC,CAAC;oBACN;gBACJ;gBAAE,OAAO,KAAK,EAAE;AACZ,oBAAA,OAAO,CAAC,KAAK,CAAC,uCAAuC,EAAE,KAAK,CAAC;gBACjE;AACJ,YAAA,CAAC;YAED,IAAI,CAAC,MAAM,CAAC,OAAO,GAAG,CAAC,KAAK,KAAI;AAC5B,gBAAA,OAAO,CAAC,KAAK,CAAC,kCAAkC,EAAE,KAAK,CAAC;AAC5D,YAAA,CAAC;YAED,IAAI,CAAC,MAAM,CAAC,OAAO,GAAG,CAAC,KAAK,KAAI;AAC5B,gBAAA,IAAI,IAAI,CAAC,aAAa,EAAE;AACpB,oBAAA,OAAO,CAAC,GAAG,CAAC,8CAA8C,EAAE;wBACxD,IAAI,EAAE,KAAK,CAAC,IAAI;wBAChB,MAAM,EAAE,KAAK,CAAC,MAAM;wBACpB,QAAQ,EAAE,KAAK,CAAC;AACnB,qBAAA,CAAC;gBACN;AACA,gBAAA,IAAI,CAAC,SAAS,GAAG,KAAK;AACtB,gBAAA,IAAI,CAAC,MAAM,GAAG,IAAI;;gBAGlB,IAAI,CAAC,gBAAgB,EAAE;;gBAGvB,IAAI,CAAC,qBAAqB,EAAE;gBAC5B,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC;;AAGzD,gBAAA,IAAI,IAAI,CAAC,mBAAmB,EAAE;oBAC1B,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC;oBACzD,IAAI,CAAC,oBAAoB,EAAE;gBAC/B;AACJ,YAAA,CAAC;AACL,QAAA,CAAC,CAAC;IACN;AAEA;;AAEG;IACK,qBAAqB,GAAA;QACzB,MAAM,SAAS,GAAG,CAAC,EAAc,KAAK,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE;QAC9E,SAAS,CAAC,MAAK;YACX,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,OAAO,KAAI;AAC/B,gBAAA,OAAO,CAAC,KAAK,CAAC,IAAI,SAAS,CAAC,UAAU,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC;AAC3E,YAAA,CAAC,CAAC;AACF,YAAA,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE;AAC1B,QAAA,CAAC,CAAC;IACN;AAEA;;AAEG;IACK,oBAAoB,GAAA;;QAExB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAClB,IAAI,CAAC,iBAAiB,EACtB,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAC/D;AAED,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE;AACpB,YAAA,OAAO,CAAC,GAAG,CAAC,CAAA,gDAAA,EAAmD,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAA,IAAA,EAAO,KAAK,CAAA,EAAA,CAAI,CAAC;QAC7G;QAEA,IAAI,CAAC,gBAAgB,EAAE;AAEvB,QAAA,IAAI,CAAC,kBAAkB,GAAG,UAAU,CAAC,MAAK;YACtC,IAAI,IAAI,CAAC,mBAAmB,IAAI,IAAI,CAAC,UAAU,EAAE;AAC7C,gBAAA,IAAI,IAAI,CAAC,aAAa,EAAE;AACpB,oBAAA,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC;gBAC7D;gBACA,IAAI,CAAC,iBAAiB,EAAE;YAC5B;QACJ,CAAC,EAAE,KAAK,CAAC;IACb;AAEA;;AAEG;IACK,iBAAiB,GAAA;;QAErB,MAAM,UAAU,GAAG,CAAC,EAAc,KAAK,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE;QAC7F,UAAU,CAAC,MAAK;AACZ,YAAA,IAAI,CAAC,cAAc,GAAG,WAAW,CAAC,MAAK;gBACnC,IAAI,CAAC,QAAQ,EAAE;AACnB,YAAA,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC;AACzB,QAAA,CAAC,CAAC;AACF,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE;AACpB,YAAA,OAAO,CAAC,GAAG,CAAC,kDAAkD,CAAC;QACnE;IACJ;AAEA;;AAEG;IACK,gBAAgB,GAAA;AACpB,QAAA,IAAI,IAAI,CAAC,cAAc,EAAE;AACrB,YAAA,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC;AAClC,YAAA,IAAI,CAAC,cAAc,GAAG,IAAI;AAC1B,YAAA,IAAI,IAAI,CAAC,aAAa,EAAE;AACpB,gBAAA,OAAO,CAAC,GAAG,CAAC,kDAAkD,CAAC;YACnE;QACJ;;AAEA,QAAA,IAAI,IAAI,CAAC,aAAa,KAAK,IAAI,EAAE;AAC7B,YAAA,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC;AAChC,YAAA,IAAI,CAAC,aAAa,GAAG,IAAI;QAC7B;IACJ;AAEA;;AAEG;IACK,QAAQ,GAAA;QACZ,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,SAAS,EAAE;AAC/B,YAAA,MAAM,SAAS,GAAG,WAAW,CAAC,IAAI,CAAC,YAAY,EAAE,UAAU,CAAC,IAAI,EAAE,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC;AACpF,YAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC;AAC3B,YAAA,IAAI,IAAI,CAAC,aAAa,EAAE;AACpB,gBAAA,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC;YACtD;;AAGA,YAAA,IAAI,IAAI,CAAC,aAAa,KAAK,IAAI,EAAE;AAC7B,gBAAA,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC;YACpC;;AAGA,YAAA,IAAI,CAAC,aAAa,GAAG,UAAU,CAAC,MAAK;AACjC,gBAAA,OAAO,CAAC,IAAI,CAAC,qEAAqE,CAAC;AACnF,gBAAA,IAAI,IAAI,CAAC,MAAM,EAAE;;oBAEb,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,cAAc,CAAC;gBAC3C;AACJ,YAAA,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC;QACxB;IACJ;AAEA;;AAEG;IACK,QAAQ,GAAA;QACZ,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,SAAS,EAAE;AAC/B,YAAA,MAAM,SAAS,GAAG,WAAW,CAAC,IAAI,CAAC,YAAY,EAAE,UAAU,CAAC,IAAI,EAAE,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC;AACpF,YAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC;AAC3B,YAAA,IAAI,IAAI,CAAC,aAAa,EAAE;AACpB,gBAAA,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC;YACtD;QACJ;IACJ;AAEA;;AAEG;IACH,UAAU,GAAA;AACN,QAAA,IAAI,CAAC,mBAAmB,GAAG,KAAK,CAAC;QACjC,IAAI,CAAC,gBAAgB,EAAE;;AAGvB,QAAA,IAAI,IAAI,CAAC,kBAAkB,EAAE;AACzB,YAAA,YAAY,CAAC,IAAI,CAAC,kBAAkB,CAAC;AACrC,YAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI;QAClC;AAEA,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE;AACb,YAAA,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE;AACnB,YAAA,IAAI,CAAC,MAAM,GAAG,IAAI;AAClB,YAAA,IAAI,CAAC,SAAS,GAAG,KAAK;QAC1B;IACJ;AAEA;;AAEG;IACH,WAAW,GAAA;QACP,OAAO,IAAI,CAAC,SAAS;IACzB;AAEA;;;;;;;;;;AAUG;IACH,YAAY,CAAC,KAAoB,EAAE,OAAiC,EAAA;AAChE,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,KAAK,KAAK;AAC7C,QAAA,IAAI,CAAC,SAAS,GAAG,KAAK;QAEtB,IAAI,OAAO,EAAE,SAAS,IAAI,YAAY,IAAI,IAAI,CAAC,SAAS,EAAE;YACtD,IAAI,CAAC,SAAS,EAAE;QACpB;IACJ;AAEA;;;;;;;;;;;;AAYG;IACH,SAAS,GAAA;AACL,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;YAClB;QACJ;AAEA,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE;AACpB,YAAA,OAAO,CAAC,GAAG,CAAC,kDAAkD,CAAC;QACnE;;QAGA,IAAI,CAAC,gBAAgB,EAAE;;AAGvB,QAAA,IAAI,IAAI,CAAC,kBAAkB,EAAE;AACzB,YAAA,YAAY,CAAC,IAAI,CAAC,kBAAkB,CAAC;AACrC,YAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI;QAClC;;AAGA,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE;;;AAGb,YAAA,MAAM,sBAAsB,GAAG,IAAI,CAAC,mBAAmB;AACvD,YAAA,IAAI,CAAC,mBAAmB,GAAG,KAAK;YAEhC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,mCAAmC,CAAC;AAC5D,YAAA,IAAI,CAAC,MAAM,GAAG,IAAI;AAClB,YAAA,IAAI,CAAC,SAAS,GAAG,KAAK;;YAGtB,IAAI,CAAC,qBAAqB,EAAE;YAC5B,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC;;AAGzD,YAAA,IAAI,CAAC,mBAAmB,GAAG,sBAAsB;QACrD;;AAGA,QAAA,IAAI,CAAC,gBAAgB,GAAG,CAAC;;QAGzB,IAAI,CAAC,iBAAiB,EAAE;IAC5B;AAEA;;AAEG;IACH,eAAe,GAAA;AACX,QAAA,OAAO,IAAI,qBAAqB,CAAC,IAAI,CAAC;IAC1C;AAEA;;;;;;;;AAQG;AACH,IAAA,OAAO,CAAC,OAAe,EAAE,MAAc,EAAE,IAAgB,EAAE,QAAiC,EAAA;QACxF,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;AACjC,YAAA,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC;QACjD;;AAGA,QAAA,IAAI,IAAI,CAAC,YAAY,GAAG,UAAU,EAAE;;;YAGhC,MAAM,QAAQ,GAAG,sBAAsB;AACvC,YAAA,OAAO,CAAC,KAAK,CAAC,mBAAmB,QAAQ,CAAA,CAAE,CAAC;YAC5C,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC;AACjC,YAAA,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC;QAC7B;AAEA,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY;AAClC,QAAA,IAAI,CAAC,YAAY,IAAI,CAAC,CAAC;;AAGvB,QAAA,MAAM,OAAO,GAAG,IAAI,OAAO,EAAc;QACzC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC;;AAGrC,QAAA,MAAM,UAAU,GAAG,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA,EAAI,MAAM,EAAE;AAC1C,QAAA,IAAI,WAAW,GAAG,CAAA,MAAA,EAAS,UAAU,EAAE;;AAGvC,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE;AAChB,YAAA,WAAW,IAAI,CAAA,wBAAA,EAA2B,IAAI,CAAC,SAAS,EAAE;QAC9D;QACA,IAAI,QAAQ,EAAE;AACV,YAAA,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;AAC3C,gBAAA,WAAW,IAAI,CAAA,EAAA,EAAK,CAAC,CAAA,EAAA,EAAK,CAAC,EAAE;YACjC;QACJ;QAEA,MAAM,cAAc,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC;AAC5D,QAAA,MAAM,YAAY,GAAG,WAAW,CAAC,QAAQ,EAAE,UAAU,CAAC,OAAO,EAAE,cAAc,CAAC;AAC9E,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC;AAE9B,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE;AACpB,YAAA,OAAO,CAAC,GAAG,CAAC,CAAA,2CAAA,EAA8C,QAAQ,CAAA,EAAA,EAAK,cAAc,CAAC,UAAU,CAAC,CAAA,CAAE,CAAC;QACxG;;AAGA,QAAA,MAAM,SAAS,GAAG,WAAW,CAAC,QAAQ,EAAE,UAAU,CAAC,IAAI,GAAG,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC;AAC/E,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC;AAE3B,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE;YACpB,OAAO,CAAC,GAAG,CAAC,CAAA,wCAAA,EAA2C,QAAQ,CAAA,QAAA,EAAW,IAAI,CAAC,MAAM,CAAA,MAAA,CAAQ,CAAC;QAClG;;AAGA,QAAA,OAAO,IAAI,UAAU,CAAa,QAAQ,IAAG;;YAEzC,MAAM,YAAY,GAAG,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC;;AAGhD,YAAA,OAAO,MAAK;gBACR,YAAY,CAAC,WAAW,EAAE;;AAE1B,gBAAA,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC;;AAG/B,gBAAA,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE;;AAE1D,oBAAA,MAAM,aAAa,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC;AACvC,oBAAA,IAAI,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;AAE1D,oBAAA,MAAM,QAAQ,GAAG,WAAW,CAAC,QAAQ,EAAE,UAAU,CAAC,UAAU,EAAE,aAAa,CAAC;AAC5E,oBAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC;AAC1B,oBAAA,IAAI,IAAI,CAAC,aAAa,EAAE;AACpB,wBAAA,OAAO,CAAC,GAAG,CAAC,uDAAuD,QAAQ,CAAA,CAAE,CAAC;oBAClF;gBACJ;AACJ,YAAA,CAAC;AACL,QAAA,CAAC,CAAC;IACN;AACH;AAED;;;AAGG;AACH,SAAS,cAAc,CAAC,CAAS,EAAA;AAC7B,IAAA,IAAI,CAAC,CAAC,MAAM,IAAI,EAAE,EAAE;AAChB,QAAA,OAAO,CAAC;IACZ;AACA,IAAA,OAAO,CAAA,EAAG,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA,WAAA,EAAc,CAAC,CAAC,MAAM,GAAG;AACzD;IAEY;AAAZ,CAAA,UAAY,eAAe,EAAA;AACvB,IAAA,eAAA,CAAA,cAAA,CAAA,GAAA,cAA6B;AAC7B,IAAA,eAAA,CAAA,cAAA,CAAA,GAAA,cAA6B;AAC7B,IAAA,eAAA,CAAA,WAAA,CAAA,GAAA,WAAuB;AAC3B,CAAC,EAJW,eAAe,KAAf,eAAe,GAAA,EAAA,CAAA,CAAA;;AC/kB3B;;AAEG;MACU,gBAAgB,GAAG,IAAI,cAAc,CAAgB,kBAAkB;AAEpF;;AAEG;MACU,gBAAgB,GAAG,IAAI,cAAc,CAAgB,kBAAkB;AAEpF;;;AAGG;AACH,SAAS,mBAAmB,GAAA;AAC1B,IAAA,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;AAC7B,IAAA,MAAM,MAAM,GAAG,MAAM,CAAC,gBAAgB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAC3D,OAAO,IAAI,aAAa,CAAC,MAAM,EAAE,MAAM,IAAI,SAAS,CAAC;AACvD;AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6CG;AACG,SAAU,cAAc,CAAC,MAAsB,EAAA;AACnD,IAAA,OAAO,wBAAwB,CAAC;AAC9B,QAAA,MAAM,GAAG,EAAE,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE;AAC7D,QAAA;AACE,YAAA,OAAO,EAAE,gBAAgB;AACzB,YAAA,UAAU,EAAE;AACb;AACF,KAAA,CAAC;AACJ;;AC7EA;;AAEG;;ACFH;;AAEG;;;;"}

@@ -7,3 +7,3 @@ {

},
"version": "1.0.0",
"version": "1.1.0",
"peerDependencies": {

@@ -31,2 +31,2 @@ "@angular/core": ">=14.0.0",

}
}
}

@@ -170,6 +170,28 @@ import * as _angular_core from '@angular/core';

*
* @param token - The authentication token (e.g., JWT bearer token)
* When called with `options.reconnect: true`, this will gracefully close the
* current WebSocket connection and immediately reconnect, ensuring subsequent
* requests use the new token. This is useful for token refresh flows (e.g.,
* Auth0 token rotation) where the server validates the token per-connection.
*
* @param token - The authentication token (e.g., JWT bearer token), or null to clear
* @param options - Optional settings. `reconnect: true` triggers a graceful reconnect.
*/
setAuthToken(token: string | null): void;
setAuthToken(token: string | null, options?: {
reconnect?: boolean;
}): void;
/**
* Gracefully closes the current WebSocket connection and immediately reconnects.
*
* Unlike `disconnect()`, this preserves the reconnection-enabled state and the
* current URL. Active streams will receive an UNAVAILABLE error and must be retried
* by the caller. The reconnection bypasses the exponential backoff since it is
* an intentional reconnect, not a failure.
*
* Common use cases:
* - Token refresh: call `setAuthToken(newToken, { reconnect: true })` instead
* - Force re-authentication after permissions change
* - Reset stream state after a known server-side deployment
*/
reconnect(): void;
/**
* Creates an RPC transport that can be used with ts-proto generated clients.

@@ -176,0 +198,0 @@ */