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