@structbuild/sdk 0.3.0 → 0.3.2

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.
@@ -1,90 +1,93 @@
1
- import type { Address } from "./common.js";
2
1
  import type { RetryConfig } from "./http.js";
2
+ import type { WsSchemas, WsAlertSchemas, WsAlertSubscribeMap, WsAlertEventDataMap, WsAlertEventName } from "./ws-helpers.js";
3
3
  export type ConnectionState = "disconnected" | "connecting" | "connected" | "reconnecting";
4
4
  export interface StructWebSocketConfig {
5
5
  apiKey: string;
6
6
  jwt?: string;
7
+ getJwt?: () => string | undefined;
7
8
  baseUrl?: string;
8
9
  reconnect?: RetryConfig;
10
+ subscribeTimeout?: number;
9
11
  }
10
- export interface PredictionTrade {
11
- id: string;
12
- hash: string;
13
- chain_id: number;
14
- block: number;
15
- confirmed_at: number;
16
- log_index: number;
17
- block_index?: number;
18
- order_hash?: string;
19
- trader: Address;
20
- taker: Address;
21
- side: number;
22
- condition_id: string | null;
23
- position_id: string;
24
- outcome: string | null;
25
- outcome_index: number | null;
26
- question: string | null;
27
- slug: string | null;
28
- event_slug?: string | null;
29
- usd_amount: string;
30
- shares_amount: string;
31
- price: number;
32
- probability: number | null;
33
- fee?: string;
34
- exchange?: number;
35
- trade_type?: number;
36
- }
37
- export interface EnrichedPredictionTrade {
38
- id: string;
39
- hash: string;
40
- block: number;
41
- confirmed_at: number;
42
- trader: Address;
43
- side: number;
44
- position_id: string;
45
- condition_id: string | null;
46
- outcome: string | null;
47
- outcome_index: number | null;
48
- question: string;
49
- slug: string;
50
- event_slug: string;
51
- image_url: string | null;
52
- market_id: string | null;
53
- title: string | null;
54
- usd_amount: string;
55
- shares_amount: string;
56
- price: number;
57
- probability: number | null;
58
- smart_money_score: number;
59
- insider_score: number;
60
- categories: string[];
61
- }
62
- export interface PredictionMarketMetadata {
63
- slug: string | null;
64
- question: string | null;
65
- outcome: string | null;
66
- outcome_index?: number | null;
67
- image_url?: string | null;
68
- }
69
- export interface PredictionWalletTrackingAlert {
70
- is_buy: boolean;
71
- trader: Address;
72
- condition_id: string | null;
73
- position_id: string;
74
- usd_amount: string;
75
- shares_amount: string;
76
- price: number;
77
- probability: number | null;
78
- metadata: PredictionMarketMetadata | null;
79
- confirmed_at: number;
80
- }
12
+ export type WsRoomId = "polymarket_trades" | "polymarket_asset_prices" | "polymarket_asset_window_updates" | "polymarket_market_metrics" | "polymarket_event_metrics" | "polymarket_position_metrics" | "polymarket_trader_pnl" | "polymarket_trader_positions" | "polymarket_accounts" | "polymarket_order_book" | "polymarket_clob_rewards";
13
+ export type WsFiltersOptionalRoom = "polymarket_trades" | "polymarket_asset_prices" | "polymarket_clob_rewards";
14
+ export type WsFiltersRequiredRoom = Exclude<WsRoomId, WsFiltersOptionalRoom>;
15
+ export type TradesSubscribeFilters = Omit<WsSchemas["TradesStreamSubscribeMessage"], "action">;
16
+ export type AssetPricesSubscribeFilters = Omit<WsSchemas["AssetPricesSubscribeMessage"], "action">;
17
+ export type AssetWindowUpdatesSubscribeFilters = Omit<WsSchemas["AssetWindowUpdatesSubscribeMessage"], "action">;
18
+ export type MarketMetricsSubscribeFilters = Omit<WsSchemas["MarketMetricsSubscribeMessage"], "action">;
19
+ export type EventMetricsSubscribeFilters = Omit<WsSchemas["EventMetricsSubscribeMessage"], "action">;
20
+ export type PositionMetricsSubscribeFilters = Omit<WsSchemas["PositionMetricsSubscribeMessage"], "action">;
21
+ export type TraderPnlSubscribeFilters = Omit<WsSchemas["TraderPnlSubscribeMessage"], "action">;
22
+ export type AccountsSubscribeFilters = Omit<WsSchemas["AccountsSubscribeMessage"], "action">;
23
+ export type OrderBookSubscribeFilters = Omit<WsSchemas["OrderBookSubscribeMessage"], "action">;
24
+ export type TraderPositionsSubscribeFilters = Omit<WsSchemas["TraderPositionsSubscribeMessage"], "action">;
25
+ export type ClobRewardsSubscribeFilters = Omit<WsSchemas["ClobRewardsSubscribeMessage"], "action">;
26
+ export type WsTradeType = NonNullable<TradesSubscribeFilters["trade_types"]>[number];
27
+ export type WsTradeStatus = NonNullable<TradesSubscribeFilters["status"]>;
28
+ export type WsAssetTimeframe = NonNullable<AssetWindowUpdatesSubscribeFilters["timeframes"]>[number];
29
+ export type TradeStreamEvent = WsSchemas["TradeStreamEvent"];
30
+ export type AssetPriceTickEvent = WsSchemas["AssetPriceTickEvent"];
31
+ export type AssetPriceWindowUpdateEvent = WsSchemas["AssetPriceWindowUpdateEvent"];
32
+ export type AssetWindowUpdateEvent = WsSchemas["AssetWindowUpdateEvent"];
33
+ export type MarketMetricsEvent = WsSchemas["MarketMetricsEvent"];
34
+ export type EventMetricsEvent = WsSchemas["EventMetricsEvent"];
35
+ export type PositionMetricsEvent = WsSchemas["PositionMetricsEvent"];
36
+ export type TraderGlobalPnlEvent = WsSchemas["TraderGlobalPnlEvent"];
37
+ export type TraderMarketPnlEvent = WsSchemas["TraderMarketPnlEvent"];
38
+ export type TraderEventPnlEvent = WsSchemas["TraderEventPnlEvent"];
39
+ export type AccountsUpdateEvent = WsSchemas["AccountsUpdateEvent"];
40
+ export type UsdceUpdateEvent = WsSchemas["UsdceUpdateEvent"];
41
+ export type MaticUpdateEvent = WsSchemas["MaticUpdateEvent"];
42
+ export type WsOrderBookLevel = WsSchemas["OrderBookLevel"];
43
+ export type OrderBookUpdateEvent = WsSchemas["OrderBookUpdateEvent"];
44
+ export type TraderPositionUpdateEvent = WsSchemas["TraderPositionUpdateEvent"];
45
+ export type TraderPositionsSubscribeResponse = WsSchemas["TraderPositionsSubscribeResponse"];
46
+ export type ClobRewardsUpdateEvent = WsSchemas["ClobRewardsUpdateEvent"];
47
+ export type ClobRewardsSubscribeResponse = WsSchemas["ClobRewardsSubscribeResponse"];
48
+ export type TradeOrderFilledEvent = WsSchemas["TradeOrderFilledEvent"];
49
+ export type TradeRedemptionEvent = WsSchemas["TradeRedemptionEvent"];
50
+ export type TradeMergeEvent = WsSchemas["TradeMergeEvent"];
51
+ export type TradeSplitEvent = WsSchemas["TradeSplitEvent"];
52
+ export type TradePositionsConvertedEvent = WsSchemas["TradePositionsConvertedEvent"];
53
+ export type TradeCancelledEvent = WsSchemas["TradeCancelledEvent"];
54
+ export type TradeOracleLifecycleEvent = WsSchemas["TradeOracleLifecycleEvent"];
55
+ export type TradeRegisterTokenEvent = WsSchemas["TradeRegisterTokenEvent"];
56
+ export type TradeApprovalEvent = WsSchemas["TradeApprovalEvent"];
57
+ export type WsAlertSubscribeMessage = WsAlertSchemas["WsAlertSubscribeMessage"];
58
+ export type WsAlertUnsubscribeMessage = WsAlertSchemas["WsAlertUnsubscribeMessage"];
59
+ export type WsAlertEventPayload = WsAlertSchemas["WsAlertEventPayload"];
60
+ export type WsAlertSubscribedResponse = WsAlertSchemas["WsAlertSubscribedResponse"];
61
+ export type WsAlertUnsubscribedResponse = WsAlertSchemas["WsAlertUnsubscribedResponse"];
62
+ export type WsAlertErrorResponse = WsAlertSchemas["WsAlertErrorResponse"];
63
+ export type WsAlertEventType = WsAlertSchemas["WsAlertEventType"];
64
+ export type { WsAlertSubscribeMap, WsAlertEventDataMap, WsAlertEventName };
65
+ export type TradesStreamSubscribeResponse = WsSchemas["TradesStreamSubscribeResponse"];
66
+ export type AssetPricesSubscribeResponse = WsSchemas["AssetPricesSubscribeResponse"];
67
+ export type AssetWindowUpdatesSubscribeResponse = WsSchemas["AssetWindowUpdatesSubscribeResponse"];
68
+ export type MarketMetricsSubscribeResponse = WsSchemas["MarketMetricsSubscribeResponse"];
69
+ export type EventMetricsSubscribeResponse = WsSchemas["EventMetricsSubscribeResponse"];
70
+ export type PositionMetricsSubscribeResponse = WsSchemas["PositionMetricsSubscribeResponse"];
71
+ export type TraderPnlSubscribeResponse = WsSchemas["TraderPnlSubscribeResponse"];
72
+ export type AccountsSubscribeResponse = WsSchemas["AccountsSubscribeResponse"];
73
+ export type OrderBookSubscribeResponse = WsSchemas["OrderBookSubscribeResponse"];
81
74
  export interface WebSocketEventMap {
82
- market_trade: PredictionTrade;
83
- whale_trade: EnrichedPredictionTrade;
84
- smart_money_trade: EnrichedPredictionTrade;
85
- insider_trade: EnrichedPredictionTrade;
86
- wallet_tracking_alert: PredictionWalletTrackingAlert;
87
- conditions_tracking_alert: PredictionTrade;
75
+ trade_stream_update: TradeStreamEvent;
76
+ asset_price_tick: AssetPriceTickEvent;
77
+ asset_price_window_update: AssetPriceWindowUpdateEvent;
78
+ asset_window_update: AssetWindowUpdateEvent;
79
+ market_metrics_update: MarketMetricsEvent;
80
+ event_metrics_update: EventMetricsEvent;
81
+ position_metrics_update: PositionMetricsEvent;
82
+ trader_global_pnl_update: TraderGlobalPnlEvent;
83
+ trader_market_pnl_update: TraderMarketPnlEvent;
84
+ trader_event_pnl_update: TraderEventPnlEvent;
85
+ accounts_update: AccountsUpdateEvent;
86
+ usdce_update: UsdceUpdateEvent;
87
+ matic_update: MaticUpdateEvent;
88
+ order_book_update: OrderBookUpdateEvent;
89
+ trader_position_update: TraderPositionUpdateEvent;
90
+ clob_rewards_update: ClobRewardsUpdateEvent;
88
91
  connected: void;
89
92
  disconnected: {
90
93
  code: number;
@@ -93,19 +96,54 @@ export interface WebSocketEventMap {
93
96
  reconnecting: {
94
97
  attempt: number;
95
98
  };
99
+ reconnect_failed: Error;
100
+ auth_failed: Error;
96
101
  error: Error;
102
+ warning: Error;
97
103
  }
98
- export interface WebSocketMessage {
99
- type: string;
100
- room_id?: string;
101
- action?: string;
102
- message?: Record<string, unknown>;
103
- wallet_addresses?: string[];
104
- condition_ids?: string[];
104
+ export interface WsSubscriptionMap {
105
+ polymarket_trades: TradesSubscribeFilters;
106
+ polymarket_asset_prices: AssetPricesSubscribeFilters;
107
+ polymarket_asset_window_updates: AssetWindowUpdatesSubscribeFilters;
108
+ polymarket_market_metrics: MarketMetricsSubscribeFilters;
109
+ polymarket_event_metrics: EventMetricsSubscribeFilters;
110
+ polymarket_position_metrics: PositionMetricsSubscribeFilters;
111
+ polymarket_trader_pnl: TraderPnlSubscribeFilters;
112
+ polymarket_trader_positions: TraderPositionsSubscribeFilters;
113
+ polymarket_accounts: AccountsSubscribeFilters;
114
+ polymarket_order_book: OrderBookSubscribeFilters;
115
+ polymarket_clob_rewards: ClobRewardsSubscribeFilters;
105
116
  }
106
- export interface WebSocketServerMessage {
107
- type: string;
108
- data?: unknown;
109
- room_id?: string;
110
- message?: string;
117
+ export interface WsSubscribeResponseMap {
118
+ polymarket_trades: TradesStreamSubscribeResponse;
119
+ polymarket_asset_prices: AssetPricesSubscribeResponse;
120
+ polymarket_asset_window_updates: AssetWindowUpdatesSubscribeResponse;
121
+ polymarket_market_metrics: MarketMetricsSubscribeResponse;
122
+ polymarket_event_metrics: EventMetricsSubscribeResponse;
123
+ polymarket_position_metrics: PositionMetricsSubscribeResponse;
124
+ polymarket_trader_pnl: TraderPnlSubscribeResponse;
125
+ polymarket_trader_positions: TraderPositionsSubscribeResponse;
126
+ polymarket_accounts: AccountsSubscribeResponse;
127
+ polymarket_order_book: OrderBookSubscribeResponse;
128
+ polymarket_clob_rewards: ClobRewardsSubscribeResponse;
111
129
  }
130
+ export type AlertsWebSocketEventMap = {
131
+ [E in WsAlertEventName]: {
132
+ event: E;
133
+ timestamp: number;
134
+ data: WsAlertEventDataMap[E];
135
+ };
136
+ } & {
137
+ connected: void;
138
+ disconnected: {
139
+ code: number;
140
+ reason: string;
141
+ };
142
+ reconnecting: {
143
+ attempt: number;
144
+ };
145
+ reconnect_failed: Error;
146
+ auth_failed: Error;
147
+ error: Error;
148
+ warning: Error;
149
+ };
@@ -0,0 +1,39 @@
1
+ import type { ConnectionState, StructWebSocketConfig, AlertsWebSocketEventMap, WsAlertSubscribedResponse } from "./types/ws.js";
2
+ import type { WsAlertSubscribeMap, WsAlertEventName } from "./types/ws-helpers.js";
3
+ type Listener<T> = (payload: T) => void;
4
+ export declare class StructAlertsWebSocket {
5
+ private readonly transport;
6
+ private readonly listeners;
7
+ private readonly subscriptions;
8
+ private readonly pendingSubscribes;
9
+ private readonly subscribeTimeout;
10
+ private pingTimer;
11
+ private pongTimer;
12
+ private isEmittingListenerError;
13
+ constructor(config: StructWebSocketConfig);
14
+ get state(): ConnectionState;
15
+ connect(): Promise<void>;
16
+ disconnect(): void;
17
+ on<K extends keyof AlertsWebSocketEventMap>(event: K, listener: Listener<AlertsWebSocketEventMap[K]>): () => void;
18
+ off<K extends keyof AlertsWebSocketEventMap>(event: K, listener: Listener<AlertsWebSocketEventMap[K]>): void;
19
+ once<K extends keyof AlertsWebSocketEventMap>(event: K, listener: Listener<AlertsWebSocketEventMap[K]>): () => void;
20
+ removeAllListeners(event?: keyof AlertsWebSocketEventMap): void;
21
+ subscribe<E extends WsAlertEventName>(event: E, filters: Omit<WsAlertSubscribeMap[E], "op" | "event">): Promise<WsAlertSubscribedResponse>;
22
+ unsubscribe(event: WsAlertEventName): void;
23
+ private rebuildReplay;
24
+ private handleOpen;
25
+ private handleClose;
26
+ private handleMessage;
27
+ private emit;
28
+ private startPing;
29
+ private stopPing;
30
+ private sendSubscription;
31
+ private restartPendingSubscribes;
32
+ private pausePendingSubscribes;
33
+ private armSubscribeTimer;
34
+ private clearSubscribeTimer;
35
+ private armPongTimer;
36
+ private clearPongTimer;
37
+ private handleListenerError;
38
+ }
39
+ export {};
@@ -1,11 +1,20 @@
1
- import type { ConnectionState, WebSocketMessage } from "./types/ws.js";
1
+ import { WebSocketClosedError } from "./errors.js";
2
+ import type { ConnectionState } from "./types/ws.js";
2
3
  import type { RetryConfig } from "./types/http.js";
4
+ export declare function buildWebSocketUrl(path: string, config: {
5
+ apiKey: string;
6
+ jwt?: string;
7
+ baseUrl?: string;
8
+ }, defaultBaseUrl: string): string;
3
9
  export interface WebSocketTransportCallbacks {
4
10
  onOpen: () => void;
5
11
  onClose: (code: number, reason: string) => void;
6
12
  onError: (error: Error) => void;
7
13
  onMessage: (data: unknown) => void;
8
14
  onReconnecting: (attempt: number) => void;
15
+ onReconnectFailed: (error: Error) => void;
16
+ onAuthFailed: (error: WebSocketClosedError) => void;
17
+ onWarning: (warning: Error) => void;
9
18
  }
10
19
  export declare class WebSocketTransport {
11
20
  private ws;
@@ -13,23 +22,33 @@ export declare class WebSocketTransport {
13
22
  private reconnectTimer;
14
23
  private reconnectAttempt;
15
24
  private intentionalClose;
25
+ private readonly connectWaiters;
16
26
  private readonly pendingMessages;
17
27
  private readonly replayMessages;
18
- private readonly url;
28
+ private readonly getUrl;
19
29
  private readonly retry;
20
30
  private readonly callbacks;
21
- constructor(url: string, retry: RetryConfig, callbacks: WebSocketTransportCallbacks);
31
+ constructor(url: string | (() => string), retry: RetryConfig, callbacks: WebSocketTransportCallbacks);
22
32
  get state(): ConnectionState;
23
- connect(): void;
33
+ connect(): Promise<void>;
24
34
  disconnect(): void;
25
- send(message: WebSocketMessage): void;
26
- addReplayMessage(message: WebSocketMessage): void;
27
- removeReplayMessages(predicate: (msg: WebSocketMessage) => boolean): void;
35
+ send(message: Record<string, unknown>): boolean;
36
+ sendNow(message: Record<string, unknown>): boolean;
37
+ addReplayMessage(message: Record<string, unknown>): void;
38
+ addReplayMessages(messages: Record<string, unknown>[]): void;
28
39
  clearReplayMessages(): void;
40
+ close(code: number, reason: string): void;
41
+ private createConnectPromise;
42
+ private resolveConnect;
43
+ private rejectConnect;
29
44
  private createSocket;
30
45
  private replaySubscriptions;
31
46
  private flushPendingMessages;
32
47
  private scheduleReconnect;
33
48
  private clearReconnectTimer;
49
+ private sendMessage;
50
+ private enqueueMessage;
51
+ private enqueueReplayMessages;
52
+ private isAuthFailure;
34
53
  private setState;
35
54
  }
package/dist/ws.d.ts CHANGED
@@ -1,46 +1,41 @@
1
- import type { ConnectionState, StructWebSocketConfig, WebSocketEventMap } from "./types/ws.js";
2
- import type { Address } from "./types/common.js";
1
+ import type { ConnectionState, StructWebSocketConfig, WebSocketEventMap, WsRoomId, WsFiltersOptionalRoom, WsFiltersRequiredRoom, WsSubscriptionMap, WsSubscribeResponseMap } from "./types/ws.js";
3
2
  type Listener<T> = (payload: T) => void;
4
3
  export declare class StructWebSocket {
5
4
  private readonly transport;
6
5
  private readonly listeners;
7
- private readonly activeMarkets;
8
- private readonly activeMarketPositions;
9
- private readonly activeWallets;
10
- private readonly activeConditions;
11
- private readonly activeSpecialRooms;
6
+ private readonly subscriptions;
7
+ private readonly pendingSubscribes;
8
+ private readonly subscribeTimeout;
9
+ private pingTimer;
10
+ private pongTimer;
11
+ private isEmittingListenerError;
12
12
  constructor(config: StructWebSocketConfig);
13
13
  get state(): ConnectionState;
14
- connect(): void;
14
+ connect(): Promise<void>;
15
15
  disconnect(): void;
16
- on<K extends keyof WebSocketEventMap>(event: K, listener: Listener<WebSocketEventMap[K]>): this;
17
- off<K extends keyof WebSocketEventMap>(event: K, listener: Listener<WebSocketEventMap[K]>): this;
18
- once<K extends keyof WebSocketEventMap>(event: K, listener: Listener<WebSocketEventMap[K]>): this;
19
- subscribeMarket(conditionId: string): void;
20
- unsubscribeMarket(conditionId: string): void;
21
- subscribeMarketByPosition(positionId: string): void;
22
- unsubscribeMarketByPosition(positionId: string): void;
23
- trackWallets(addresses: Address[]): void;
24
- untrackWallets(addresses: Address[]): void;
25
- subscribeWhaleTrades(): void;
26
- unsubscribeWhaleTrades(): void;
27
- subscribeSmartMoneyTrades(): void;
28
- unsubscribeSmartMoneyTrades(): void;
29
- subscribeInsiderTrades(): void;
30
- unsubscribeInsiderTrades(): void;
31
- trackConditions(conditionIds: string[]): void;
32
- untrackConditions(conditionIds: string[]): void;
16
+ on<K extends keyof WebSocketEventMap>(event: K, listener: Listener<WebSocketEventMap[K]>): () => void;
17
+ off<K extends keyof WebSocketEventMap>(event: K, listener: Listener<WebSocketEventMap[K]>): void;
18
+ once<K extends keyof WebSocketEventMap>(event: K, listener: Listener<WebSocketEventMap[K]>): () => void;
19
+ removeAllListeners(event?: keyof WebSocketEventMap): void;
20
+ subscribe<R extends WsFiltersOptionalRoom>(room: R, filters?: WsSubscriptionMap[R]): Promise<WsSubscribeResponseMap[R]>;
21
+ subscribe<R extends WsFiltersRequiredRoom>(room: R, filters: WsSubscriptionMap[R]): Promise<WsSubscribeResponseMap[R]>;
22
+ unsubscribe(room: WsRoomId): void;
23
+ private rebuildReplay;
33
24
  private handleOpen;
34
25
  private handleClose;
35
26
  private handleMessage;
27
+ private isSubscribeResponseMessage;
36
28
  private emit;
37
- private marketSubscribeMessage;
38
- private marketPositionSubscribeMessage;
39
- private walletTrackMessage;
40
- private conditionsTrackMessage;
41
- private subscribeSpecialRoom;
42
- private unsubscribeSpecialRoom;
43
- private rebuildWalletReplay;
44
- private rebuildConditionsReplay;
29
+ private startPing;
30
+ private stopPing;
31
+ private sendSubscription;
32
+ private restartPendingSubscribes;
33
+ private pausePendingSubscribes;
34
+ private armSubscribeTimer;
35
+ private clearSubscribeTimer;
36
+ private armPongTimer;
37
+ private clearPongTimer;
38
+ private getSubscribeError;
39
+ private handleListenerError;
45
40
  }
46
41
  export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@structbuild/sdk",
3
- "version": "0.3.0",
3
+ "version": "0.3.2",
4
4
  "type": "module",
5
5
  "main": "./dist/index.cjs",
6
6
  "module": "./dist/index.js",
@@ -24,14 +24,18 @@
24
24
  "build": "rm -rf dist && bun build ./src/index.ts --target browser --format esm --sourcemap --outdir ./dist && bun build ./src/index.ts --target browser --format cjs --sourcemap --outdir ./dist-cjs && mv ./dist-cjs/index.js ./dist/index.cjs && mv ./dist-cjs/index.js.map ./dist/index.cjs.map && rm -rf dist-cjs && tsc --emitDeclarationOnly",
25
25
  "check-routes": "bun run scripts/check-routes.ts",
26
26
  "fix-spec": "bun run scripts/fix-spec.ts",
27
- "prep": "bun run fetch-spec:polymarket && bun run fix-spec && bun run generate:polymarket && bun run fetch-spec:webhooks && bun run generate:webhooks && bun run check-routes && bun run build",
27
+ "fetch-specs": "bun run scripts/fetch-specs.ts",
28
+ "prep": "bun run fetch-specs && bun run fix-spec && bun run generate:polymarket && bun run generate:webhooks && bun run generate:ws && bun run check-routes && bun run build",
29
+ "prep:staging": "STRUCT_ENV=staging bun run prep",
28
30
  "test": "bun test",
31
+ "test:ws:live": "bun test tests/ws.live.test.ts --timeout 900000",
29
32
  "test:watch": "bun test --watch",
30
33
  "typecheck": "bun run tsc -p tsconfig.check.json",
31
- "fetch-spec:polymarket": "curl -s -o openapi/polymarket.json https://api.struct.to/api-docs/openapi.json",
32
34
  "generate:polymarket": "openapi-typescript openapi/polymarket.json -o src/generated/polymarket.ts",
33
- "fetch-spec:webhooks": "curl -s -o openapi/webhooks.json https://api.struct.to/webhookopenapi.json",
34
- "generate:webhooks": "openapi-typescript openapi/webhooks.json -o src/generated/webhooks.ts"
35
+ "generate:webhooks": "openapi-typescript openapi/webhooks.json -o src/generated/webhooks.ts",
36
+ "generate:ws": "bun run scripts/generate-ws-types.ts",
37
+ "link": "bun link",
38
+ "pack": "bun run build && bun pm pack"
35
39
  },
36
40
  "devDependencies": {
37
41
  "@types/bun": "latest",