Skip to content

Commit fc11993

Browse files
authored
refactor(experimental): add function to create Solana RPC Subscriptions using only an URL (#2239)
This PR changes the `createSolanaRpcSubscriptions` and `createSolanaRpcSubscriptions_UNSTABLE` functions so that they accepts a `ClusterUrl` as a first parameter and an optional config object as a second parameter. This makes it much easier for 95% of RPC Subscription use-cases to get started with the library: ```ts const rpcSubscriptions = createSolanaRpcSubscriptions("ws://localhost:8899"); // Cluster-aware RPC Subscriptions: const rpcSubscriptions = createSolanaRpcSubscriptions(devnet("ws://api.devnet.solana.com")); const rpcSubscriptions = createSolanaRpcSubscriptions(testnet("ws://api.testnet.solana.com")); const rpcSubscriptions = createSolanaRpcSubscriptions(mainnet("ws://api.mainnet-beta.solana.com")); // With configs: const rpcSubscriptions = createSolanaRpcSubscriptions("ws://localhost:8899", { intervalMs: 500, sendBufferHighWatermark: 0, }); ``` Additionally, this PR adds the `createSolanaRpcSubscriptionsFromTransport` and `createSolanaRpcSubscriptionsFromTransport_UNSTABLE` function allowing the remaining 5% of use-cases to customize their own transport just as easily: ```ts const rpcSubscriptions = createSolanaRpcSubscriptionsFromTransport(myCustomTransport); ``` Note that these functions are cluster aware so, if `myCustomTransport` is of type `RpcSubscriptionsTransportMainnet`, then `rpcSubscriptions` will automatically be of type `RpcSubscriptionsMainnet<SolanaRpcSubscriptionsApi>`. Finally, this PR refactors the cluster typetests to make it clearer what we are trying to tests. --- Fixes #2119
1 parent cd0b6c6 commit fc11993

File tree

3 files changed

+267
-186
lines changed

3 files changed

+267
-186
lines changed

packages/rpc-subscriptions/src/__typetests__/rpc-subscriptions-clusters-typetest.ts

Lines changed: 216 additions & 155 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,12 @@ import type { SolanaRpcSubscriptionsApi, SolanaRpcSubscriptionsApiUnstable } fro
22
import type { RpcSubscriptions, RpcSubscriptionsTransport } from '@solana/rpc-subscriptions-spec';
33
import { devnet, mainnet, testnet } from '@solana/rpc-types';
44

5-
import { createSolanaRpcSubscriptions, createSolanaRpcSubscriptions_UNSTABLE } from '../rpc-subscriptions';
5+
import {
6+
createSolanaRpcSubscriptions,
7+
createSolanaRpcSubscriptions_UNSTABLE,
8+
createSolanaRpcSubscriptionsFromTransport,
9+
createSolanaRpcSubscriptionsFromTransport_UNSTABLE,
10+
} from '../rpc-subscriptions';
611
import type {
712
RpcSubscriptionsDevnet,
813
RpcSubscriptionsMainnet,
@@ -13,163 +18,219 @@ import type {
1318
} from '../rpc-subscriptions-clusters';
1419
import { createDefaultRpcSubscriptionsTransport } from '../rpc-subscriptions-transport';
1520

16-
// Creating default websocket transports
21+
// Define cluster-aware URLs and transports.
1722

1823
const genericUrl = 'http://localhost:8899';
1924
const devnetUrl = devnet('https://api.devnet.solana.com');
2025
const testnetUrl = testnet('https://api.testnet.solana.com');
2126
const mainnetUrl = mainnet('https://api.mainnet-beta.solana.com');
2227

23-
// No cluster specified should be generic `RpcSubscriptionsTransport`
24-
createDefaultRpcSubscriptionsTransport({ url: genericUrl }) satisfies RpcSubscriptionsTransport;
25-
//@ts-expect-error Should not be a devnet transport
26-
createDefaultRpcSubscriptionsTransport({ url: genericUrl }) satisfies RpcSubscriptionsTransportDevnet;
27-
//@ts-expect-error Should not be a testnet transport
28-
createDefaultRpcSubscriptionsTransport({ url: genericUrl }) satisfies RpcSubscriptionsTransportTestnet;
29-
//@ts-expect-error Should not be a mainnet transport
30-
createDefaultRpcSubscriptionsTransport({ url: genericUrl }) satisfies RpcSubscriptionsTransportMainnet;
31-
32-
// Devnet cluster should be `RpcSubscriptionsTransportDevnet`
33-
createDefaultRpcSubscriptionsTransport({ url: devnetUrl }) satisfies RpcSubscriptionsTransportDevnet;
34-
//@ts-expect-error Should not be a testnet transport
35-
createDefaultRpcSubscriptionsTransport({ url: devnetUrl }) satisfies RpcSubscriptionsTransportTestnet;
36-
//@ts-expect-error Should not be a mainnet transport
37-
createDefaultRpcSubscriptionsTransport({ url: devnetUrl }) satisfies RpcSubscriptionsTransportMainnet;
38-
39-
// Testnet cluster should be `RpcSubscriptionsTransportTestnet`
40-
createDefaultRpcSubscriptionsTransport({ url: testnetUrl }) satisfies RpcSubscriptionsTransportTestnet;
41-
//@ts-expect-error Should not be a devnet transport
42-
createDefaultRpcSubscriptionsTransport({ url: testnetUrl }) satisfies RpcSubscriptionsTransportDevnet;
43-
//@ts-expect-error Should not be a mainnet transport
44-
createDefaultRpcSubscriptionsTransport({ url: testnetUrl }) satisfies RpcSubscriptionsTransportMainnet;
45-
46-
// Mainnet cluster should be `RpcSubscriptionsTransportMainnet`
47-
createDefaultRpcSubscriptionsTransport({ url: mainnetUrl }) satisfies RpcSubscriptionsTransportMainnet;
48-
//@ts-expect-error Should not be a devnet transport
49-
createDefaultRpcSubscriptionsTransport({ url: mainnetUrl }) satisfies RpcSubscriptionsTransportDevnet;
50-
//@ts-expect-error Should not be a testnet transport
51-
createDefaultRpcSubscriptionsTransport({ url: mainnetUrl }) satisfies RpcSubscriptionsTransportTestnet;
52-
53-
// Creating JSON Subscription RPC clients
54-
55-
const genericWebSocketTransport = createDefaultRpcSubscriptionsTransport({
56-
sendBufferHighWatermark: 0,
57-
url: genericUrl,
58-
});
59-
const devnetWebSocketTransport = createDefaultRpcSubscriptionsTransport({
60-
sendBufferHighWatermark: 0,
61-
url: devnetUrl,
62-
});
63-
const testnetWebSocketTransport = createDefaultRpcSubscriptionsTransport({
64-
sendBufferHighWatermark: 0,
65-
url: testnetUrl,
66-
});
67-
const mainnetWebSocketTransport = createDefaultRpcSubscriptionsTransport({
68-
sendBufferHighWatermark: 0,
69-
url: mainnetUrl,
70-
});
71-
72-
// Checking stable vs unstable subscriptions
73-
74-
createSolanaRpcSubscriptions({
75-
transport: genericWebSocketTransport,
76-
}) satisfies RpcSubscriptions<SolanaRpcSubscriptionsApi>;
77-
// @ts-expect-error Should not have unstable subscriptions
78-
createSolanaRpcSubscriptions(config) satisfies RpcSubscriptions<
79-
SolanaRpcSubscriptionsApi & SolanaRpcSubscriptionsApiUnstable
80-
>;
81-
82-
createSolanaRpcSubscriptions_UNSTABLE({ transport: genericWebSocketTransport }) satisfies RpcSubscriptions<
83-
SolanaRpcSubscriptionsApi & SolanaRpcSubscriptionsApiUnstable
84-
>;
85-
86-
// Checking cluster-level subscriptions API
87-
88-
// No cluster specified should be generic `RpcSubscriptions`
89-
createSolanaRpcSubscriptions({
90-
transport: genericWebSocketTransport,
91-
}) satisfies RpcSubscriptions<SolanaRpcSubscriptionsApi>;
92-
createSolanaRpcSubscriptions({
93-
transport: genericWebSocketTransport,
94-
//@ts-expect-error Should not be a devnet RPC
95-
}) satisfies RpcSubscriptionsDevnet<SolanaRpcSubscriptionsApi>;
96-
createSolanaRpcSubscriptions({
97-
transport: genericWebSocketTransport,
98-
//@ts-expect-error Should not be a testnet RPC
99-
}) satisfies RpcSubscriptionsTestnet<SolanaRpcSubscriptionsApi>;
100-
createSolanaRpcSubscriptions({
101-
transport: genericWebSocketTransport,
102-
//@ts-expect-error Should not be a mainnet RPC
103-
}) satisfies RpcSubscriptionsMainnet<SolanaRpcSubscriptionsApi>;
104-
105-
// Devnet cluster should be `RpcSubscriptionsDevnet`
106-
createSolanaRpcSubscriptions({
107-
transport: devnetWebSocketTransport,
108-
}) satisfies RpcSubscriptions<SolanaRpcSubscriptionsApi>;
109-
createSolanaRpcSubscriptions({
110-
transport: devnetWebSocketTransport,
111-
}) satisfies RpcSubscriptionsDevnet<SolanaRpcSubscriptionsApi>;
112-
createSolanaRpcSubscriptions({
113-
transport: devnetWebSocketTransport,
114-
//@ts-expect-error Should not be a testnet RPC
115-
}) satisfies RpcSubscriptionsTestnet<SolanaRpcSubscriptionsApi>;
116-
createSolanaRpcSubscriptions({
117-
transport: devnetWebSocketTransport,
118-
//@ts-expect-error Should not be a mainnet RPC
119-
}) satisfies RpcSubscriptionsMainnet<SolanaRpcSubscriptionsApi>;
120-
//@ts-expect-error Should not have unstable subscriptions
121-
createSolanaRpcSubscriptions({ transport: devnetWebSocketTransport }) satisfies RpcSubscriptionsDevnet<
122-
SolanaRpcSubscriptionsApi & SolanaRpcSubscriptionsApiUnstable
123-
>;
124-
// Unstable methods present with proper initializer
125-
createSolanaRpcSubscriptions_UNSTABLE({ transport: devnetWebSocketTransport }) satisfies RpcSubscriptionsDevnet<
126-
SolanaRpcSubscriptionsApi & SolanaRpcSubscriptionsApiUnstable
127-
>;
128-
129-
// Testnet cluster should be `RpcSubscriptionsTestnet`
130-
createSolanaRpcSubscriptions({
131-
transport: testnetWebSocketTransport,
132-
}) satisfies RpcSubscriptions<SolanaRpcSubscriptionsApi>;
133-
createSolanaRpcSubscriptions({
134-
transport: testnetWebSocketTransport,
135-
}) satisfies RpcSubscriptionsTestnet<SolanaRpcSubscriptionsApi>;
136-
createSolanaRpcSubscriptions({
137-
transport: testnetWebSocketTransport,
138-
//@ts-expect-error Should not be a devnet RPC
139-
}) satisfies RpcSubscriptionsDevnet<SolanaRpcSubscriptionsApi>;
140-
createSolanaRpcSubscriptions({
141-
transport: testnetWebSocketTransport,
142-
//@ts-expect-error Should not be a mainnet RPC
143-
}) satisfies RpcSubscriptionsMainnet<SolanaRpcSubscriptionsApi>;
144-
//@ts-expect-error Should not have unstable subscriptions
145-
createSolanaRpcSubscriptions({ transport: testnetWebSocketTransport }) satisfies RpcSubscriptionsTestnet<
146-
SolanaRpcSubscriptionsApi & SolanaRpcSubscriptionsApiUnstable
147-
>;
148-
// Unstable methods present with proper initializer
149-
createSolanaRpcSubscriptions_UNSTABLE({ transport: testnetWebSocketTransport }) satisfies RpcSubscriptionsTestnet<
150-
SolanaRpcSubscriptionsApi & SolanaRpcSubscriptionsApiUnstable
151-
>;
152-
153-
// Mainnet cluster should be `RpcSubscriptionsMainnet`
154-
createSolanaRpcSubscriptions({
155-
transport: mainnetWebSocketTransport,
156-
}) satisfies RpcSubscriptions<SolanaRpcSubscriptionsApi>;
157-
createSolanaRpcSubscriptions({
158-
transport: mainnetWebSocketTransport,
159-
}) satisfies RpcSubscriptionsMainnet<SolanaRpcSubscriptionsApi>;
160-
createSolanaRpcSubscriptions({
161-
transport: mainnetWebSocketTransport,
162-
//@ts-expect-error Should not be a devnet RPC
163-
}) satisfies RpcSubscriptionsDevnet<SolanaRpcSubscriptionsApi>;
164-
createSolanaRpcSubscriptions({
165-
transport: mainnetWebSocketTransport,
166-
//@ts-expect-error Should not be a testnet RPC
167-
}) satisfies RpcSubscriptionsTestnet<SolanaRpcSubscriptionsApi>;
168-
//@ts-expect-error Should not have unstable subscriptions
169-
createSolanaRpcSubscriptions({ transport: mainnetWebSocketTransport }) satisfies RpcSubscriptionsMainnet<
170-
SolanaRpcSubscriptionsApi & SolanaRpcSubscriptionsApiUnstable
171-
>;
172-
// Unstable methods present with proper initializer
173-
createSolanaRpcSubscriptions_UNSTABLE({ transport: mainnetWebSocketTransport }) satisfies RpcSubscriptionsMainnet<
174-
SolanaRpcSubscriptionsApi & SolanaRpcSubscriptionsApiUnstable
175-
>;
28+
const genericTransport = createDefaultRpcSubscriptionsTransport({ url: genericUrl });
29+
const devnetTransport = createDefaultRpcSubscriptionsTransport({ url: devnetUrl });
30+
const testnetTransport = createDefaultRpcSubscriptionsTransport({ url: testnetUrl });
31+
const mainnetTransport = createDefaultRpcSubscriptionsTransport({ url: mainnetUrl });
32+
33+
// [DEFINE] createDefaultRpcSubscriptionsTransport.
34+
{
35+
// No cluster specified should be generic `RpcSubscriptionsTransport`.
36+
{
37+
genericTransport satisfies RpcSubscriptionsTransport;
38+
//@ts-expect-error Should not be a devnet transport
39+
genericTransport satisfies RpcSubscriptionsTransportDevnet;
40+
//@ts-expect-error Should not be a testnet transport
41+
genericTransport satisfies RpcSubscriptionsTransportTestnet;
42+
//@ts-expect-error Should not be a mainnet transport
43+
genericTransport satisfies RpcSubscriptionsTransportMainnet;
44+
}
45+
46+
// Devnet cluster should be `RpcSubscriptionsTransportDevnet`.
47+
{
48+
devnetTransport satisfies RpcSubscriptionsTransportDevnet;
49+
//@ts-expect-error Should not be a testnet transport
50+
devnetTransport satisfies RpcSubscriptionsTransportTestnet;
51+
//@ts-expect-error Should not be a mainnet transport
52+
devnetTransport satisfies RpcSubscriptionsTransportMainnet;
53+
}
54+
55+
// Testnet cluster should be `RpcSubscriptionsTransportTestnet`.
56+
{
57+
testnetTransport satisfies RpcSubscriptionsTransportTestnet;
58+
//@ts-expect-error Should not be a devnet transport
59+
testnetTransport satisfies RpcSubscriptionsTransportDevnet;
60+
//@ts-expect-error Should not be a mainnet transport
61+
testnetTransport satisfies RpcSubscriptionsTransportMainnet;
62+
}
63+
64+
// Mainnet cluster should be `RpcSubscriptionsTransportMainnet`.
65+
{
66+
mainnetTransport satisfies RpcSubscriptionsTransportMainnet;
67+
//@ts-expect-error Should not be a devnet transport
68+
mainnetTransport satisfies RpcSubscriptionsTransportDevnet;
69+
//@ts-expect-error Should not be a testnet transport
70+
mainnetTransport satisfies RpcSubscriptionsTransportTestnet;
71+
}
72+
}
73+
74+
// [DEFINE] createSolanaRpcSubscriptionsFromTransport.
75+
{
76+
const genericRpc = createSolanaRpcSubscriptionsFromTransport(genericTransport);
77+
const devnetRpc = createSolanaRpcSubscriptionsFromTransport(devnetTransport);
78+
const tesnetRpc = createSolanaRpcSubscriptionsFromTransport(testnetTransport);
79+
const mainnetRpc = createSolanaRpcSubscriptionsFromTransport(mainnetTransport);
80+
81+
// Checking stable subscriptions.
82+
{
83+
genericRpc satisfies RpcSubscriptions<SolanaRpcSubscriptionsApi>;
84+
devnetRpc satisfies RpcSubscriptions<SolanaRpcSubscriptionsApi>;
85+
tesnetRpc satisfies RpcSubscriptions<SolanaRpcSubscriptionsApi>;
86+
mainnetRpc satisfies RpcSubscriptions<SolanaRpcSubscriptionsApi>;
87+
88+
// @ts-expect-error Should not have unstable subscriptions
89+
genericRpc satisfies RpcSubscriptions<SolanaRpcSubscriptionsApi & SolanaRpcSubscriptionsApiUnstable>;
90+
// @ts-expect-error Should not have unstable subscriptions
91+
devnetRpc satisfies RpcSubscriptions<SolanaRpcSubscriptionsApi & SolanaRpcSubscriptionsApiUnstable>;
92+
// @ts-expect-error Should not have unstable subscriptions
93+
tesnetRpc satisfies RpcSubscriptions<SolanaRpcSubscriptionsApi & SolanaRpcSubscriptionsApiUnstable>;
94+
// @ts-expect-error Should not have unstable subscriptions
95+
mainnetRpc satisfies RpcSubscriptions<SolanaRpcSubscriptionsApi & SolanaRpcSubscriptionsApiUnstable>;
96+
}
97+
98+
// No cluster specified should be generic `RpcSubscriptions`.
99+
{
100+
genericRpc satisfies RpcSubscriptions<SolanaRpcSubscriptionsApi>;
101+
//@ts-expect-error Should not be a devnet RPC
102+
genericRpc satisfies RpcSubscriptionsDevnet<SolanaRpcSubscriptionsApi>;
103+
//@ts-expect-error Should not be a testnet RPC
104+
genericRpc satisfies RpcSubscriptionsTestnet<SolanaRpcSubscriptionsApi>;
105+
//@ts-expect-error Should not be a mainnet RPC
106+
genericRpc satisfies RpcSubscriptionsMainnet<SolanaRpcSubscriptionsApi>;
107+
}
108+
109+
// Devnet cluster should be `RpcSubscriptionsDevnet`.
110+
{
111+
devnetRpc satisfies RpcSubscriptions<SolanaRpcSubscriptionsApi>;
112+
devnetRpc satisfies RpcSubscriptionsDevnet<SolanaRpcSubscriptionsApi>;
113+
//@ts-expect-error Should not be a testnet RPC
114+
devnetRpc satisfies RpcSubscriptionsTestnet<SolanaRpcSubscriptionsApi>;
115+
//@ts-expect-error Should not be a mainnet RPC
116+
devnetRpc satisfies RpcSubscriptionsMainnet<SolanaRpcSubscriptionsApi>;
117+
}
118+
119+
// Testnet cluster should be `RpcSubscriptionsTestnet`.
120+
{
121+
tesnetRpc satisfies RpcSubscriptions<SolanaRpcSubscriptionsApi>;
122+
tesnetRpc satisfies RpcSubscriptionsTestnet<SolanaRpcSubscriptionsApi>;
123+
//@ts-expect-error Should not be a devnet RPC
124+
tesnetRpc satisfies RpcSubscriptionsDevnet<SolanaRpcSubscriptionsApi>;
125+
//@ts-expect-error Should not be a mainnet RPC
126+
tesnetRpc satisfies RpcSubscriptionsMainnet<SolanaRpcSubscriptionsApi>;
127+
}
128+
129+
// Mainnet cluster should be `RpcSubscriptionsMainnet`.
130+
{
131+
mainnetRpc satisfies RpcSubscriptions<SolanaRpcSubscriptionsApi>;
132+
mainnetRpc satisfies RpcSubscriptionsMainnet<SolanaRpcSubscriptionsApi>;
133+
//@ts-expect-error Should not be a devnet RPC
134+
mainnetRpc satisfies RpcSubscriptionsDevnet<SolanaRpcSubscriptionsApi>;
135+
//@ts-expect-error Should not be a testnet RPC
136+
mainnetRpc satisfies RpcSubscriptionsTestnet<SolanaRpcSubscriptionsApi>;
137+
}
138+
}
139+
140+
// [DEFINE] createSolanaRpcSubscriptionsFromTransport_UNSTABLE.
141+
{
142+
const genericRpc = createSolanaRpcSubscriptionsFromTransport_UNSTABLE(genericTransport);
143+
const devnetRpc = createSolanaRpcSubscriptionsFromTransport_UNSTABLE(devnetTransport);
144+
const tesnetRpc = createSolanaRpcSubscriptionsFromTransport_UNSTABLE(testnetTransport);
145+
const mainnetRpc = createSolanaRpcSubscriptionsFromTransport_UNSTABLE(mainnetTransport);
146+
147+
// Checking unstable subscriptions.
148+
{
149+
genericRpc satisfies RpcSubscriptions<SolanaRpcSubscriptionsApi & SolanaRpcSubscriptionsApiUnstable>;
150+
devnetRpc satisfies RpcSubscriptionsDevnet<SolanaRpcSubscriptionsApi & SolanaRpcSubscriptionsApiUnstable>;
151+
tesnetRpc satisfies RpcSubscriptionsTestnet<SolanaRpcSubscriptionsApi & SolanaRpcSubscriptionsApiUnstable>;
152+
mainnetRpc satisfies RpcSubscriptionsMainnet<SolanaRpcSubscriptionsApi & SolanaRpcSubscriptionsApiUnstable>;
153+
}
154+
}
155+
156+
// [DEFINE] createSolanaRpcSubscriptions.
157+
{
158+
const genericRpc = createSolanaRpcSubscriptions(genericUrl);
159+
const devnetRpc = createSolanaRpcSubscriptions(devnetUrl);
160+
const tesnetRpc = createSolanaRpcSubscriptions(testnetUrl);
161+
const mainnetRpc = createSolanaRpcSubscriptions(mainnetUrl);
162+
163+
// Checking stable subscriptions.
164+
{
165+
genericRpc satisfies RpcSubscriptions<SolanaRpcSubscriptionsApi>;
166+
devnetRpc satisfies RpcSubscriptions<SolanaRpcSubscriptionsApi>;
167+
tesnetRpc satisfies RpcSubscriptions<SolanaRpcSubscriptionsApi>;
168+
mainnetRpc satisfies RpcSubscriptions<SolanaRpcSubscriptionsApi>;
169+
170+
// @ts-expect-error Should not have unstable subscriptions
171+
genericRpc satisfies RpcSubscriptions<SolanaRpcSubscriptionsApi & SolanaRpcSubscriptionsApiUnstable>;
172+
// @ts-expect-error Should not have unstable subscriptions
173+
devnetRpc satisfies RpcSubscriptions<SolanaRpcSubscriptionsApi & SolanaRpcSubscriptionsApiUnstable>;
174+
// @ts-expect-error Should not have unstable subscriptions
175+
tesnetRpc satisfies RpcSubscriptions<SolanaRpcSubscriptionsApi & SolanaRpcSubscriptionsApiUnstable>;
176+
// @ts-expect-error Should not have unstable subscriptions
177+
mainnetRpc satisfies RpcSubscriptions<SolanaRpcSubscriptionsApi & SolanaRpcSubscriptionsApiUnstable>;
178+
}
179+
180+
// No cluster specified should be generic `RpcSubscriptions`.
181+
{
182+
genericRpc satisfies RpcSubscriptions<SolanaRpcSubscriptionsApi>;
183+
//@ts-expect-error Should not be a devnet RPC
184+
genericRpc satisfies RpcSubscriptionsDevnet<SolanaRpcSubscriptionsApi>;
185+
//@ts-expect-error Should not be a testnet RPC
186+
genericRpc satisfies RpcSubscriptionsTestnet<SolanaRpcSubscriptionsApi>;
187+
//@ts-expect-error Should not be a mainnet RPC
188+
genericRpc satisfies RpcSubscriptionsMainnet<SolanaRpcSubscriptionsApi>;
189+
}
190+
191+
// Devnet cluster should be `RpcSubscriptionsDevnet`.
192+
{
193+
devnetRpc satisfies RpcSubscriptions<SolanaRpcSubscriptionsApi>;
194+
devnetRpc satisfies RpcSubscriptionsDevnet<SolanaRpcSubscriptionsApi>;
195+
//@ts-expect-error Should not be a testnet RPC
196+
devnetRpc satisfies RpcSubscriptionsTestnet<SolanaRpcSubscriptionsApi>;
197+
//@ts-expect-error Should not be a mainnet RPC
198+
devnetRpc satisfies RpcSubscriptionsMainnet<SolanaRpcSubscriptionsApi>;
199+
}
200+
201+
// Testnet cluster should be `RpcSubscriptionsTestnet`.
202+
{
203+
tesnetRpc satisfies RpcSubscriptions<SolanaRpcSubscriptionsApi>;
204+
tesnetRpc satisfies RpcSubscriptionsTestnet<SolanaRpcSubscriptionsApi>;
205+
//@ts-expect-error Should not be a devnet RPC
206+
tesnetRpc satisfies RpcSubscriptionsDevnet<SolanaRpcSubscriptionsApi>;
207+
//@ts-expect-error Should not be a mainnet RPC
208+
tesnetRpc satisfies RpcSubscriptionsMainnet<SolanaRpcSubscriptionsApi>;
209+
}
210+
211+
// Mainnet cluster should be `RpcSubscriptionsMainnet`.
212+
{
213+
mainnetRpc satisfies RpcSubscriptions<SolanaRpcSubscriptionsApi>;
214+
mainnetRpc satisfies RpcSubscriptionsMainnet<SolanaRpcSubscriptionsApi>;
215+
//@ts-expect-error Should not be a devnet RPC
216+
mainnetRpc satisfies RpcSubscriptionsDevnet<SolanaRpcSubscriptionsApi>;
217+
//@ts-expect-error Should not be a testnet RPC
218+
mainnetRpc satisfies RpcSubscriptionsTestnet<SolanaRpcSubscriptionsApi>;
219+
}
220+
}
221+
222+
// [DEFINE] createSolanaRpcSubscriptions_UNSTABLE.
223+
{
224+
const genericRpc = createSolanaRpcSubscriptions_UNSTABLE(genericUrl);
225+
const devnetRpc = createSolanaRpcSubscriptions_UNSTABLE(devnetUrl);
226+
const tesnetRpc = createSolanaRpcSubscriptions_UNSTABLE(testnetUrl);
227+
const mainnetRpc = createSolanaRpcSubscriptions_UNSTABLE(mainnetUrl);
228+
229+
// Checking unstable subscriptions.
230+
{
231+
genericRpc satisfies RpcSubscriptions<SolanaRpcSubscriptionsApi & SolanaRpcSubscriptionsApiUnstable>;
232+
devnetRpc satisfies RpcSubscriptionsDevnet<SolanaRpcSubscriptionsApi & SolanaRpcSubscriptionsApiUnstable>;
233+
tesnetRpc satisfies RpcSubscriptionsTestnet<SolanaRpcSubscriptionsApi & SolanaRpcSubscriptionsApiUnstable>;
234+
mainnetRpc satisfies RpcSubscriptionsMainnet<SolanaRpcSubscriptionsApi & SolanaRpcSubscriptionsApiUnstable>;
235+
}
236+
}

0 commit comments

Comments
 (0)