@zaplier/sdk 1.1.8 → 1.2.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/sdk.js CHANGED
@@ -6153,112 +6153,6 @@
6153
6153
  }
6154
6154
  }
6155
6155
  }
6156
- /**
6157
- * WebSocket Transport
6158
- */
6159
- class WebSocketTransport {
6160
- constructor(baseUrl) {
6161
- this.name = 'websocket';
6162
- this.available = typeof WebSocket !== 'undefined';
6163
- this.connected = false;
6164
- this.messageQueue = [];
6165
- this.baseUrl = baseUrl.replace(/^http/, 'ws');
6166
- }
6167
- async connect() {
6168
- if (this.connected || !this.available)
6169
- return;
6170
- return new Promise((resolve, reject) => {
6171
- try {
6172
- this.ws = new WebSocket(`${this.baseUrl}/ws/track`);
6173
- this.ws.onopen = () => {
6174
- this.connected = true;
6175
- this.processQueue();
6176
- resolve();
6177
- };
6178
- this.ws.onerror = () => {
6179
- reject(new Error('WebSocket connection failed'));
6180
- };
6181
- this.ws.onclose = () => {
6182
- this.connected = false;
6183
- // Try to reconnect after 5 seconds
6184
- setTimeout(() => this.connect().catch(() => { }), 5000);
6185
- };
6186
- }
6187
- catch (error) {
6188
- reject(error);
6189
- }
6190
- });
6191
- }
6192
- processQueue() {
6193
- while (this.messageQueue.length > 0 && this.connected) {
6194
- const item = this.messageQueue.shift();
6195
- if (item && this.ws) {
6196
- try {
6197
- this.ws.send(JSON.stringify(item.data));
6198
- item.resolve({ success: true, method: this.name });
6199
- }
6200
- catch (error) {
6201
- item.resolve({
6202
- success: false,
6203
- method: this.name,
6204
- error: error instanceof Error ? error.message : String(error)
6205
- });
6206
- }
6207
- }
6208
- }
6209
- }
6210
- async send(data, endpoint) {
6211
- const start = Date.now();
6212
- if (!this.available) {
6213
- return { success: false, method: this.name, error: 'WebSocket not available' };
6214
- }
6215
- // Try to connect if not connected
6216
- if (!this.connected) {
6217
- try {
6218
- await this.connect();
6219
- }
6220
- catch (error) {
6221
- return {
6222
- success: false,
6223
- method: this.name,
6224
- error: error instanceof Error ? error.message : String(error)
6225
- };
6226
- }
6227
- }
6228
- return new Promise((resolve) => {
6229
- if (this.connected && this.ws) {
6230
- try {
6231
- this.ws.send(JSON.stringify(data));
6232
- resolve({
6233
- success: true,
6234
- method: this.name,
6235
- latency: Date.now() - start
6236
- });
6237
- }
6238
- catch (error) {
6239
- resolve({
6240
- success: false,
6241
- method: this.name,
6242
- error: error instanceof Error ? error.message : String(error)
6243
- });
6244
- }
6245
- }
6246
- else {
6247
- // Queue message for later
6248
- this.messageQueue.push({ data, resolve: (response) => resolve({
6249
- ...response,
6250
- latency: Date.now() - start
6251
- }) });
6252
- }
6253
- });
6254
- }
6255
- destroy() {
6256
- if (this.ws) {
6257
- this.ws.close();
6258
- this.connected = false;
6259
- }
6260
- }
6261
- }
6262
6156
  /**
6263
6157
  * Resource Spoofing Transport (GET requests disguised as assets)
6264
6158
  */
@@ -6321,6 +6215,112 @@
6321
6215
  }
6322
6216
  }
6323
6217
  }
6218
+ /**
6219
+ * Elysia WebSocket Transport (Native WebSocket for anti-adblock)
6220
+ */
6221
+ class ElysiaWebSocketTransport {
6222
+ constructor(baseUrl, token) {
6223
+ this.name = 'elysia-websocket';
6224
+ this.available = typeof WebSocket !== 'undefined';
6225
+ this.connected = false;
6226
+ this.baseUrl = baseUrl;
6227
+ this.token = token;
6228
+ }
6229
+ async send(data, endpoint) {
6230
+ const start = Date.now();
6231
+ try {
6232
+ if (!this.token) {
6233
+ throw new Error('Missing token for WebSocket connection');
6234
+ }
6235
+ await this.connect();
6236
+ if (!this.ws || !this.connected) {
6237
+ throw new Error('WebSocket not connected');
6238
+ }
6239
+ return new Promise((resolve, reject) => {
6240
+ const messageHandler = (event) => {
6241
+ try {
6242
+ const response = JSON.parse(event.data);
6243
+ this.ws?.removeEventListener('message', messageHandler);
6244
+ resolve({
6245
+ success: response.success || false,
6246
+ method: this.name,
6247
+ latency: Date.now() - start
6248
+ });
6249
+ }
6250
+ catch (error) {
6251
+ this.ws?.removeEventListener('message', messageHandler);
6252
+ reject(new Error('Failed to parse WebSocket response'));
6253
+ }
6254
+ };
6255
+ this.ws?.addEventListener('message', messageHandler);
6256
+ // Send the tracking data
6257
+ this.ws?.send(JSON.stringify({
6258
+ eventId: data.eventId || crypto.randomUUID(),
6259
+ sessionId: data.sessionId || data.s,
6260
+ eventType: data.eventType || data.type || 'websocket_event',
6261
+ eventName: data.eventName || data.name,
6262
+ url: data.url,
6263
+ userAgent: data.userAgent || navigator.userAgent,
6264
+ timestamp: new Date().toISOString()
6265
+ }));
6266
+ // Timeout after 5 seconds
6267
+ setTimeout(() => {
6268
+ this.ws?.removeEventListener('message', messageHandler);
6269
+ reject(new Error('WebSocket response timeout'));
6270
+ }, 5000);
6271
+ });
6272
+ }
6273
+ catch (error) {
6274
+ return {
6275
+ success: false,
6276
+ method: this.name,
6277
+ latency: Date.now() - start,
6278
+ error: error instanceof Error ? error.message : String(error)
6279
+ };
6280
+ }
6281
+ }
6282
+ async connect() {
6283
+ if (this.connected && this.ws?.readyState === WebSocket.OPEN) {
6284
+ return;
6285
+ }
6286
+ return new Promise((resolve, reject) => {
6287
+ try {
6288
+ // Convert HTTP/HTTPS to WS/WSS
6289
+ const url = new URL(this.baseUrl);
6290
+ const protocol = url.protocol === 'https:' ? 'wss:' : 'ws:';
6291
+ const wsUrl = `${protocol}//${url.host}/ws/track?token=${encodeURIComponent(this.token)}`;
6292
+ this.ws = new WebSocket(wsUrl);
6293
+ this.ws.onopen = () => {
6294
+ this.connected = true;
6295
+ resolve();
6296
+ };
6297
+ this.ws.onerror = () => {
6298
+ this.connected = false;
6299
+ reject(new Error('WebSocket connection failed'));
6300
+ };
6301
+ this.ws.onclose = () => {
6302
+ this.connected = false;
6303
+ };
6304
+ // Timeout after 5 seconds
6305
+ setTimeout(() => {
6306
+ if (!this.connected) {
6307
+ this.ws?.close();
6308
+ reject(new Error('WebSocket connection timeout'));
6309
+ }
6310
+ }, 5000);
6311
+ }
6312
+ catch (error) {
6313
+ reject(error);
6314
+ }
6315
+ });
6316
+ }
6317
+ cleanup() {
6318
+ if (this.ws) {
6319
+ this.ws.close();
6320
+ this.connected = false;
6321
+ }
6322
+ }
6323
+ }
6324
6324
  /**
6325
6325
  * Socket.io Transport (Real-time bidirectional communication for anti-adblock)
6326
6326
  */
@@ -6331,7 +6331,7 @@
6331
6331
  this.connected = false;
6332
6332
  this.baseUrl = baseUrl;
6333
6333
  }
6334
- async send(data, endpoint) {
6334
+ async send(data, _endpoint) {
6335
6335
  const start = Date.now();
6336
6336
  if (!this.available) {
6337
6337
  return { success: false, method: this.name, error: 'WebRTC not available' };
@@ -6382,12 +6382,14 @@
6382
6382
  try {
6383
6383
  // Use dynamic import to load socket.io-client only when needed
6384
6384
  Promise.resolve().then(function () { return index; }).then(({ io }) => {
6385
- // Extract domain from baseUrl - use HTTP for Socket.io connection
6385
+ // Extract domain from baseUrl - preserve protocol (HTTP/HTTPS)
6386
6386
  const url = new URL(this.baseUrl);
6387
- const socketUrl = `http://${url.host}`;
6387
+ const socketUrl = `${url.protocol}//${url.host}`;
6388
6388
  this.socket = io(socketUrl, {
6389
- transports: ['websocket', 'polling'],
6390
- timeout: 5000
6389
+ transports: ['polling', 'websocket'], // Try polling first for better proxy compatibility
6390
+ timeout: 5000,
6391
+ upgrade: true,
6392
+ rememberUpgrade: false
6391
6393
  });
6392
6394
  this.socket.on('connect', () => {
6393
6395
  this.connected = true;
@@ -6422,7 +6424,7 @@
6422
6424
  this.available = typeof globalThis.RTCPeerConnection !== 'undefined';
6423
6425
  this.connected = false;
6424
6426
  }
6425
- async send(data, endpoint) {
6427
+ async send(data, _endpoint) {
6426
6428
  const start = Date.now();
6427
6429
  if (!this.available) {
6428
6430
  return { success: false, method: this.name, error: 'WebRTC not available' };
@@ -6494,7 +6496,7 @@
6494
6496
  * Main Anti-Adblock Manager
6495
6497
  */
6496
6498
  class AntiAdblockManager {
6497
- constructor(baseUrl, config = {}) {
6499
+ constructor(baseUrl, token, config = {}) {
6498
6500
  this.transports = [];
6499
6501
  this.stats = {
6500
6502
  totalRequests: 0,
@@ -6503,9 +6505,10 @@
6503
6505
  methodFailures: new Map()
6504
6506
  };
6505
6507
  this.baseUrl = baseUrl;
6508
+ this.token = token;
6506
6509
  this.config = {
6507
6510
  enabled: true,
6508
- methods: ['socketio', 'fetch', 'resource'], // Socket.io as primary, removed native websocket
6511
+ methods: ['elysia-websocket', 'fetch', 'resource'], // Elysia WebSocket as primary
6509
6512
  fallbackDelay: 100,
6510
6513
  maxRetries: 2,
6511
6514
  debug: false,
@@ -6515,9 +6518,9 @@
6515
6518
  }
6516
6519
  initializeTransports() {
6517
6520
  const transportMap = {
6521
+ 'elysia-websocket': () => new ElysiaWebSocketTransport(this.baseUrl, this.token),
6518
6522
  socketio: () => new SocketIOTransport(this.baseUrl),
6519
6523
  fetch: () => new FetchTransport(),
6520
- websocket: () => new WebSocketTransport(this.baseUrl),
6521
6524
  resource: () => new ResourceSpoofTransport(this.baseUrl),
6522
6525
  webrtc: () => new WebRTCTransport()
6523
6526
  };
@@ -7761,9 +7764,10 @@
7761
7764
  */
7762
7765
  initializeAntiAdblock() {
7763
7766
  try {
7764
- this.antiAdblockManager = new AntiAdblockManager(this.config.apiEndpoint, {
7767
+ this.antiAdblockManager = new AntiAdblockManager(this.config.apiEndpoint, this.config.token, // Pass token to anti-adblock manager
7768
+ {
7765
7769
  enabled: true,
7766
- methods: ["socketio", "fetch", "resource"], // Socket.io as primary, removed native websocket
7770
+ methods: ["elysia-websocket", "fetch", "resource"], // Elysia WebSocket as primary
7767
7771
  fallbackDelay: 100,
7768
7772
  maxRetries: 2,
7769
7773
  debug: this.config.debug,