@smoud/playable-sdk 1.1.4 → 1.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/README.md CHANGED
@@ -46,7 +46,9 @@ It's powerful, unified SDK that seamlessly integrates multiple ad network SDKs,
46
46
  - Remerge
47
47
  - Tencent
48
48
  - YouAppi
49
+ - DT Exchange
49
50
  - Aarki
51
+ - Bidease
50
52
 
51
53
  ### Protocol Support
52
54
 
@@ -177,7 +179,9 @@ Supported **Ad Networks**:
177
179
  - `remerge`
178
180
  - `tencent`
179
181
  - `youappi`
182
+ - `digitalturbine`
180
183
  - `aarki`
184
+ - `bidease`
181
185
 
182
186
  See more details in [`GitHub repository.`](https://github.com/smoudjs/playable-scripts?tab=readme-ov-file#installation)
183
187
 
@@ -353,6 +357,9 @@ sdk.off('eventName', [callback], [context]);
353
357
  | `ready` | - | Ad container is ready `post` init callback | Start resource loading |
354
358
  | `start` | - | Playable experience started | Begin gameplay/animation |
355
359
  | `interaction` | `count` | User interaction occurred | Track engagement |
360
+ | `pointerdown` | `x, y, event` | Mouse/touch pressed (unified, no duplicates) | Start drag / tap |
361
+ | `pointermove` | `x, y, event` | Mouse/touch moved while pressed | Update drag |
362
+ | `pointerup` | `x, y, event` | Mouse/touch released or cancelled | End drag / tap |
356
363
  | `resize` | `width, height` | Container size changed | Update layout |
357
364
  | `pause` | - | Playable entered pause state | Pause gameplay |
358
365
  | `resume` | - | Playable resumed from pause | Resume gameplay |
package/defines.d.ts CHANGED
@@ -71,7 +71,9 @@ declare const AD_NETWORK:
71
71
  | 'remerge'
72
72
  | 'tencent'
73
73
  | 'youappi'
74
- | 'aarki';
74
+ | 'digitalturbine'
75
+ | 'aarki'
76
+ | 'bidease';
75
77
 
76
78
  declare const AD_PROTOCOL: 'mraid' | 'dapi' | 'nucleo' | 'none';
77
79
  declare const GOOGLE_PLAY_URL: string;
@@ -104,6 +106,10 @@ interface Window {
104
106
  clickOpen?: Function;
105
107
  };
106
108
 
109
+ // Bidease functions
110
+ initGame?: Function;
111
+ trackClick?: Function;
112
+
107
113
  BIGABID_BIDTIMEMACROS?: Record<string, string>
108
114
  INMOBI_DSPMACROS?: Record<string, string>
109
115
  REMERGE_BIDTIMEMACROS?: Record<string, string>
package/dist/esm/index.js CHANGED
@@ -192,6 +192,51 @@ function initTrackingProtocols() {
192
192
  }
193
193
  }
194
194
 
195
+ // src/interaction.ts
196
+ var TOUCH_MOUSE_DEDUPE_MS = 500;
197
+ var lastTouchTime = 0;
198
+ var isPointerDown = false;
199
+ var isRegistered = false;
200
+ var isMoveRegistered = false;
201
+ function createPointerHandler(name) {
202
+ return function(event) {
203
+ const touches = event.changedTouches;
204
+ let point = event;
205
+ if (touches) {
206
+ lastTouchTime = event.timeStamp;
207
+ point = touches[0];
208
+ } else if (event.timeStamp - lastTouchTime < TOUCH_MOUSE_DEDUPE_MS) return;
209
+ if (name === "pointerdown") {
210
+ isPointerDown = true;
211
+ sdk.interactions += 1;
212
+ emitEvent("interaction", sdk.interactions);
213
+ } else if (!isPointerDown) return;
214
+ else if (name === "pointerup") isPointerDown = !!touches && event.touches.length > 0;
215
+ emitEvent(name, point.clientX, point.clientY, event);
216
+ };
217
+ }
218
+ var onPointerDown = createPointerHandler("pointerdown");
219
+ var onPointerMove = createPointerHandler("pointermove");
220
+ var onPointerUp = createPointerHandler("pointerup");
221
+ function listen(type, handler) {
222
+ document.addEventListener(type, handler);
223
+ }
224
+ function registerInteractionHandlers() {
225
+ if (isRegistered) return;
226
+ isRegistered = true;
227
+ listen("mousedown", onPointerDown);
228
+ listen("touchstart", onPointerDown);
229
+ listen("mouseup", onPointerUp);
230
+ listen("touchend", onPointerUp);
231
+ listen("touchcancel", onPointerUp);
232
+ }
233
+ function registerMoveHandler() {
234
+ if (isMoveRegistered) return;
235
+ isMoveRegistered = true;
236
+ listen("mousemove", onPointerMove);
237
+ listen("touchmove", onPointerMove);
238
+ }
239
+
195
240
  // src/core.ts
196
241
  var destinationUrl = "";
197
242
  var isSDKInitialized = false;
@@ -396,23 +441,6 @@ function handleResize(width, height) {
396
441
  sdk.isLandscape = sdk.maxWidth > sdk.maxHeight;
397
442
  emitEvent("resize", sdk.maxWidth, sdk.maxHeight);
398
443
  }
399
- var isListeningToTouchEvents = false;
400
- var isTouchEventRegistered = false;
401
- function onUserInteraction(event) {
402
- if (typeof TouchEvent !== "undefined" && event instanceof TouchEvent) {
403
- isListeningToTouchEvents = true;
404
- }
405
- if (isListeningToTouchEvents && event instanceof MouseEvent) return;
406
- sdk.interactions += 1;
407
- emitEvent("interaction", sdk.interactions);
408
- }
409
- function registerTouchHandlers() {
410
- if (!isTouchEventRegistered) {
411
- document.addEventListener("mousedown", onUserInteraction);
412
- document.addEventListener("touchstart", onUserInteraction);
413
- isTouchEventRegistered = true;
414
- }
415
- }
416
444
  function initSDK() {
417
445
  destinationUrl = /android/i.test(navigator.userAgent) ? GOOGLE_PLAY_URL : APP_STORE_URL;
418
446
  ensureProtocol();
@@ -466,7 +494,7 @@ var _sdk = class _sdk {
466
494
  if (_sdk.isStarted) return;
467
495
  _sdk.isStarted = true;
468
496
  emitEvent("start");
469
- registerTouchHandlers();
497
+ registerInteractionHandlers();
470
498
  if ("mintegral" === AD_NETWORK && isMintegral()) {
471
499
  _sdk.resize();
472
500
  handlePause();
@@ -477,6 +505,8 @@ var _sdk = class _sdk {
477
505
  orientation: this.isLandscape ? "landscape" : "portrait",
478
506
  buildID: BUILD_HASH
479
507
  });
508
+ } else if ("bidease" === AD_NETWORK && window.initGame) {
509
+ window.initGame();
480
510
  }
481
511
  fireVolumeChange(_sdk.volume);
482
512
  _sdk.resize();
@@ -550,6 +580,8 @@ var _sdk = class _sdk {
550
580
  emitEvent("install");
551
581
  if ("tencent" === AD_NETWORK && window.TencentGDT && window.TencentGDT.clickOpen) {
552
582
  window.TencentGDT.clickOpen();
583
+ } else if ("bidease" === AD_NETWORK && window.trackClick) {
584
+ window.trackClick();
553
585
  } else if ("mraid" === AD_PROTOCOL && isMraid()) {
554
586
  mraid.open(destinationUrl);
555
587
  } else if ("dapi" === AD_PROTOCOL && isDapi()) {
@@ -638,6 +670,7 @@ var _sdk = class _sdk {
638
670
  * }, gameInstance);
639
671
  */
640
672
  static on(event, fn, context) {
673
+ if (event === "pointermove") registerMoveHandler();
641
674
  onEvent(event, fn, context);
642
675
  }
643
676
  /**
@@ -654,6 +687,7 @@ var _sdk = class _sdk {
654
687
  * });
655
688
  */
656
689
  static once(event, fn, context) {
690
+ if (event === "pointermove") registerMoveHandler();
657
691
  onEvent(event, fn, context, true);
658
692
  }
659
693
  /**
@@ -676,7 +710,7 @@ var _sdk = class _sdk {
676
710
  }
677
711
  };
678
712
  /** Current version of the SDK */
679
- _sdk.version = "1.1.4";
713
+ _sdk.version = "1.2.1";
680
714
  /** Current maximum width of the playable ad container in pixels */
681
715
  _sdk.maxWidth = Math.floor(window.innerWidth);
682
716
  /** Current maximum height of the playable ad container in pixels */
@@ -194,6 +194,51 @@
194
194
  }
195
195
  }
196
196
 
197
+ // src/interaction.ts
198
+ var TOUCH_MOUSE_DEDUPE_MS = 500;
199
+ var lastTouchTime = 0;
200
+ var isPointerDown = false;
201
+ var isRegistered = false;
202
+ var isMoveRegistered = false;
203
+ function createPointerHandler(name) {
204
+ return function(event) {
205
+ const touches = event.changedTouches;
206
+ let point = event;
207
+ if (touches) {
208
+ lastTouchTime = event.timeStamp;
209
+ point = touches[0];
210
+ } else if (event.timeStamp - lastTouchTime < TOUCH_MOUSE_DEDUPE_MS) return;
211
+ if (name === "pointerdown") {
212
+ isPointerDown = true;
213
+ sdk.interactions += 1;
214
+ emitEvent("interaction", sdk.interactions);
215
+ } else if (!isPointerDown) return;
216
+ else if (name === "pointerup") isPointerDown = !!touches && event.touches.length > 0;
217
+ emitEvent(name, point.clientX, point.clientY, event);
218
+ };
219
+ }
220
+ var onPointerDown = createPointerHandler("pointerdown");
221
+ var onPointerMove = createPointerHandler("pointermove");
222
+ var onPointerUp = createPointerHandler("pointerup");
223
+ function listen(type, handler) {
224
+ document.addEventListener(type, handler);
225
+ }
226
+ function registerInteractionHandlers() {
227
+ if (isRegistered) return;
228
+ isRegistered = true;
229
+ listen("mousedown", onPointerDown);
230
+ listen("touchstart", onPointerDown);
231
+ listen("mouseup", onPointerUp);
232
+ listen("touchend", onPointerUp);
233
+ listen("touchcancel", onPointerUp);
234
+ }
235
+ function registerMoveHandler() {
236
+ if (isMoveRegistered) return;
237
+ isMoveRegistered = true;
238
+ listen("mousemove", onPointerMove);
239
+ listen("touchmove", onPointerMove);
240
+ }
241
+
197
242
  // src/core.ts
198
243
  var destinationUrl = "";
199
244
  var isSDKInitialized = false;
@@ -398,23 +443,6 @@
398
443
  sdk.isLandscape = sdk.maxWidth > sdk.maxHeight;
399
444
  emitEvent("resize", sdk.maxWidth, sdk.maxHeight);
400
445
  }
401
- var isListeningToTouchEvents = false;
402
- var isTouchEventRegistered = false;
403
- function onUserInteraction(event) {
404
- if (typeof TouchEvent !== "undefined" && event instanceof TouchEvent) {
405
- isListeningToTouchEvents = true;
406
- }
407
- if (isListeningToTouchEvents && event instanceof MouseEvent) return;
408
- sdk.interactions += 1;
409
- emitEvent("interaction", sdk.interactions);
410
- }
411
- function registerTouchHandlers() {
412
- if (!isTouchEventRegistered) {
413
- document.addEventListener("mousedown", onUserInteraction);
414
- document.addEventListener("touchstart", onUserInteraction);
415
- isTouchEventRegistered = true;
416
- }
417
- }
418
446
  function initSDK() {
419
447
  destinationUrl = /android/i.test(navigator.userAgent) ? GOOGLE_PLAY_URL : APP_STORE_URL;
420
448
  ensureProtocol();
@@ -468,7 +496,7 @@
468
496
  if (_sdk.isStarted) return;
469
497
  _sdk.isStarted = true;
470
498
  emitEvent("start");
471
- registerTouchHandlers();
499
+ registerInteractionHandlers();
472
500
  if ("mintegral" === AD_NETWORK && isMintegral()) {
473
501
  _sdk.resize();
474
502
  handlePause();
@@ -479,6 +507,8 @@
479
507
  orientation: this.isLandscape ? "landscape" : "portrait",
480
508
  buildID: BUILD_HASH
481
509
  });
510
+ } else if ("bidease" === AD_NETWORK && window.initGame) {
511
+ window.initGame();
482
512
  }
483
513
  fireVolumeChange(_sdk.volume);
484
514
  _sdk.resize();
@@ -552,6 +582,8 @@
552
582
  emitEvent("install");
553
583
  if ("tencent" === AD_NETWORK && window.TencentGDT && window.TencentGDT.clickOpen) {
554
584
  window.TencentGDT.clickOpen();
585
+ } else if ("bidease" === AD_NETWORK && window.trackClick) {
586
+ window.trackClick();
555
587
  } else if ("mraid" === AD_PROTOCOL && isMraid()) {
556
588
  mraid.open(destinationUrl);
557
589
  } else if ("dapi" === AD_PROTOCOL && isDapi()) {
@@ -640,6 +672,7 @@
640
672
  * }, gameInstance);
641
673
  */
642
674
  static on(event, fn, context) {
675
+ if (event === "pointermove") registerMoveHandler();
643
676
  onEvent(event, fn, context);
644
677
  }
645
678
  /**
@@ -656,6 +689,7 @@
656
689
  * });
657
690
  */
658
691
  static once(event, fn, context) {
692
+ if (event === "pointermove") registerMoveHandler();
659
693
  onEvent(event, fn, context, true);
660
694
  }
661
695
  /**
@@ -678,7 +712,7 @@
678
712
  }
679
713
  };
680
714
  /** Current version of the SDK */
681
- _sdk.version = "1.1.4";
715
+ _sdk.version = "1.2.1";
682
716
  /** Current maximum width of the playable ad container in pixels */
683
717
  _sdk.maxWidth = Math.floor(window.innerWidth);
684
718
  /** Current maximum height of the playable ad container in pixels */
package/dist/index.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- type EventName = 'init' | 'boot' | 'ready' | 'start' | 'interaction' | 'resize' | 'pause' | 'resume' | 'volume' | 'retry' | 'finish' | 'install' | 'error';
1
+ type EventName = 'init' | 'boot' | 'ready' | 'start' | 'interaction' | 'pointerdown' | 'pointermove' | 'pointerup' | 'resize' | 'pause' | 'resume' | 'volume' | 'retry' | 'finish' | 'install' | 'error';
2
2
 
3
3
  type InitCallbackType = (maxWidth: number, maxHeight: number) => void;
4
4
  /**
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- type EventName = 'init' | 'boot' | 'ready' | 'start' | 'interaction' | 'resize' | 'pause' | 'resume' | 'volume' | 'retry' | 'finish' | 'install' | 'error';
1
+ type EventName = 'init' | 'boot' | 'ready' | 'start' | 'interaction' | 'pointerdown' | 'pointermove' | 'pointerup' | 'resize' | 'pause' | 'resume' | 'volume' | 'retry' | 'finish' | 'install' | 'error';
2
2
 
3
3
  type InitCallbackType = (maxWidth: number, maxHeight: number) => void;
4
4
  /**
package/dist/index.js CHANGED
@@ -219,6 +219,51 @@ function initTrackingProtocols() {
219
219
  }
220
220
  }
221
221
 
222
+ // src/interaction.ts
223
+ var TOUCH_MOUSE_DEDUPE_MS = 500;
224
+ var lastTouchTime = 0;
225
+ var isPointerDown = false;
226
+ var isRegistered = false;
227
+ var isMoveRegistered = false;
228
+ function createPointerHandler(name) {
229
+ return function(event) {
230
+ const touches = event.changedTouches;
231
+ let point = event;
232
+ if (touches) {
233
+ lastTouchTime = event.timeStamp;
234
+ point = touches[0];
235
+ } else if (event.timeStamp - lastTouchTime < TOUCH_MOUSE_DEDUPE_MS) return;
236
+ if (name === "pointerdown") {
237
+ isPointerDown = true;
238
+ sdk.interactions += 1;
239
+ emitEvent("interaction", sdk.interactions);
240
+ } else if (!isPointerDown) return;
241
+ else if (name === "pointerup") isPointerDown = !!touches && event.touches.length > 0;
242
+ emitEvent(name, point.clientX, point.clientY, event);
243
+ };
244
+ }
245
+ var onPointerDown = createPointerHandler("pointerdown");
246
+ var onPointerMove = createPointerHandler("pointermove");
247
+ var onPointerUp = createPointerHandler("pointerup");
248
+ function listen(type, handler) {
249
+ document.addEventListener(type, handler);
250
+ }
251
+ function registerInteractionHandlers() {
252
+ if (isRegistered) return;
253
+ isRegistered = true;
254
+ listen("mousedown", onPointerDown);
255
+ listen("touchstart", onPointerDown);
256
+ listen("mouseup", onPointerUp);
257
+ listen("touchend", onPointerUp);
258
+ listen("touchcancel", onPointerUp);
259
+ }
260
+ function registerMoveHandler() {
261
+ if (isMoveRegistered) return;
262
+ isMoveRegistered = true;
263
+ listen("mousemove", onPointerMove);
264
+ listen("touchmove", onPointerMove);
265
+ }
266
+
222
267
  // src/core.ts
223
268
  var destinationUrl = "";
224
269
  var isSDKInitialized = false;
@@ -423,23 +468,6 @@ function handleResize(width, height) {
423
468
  sdk.isLandscape = sdk.maxWidth > sdk.maxHeight;
424
469
  emitEvent("resize", sdk.maxWidth, sdk.maxHeight);
425
470
  }
426
- var isListeningToTouchEvents = false;
427
- var isTouchEventRegistered = false;
428
- function onUserInteraction(event) {
429
- if (typeof TouchEvent !== "undefined" && event instanceof TouchEvent) {
430
- isListeningToTouchEvents = true;
431
- }
432
- if (isListeningToTouchEvents && event instanceof MouseEvent) return;
433
- sdk.interactions += 1;
434
- emitEvent("interaction", sdk.interactions);
435
- }
436
- function registerTouchHandlers() {
437
- if (!isTouchEventRegistered) {
438
- document.addEventListener("mousedown", onUserInteraction);
439
- document.addEventListener("touchstart", onUserInteraction);
440
- isTouchEventRegistered = true;
441
- }
442
- }
443
471
  function initSDK() {
444
472
  destinationUrl = /android/i.test(navigator.userAgent) ? GOOGLE_PLAY_URL : APP_STORE_URL;
445
473
  ensureProtocol();
@@ -493,7 +521,7 @@ var _sdk = class _sdk {
493
521
  if (_sdk.isStarted) return;
494
522
  _sdk.isStarted = true;
495
523
  emitEvent("start");
496
- registerTouchHandlers();
524
+ registerInteractionHandlers();
497
525
  if ("mintegral" === AD_NETWORK && isMintegral()) {
498
526
  _sdk.resize();
499
527
  handlePause();
@@ -504,6 +532,8 @@ var _sdk = class _sdk {
504
532
  orientation: this.isLandscape ? "landscape" : "portrait",
505
533
  buildID: BUILD_HASH
506
534
  });
535
+ } else if ("bidease" === AD_NETWORK && window.initGame) {
536
+ window.initGame();
507
537
  }
508
538
  fireVolumeChange(_sdk.volume);
509
539
  _sdk.resize();
@@ -577,6 +607,8 @@ var _sdk = class _sdk {
577
607
  emitEvent("install");
578
608
  if ("tencent" === AD_NETWORK && window.TencentGDT && window.TencentGDT.clickOpen) {
579
609
  window.TencentGDT.clickOpen();
610
+ } else if ("bidease" === AD_NETWORK && window.trackClick) {
611
+ window.trackClick();
580
612
  } else if ("mraid" === AD_PROTOCOL && isMraid()) {
581
613
  mraid.open(destinationUrl);
582
614
  } else if ("dapi" === AD_PROTOCOL && isDapi()) {
@@ -665,6 +697,7 @@ var _sdk = class _sdk {
665
697
  * }, gameInstance);
666
698
  */
667
699
  static on(event, fn, context) {
700
+ if (event === "pointermove") registerMoveHandler();
668
701
  onEvent(event, fn, context);
669
702
  }
670
703
  /**
@@ -681,6 +714,7 @@ var _sdk = class _sdk {
681
714
  * });
682
715
  */
683
716
  static once(event, fn, context) {
717
+ if (event === "pointermove") registerMoveHandler();
684
718
  onEvent(event, fn, context, true);
685
719
  }
686
720
  /**
@@ -703,7 +737,7 @@ var _sdk = class _sdk {
703
737
  }
704
738
  };
705
739
  /** Current version of the SDK */
706
- _sdk.version = "1.1.4";
740
+ _sdk.version = "1.2.1";
707
741
  /** Current maximum width of the playable ad container in pixels */
708
742
  _sdk.maxWidth = Math.floor(window.innerWidth);
709
743
  /** Current maximum height of the playable ad container in pixels */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@smoud/playable-sdk",
3
- "version": "1.1.4",
3
+ "version": "1.2.1",
4
4
  "description": "It's unified Playable SDK that supports MRAID, Google, Facebook, Vungle, and many more Ad Networks, simplifying playable ad development with a standardized interface for seamless cross-network compatibility.",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/esm/index.js",