@smoud/playable-sdk 1.1.3 → 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/README.md CHANGED
@@ -44,6 +44,9 @@ It's powerful, unified SDK that seamlessly integrates multiple ad network SDKs,
44
44
  - Bigabid
45
45
  - inMobi
46
46
  - Remerge
47
+ - Tencent
48
+ - YouAppi
49
+ - Aarki
47
50
 
48
51
  ### Protocol Support
49
52
 
@@ -172,6 +175,9 @@ Supported **Ad Networks**:
172
175
  - `bigabid`
173
176
  - `inmobi`
174
177
  - `remerge`
178
+ - `tencent`
179
+ - `youappi`
180
+ - `aarki`
175
181
 
176
182
  See more details in [`GitHub repository.`](https://github.com/smoudjs/playable-scripts?tab=readme-ov-file#installation)
177
183
 
@@ -347,6 +353,9 @@ sdk.off('eventName', [callback], [context]);
347
353
  | `ready` | - | Ad container is ready `post` init callback | Start resource loading |
348
354
  | `start` | - | Playable experience started | Begin gameplay/animation |
349
355
  | `interaction` | `count` | User interaction occurred | Track engagement |
356
+ | `pointerdown` | `x, y, event` | Mouse/touch pressed (unified, no duplicates) | Start drag / tap |
357
+ | `pointermove` | `x, y, event` | Mouse/touch moved while pressed | Update drag |
358
+ | `pointerup` | `x, y, event` | Mouse/touch released or cancelled | End drag / tap |
350
359
  | `resize` | `width, height` | Container size changed | Update layout |
351
360
  | `pause` | - | Playable entered pause state | Pause gameplay |
352
361
  | `resume` | - | Playable resumed from pause | Resume gameplay |
package/defines.d.ts CHANGED
@@ -68,7 +68,10 @@ declare const AD_NETWORK:
68
68
  | 'adikteev'
69
69
  | 'bigabid'
70
70
  | 'inmobi'
71
- | 'remerge';
71
+ | 'remerge'
72
+ | 'tencent'
73
+ | 'youappi'
74
+ | 'aarki';
72
75
 
73
76
  declare const AD_PROTOCOL: 'mraid' | 'dapi' | 'nucleo' | 'none';
74
77
  declare const GOOGLE_PLAY_URL: string;
@@ -96,6 +99,11 @@ interface Window {
96
99
  click: Function;
97
100
  };
98
101
 
102
+ // Tencent functions
103
+ TencentGDT?: {
104
+ clickOpen?: Function;
105
+ };
106
+
99
107
  BIGABID_BIDTIMEMACROS?: Record<string, string>
100
108
  INMOBI_DSPMACROS?: Record<string, string>
101
109
  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();
@@ -548,7 +576,9 @@ var _sdk = class _sdk {
548
576
  isInstallClicked = false;
549
577
  }, 500);
550
578
  emitEvent("install");
551
- if ("mraid" === AD_PROTOCOL && isMraid()) {
579
+ if ("tencent" === AD_NETWORK && window.TencentGDT && window.TencentGDT.clickOpen) {
580
+ window.TencentGDT.clickOpen();
581
+ } else if ("mraid" === AD_PROTOCOL && isMraid()) {
552
582
  mraid.open(destinationUrl);
553
583
  } else if ("dapi" === AD_PROTOCOL && isDapi()) {
554
584
  dapi.openStoreUrl();
@@ -636,6 +666,7 @@ var _sdk = class _sdk {
636
666
  * }, gameInstance);
637
667
  */
638
668
  static on(event, fn, context) {
669
+ if (event === "pointermove") registerMoveHandler();
639
670
  onEvent(event, fn, context);
640
671
  }
641
672
  /**
@@ -652,6 +683,7 @@ var _sdk = class _sdk {
652
683
  * });
653
684
  */
654
685
  static once(event, fn, context) {
686
+ if (event === "pointermove") registerMoveHandler();
655
687
  onEvent(event, fn, context, true);
656
688
  }
657
689
  /**
@@ -674,7 +706,7 @@ var _sdk = class _sdk {
674
706
  }
675
707
  };
676
708
  /** Current version of the SDK */
677
- _sdk.version = "1.1.3";
709
+ _sdk.version = "1.2.0";
678
710
  /** Current maximum width of the playable ad container in pixels */
679
711
  _sdk.maxWidth = Math.floor(window.innerWidth);
680
712
  /** 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();
@@ -550,7 +578,9 @@
550
578
  isInstallClicked = false;
551
579
  }, 500);
552
580
  emitEvent("install");
553
- if ("mraid" === AD_PROTOCOL && isMraid()) {
581
+ if ("tencent" === AD_NETWORK && window.TencentGDT && window.TencentGDT.clickOpen) {
582
+ window.TencentGDT.clickOpen();
583
+ } else if ("mraid" === AD_PROTOCOL && isMraid()) {
554
584
  mraid.open(destinationUrl);
555
585
  } else if ("dapi" === AD_PROTOCOL && isDapi()) {
556
586
  dapi.openStoreUrl();
@@ -638,6 +668,7 @@
638
668
  * }, gameInstance);
639
669
  */
640
670
  static on(event, fn, context) {
671
+ if (event === "pointermove") registerMoveHandler();
641
672
  onEvent(event, fn, context);
642
673
  }
643
674
  /**
@@ -654,6 +685,7 @@
654
685
  * });
655
686
  */
656
687
  static once(event, fn, context) {
688
+ if (event === "pointermove") registerMoveHandler();
657
689
  onEvent(event, fn, context, true);
658
690
  }
659
691
  /**
@@ -676,7 +708,7 @@
676
708
  }
677
709
  };
678
710
  /** Current version of the SDK */
679
- _sdk.version = "1.1.3";
711
+ _sdk.version = "1.2.0";
680
712
  /** Current maximum width of the playable ad container in pixels */
681
713
  _sdk.maxWidth = Math.floor(window.innerWidth);
682
714
  /** 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();
@@ -575,7 +603,9 @@ var _sdk = class _sdk {
575
603
  isInstallClicked = false;
576
604
  }, 500);
577
605
  emitEvent("install");
578
- if ("mraid" === AD_PROTOCOL && isMraid()) {
606
+ if ("tencent" === AD_NETWORK && window.TencentGDT && window.TencentGDT.clickOpen) {
607
+ window.TencentGDT.clickOpen();
608
+ } else if ("mraid" === AD_PROTOCOL && isMraid()) {
579
609
  mraid.open(destinationUrl);
580
610
  } else if ("dapi" === AD_PROTOCOL && isDapi()) {
581
611
  dapi.openStoreUrl();
@@ -663,6 +693,7 @@ var _sdk = class _sdk {
663
693
  * }, gameInstance);
664
694
  */
665
695
  static on(event, fn, context) {
696
+ if (event === "pointermove") registerMoveHandler();
666
697
  onEvent(event, fn, context);
667
698
  }
668
699
  /**
@@ -679,6 +710,7 @@ var _sdk = class _sdk {
679
710
  * });
680
711
  */
681
712
  static once(event, fn, context) {
713
+ if (event === "pointermove") registerMoveHandler();
682
714
  onEvent(event, fn, context, true);
683
715
  }
684
716
  /**
@@ -701,7 +733,7 @@ var _sdk = class _sdk {
701
733
  }
702
734
  };
703
735
  /** Current version of the SDK */
704
- _sdk.version = "1.1.3";
736
+ _sdk.version = "1.2.0";
705
737
  /** Current maximum width of the playable ad container in pixels */
706
738
  _sdk.maxWidth = Math.floor(window.innerWidth);
707
739
  /** 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.3",
3
+ "version": "1.2.0",
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",