@provable-games/budokan-sdk 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client-BtC3ngNe.d.cts +448 -0
- package/dist/client-BtC3ngNe.d.ts +448 -0
- package/dist/index.cjs +2553 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +205 -0
- package/dist/index.d.ts +205 -0
- package/dist/index.js +2519 -0
- package/dist/index.js.map +1 -0
- package/dist/react.cjs +2776 -0
- package/dist/react.cjs.map +1 -0
- package/dist/react.d.cts +160 -0
- package/dist/react.d.ts +160 -0
- package/dist/react.js +2760 -0
- package/dist/react.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,448 @@
|
|
|
1
|
+
type DataSource = "api" | "rpc";
|
|
2
|
+
interface BudokanClientConfig {
|
|
3
|
+
apiBaseUrl: string;
|
|
4
|
+
wsUrl?: string;
|
|
5
|
+
rpcUrl?: string;
|
|
6
|
+
chain?: "mainnet" | "sepolia";
|
|
7
|
+
provider?: unknown;
|
|
8
|
+
viewerAddress?: string;
|
|
9
|
+
budokanAddress?: string;
|
|
10
|
+
primarySource?: DataSource;
|
|
11
|
+
retryAttempts?: number;
|
|
12
|
+
retryDelay?: number;
|
|
13
|
+
timeout?: number;
|
|
14
|
+
health?: {
|
|
15
|
+
initialCheckDelay?: number;
|
|
16
|
+
checkInterval?: number;
|
|
17
|
+
checkTimeout?: number;
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
interface Tournament {
|
|
22
|
+
id: string;
|
|
23
|
+
/** @deprecated Use `id` instead */
|
|
24
|
+
tournamentId: string;
|
|
25
|
+
gameAddress: string;
|
|
26
|
+
createdAt: string;
|
|
27
|
+
createdBy: string;
|
|
28
|
+
creatorTokenId: string | null;
|
|
29
|
+
name: string;
|
|
30
|
+
description: string;
|
|
31
|
+
registrationStartDelay: number | null;
|
|
32
|
+
registrationEndDelay: number | null;
|
|
33
|
+
gameStartDelay: number | null;
|
|
34
|
+
gameEndDelay: number | null;
|
|
35
|
+
submissionDuration: number | null;
|
|
36
|
+
createdAtOnchain: string | null;
|
|
37
|
+
registrationStartTime: string | null;
|
|
38
|
+
registrationEndTime: string | null;
|
|
39
|
+
gameStartTime: string | null;
|
|
40
|
+
gameEndTime: string | null;
|
|
41
|
+
submissionEndTime: string | null;
|
|
42
|
+
settingsId: number | null;
|
|
43
|
+
soulbound: boolean | null;
|
|
44
|
+
paymaster: boolean | null;
|
|
45
|
+
clientUrl: string | null;
|
|
46
|
+
renderer: string | null;
|
|
47
|
+
leaderboardAscending: boolean | null;
|
|
48
|
+
leaderboardGameMustBeOver: boolean | null;
|
|
49
|
+
entryFeeToken: string | null;
|
|
50
|
+
entryFeeAmount: string | null;
|
|
51
|
+
hasEntryRequirement: boolean | null;
|
|
52
|
+
schedule: Schedule | null;
|
|
53
|
+
gameConfig: GameConfig | null;
|
|
54
|
+
entryFee: EntryFee | null;
|
|
55
|
+
entryRequirement: unknown | null;
|
|
56
|
+
leaderboardConfig: LeaderboardConfig | null;
|
|
57
|
+
entryCount: number;
|
|
58
|
+
prizeCount: number;
|
|
59
|
+
submissionCount: number;
|
|
60
|
+
paidPlaces?: number;
|
|
61
|
+
prizeAggregation?: Array<{
|
|
62
|
+
tokenAddress: string;
|
|
63
|
+
tokenType: string;
|
|
64
|
+
totalAmount: string;
|
|
65
|
+
nftCount: number;
|
|
66
|
+
}>;
|
|
67
|
+
metadata: unknown | null;
|
|
68
|
+
}
|
|
69
|
+
interface Schedule {
|
|
70
|
+
registrationStartDelay: number;
|
|
71
|
+
registrationEndDelay: number;
|
|
72
|
+
gameStartDelay: number;
|
|
73
|
+
gameEndDelay: number;
|
|
74
|
+
submissionDuration: number;
|
|
75
|
+
}
|
|
76
|
+
interface GameConfig {
|
|
77
|
+
gameAddress: string;
|
|
78
|
+
settingsId: number;
|
|
79
|
+
soulbound: boolean;
|
|
80
|
+
paymaster: boolean;
|
|
81
|
+
clientUrl: string | null;
|
|
82
|
+
renderer: string | null;
|
|
83
|
+
}
|
|
84
|
+
interface EntryFee {
|
|
85
|
+
tokenAddress: string;
|
|
86
|
+
amount: string;
|
|
87
|
+
tournamentCreatorShare: number;
|
|
88
|
+
gameCreatorShare: number;
|
|
89
|
+
refundShare: number;
|
|
90
|
+
distribution: unknown;
|
|
91
|
+
distributionCount: number;
|
|
92
|
+
}
|
|
93
|
+
interface LeaderboardConfig {
|
|
94
|
+
ascending: boolean;
|
|
95
|
+
gameMustBeOver: boolean;
|
|
96
|
+
}
|
|
97
|
+
type Phase = "scheduled" | "registration" | "staging" | "live" | "submission" | "finalized";
|
|
98
|
+
interface TournamentListParams {
|
|
99
|
+
gameAddress?: string;
|
|
100
|
+
creator?: string;
|
|
101
|
+
phase?: Phase;
|
|
102
|
+
limit?: number;
|
|
103
|
+
offset?: number;
|
|
104
|
+
sort?: "start_time" | "end_time" | "players" | "created_at";
|
|
105
|
+
fromId?: string;
|
|
106
|
+
excludeIds?: string[];
|
|
107
|
+
whitelistedExtensions?: string[];
|
|
108
|
+
includePrizeSummary?: "summary" | boolean;
|
|
109
|
+
}
|
|
110
|
+
interface QualificationEntry {
|
|
111
|
+
tournamentId: string;
|
|
112
|
+
qualificationProof: unknown;
|
|
113
|
+
entryCount: number;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
interface LeaderboardEntry {
|
|
117
|
+
position: number;
|
|
118
|
+
tokenId: string;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
interface Registration {
|
|
122
|
+
tournamentId: string;
|
|
123
|
+
gameTokenId: string;
|
|
124
|
+
gameAddress: string;
|
|
125
|
+
playerAddress: string;
|
|
126
|
+
entryNumber: number;
|
|
127
|
+
hasSubmitted: boolean;
|
|
128
|
+
isBanned: boolean;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
interface Prize {
|
|
132
|
+
prizeId: string;
|
|
133
|
+
tournamentId: string;
|
|
134
|
+
payoutPosition: number;
|
|
135
|
+
tokenAddress: string;
|
|
136
|
+
tokenType: "erc20" | "erc721";
|
|
137
|
+
amount: string | null;
|
|
138
|
+
tokenId: string | null;
|
|
139
|
+
distributionType: string | null;
|
|
140
|
+
distributionWeight: number | null;
|
|
141
|
+
distributionCount: number | null;
|
|
142
|
+
sponsorAddress: string;
|
|
143
|
+
}
|
|
144
|
+
interface RewardClaim {
|
|
145
|
+
tournamentId: string;
|
|
146
|
+
rewardType: unknown;
|
|
147
|
+
claimed: boolean;
|
|
148
|
+
}
|
|
149
|
+
interface PrizeAggregation {
|
|
150
|
+
tokenAddress: string;
|
|
151
|
+
tokenType: string;
|
|
152
|
+
totalAmount: string;
|
|
153
|
+
nftCount: number;
|
|
154
|
+
}
|
|
155
|
+
interface RewardClaimSummary {
|
|
156
|
+
totalPrizes: number;
|
|
157
|
+
totalClaimed: number;
|
|
158
|
+
totalUnclaimed: number;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
interface PlayerStats {
|
|
162
|
+
totalTournaments: number;
|
|
163
|
+
totalSubmissions: number;
|
|
164
|
+
}
|
|
165
|
+
interface PlayerTournament extends Tournament {
|
|
166
|
+
registration: Registration;
|
|
167
|
+
}
|
|
168
|
+
interface PlayerTournamentParams {
|
|
169
|
+
phase?: Phase;
|
|
170
|
+
gameTokenIds?: string[];
|
|
171
|
+
limit?: number;
|
|
172
|
+
offset?: number;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
interface ActivityEvent {
|
|
176
|
+
id: string;
|
|
177
|
+
eventType: string;
|
|
178
|
+
tournamentId: string | null;
|
|
179
|
+
playerAddress: string | null;
|
|
180
|
+
data: unknown;
|
|
181
|
+
blockNumber: string;
|
|
182
|
+
txHash: string;
|
|
183
|
+
eventIndex: number;
|
|
184
|
+
}
|
|
185
|
+
interface ActivityParams {
|
|
186
|
+
eventType?: string;
|
|
187
|
+
tournamentId?: string;
|
|
188
|
+
playerAddress?: string;
|
|
189
|
+
limit?: number;
|
|
190
|
+
offset?: number;
|
|
191
|
+
}
|
|
192
|
+
interface PlatformStats {
|
|
193
|
+
totalTournaments: number;
|
|
194
|
+
totalPrizes: number;
|
|
195
|
+
totalRegistrations: number;
|
|
196
|
+
totalSubmissions: number;
|
|
197
|
+
}
|
|
198
|
+
interface PrizeStats {
|
|
199
|
+
tokenTotals: Array<{
|
|
200
|
+
tokenAddress: string;
|
|
201
|
+
totalPrizes: number;
|
|
202
|
+
totalAmount: string;
|
|
203
|
+
}>;
|
|
204
|
+
totalNftPrizes: number;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
interface PaginatedResult<T> {
|
|
208
|
+
data: T[];
|
|
209
|
+
total?: number;
|
|
210
|
+
limit: number;
|
|
211
|
+
offset: number;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
type WSChannel = "tournaments" | "registrations" | "leaderboards" | "prizes" | "rewards" | "metrics";
|
|
215
|
+
interface WSSubscribeMessage {
|
|
216
|
+
type: "subscribe";
|
|
217
|
+
channels: WSChannel[];
|
|
218
|
+
tournamentIds?: string[];
|
|
219
|
+
}
|
|
220
|
+
interface WSUnsubscribeMessage {
|
|
221
|
+
type: "unsubscribe";
|
|
222
|
+
channels: WSChannel[];
|
|
223
|
+
}
|
|
224
|
+
interface WSEventMessage {
|
|
225
|
+
type: "event";
|
|
226
|
+
channel: WSChannel;
|
|
227
|
+
data: unknown;
|
|
228
|
+
timestamp: string;
|
|
229
|
+
}
|
|
230
|
+
type WSMessage = WSSubscribeMessage | WSUnsubscribeMessage | WSEventMessage;
|
|
231
|
+
interface WSSubscribeOptions {
|
|
232
|
+
channels: WSChannel[];
|
|
233
|
+
tournamentIds?: string[];
|
|
234
|
+
}
|
|
235
|
+
type WSEventHandler = (message: WSEventMessage) => void;
|
|
236
|
+
|
|
237
|
+
type ConnectionMode = "api" | "rpc-fallback" | "offline";
|
|
238
|
+
interface ServiceStatus {
|
|
239
|
+
available: boolean;
|
|
240
|
+
lastChecked: number;
|
|
241
|
+
latency: number | null;
|
|
242
|
+
error: string | null;
|
|
243
|
+
}
|
|
244
|
+
interface ConnectionStatusState {
|
|
245
|
+
api: ServiceStatus;
|
|
246
|
+
rpc: ServiceStatus;
|
|
247
|
+
mode: ConnectionMode;
|
|
248
|
+
initialCheckComplete: boolean;
|
|
249
|
+
}
|
|
250
|
+
type StatusListener = (status: ConnectionStatusState) => void;
|
|
251
|
+
interface HealthTimingConfig {
|
|
252
|
+
initialCheckDelay?: number;
|
|
253
|
+
checkInterval?: number;
|
|
254
|
+
checkTimeout?: number;
|
|
255
|
+
}
|
|
256
|
+
declare class ConnectionStatus {
|
|
257
|
+
private status;
|
|
258
|
+
private listeners;
|
|
259
|
+
private checkInterval;
|
|
260
|
+
private initialCheckTimeout;
|
|
261
|
+
private apiUrl;
|
|
262
|
+
private rpcUrl;
|
|
263
|
+
private readonly initialCheckDelay;
|
|
264
|
+
private readonly checkIntervalMs;
|
|
265
|
+
private readonly checkTimeoutMs;
|
|
266
|
+
constructor(apiUrl: string, rpcUrl: string, config?: HealthTimingConfig);
|
|
267
|
+
getStatus(): ConnectionStatusState;
|
|
268
|
+
get mode(): ConnectionMode;
|
|
269
|
+
subscribe(listener: StatusListener): () => void;
|
|
270
|
+
startMonitoring(): void;
|
|
271
|
+
stopMonitoring(): void;
|
|
272
|
+
markApiUnavailable(error?: string): void;
|
|
273
|
+
markRpcUnavailable(error?: string): void;
|
|
274
|
+
checkNow(): Promise<void>;
|
|
275
|
+
destroy(): void;
|
|
276
|
+
private performHealthCheck;
|
|
277
|
+
private checkApi;
|
|
278
|
+
private checkRpc;
|
|
279
|
+
private updateStatus;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
/**
|
|
283
|
+
* Main client for interacting with the Budokan tournament system.
|
|
284
|
+
*
|
|
285
|
+
* Provides methods for querying tournaments, registrations, leaderboards,
|
|
286
|
+
* prizes, player stats, and activity events. Supports real-time updates
|
|
287
|
+
* via WebSocket subscriptions and automatic RPC fallback when the API is
|
|
288
|
+
* unavailable.
|
|
289
|
+
*
|
|
290
|
+
* @example
|
|
291
|
+
* ```ts
|
|
292
|
+
* // API-only (default, backward compatible)
|
|
293
|
+
* const client = new BudokanClient({
|
|
294
|
+
* apiBaseUrl: "https://budokan-api.provable.games",
|
|
295
|
+
* });
|
|
296
|
+
*
|
|
297
|
+
* // With RPC fallback
|
|
298
|
+
* const client = new BudokanClient({
|
|
299
|
+
* chain: "mainnet",
|
|
300
|
+
* apiBaseUrl: "https://budokan-api.provable.games",
|
|
301
|
+
* viewerAddress: "0x...",
|
|
302
|
+
* });
|
|
303
|
+
*
|
|
304
|
+
* // RPC-only (bypass API entirely)
|
|
305
|
+
* const client = new BudokanClient({
|
|
306
|
+
* primarySource: "rpc",
|
|
307
|
+
* rpcUrl: "https://api.cartridge.gg/x/starknet/mainnet/rpc/v0_10",
|
|
308
|
+
* viewerAddress: "0x...",
|
|
309
|
+
* });
|
|
310
|
+
* ```
|
|
311
|
+
*/
|
|
312
|
+
declare class BudokanClient {
|
|
313
|
+
private readonly resolvedConfig;
|
|
314
|
+
private readonly wsManager;
|
|
315
|
+
private readonly connectionStatus;
|
|
316
|
+
private cachedProvider;
|
|
317
|
+
private cachedViewerContract;
|
|
318
|
+
constructor(config: BudokanClientConfig);
|
|
319
|
+
/** Returns the resolved configuration. */
|
|
320
|
+
get clientConfig(): BudokanClientConfig;
|
|
321
|
+
/** Whether the WebSocket is currently connected. */
|
|
322
|
+
get wsConnected(): boolean;
|
|
323
|
+
/** Returns the current connection status (API, RPC, mode). */
|
|
324
|
+
getConnectionStatus(): ConnectionStatusState;
|
|
325
|
+
/** Subscribe to connection status changes. Returns an unsubscribe function. */
|
|
326
|
+
onConnectionStatusChange(listener: (status: ConnectionStatusState) => void): () => void;
|
|
327
|
+
private getProvider;
|
|
328
|
+
private getViewerContract;
|
|
329
|
+
private get apiCtx();
|
|
330
|
+
/**
|
|
331
|
+
* Fetch a paginated list of tournaments with optional filtering.
|
|
332
|
+
* Supports RPC fallback when API is unavailable.
|
|
333
|
+
*/
|
|
334
|
+
getTournaments(params?: TournamentListParams): Promise<PaginatedResult<Tournament>>;
|
|
335
|
+
/**
|
|
336
|
+
* Fetch a single tournament by its ID.
|
|
337
|
+
* Supports RPC fallback when API is unavailable.
|
|
338
|
+
*/
|
|
339
|
+
getTournament(tournamentId: string): Promise<Tournament>;
|
|
340
|
+
/**
|
|
341
|
+
* Fetch the leaderboard for a tournament.
|
|
342
|
+
* Supports RPC fallback when API is unavailable.
|
|
343
|
+
*/
|
|
344
|
+
getTournamentLeaderboard(tournamentId: string): Promise<LeaderboardEntry[]>;
|
|
345
|
+
/**
|
|
346
|
+
* Fetch registrations for a tournament.
|
|
347
|
+
* Supports RPC fallback when API is unavailable.
|
|
348
|
+
* Note: In RPC mode, `playerAddress` and `gameAddress` fields will be empty strings.
|
|
349
|
+
*/
|
|
350
|
+
getTournamentRegistrations(tournamentId: string, params?: {
|
|
351
|
+
limit?: number;
|
|
352
|
+
offset?: number;
|
|
353
|
+
}): Promise<PaginatedResult<Registration>>;
|
|
354
|
+
/**
|
|
355
|
+
* Fetch prizes for a tournament.
|
|
356
|
+
* Supports RPC fallback when API is unavailable.
|
|
357
|
+
*/
|
|
358
|
+
getTournamentPrizes(tournamentId: string): Promise<Prize[]>;
|
|
359
|
+
/**
|
|
360
|
+
* Fetch tournaments that a player has registered for.
|
|
361
|
+
* API-only — no RPC fallback available.
|
|
362
|
+
*/
|
|
363
|
+
getPlayerTournaments(address: string, params?: PlayerTournamentParams): Promise<PaginatedResult<PlayerTournament>>;
|
|
364
|
+
/**
|
|
365
|
+
* Fetch stats for a player.
|
|
366
|
+
* API-only — no RPC fallback available.
|
|
367
|
+
*/
|
|
368
|
+
getPlayerStats(address: string): Promise<PlayerStats>;
|
|
369
|
+
/**
|
|
370
|
+
* Fetch tournaments for a specific game.
|
|
371
|
+
* Supports RPC fallback when API is unavailable.
|
|
372
|
+
*/
|
|
373
|
+
getGameTournaments(gameAddress: string, params?: Omit<TournamentListParams, "gameAddress">): Promise<PaginatedResult<Tournament>>;
|
|
374
|
+
/**
|
|
375
|
+
* Fetch tournament stats for a specific game.
|
|
376
|
+
* API-only — no RPC fallback available.
|
|
377
|
+
*/
|
|
378
|
+
getGameStats(gameAddress: string): Promise<PlatformStats>;
|
|
379
|
+
/**
|
|
380
|
+
* Fetch reward claims for a tournament.
|
|
381
|
+
* API-only -- no RPC fallback available.
|
|
382
|
+
*/
|
|
383
|
+
getTournamentRewardClaims(tournamentId: string, params?: {
|
|
384
|
+
limit?: number;
|
|
385
|
+
offset?: number;
|
|
386
|
+
}): Promise<PaginatedResult<RewardClaim>>;
|
|
387
|
+
/**
|
|
388
|
+
* Fetch reward claims summary for a tournament.
|
|
389
|
+
* API-only -- no RPC fallback available.
|
|
390
|
+
*/
|
|
391
|
+
getTournamentRewardClaimsSummary(tournamentId: string): Promise<RewardClaimSummary>;
|
|
392
|
+
/**
|
|
393
|
+
* Fetch qualifications for a tournament.
|
|
394
|
+
* API-only -- no RPC fallback available.
|
|
395
|
+
*/
|
|
396
|
+
getTournamentQualifications(tournamentId: string, params?: {
|
|
397
|
+
limit?: number;
|
|
398
|
+
offset?: number;
|
|
399
|
+
}): Promise<PaginatedResult<QualificationEntry>>;
|
|
400
|
+
/**
|
|
401
|
+
* Fetch prize aggregation for a tournament.
|
|
402
|
+
* API-only -- no RPC fallback available.
|
|
403
|
+
*/
|
|
404
|
+
getTournamentPrizeAggregation(tournamentId: string): Promise<PrizeAggregation[]>;
|
|
405
|
+
/**
|
|
406
|
+
* Fetch activity events with optional filtering.
|
|
407
|
+
* API-only — no RPC fallback available.
|
|
408
|
+
*/
|
|
409
|
+
getActivity(params?: ActivityParams): Promise<PaginatedResult<ActivityEvent>>;
|
|
410
|
+
/**
|
|
411
|
+
* Fetch platform-wide activity stats.
|
|
412
|
+
* API-only — no RPC fallback available.
|
|
413
|
+
*/
|
|
414
|
+
getActivityStats(): Promise<PlatformStats>;
|
|
415
|
+
/**
|
|
416
|
+
* Fetch platform-wide prize stats.
|
|
417
|
+
* API-only — no RPC fallback available.
|
|
418
|
+
*/
|
|
419
|
+
getPrizeStats(): Promise<PrizeStats>;
|
|
420
|
+
/**
|
|
421
|
+
* Open a WebSocket connection for real-time updates.
|
|
422
|
+
*/
|
|
423
|
+
connect(): void;
|
|
424
|
+
/**
|
|
425
|
+
* Close the WebSocket connection.
|
|
426
|
+
*/
|
|
427
|
+
disconnect(): void;
|
|
428
|
+
/**
|
|
429
|
+
* Stop health monitoring and close all connections.
|
|
430
|
+
*/
|
|
431
|
+
destroy(): void;
|
|
432
|
+
/**
|
|
433
|
+
* Subscribe to WebSocket channels with optional tournament filtering.
|
|
434
|
+
* Returns an unsubscribe function.
|
|
435
|
+
*/
|
|
436
|
+
subscribe(channels: WSChannel[], handler: WSEventHandler, tournamentIds?: string[]): () => void;
|
|
437
|
+
/**
|
|
438
|
+
* Register a listener for WebSocket connection state changes.
|
|
439
|
+
* Returns an unsubscribe function.
|
|
440
|
+
*/
|
|
441
|
+
onWsConnectionChange(listener: (connected: boolean) => void): () => void;
|
|
442
|
+
}
|
|
443
|
+
/**
|
|
444
|
+
* Factory function for creating a BudokanClient instance.
|
|
445
|
+
*/
|
|
446
|
+
declare function createBudokanClient(config: BudokanClientConfig): BudokanClient;
|
|
447
|
+
|
|
448
|
+
export { type ActivityParams as A, BudokanClient as B, type ConnectionMode as C, type DataSource as D, type EntryFee as E, type GameConfig as G, type LeaderboardEntry as L, type PrizeAggregation as P, type QualificationEntry as Q, type Registration as R, type Schedule as S, type Tournament as T, type WSSubscribeOptions as W, type Prize as a, type PaginatedResult as b, type RewardClaim as c, type RewardClaimSummary as d, type TournamentListParams as e, type PlayerStats as f, type PlayerTournamentParams as g, type PlayerTournament as h, type PlatformStats as i, type ActivityEvent as j, type PrizeStats as k, type WSEventHandler as l, type BudokanClientConfig as m, ConnectionStatus as n, type ConnectionStatusState as o, type LeaderboardConfig as p, type Phase as q, type WSChannel as r, type WSEventMessage as s, type WSMessage as t, type WSSubscribeMessage as u, type WSUnsubscribeMessage as v, createBudokanClient as w };
|