robinhood-chain-x402 0.1.0

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/stream.js ADDED
@@ -0,0 +1,217 @@
1
+ async function resolveWebSocket(override) {
2
+ if (override)
3
+ return override;
4
+ // Prefer the `ws` package in Node: it exposes terminate() for an immediate
5
+ // socket teardown, so close() lets short-lived processes exit. The global
6
+ // (undici) WebSocket on Node 22+ keeps its TLS socket open after close() —
7
+ // it has no terminate() and no reachable socket handle — which hangs the
8
+ // event loop. In the browser this import rejects and we fall back to the
9
+ // platform's native WebSocket.
10
+ try {
11
+ const mod = (await import("ws"));
12
+ const impl = mod.default ?? mod.WebSocket;
13
+ if (impl)
14
+ return impl;
15
+ }
16
+ catch {
17
+ /* not Node, or `ws` not installed — fall back to the platform WebSocket */
18
+ }
19
+ const g = globalThis.WebSocket;
20
+ if (g)
21
+ return g;
22
+ throw new Error("No WebSocket implementation available. On Node < 22, install `ws` (npm i ws) or pass { WebSocketImpl }.");
23
+ }
24
+ const OPEN = 1;
25
+ export class RobinhoodChainStream {
26
+ opts;
27
+ ws = null;
28
+ listeners = new Map();
29
+ desired = { channels: new Set(), filters: {} };
30
+ closedByUser = false;
31
+ attempt = 0;
32
+ hbTimer = null;
33
+ reconnectTimer = null;
34
+ connecting = false;
35
+ constructor(opts) {
36
+ this.opts = {
37
+ getToken: opts.getToken,
38
+ autoReconnect: opts.autoReconnect ?? true,
39
+ maxBackoffMs: opts.maxBackoffMs ?? 30_000,
40
+ heartbeatTimeoutMs: opts.heartbeatTimeoutMs ?? 90_000,
41
+ WebSocketImpl: opts.WebSocketImpl,
42
+ };
43
+ }
44
+ /** Register a handler. Use an event name, `"*"` for every event, or a lifecycle event. */
45
+ on(event, fn) {
46
+ if (!this.listeners.has(event))
47
+ this.listeners.set(event, new Set());
48
+ this.listeners.get(event).add(fn);
49
+ return this;
50
+ }
51
+ /** Remove a handler (or all handlers for an event when `fn` is omitted). */
52
+ off(event, fn) {
53
+ if (!fn)
54
+ this.listeners.delete(event);
55
+ else
56
+ this.listeners.get(event)?.delete(fn);
57
+ return this;
58
+ }
59
+ emit(event, data, evt) {
60
+ const set = this.listeners.get(event);
61
+ if (set)
62
+ for (const fn of set) {
63
+ try {
64
+ fn(data, evt);
65
+ }
66
+ catch { /* user handler */ }
67
+ }
68
+ }
69
+ /** Subscribe to one or more channels (connects on first call). Optional server-side filters. */
70
+ subscribe(channels, filters) {
71
+ for (const c of channels)
72
+ this.desired.channels.add(c);
73
+ if (filters)
74
+ this.desired.filters = { ...this.desired.filters, ...filters };
75
+ if (this.ws && this.ws.readyState === OPEN)
76
+ this.sendSubscribe();
77
+ else
78
+ void this.connect();
79
+ return this;
80
+ }
81
+ /** Stop receiving the given channels. */
82
+ unsubscribe(channels) {
83
+ for (const c of channels)
84
+ this.desired.channels.delete(c);
85
+ if (this.ws && this.ws.readyState === OPEN) {
86
+ this.ws.send(JSON.stringify({ type: "unsubscribe", channels }));
87
+ }
88
+ return this;
89
+ }
90
+ /** Open the connection (also called implicitly by subscribe). */
91
+ async connect() {
92
+ if (this.connecting || (this.ws && this.ws.readyState === OPEN))
93
+ return;
94
+ this.closedByUser = false;
95
+ this.connecting = true;
96
+ try {
97
+ const [WS, token] = await Promise.all([
98
+ resolveWebSocket(this.opts.WebSocketImpl),
99
+ this.opts.getToken(),
100
+ ]);
101
+ const url = `${token.ws_url}?token=${encodeURIComponent(token.token)}`;
102
+ const ws = new WS(url);
103
+ this.ws = ws;
104
+ ws.onopen = () => {
105
+ this.attempt = 0;
106
+ this.resetHeartbeat();
107
+ if (this.desired.channels.size > 0)
108
+ this.sendSubscribe();
109
+ this.emit("open", undefined);
110
+ };
111
+ ws.onmessage = (ev) => this.handleMessage(ev.data);
112
+ ws.onerror = (err) => this.emit("error", err instanceof Error ? err : new Error("WebSocket error"));
113
+ ws.onclose = (ev) => {
114
+ this.clearHeartbeat();
115
+ this.ws = null;
116
+ this.emit("close", { code: ev?.code, reason: ev?.reason });
117
+ if (!this.closedByUser && this.opts.autoReconnect)
118
+ this.scheduleReconnect();
119
+ };
120
+ }
121
+ catch (err) {
122
+ this.emit("error", err);
123
+ if (!this.closedByUser && this.opts.autoReconnect)
124
+ this.scheduleReconnect();
125
+ }
126
+ finally {
127
+ this.connecting = false;
128
+ }
129
+ }
130
+ /** Close the connection and stop reconnecting. */
131
+ close() {
132
+ this.closedByUser = true;
133
+ if (this.reconnectTimer) {
134
+ clearTimeout(this.reconnectTimer);
135
+ this.reconnectTimer = null;
136
+ }
137
+ this.clearHeartbeat();
138
+ const sock = this.ws;
139
+ this.ws = null;
140
+ try {
141
+ // `ws` package: terminate() destroys the underlying socket immediately so
142
+ // the process can exit. Native/undici WebSocket has no terminate() — fall
143
+ // back to a graceful close().
144
+ if (typeof sock?.terminate === "function")
145
+ sock.terminate();
146
+ else
147
+ sock?.close(1000, "client closed");
148
+ }
149
+ catch { /* ignore */ }
150
+ }
151
+ sendSubscribe() {
152
+ const channels = Array.from(this.desired.channels);
153
+ if (channels.length === 0)
154
+ return;
155
+ const msg = { type: "subscribe", channels };
156
+ if (Object.keys(this.desired.filters).length > 0)
157
+ msg.filters = this.desired.filters;
158
+ this.ws?.send(JSON.stringify(msg));
159
+ }
160
+ handleMessage(raw) {
161
+ let msg;
162
+ try {
163
+ const text = typeof raw === "string" ? raw : String(raw);
164
+ msg = JSON.parse(text);
165
+ }
166
+ catch {
167
+ this.emit("error", new Error("Failed to parse stream message"));
168
+ return;
169
+ }
170
+ if (msg.type === "heartbeat") {
171
+ this.resetHeartbeat();
172
+ this.emit("heartbeat", msg.ts);
173
+ return;
174
+ }
175
+ if (msg.type === "connected") {
176
+ return;
177
+ } // 'open' already emitted on socket open
178
+ if (msg.type === "subscribed") {
179
+ this.emit("subscribed", msg.channels);
180
+ return;
181
+ }
182
+ if (msg.channel && msg.event) {
183
+ const evt = msg;
184
+ this.emit(evt.event, evt.data, evt);
185
+ this.emit("*", evt.data, evt);
186
+ }
187
+ }
188
+ scheduleReconnect() {
189
+ if (this.reconnectTimer)
190
+ return;
191
+ const base = Math.min(1000 * 2 ** this.attempt, this.opts.maxBackoffMs);
192
+ const delay = base / 2 + Math.floor((base / 2) * Math.random()); // jitter
193
+ this.attempt++;
194
+ this.emit("reconnect", { attempt: this.attempt, delayMs: delay });
195
+ this.reconnectTimer = setTimeout(() => {
196
+ this.reconnectTimer = null;
197
+ void this.connect();
198
+ }, delay);
199
+ }
200
+ resetHeartbeat() {
201
+ this.clearHeartbeat();
202
+ this.hbTimer = setTimeout(() => {
203
+ // Server went quiet — force a reconnect.
204
+ try {
205
+ this.ws?.close(4000, "heartbeat timeout");
206
+ }
207
+ catch { /* ignore */ }
208
+ }, this.opts.heartbeatTimeoutMs);
209
+ }
210
+ clearHeartbeat() {
211
+ if (this.hbTimer) {
212
+ clearTimeout(this.hbTimer);
213
+ this.hbTimer = null;
214
+ }
215
+ }
216
+ }
217
+ //# sourceMappingURL=stream.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream.js","sourceRoot":"","sources":["../src/stream.ts"],"names":[],"mappings":"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"}