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/LICENSE +21 -0
- package/README.md +135 -0
- package/dist/index.d.ts +154 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +212 -0
- package/dist/index.js.map +1 -0
- package/dist/stream.d.ts +72 -0
- package/dist/stream.d.ts.map +1 -0
- package/dist/stream.js +217 -0
- package/dist/stream.js.map +1 -0
- package/dist/types.d.ts +541 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +11 -0
- package/dist/types.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +3 -0
- package/dist/version.js.map +1 -0
- package/package.json +59 -0
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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"}
|