From 75710e7e7e894efa73aa7ca5a790d28587ab1656 Mon Sep 17 00:00:00 2001 From: Steven Luscher Date: Wed, 21 Aug 2024 13:49:48 -0700 Subject: [PATCH] Retrict the type of subscription iterables to `AsyncIterable` (#3131) # Summary We want to return `Iterables` from here; it's not important that a generator itself is iterable. --- .../websocket-connection-typetest.ts | 24 +++++++++++++++++++ .../src/websocket-connection.ts | 5 ++-- 2 files changed, 26 insertions(+), 3 deletions(-) create mode 100644 packages/rpc-subscriptions-transport-websocket/src/__typetests__/websocket-connection-typetest.ts diff --git a/packages/rpc-subscriptions-transport-websocket/src/__typetests__/websocket-connection-typetest.ts b/packages/rpc-subscriptions-transport-websocket/src/__typetests__/websocket-connection-typetest.ts new file mode 100644 index 000000000000..fc0a4ffe6793 --- /dev/null +++ b/packages/rpc-subscriptions-transport-websocket/src/__typetests__/websocket-connection-typetest.ts @@ -0,0 +1,24 @@ +import { RpcWebSocketConnection } from '../websocket-connection'; + +const connection = null as unknown as RpcWebSocketConnection; + +// [DESCRIBE] RpcWebSocketConnection +{ + // It is an `AsyncIterable` + { + connection satisfies AsyncIterable; + } + + // It produces an `AsyncIterator` + { + connection[Symbol.asyncIterator]() satisfies AsyncIterator; + } + + // Is not an `AsyncIterableIterator` + { + // @ts-expect-error Should not be able to produce an iterable. + connection satisfies AsyncIterableIterator; + // @ts-expect-error Should not be able to produce an iterable. + connection[Symbol.asyncIterator]() satisfies AsyncIterableIterator; + } +} diff --git a/packages/rpc-subscriptions-transport-websocket/src/websocket-connection.ts b/packages/rpc-subscriptions-transport-websocket/src/websocket-connection.ts index 36140867f700..0a225aa94210 100644 --- a/packages/rpc-subscriptions-transport-websocket/src/websocket-connection.ts +++ b/packages/rpc-subscriptions-transport-websocket/src/websocket-connection.ts @@ -24,10 +24,9 @@ type IteratorState = onError: Parameters[0]>[1]; onMessage: Parameters[0]>[0]; }; -export type RpcWebSocketConnection = Readonly<{ +export interface RpcWebSocketConnection extends AsyncIterable { send(payload: unknown): Promise; - [Symbol.asyncIterator](): AsyncGenerator; -}>; +} let EXPLICIT_ABORT_TOKEN: symbol; function createExplicitAbortToken() {