@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.
@@ -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 parsedData = JSON.parse(messageStr);
125
- events = Array.isArray(parsedData) ? parsedData : [parsedData];
126
- }
127
- catch (err) {
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
+ 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
- // For all other events, check asset_id
138
- return lodash_1.default.size(event.asset_id) > 0;
139
- });
140
- const bookEvents = [];
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
- else {
162
- // For all other events, check asset_id at root
163
- if (!group.assetIds.has(event.asset_id)) {
164
- continue;
165
- }
166
- if ((0, PolymarketWebSocket_1.isBookEvent)(event)) {
167
- bookEvents.push(event);
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
- else if ((0, PolymarketWebSocket_1.isLastTradePriceEvent)(event)) {
170
- lastTradeEvents.push(event);
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
- else if ((0, PolymarketWebSocket_1.isTickSizeChangeEvent)(event)) {
173
- tickEvents.push(event);
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
- await ((_b = handlers.onError) === null || _b === void 0 ? void 0 : _b.call(handlers, new Error(`Unknown event: ${JSON.stringify(event)}`)));
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nevuamarkets/poly-websockets",
3
- "version": "0.2.0",
3
+ "version": "0.2.2",
4
4
  "description": "Plug-and-play Polymarket WebSocket price alerts",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -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 parsedData: any = JSON.parse(messageStr);
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();
142
+ const normalizedMessageStr = messageStr.trim().toUpperCase();
155
143
 
156
- // Filter events to ensure validity
157
- events = _.filter(events, (event: PolymarketWSEvent) => {
158
- // For price_change events, check that price_changes array exists
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
- const bookEvents: BookEvent[] = [];
167
- const lastTradeEvents: LastTradePriceEvent[] = [];
168
- const tickEvents: TickSizeChangeEvent[] = [];
169
- const priceChangeEvents: PriceChangeEvent[] = [];
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
- for (const event of events) {
172
- /*
173
- Skip events for asset ids that are not in the group to ensure that
174
- we don't get stale events for assets that were removed.
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
- // Only include relevant changes
183
- priceChangeEvents.push({
184
- ...event,
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
- if (isBookEvent(event)) {
194
- bookEvents.push(event);
195
- } else if (isLastTradePriceEvent(event)) {
196
- lastTradeEvents.push(event);
197
- } else if (isTickSizeChangeEvent(event)) {
198
- tickEvents.push(event);
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
- await handlers.onError?.(new Error(`Unknown event: ${JSON.stringify(event)}`));
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
- await this.handleBookEvents(bookEvents);
206
- await this.handleTickEvents(tickEvents);
207
- await this.handlePriceChangeEvents(priceChangeEvents);
208
- await this.handleLastTradeEvents(lastTradeEvents);
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 = () => {