@nevuamarkets/poly-websockets 0.2.0 → 0.2.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.
- package/dist/modules/GroupSocket.js +68 -58
- package/package.json +1 -1
- package/src/modules/GroupSocket.ts +66 -57
|
@@ -113,74 +113,84 @@ class GroupSocket {
|
|
|
113
113
|
}, (0, crypto_1.randomInt)((0, ms_1.default)('15s'), (0, ms_1.default)('25s')));
|
|
114
114
|
};
|
|
115
115
|
const handleMessage = async (data) => {
|
|
116
|
-
var _a, _b;
|
|
117
|
-
const messageStr = data.toString();
|
|
118
|
-
// Handle PONG messages that might be sent to message handler during handler reattachment
|
|
119
|
-
if (messageStr === 'PONG') {
|
|
120
|
-
return;
|
|
121
|
-
}
|
|
122
|
-
let events = [];
|
|
116
|
+
var _a, _b, _c;
|
|
123
117
|
try {
|
|
124
|
-
const
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
return;
|
|
130
|
-
}
|
|
131
|
-
// Filter events to ensure validity
|
|
132
|
-
events = lodash_1.default.filter(events, (event) => {
|
|
133
|
-
// For price_change events, check that price_changes array exists
|
|
134
|
-
if ((0, PolymarketWebSocket_1.isPriceChangeEvent)(event)) {
|
|
135
|
-
return event.price_changes && event.price_changes.length > 0;
|
|
118
|
+
const messageStr = data.toString();
|
|
119
|
+
const normalizedMessageStr = messageStr.trim().toUpperCase();
|
|
120
|
+
// Handle PONG messages that might be sent to message handler during handler reattachment
|
|
121
|
+
if (normalizedMessageStr === 'PONG') {
|
|
122
|
+
return;
|
|
136
123
|
}
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
const lastTradeEvents = [];
|
|
142
|
-
const tickEvents = [];
|
|
143
|
-
const priceChangeEvents = [];
|
|
144
|
-
for (const event of events) {
|
|
145
|
-
/*
|
|
146
|
-
Skip events for asset ids that are not in the group to ensure that
|
|
147
|
-
we don't get stale events for assets that were removed.
|
|
148
|
-
*/
|
|
149
|
-
if ((0, PolymarketWebSocket_1.isPriceChangeEvent)(event)) {
|
|
150
|
-
// Check if any of the price_changes are for assets in this group
|
|
151
|
-
const relevantChanges = event.price_changes.filter(price_change_item => group.assetIds.has(price_change_item.asset_id));
|
|
152
|
-
if (relevantChanges.length === 0) {
|
|
153
|
-
continue;
|
|
154
|
-
}
|
|
155
|
-
// Only include relevant changes
|
|
156
|
-
priceChangeEvents.push({
|
|
157
|
-
...event,
|
|
158
|
-
price_changes: relevantChanges
|
|
159
|
-
});
|
|
124
|
+
let events = [];
|
|
125
|
+
try {
|
|
126
|
+
const parsedData = JSON.parse(messageStr);
|
|
127
|
+
events = Array.isArray(parsedData) ? parsedData : [parsedData];
|
|
160
128
|
}
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
129
|
+
catch (err) {
|
|
130
|
+
await ((_a = handlers.onError) === null || _a === void 0 ? void 0 : _a.call(handlers, new Error(`Not JSON: ${messageStr}`)));
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
// Filter events to ensure validity
|
|
134
|
+
events = lodash_1.default.filter(events, (event) => {
|
|
135
|
+
if (!event) {
|
|
136
|
+
return false;
|
|
168
137
|
}
|
|
169
|
-
|
|
170
|
-
|
|
138
|
+
// For price_change events, check that price_changes array exists
|
|
139
|
+
if ((0, PolymarketWebSocket_1.isPriceChangeEvent)(event)) {
|
|
140
|
+
return event.price_changes && event.price_changes.length > 0;
|
|
171
141
|
}
|
|
172
|
-
|
|
173
|
-
|
|
142
|
+
// For all other events, check asset_id
|
|
143
|
+
return lodash_1.default.size(event.asset_id) > 0;
|
|
144
|
+
});
|
|
145
|
+
const bookEvents = [];
|
|
146
|
+
const lastTradeEvents = [];
|
|
147
|
+
const tickEvents = [];
|
|
148
|
+
const priceChangeEvents = [];
|
|
149
|
+
for (const event of events) {
|
|
150
|
+
/*
|
|
151
|
+
Skip events for asset ids that are not in the group to ensure that
|
|
152
|
+
we don't get stale events for assets that were removed.
|
|
153
|
+
*/
|
|
154
|
+
if ((0, PolymarketWebSocket_1.isPriceChangeEvent)(event)) {
|
|
155
|
+
// Check if any of the price_changes are for assets in this group
|
|
156
|
+
const relevantChanges = event.price_changes.filter(price_change_item => group.assetIds.has(price_change_item.asset_id));
|
|
157
|
+
if (relevantChanges.length === 0) {
|
|
158
|
+
continue;
|
|
159
|
+
}
|
|
160
|
+
// Only include relevant changes
|
|
161
|
+
priceChangeEvents.push({
|
|
162
|
+
...event,
|
|
163
|
+
price_changes: relevantChanges
|
|
164
|
+
});
|
|
174
165
|
}
|
|
175
166
|
else {
|
|
176
|
-
|
|
167
|
+
// For all other events, check asset_id at root
|
|
168
|
+
if (!group.assetIds.has(event.asset_id)) {
|
|
169
|
+
continue;
|
|
170
|
+
}
|
|
171
|
+
if ((0, PolymarketWebSocket_1.isBookEvent)(event)) {
|
|
172
|
+
bookEvents.push(event);
|
|
173
|
+
}
|
|
174
|
+
else if ((0, PolymarketWebSocket_1.isLastTradePriceEvent)(event)) {
|
|
175
|
+
lastTradeEvents.push(event);
|
|
176
|
+
}
|
|
177
|
+
else if ((0, PolymarketWebSocket_1.isTickSizeChangeEvent)(event)) {
|
|
178
|
+
tickEvents.push(event);
|
|
179
|
+
}
|
|
180
|
+
else {
|
|
181
|
+
await ((_b = handlers.onError) === null || _b === void 0 ? void 0 : _b.call(handlers, new Error(`Unknown event: ${JSON.stringify(event)}`)));
|
|
182
|
+
}
|
|
177
183
|
}
|
|
178
184
|
}
|
|
185
|
+
await this.handleBookEvents(bookEvents);
|
|
186
|
+
await this.handleTickEvents(tickEvents);
|
|
187
|
+
await this.handlePriceChangeEvents(priceChangeEvents);
|
|
188
|
+
await this.handleLastTradeEvents(lastTradeEvents);
|
|
189
|
+
}
|
|
190
|
+
catch (err) {
|
|
191
|
+
// handler-wide error handling
|
|
192
|
+
await ((_c = handlers.onError) === null || _c === void 0 ? void 0 : _c.call(handlers, new Error(`Error handling message: ${err}`)));
|
|
179
193
|
}
|
|
180
|
-
await this.handleBookEvents(bookEvents);
|
|
181
|
-
await this.handleTickEvents(tickEvents);
|
|
182
|
-
await this.handlePriceChangeEvents(priceChangeEvents);
|
|
183
|
-
await this.handleLastTradeEvents(lastTradeEvents);
|
|
184
194
|
};
|
|
185
195
|
const handlePong = () => {
|
|
186
196
|
group.groupId;
|
package/package.json
CHANGED
|
@@ -137,75 +137,84 @@ export class GroupSocket {
|
|
|
137
137
|
};
|
|
138
138
|
|
|
139
139
|
const handleMessage = async (data: Buffer) => {
|
|
140
|
-
const messageStr = data.toString();
|
|
141
|
-
|
|
142
|
-
// Handle PONG messages that might be sent to message handler during handler reattachment
|
|
143
|
-
if (messageStr === 'PONG') {
|
|
144
|
-
return;
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
let events: PolymarketWSEvent[] = [];
|
|
148
140
|
try {
|
|
149
|
-
const
|
|
150
|
-
|
|
151
|
-
} catch (err) {
|
|
152
|
-
await handlers.onError?.(new Error(`Not JSON: ${messageStr}`));
|
|
153
|
-
return;
|
|
154
|
-
}
|
|
141
|
+
const messageStr = data.toString();
|
|
142
|
+
const normalizedMessageStr = messageStr.trim().toUpperCase();
|
|
155
143
|
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
if (isPriceChangeEvent(event)) {
|
|
160
|
-
return event.price_changes && event.price_changes.length > 0;
|
|
144
|
+
// Handle PONG messages that might be sent to message handler during handler reattachment
|
|
145
|
+
if (normalizedMessageStr === 'PONG') {
|
|
146
|
+
return;
|
|
161
147
|
}
|
|
162
|
-
// For all other events, check asset_id
|
|
163
|
-
return _.size(event.asset_id) > 0;
|
|
164
|
-
});
|
|
165
148
|
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
149
|
+
let events: PolymarketWSEvent[] = [];
|
|
150
|
+
try {
|
|
151
|
+
const parsedData: any = JSON.parse(messageStr);
|
|
152
|
+
events = Array.isArray(parsedData) ? parsedData : [parsedData];
|
|
153
|
+
} catch (err) {
|
|
154
|
+
await handlers.onError?.(new Error(`Not JSON: ${messageStr}`));
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
170
157
|
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
*/
|
|
176
|
-
if (isPriceChangeEvent(event)) {
|
|
177
|
-
// Check if any of the price_changes are for assets in this group
|
|
178
|
-
const relevantChanges = event.price_changes.filter(price_change_item => group.assetIds.has(price_change_item.asset_id));
|
|
179
|
-
if (relevantChanges.length === 0) {
|
|
180
|
-
continue;
|
|
158
|
+
// Filter events to ensure validity
|
|
159
|
+
events = _.filter(events, (event: PolymarketWSEvent) => {
|
|
160
|
+
if (!event) {
|
|
161
|
+
return false;
|
|
181
162
|
}
|
|
182
|
-
//
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
price_changes: relevantChanges
|
|
186
|
-
});
|
|
187
|
-
} else {
|
|
188
|
-
// For all other events, check asset_id at root
|
|
189
|
-
if (!group.assetIds.has(event.asset_id!)) {
|
|
190
|
-
continue;
|
|
163
|
+
// For price_change events, check that price_changes array exists
|
|
164
|
+
if (isPriceChangeEvent(event)) {
|
|
165
|
+
return event.price_changes && event.price_changes.length > 0;
|
|
191
166
|
}
|
|
167
|
+
// For all other events, check asset_id
|
|
168
|
+
return _.size(event.asset_id) > 0;
|
|
169
|
+
});
|
|
192
170
|
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
171
|
+
const bookEvents: BookEvent[] = [];
|
|
172
|
+
const lastTradeEvents: LastTradePriceEvent[] = [];
|
|
173
|
+
const tickEvents: TickSizeChangeEvent[] = [];
|
|
174
|
+
const priceChangeEvents: PriceChangeEvent[] = [];
|
|
175
|
+
|
|
176
|
+
for (const event of events) {
|
|
177
|
+
/*
|
|
178
|
+
Skip events for asset ids that are not in the group to ensure that
|
|
179
|
+
we don't get stale events for assets that were removed.
|
|
180
|
+
*/
|
|
181
|
+
if (isPriceChangeEvent(event)) {
|
|
182
|
+
// Check if any of the price_changes are for assets in this group
|
|
183
|
+
const relevantChanges = event.price_changes.filter(price_change_item => group.assetIds.has(price_change_item.asset_id));
|
|
184
|
+
if (relevantChanges.length === 0) {
|
|
185
|
+
continue;
|
|
186
|
+
}
|
|
187
|
+
// Only include relevant changes
|
|
188
|
+
priceChangeEvents.push({
|
|
189
|
+
...event,
|
|
190
|
+
price_changes: relevantChanges
|
|
191
|
+
});
|
|
199
192
|
} else {
|
|
200
|
-
|
|
193
|
+
// For all other events, check asset_id at root
|
|
194
|
+
if (!group.assetIds.has(event.asset_id!)) {
|
|
195
|
+
continue;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
if (isBookEvent(event)) {
|
|
199
|
+
bookEvents.push(event);
|
|
200
|
+
} else if (isLastTradePriceEvent(event)) {
|
|
201
|
+
lastTradeEvents.push(event);
|
|
202
|
+
} else if (isTickSizeChangeEvent(event)) {
|
|
203
|
+
tickEvents.push(event);
|
|
204
|
+
} else {
|
|
205
|
+
await handlers.onError?.(new Error(`Unknown event: ${JSON.stringify(event)}`));
|
|
206
|
+
}
|
|
201
207
|
}
|
|
202
208
|
}
|
|
203
|
-
}
|
|
204
209
|
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
210
|
+
await this.handleBookEvents(bookEvents);
|
|
211
|
+
await this.handleTickEvents(tickEvents);
|
|
212
|
+
await this.handlePriceChangeEvents(priceChangeEvents);
|
|
213
|
+
await this.handleLastTradeEvents(lastTradeEvents);
|
|
214
|
+
} catch (err) {
|
|
215
|
+
// handler-wide error handling
|
|
216
|
+
await handlers.onError?.(new Error(`Error handling message: ${err}`));
|
|
217
|
+
}
|
|
209
218
|
};
|
|
210
219
|
|
|
211
220
|
const handlePong = () => {
|