@hopeplayer/core 1.4.0 → 1.6.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/HopePlayerElement.d.ts +42 -2
- package/dist/HopePlayerElement.d.ts.map +1 -1
- package/dist/chunks/NativeEme-CXosVcw8.js +80 -0
- package/dist/chunks/NativeEme-CXosVcw8.js.map +1 -0
- package/dist/chunks/{accessibility-DeUIoAda.js → accessibility-DFx4CE0H.js} +9 -8
- package/dist/chunks/{accessibility-DeUIoAda.js.map → accessibility-DFx4CE0H.js.map} +1 -1
- package/dist/chunks/adTriggers-BIAWe8o4.js +419 -0
- package/dist/chunks/adTriggers-BIAWe8o4.js.map +1 -0
- package/dist/chunks/{ads-CdWbE9aD.js → ads-DlpHPpR9.js} +3 -3
- package/dist/chunks/ads-DlpHPpR9.js.map +1 -0
- package/dist/chunks/analytics-DEjTAJO9.js +281 -0
- package/dist/chunks/analytics-DEjTAJO9.js.map +1 -0
- package/dist/chunks/{cast-BQ-suTcF.js → cast-vHyi7oV_.js} +2 -2
- package/dist/chunks/{cast-BQ-suTcF.js.map → cast-vHyi7oV_.js.map} +1 -1
- package/dist/chunks/dash-CWjy-y7B.js +22 -0
- package/dist/chunks/dash-CWjy-y7B.js.map +1 -0
- package/dist/chunks/docPip-wybMVP1H.js +82 -0
- package/dist/chunks/docPip-wybMVP1H.js.map +1 -0
- package/dist/chunks/heatmap-Bb7neaYU.js +92 -0
- package/dist/chunks/heatmap-Bb7neaYU.js.map +1 -0
- package/dist/chunks/{history-DAbqEhNB.js → history-CwqLXiZi.js} +2 -2
- package/dist/chunks/{history-DAbqEhNB.js.map → history-CwqLXiZi.js.map} +1 -1
- package/dist/chunks/interactive-CgltIneu.js +189 -0
- package/dist/chunks/interactive-CgltIneu.js.map +1 -0
- package/dist/chunks/keySystems-CNzjRq6e.js +70 -0
- package/dist/chunks/keySystems-CNzjRq6e.js.map +1 -0
- package/dist/chunks/{loopSection-CvF4l5uf.js → loopSection-Bwk4W8vz.js} +16 -16
- package/dist/chunks/loopSection-Bwk4W8vz.js.map +1 -0
- package/dist/chunks/{markers-B04NMI79.js → markers-L69W3kj6.js} +53 -51
- package/dist/chunks/markers-L69W3kj6.js.map +1 -0
- package/dist/chunks/player-D2_HRzot.js +4351 -0
- package/dist/chunks/player-D2_HRzot.js.map +1 -0
- package/dist/chunks/{playlist-C6Mh9BE8.js → playlist-CHfStNbQ.js} +29 -21
- package/dist/chunks/playlist-CHfStNbQ.js.map +1 -0
- package/dist/chunks/plugin-style-CPJELe-i.js +17 -0
- package/dist/chunks/plugin-style-CPJELe-i.js.map +1 -0
- package/dist/chunks/pluginHost-cN2uGFeG.js +566 -0
- package/dist/chunks/pluginHost-cN2uGFeG.js.map +1 -0
- package/dist/chunks/redirectScreen-TIqLdvBY.js +239 -0
- package/dist/chunks/redirectScreen-TIqLdvBY.js.map +1 -0
- package/dist/chunks/{rewardedUnlock-CGhQyWOk.js → rewardedUnlock-DUqYwXTr.js} +2 -2
- package/dist/chunks/{rewardedUnlock-CGhQyWOk.js.map → rewardedUnlock-DUqYwXTr.js.map} +1 -1
- package/dist/chunks/segments-Ds-c1b5e.js +66 -0
- package/dist/chunks/segments-Ds-c1b5e.js.map +1 -0
- package/dist/chunks/{skipSegments-BbWzPpXz.js → skipSegments-ByNoF1qZ.js} +2 -2
- package/dist/chunks/{skipSegments-BbWzPpXz.js.map → skipSegments-ByNoF1qZ.js.map} +1 -1
- package/dist/chunks/{spriteThumbnails-B7oDZFTo.js → spriteThumbnails-Cr9UmkM9.js} +74 -51
- package/dist/chunks/spriteThumbnails-Cr9UmkM9.js.map +1 -0
- package/dist/chunks/{statsPanel-DSClIwA3.js → statsPanel-D0DtoFgS.js} +2 -2
- package/dist/chunks/statsPanel-D0DtoFgS.js.map +1 -0
- package/dist/chunks/{sticky-D_eLCNFk.js → sticky-BDStzjBM.js} +27 -26
- package/dist/chunks/sticky-BDStzjBM.js.map +1 -0
- package/dist/chunks/{story-BLBij82f.js → story-CodA2dfn.js} +2 -2
- package/dist/chunks/{story-BLBij82f.js.map → story-CodA2dfn.js.map} +1 -1
- package/dist/chunks/transcript-LG7E9UYE.js +186 -0
- package/dist/chunks/transcript-LG7E9UYE.js.map +1 -0
- package/dist/controls/ContextMenu.d.ts +1 -0
- package/dist/controls/ContextMenu.d.ts.map +1 -1
- package/dist/controls/ControlBar.d.ts +6 -0
- package/dist/controls/ControlBar.d.ts.map +1 -1
- package/dist/controls/SeekBar.d.ts +5 -2
- package/dist/controls/SeekBar.d.ts.map +1 -1
- package/dist/controls/SettingsMenu.d.ts +2 -1
- package/dist/controls/SettingsMenu.d.ts.map +1 -1
- package/dist/drm/NativeEme.d.ts +23 -0
- package/dist/drm/NativeEme.d.ts.map +1 -0
- package/dist/drm/keySystems.d.ts +18 -0
- package/dist/drm/keySystems.d.ts.map +1 -0
- package/dist/hls/SourceManager.d.ts +31 -5
- package/dist/hls/SourceManager.d.ts.map +1 -1
- package/dist/hls/dashEngine.d.ts +85 -0
- package/dist/hls/dashEngine.d.ts.map +1 -0
- package/dist/hls/sourceGroups.d.ts.map +1 -1
- package/dist/hope-player.js +1 -1
- package/dist/i18n/locales/en.d.ts.map +1 -1
- package/dist/i18n/locales/tr.d.ts.map +1 -1
- package/dist/i18n/types.d.ts +28 -0
- package/dist/i18n/types.d.ts.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/keyboard/KeyboardController.d.ts +14 -0
- package/dist/keyboard/KeyboardController.d.ts.map +1 -1
- package/dist/plugin-api/PluginAds.d.ts +61 -0
- package/dist/plugin-api/PluginAds.d.ts.map +1 -0
- package/dist/plugin-api/PluginHost.d.ts +6 -0
- package/dist/plugin-api/PluginHost.d.ts.map +1 -1
- package/dist/plugin-api/types.d.ts +39 -0
- package/dist/plugin-api/types.d.ts.map +1 -1
- package/dist/plugins/accessibility/Accessibility.d.ts.map +1 -1
- package/dist/plugins/ad-triggers/AdTriggers.d.ts +5 -0
- package/dist/plugins/ad-triggers/AdTriggers.d.ts.map +1 -1
- package/dist/plugins/ads/AdsController.d.ts +2 -0
- package/dist/plugins/ads/AdsController.d.ts.map +1 -1
- package/dist/plugins/analytics/QoeTracker.d.ts +71 -0
- package/dist/plugins/analytics/QoeTracker.d.ts.map +1 -0
- package/dist/plugins/analytics/index.d.ts +6 -0
- package/dist/plugins/analytics/index.d.ts.map +1 -0
- package/dist/plugins/doc-pip/DocumentPip.d.ts +44 -0
- package/dist/plugins/doc-pip/DocumentPip.d.ts.map +1 -0
- package/dist/plugins/doc-pip/index.d.ts +5 -0
- package/dist/plugins/doc-pip/index.d.ts.map +1 -0
- package/dist/plugins/heatmap/Heatmap.d.ts +36 -0
- package/dist/plugins/heatmap/Heatmap.d.ts.map +1 -0
- package/dist/plugins/heatmap/index.d.ts +6 -0
- package/dist/plugins/heatmap/index.d.ts.map +1 -0
- package/dist/plugins/interactive/Interactive.d.ts +45 -0
- package/dist/plugins/interactive/Interactive.d.ts.map +1 -0
- package/dist/plugins/interactive/index.d.ts +6 -0
- package/dist/plugins/interactive/index.d.ts.map +1 -0
- package/dist/plugins/markers/MarkProgress.d.ts +3 -1
- package/dist/plugins/markers/MarkProgress.d.ts.map +1 -1
- package/dist/plugins/playlist/PlaylistRunner.d.ts +2 -0
- package/dist/plugins/playlist/PlaylistRunner.d.ts.map +1 -1
- package/dist/plugins/redirect-screen/RedirectScreen.d.ts +3 -1
- package/dist/plugins/redirect-screen/RedirectScreen.d.ts.map +1 -1
- package/dist/plugins/segments/Segments.d.ts +1 -0
- package/dist/plugins/segments/Segments.d.ts.map +1 -1
- package/dist/plugins/sprite-thumbnails/SpriteThumbnails.d.ts +9 -0
- package/dist/plugins/sprite-thumbnails/SpriteThumbnails.d.ts.map +1 -1
- package/dist/plugins/sticky/StickyManager.d.ts +2 -0
- package/dist/plugins/sticky/StickyManager.d.ts.map +1 -1
- package/dist/plugins/transcript/Transcript.d.ts +65 -0
- package/dist/plugins/transcript/Transcript.d.ts.map +1 -0
- package/dist/plugins/transcript/index.d.ts +6 -0
- package/dist/plugins/transcript/index.d.ts.map +1 -0
- package/dist/screens/ErrorScreen.d.ts +1 -1
- package/dist/screens/ErrorScreen.d.ts.map +1 -1
- package/dist/subtitles/attachTracks.d.ts +6 -0
- package/dist/subtitles/attachTracks.d.ts.map +1 -1
- package/dist/types/index.d.ts +320 -16
- package/dist/types/index.d.ts.map +1 -1
- package/dist/utils/plugin-style.d.ts +5 -0
- package/dist/utils/plugin-style.d.ts.map +1 -0
- package/package.json +2 -1
- package/dist/chunks/adTriggers-DXmtF4t2.js +0 -410
- package/dist/chunks/adTriggers-DXmtF4t2.js.map +0 -1
- package/dist/chunks/ads-CdWbE9aD.js.map +0 -1
- package/dist/chunks/loopSection-CvF4l5uf.js.map +0 -1
- package/dist/chunks/markers-B04NMI79.js.map +0 -1
- package/dist/chunks/player-D7WQxMzr.js +0 -3894
- package/dist/chunks/player-D7WQxMzr.js.map +0 -1
- package/dist/chunks/playlist-C6Mh9BE8.js.map +0 -1
- package/dist/chunks/pluginHost-DjvLmMYZ.js +0 -376
- package/dist/chunks/pluginHost-DjvLmMYZ.js.map +0 -1
- package/dist/chunks/redirectScreen-5HAVRtxe.js +0 -208
- package/dist/chunks/redirectScreen-5HAVRtxe.js.map +0 -1
- package/dist/chunks/segments-gCPrWRig.js +0 -63
- package/dist/chunks/segments-gCPrWRig.js.map +0 -1
- package/dist/chunks/spriteThumbnails-B7oDZFTo.js.map +0 -1
- package/dist/chunks/statsPanel-DSClIwA3.js.map +0 -1
- package/dist/chunks/sticky-D_eLCNFk.js.map +0 -1
|
@@ -0,0 +1,419 @@
|
|
|
1
|
+
var x = Object.defineProperty;
|
|
2
|
+
var L = (l, e, t) => e in l ? x(l, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : l[e] = t;
|
|
3
|
+
var c = (l, e, t) => L(l, typeof e != "symbol" ? e + "" : e, t);
|
|
4
|
+
import { f as b } from "./trackingPixel-D2wxdCEz.js";
|
|
5
|
+
import { l as T } from "./gpt-CGXHTG_H.js";
|
|
6
|
+
const C = 5e3, F = 8e3, P = 30, U = ["none", "full", "center", "top", "bottom", "top-left", "top-right", "bottom-left", "bottom-right"], N = ["time", "interval", "percent", "fullscreen", "fullscreenExit", "start", "pause", "resume", "ended"], R = 1.5;
|
|
7
|
+
let M = 0;
|
|
8
|
+
function D(l) {
|
|
9
|
+
if (typeof l != "string" || !l.trim()) return null;
|
|
10
|
+
try {
|
|
11
|
+
const e = new URL(l, document.baseURI);
|
|
12
|
+
return e.protocol === "https:" || e.protocol === "http:" ? e.href : null;
|
|
13
|
+
} catch {
|
|
14
|
+
return null;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
const m = (l, e, t) => typeof l == "number" && Number.isFinite(l) ? Math.min(t, Math.max(e, l)) : void 0, A = (l) => typeof l == "string" ? l.slice(0, 200) : typeof l == "number" && Number.isFinite(l) || typeof l == "boolean" ? String(l) : null;
|
|
18
|
+
function v(l) {
|
|
19
|
+
let e;
|
|
20
|
+
if (typeof l == "string") {
|
|
21
|
+
if (!l.trim()) return;
|
|
22
|
+
e = [...new URLSearchParams(l.trim().replace(/^\?/, "")).entries()].map(([s, i]) => [s, i.includes(",") ? i.split(",") : i]);
|
|
23
|
+
} else if (l && typeof l == "object" && !Array.isArray(l))
|
|
24
|
+
e = Object.entries(l);
|
|
25
|
+
else
|
|
26
|
+
return;
|
|
27
|
+
const t = {};
|
|
28
|
+
for (const [s, i] of e.slice(0, 50))
|
|
29
|
+
if (/^[\w.-]{1,40}$/.test(s))
|
|
30
|
+
if (Array.isArray(i)) {
|
|
31
|
+
const r = i.map(A).filter((o) => o !== null && o !== "").slice(0, 30);
|
|
32
|
+
r.length && (t[s] = r);
|
|
33
|
+
} else {
|
|
34
|
+
const r = A(i);
|
|
35
|
+
r !== null && r !== "" && (t[s] = r);
|
|
36
|
+
}
|
|
37
|
+
return Object.keys(t).length ? t : void 0;
|
|
38
|
+
}
|
|
39
|
+
function O(l) {
|
|
40
|
+
if (!l || typeof l != "object") return null;
|
|
41
|
+
const e = l, t = e.type;
|
|
42
|
+
if (!N.includes(t)) return null;
|
|
43
|
+
const s = (i, r, o) => (Array.isArray(i) ? i : [i]).map((a) => m(a, r, o)).filter((a) => a !== void 0).slice(0, 50);
|
|
44
|
+
if (t === "time") {
|
|
45
|
+
const i = s(e.at, 0, 86400);
|
|
46
|
+
return i.length ? { type: t, at: i } : null;
|
|
47
|
+
}
|
|
48
|
+
if (t === "percent") {
|
|
49
|
+
const i = s(e.at, 1, 99);
|
|
50
|
+
return i.length ? { type: t, at: i } : null;
|
|
51
|
+
}
|
|
52
|
+
if (t === "interval") {
|
|
53
|
+
const i = m(e.every, 10, 86400);
|
|
54
|
+
return i ? { type: t, every: i, startAfter: m(e.startAfter, 0, 86400) } : null;
|
|
55
|
+
}
|
|
56
|
+
return { type: t, delay: m(e.delay, 0, 600) };
|
|
57
|
+
}
|
|
58
|
+
function k(l) {
|
|
59
|
+
var a, d, u;
|
|
60
|
+
if (!l || typeof l != "object") return null;
|
|
61
|
+
const e = l;
|
|
62
|
+
if (e.active !== !0 || !Array.isArray(e.rules)) return null;
|
|
63
|
+
const t = Date.now(), s = e.validFrom ? Date.parse(e.validFrom) : NaN, i = e.validUntil ? Date.parse(e.validUntil) : NaN;
|
|
64
|
+
if (Number.isFinite(s) && t < s || Number.isFinite(i) && t > i) return null;
|
|
65
|
+
const r = (f) => Array.isArray(f) ? f.map(D).filter((n) => !!n).slice(0, 10) : [], o = [];
|
|
66
|
+
for (const f of e.rules.slice(0, 20)) {
|
|
67
|
+
if (!f || typeof f != "object") continue;
|
|
68
|
+
const n = f;
|
|
69
|
+
if (typeof n.adUnitPath != "string" || !/^\/\d+(?:[,/][\w.\-/]*)?$/.test(n.adUnitPath)) continue;
|
|
70
|
+
const g = (Array.isArray(n.triggers) ? n.triggers : []).map(O).filter((y) => !!y).slice(0, 20);
|
|
71
|
+
if (!g.length) continue;
|
|
72
|
+
const h = Array.isArray(n.size) && n.size.length === 2 ? [m(n.size[0], 1, 4e3), m(n.size[1], 1, 4e3)] : null, p = U.includes(n.layout) ? n.layout : "none";
|
|
73
|
+
o.push({
|
|
74
|
+
id: typeof n.id == "string" ? n.id.slice(0, 80) : void 0,
|
|
75
|
+
adUnitPath: n.adUnitPath,
|
|
76
|
+
mode: n.mode === "fullscreen" || n.mode === "normal" ? n.mode : "any",
|
|
77
|
+
triggers: g,
|
|
78
|
+
targeting: v(n.targeting),
|
|
79
|
+
// API'lerde yaygın `cust_params` yazımı da kabul edilir.
|
|
80
|
+
custParams: v(n.custParams ?? n.cust_params),
|
|
81
|
+
layout: p,
|
|
82
|
+
size: h && h[0] && h[1] ? [h[0], h[1]] : void 0,
|
|
83
|
+
backdrop: typeof n.backdrop == "boolean" ? n.backdrop : p === "full",
|
|
84
|
+
pauseContent: n.pauseContent === !0,
|
|
85
|
+
closeButton: n.closeButton !== !1,
|
|
86
|
+
closeDelay: m(n.closeDelay, 0, 120) ?? 0,
|
|
87
|
+
duration: m(n.duration, 1, 3600),
|
|
88
|
+
label: n.label === !1 ? !1 : typeof n.label == "string" ? n.label.slice(0, 40) : void 0,
|
|
89
|
+
maxShows: m(n.maxShows, 1, 1e3),
|
|
90
|
+
minGapSeconds: m(n.minGapSeconds, 0, 86400),
|
|
91
|
+
minPlayerWidth: m(n.minPlayerWidth, 0, 4e3),
|
|
92
|
+
tracking: { impression: r((a = n.tracking) == null ? void 0 : a.impression), close: r((d = n.tracking) == null ? void 0 : d.close), empty: r((u = n.tracking) == null ? void 0 : u.empty) }
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
return o.length ? {
|
|
96
|
+
active: !0,
|
|
97
|
+
id: typeof e.id == "string" ? e.id.slice(0, 120) : void 0,
|
|
98
|
+
minGapSeconds: m(e.minGapSeconds, 0, 86400) ?? P,
|
|
99
|
+
rules: o
|
|
100
|
+
} : null;
|
|
101
|
+
}
|
|
102
|
+
class $ {
|
|
103
|
+
constructor(e, t) {
|
|
104
|
+
c(this, "options");
|
|
105
|
+
c(this, "config", null);
|
|
106
|
+
c(this, "loaded", !1);
|
|
107
|
+
c(this, "googletag", null);
|
|
108
|
+
c(this, "showing", null);
|
|
109
|
+
c(this, "instance", ++M);
|
|
110
|
+
c(this, "seq", 0);
|
|
111
|
+
c(this, "requestSeq", 0);
|
|
112
|
+
c(this, "destroyed", !1);
|
|
113
|
+
c(this, "refreshTimer", null);
|
|
114
|
+
c(this, "tickTimer");
|
|
115
|
+
/** Olaydan `delay` sn sonra çalışacak tetiklemeler — koşul bozulunca iptal edilir. */
|
|
116
|
+
c(this, "delayed", []);
|
|
117
|
+
// ── içerik başına durum (kaynak değişince sıfırlanır) ──
|
|
118
|
+
c(this, "contentKey", "");
|
|
119
|
+
c(this, "fired", /* @__PURE__ */ new Set());
|
|
120
|
+
c(this, "shows", /* @__PURE__ */ new Map());
|
|
121
|
+
c(this, "lastShownAt", /* @__PURE__ */ new Map());
|
|
122
|
+
c(this, "lastAnyAt", 0);
|
|
123
|
+
c(this, "watchedMs", 0);
|
|
124
|
+
c(this, "lastTick", performance.now());
|
|
125
|
+
c(this, "lastPos", 0);
|
|
126
|
+
/** lastPos'un ölçüldüğü an — doğal ilerlemenin üst sınırı geçen gerçek süreden hesaplanır. */
|
|
127
|
+
c(this, "lastPosAt", performance.now());
|
|
128
|
+
/** `seeking` ile `seeked` arası: aradaki işaretler tetiklenmez. */
|
|
129
|
+
c(this, "seekPending", !1);
|
|
130
|
+
c(this, "started", !1);
|
|
131
|
+
c(this, "userPaused", !1);
|
|
132
|
+
/** Player'ın kendi duraklatması (pauseContent) — pause/resume kuralı sayılmaz. */
|
|
133
|
+
c(this, "selfPause", !1);
|
|
134
|
+
c(this, "wasFullscreen", !1);
|
|
135
|
+
// ── olaylar → tetikleyiciler ──
|
|
136
|
+
c(this, "onLoadStart", () => {
|
|
137
|
+
const e = this.ctx.contentKey();
|
|
138
|
+
e !== this.contentKey && (this.contentKey = e, this.fired.clear(), this.shows.clear(), this.lastShownAt.clear(), this.watchedMs = 0, this.lastPos = 0, this.lastPosAt = performance.now(), this.seekPending = !1, this.started = !1, this.userPaused = !1, this.cancelDelayed(), this.close("content"));
|
|
139
|
+
});
|
|
140
|
+
c(this, "onPlaying", () => {
|
|
141
|
+
this.ctx.isBlocked() || (this.started ? this.userPaused && this.trigger("resume") : (this.started = !0, this.trigger("start")), this.userPaused = !1, this.cancelDelayed("pause"));
|
|
142
|
+
});
|
|
143
|
+
c(this, "onPause", () => {
|
|
144
|
+
const e = this.ctx.videoEl;
|
|
145
|
+
if (this.selfPause) {
|
|
146
|
+
this.selfPause = !1;
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
e.ended || e.seeking || this.ctx.isBlocked() || (this.userPaused = !0, this.cancelDelayed("start", "resume"), this.trigger("pause"));
|
|
150
|
+
});
|
|
151
|
+
c(this, "onEnded", () => {
|
|
152
|
+
this.ctx.isBlocked() || this.trigger("ended");
|
|
153
|
+
});
|
|
154
|
+
c(this, "onSeeking", () => {
|
|
155
|
+
this.seekPending = !0;
|
|
156
|
+
});
|
|
157
|
+
c(this, "onSeeked", () => {
|
|
158
|
+
this.seekPending = !1, this.lastPos = this.ctx.videoEl.currentTime, this.lastPosAt = performance.now();
|
|
159
|
+
});
|
|
160
|
+
c(this, "onFullscreenChange", () => {
|
|
161
|
+
var s;
|
|
162
|
+
const e = this.ctx.isFullscreen();
|
|
163
|
+
if (e === this.wasFullscreen) return;
|
|
164
|
+
this.wasFullscreen = e, this.cancelDelayed(e ? "fullscreenExit" : "fullscreen");
|
|
165
|
+
const t = (s = this.showing) == null ? void 0 : s.rule.mode;
|
|
166
|
+
(t === "fullscreen" && !e || t === "normal" && e) && this.close("mode"), this.trigger(e ? "fullscreen" : "fullscreenExit");
|
|
167
|
+
});
|
|
168
|
+
c(this, "onVideoAdStart", (e) => {
|
|
169
|
+
var t;
|
|
170
|
+
((t = e.detail) == null ? void 0 : t.linear) !== !1 && (this.cancelDelayed(), this.close("ad"));
|
|
171
|
+
});
|
|
172
|
+
c(this, "onTimeUpdate", () => {
|
|
173
|
+
const e = this.ctx.videoEl, t = e.currentTime, s = this.lastPos, i = performance.now(), r = (i - this.lastPosAt) / 1e3;
|
|
174
|
+
this.lastPos = t, this.lastPosAt = i;
|
|
175
|
+
const o = this.config;
|
|
176
|
+
if (!o || e.paused || e.seeking || this.seekPending || this.isLive() || this.ctx.isBlocked()) return;
|
|
177
|
+
const a = Math.max(R, r * (e.playbackRate || 1) + 0.5);
|
|
178
|
+
if (t <= s || t - s > a) return;
|
|
179
|
+
const d = e.duration;
|
|
180
|
+
o.rules.forEach(
|
|
181
|
+
(u, f) => u.triggers.forEach((n, g) => {
|
|
182
|
+
if (!(n.type !== "time" && n.type !== "percent"))
|
|
183
|
+
for (const h of n.at) {
|
|
184
|
+
const p = n.type === "percent" ? Number.isFinite(d) && d > 0 ? d * h / 100 : NaN : h, y = `${f}:${g}:${h}`;
|
|
185
|
+
s < p && p <= t && !this.fired.has(y) && (this.fired.add(y), this.showRule(f, n.type));
|
|
186
|
+
}
|
|
187
|
+
})
|
|
188
|
+
);
|
|
189
|
+
});
|
|
190
|
+
/** Gerçek izleme süresi: interval kuralları (ve canlıda time kuralları) bununla sayılır. */
|
|
191
|
+
c(this, "tick", () => {
|
|
192
|
+
var a;
|
|
193
|
+
const e = performance.now(), t = Math.min(2e3, Math.max(0, e - this.lastTick));
|
|
194
|
+
this.lastTick = e;
|
|
195
|
+
const s = this.ctx.videoEl, i = this.config;
|
|
196
|
+
if (!i || s.paused || s.ended || document.hidden || this.ctx.isBlocked() || (a = this.showing) != null && a.filled) return;
|
|
197
|
+
const r = this.watchedMs / 1e3;
|
|
198
|
+
this.watchedMs += t;
|
|
199
|
+
const o = this.watchedMs / 1e3;
|
|
200
|
+
i.rules.forEach(
|
|
201
|
+
(d, u) => d.triggers.forEach((f, n) => {
|
|
202
|
+
if (f.type === "interval") {
|
|
203
|
+
const g = f.startAfter ?? f.every, h = Math.floor((o - g) / f.every);
|
|
204
|
+
o >= g && g + h * f.every > r && this.showRule(u, "interval");
|
|
205
|
+
} else if (f.type === "time" && this.isLive())
|
|
206
|
+
for (const g of f.at) {
|
|
207
|
+
const h = `${u}:${n}:${g}:live`;
|
|
208
|
+
r < g && g <= o && !this.fired.has(h) && (this.fired.add(h), this.showRule(u, "time"));
|
|
209
|
+
}
|
|
210
|
+
})
|
|
211
|
+
);
|
|
212
|
+
});
|
|
213
|
+
this.ctx = e, this.options = t;
|
|
214
|
+
const s = e.videoEl;
|
|
215
|
+
s.addEventListener("timeupdate", this.onTimeUpdate), s.addEventListener("seeking", this.onSeeking), s.addEventListener("seeked", this.onSeeked), s.addEventListener("playing", this.onPlaying), s.addEventListener("pause", this.onPause), s.addEventListener("ended", this.onEnded), s.addEventListener("loadstart", this.onLoadStart), s.addEventListener("webkitbeginfullscreen", this.onFullscreenChange), s.addEventListener("webkitendfullscreen", this.onFullscreenChange), document.addEventListener("fullscreenchange", this.onFullscreenChange), document.addEventListener("webkitfullscreenchange", this.onFullscreenChange), e.hostEl.addEventListener("hp:adstart", this.onVideoAdStart), this.wasFullscreen = e.isFullscreen(), this.contentKey = e.contentKey(), this.tickTimer = setInterval(this.tick, 1e3), this.load(), this.scheduleRefresh();
|
|
216
|
+
}
|
|
217
|
+
update(e) {
|
|
218
|
+
const t = e.endpoint !== this.options.endpoint || JSON.stringify(e.params) !== JSON.stringify(this.options.params) || JSON.stringify(e.config) !== JSON.stringify(this.options.config), s = e.refreshSeconds !== this.options.refreshSeconds;
|
|
219
|
+
this.options = e, t && this.load(), s && this.scheduleRefresh();
|
|
220
|
+
}
|
|
221
|
+
get current() {
|
|
222
|
+
return this.config;
|
|
223
|
+
}
|
|
224
|
+
/** Şu an bir reklam gösteriliyor mu. */
|
|
225
|
+
get active() {
|
|
226
|
+
var e;
|
|
227
|
+
return !!((e = this.showing) != null && e.filled);
|
|
228
|
+
}
|
|
229
|
+
// ── kurallar ──
|
|
230
|
+
scheduleRefresh() {
|
|
231
|
+
this.refreshTimer && clearInterval(this.refreshTimer), this.refreshTimer = null;
|
|
232
|
+
const e = this.options.refreshSeconds;
|
|
233
|
+
this.options.endpoint && typeof e == "number" && e >= 10 && (this.refreshTimer = setInterval(() => void this.load(), e * 1e3));
|
|
234
|
+
}
|
|
235
|
+
async load() {
|
|
236
|
+
const e = ++this.requestSeq;
|
|
237
|
+
if (!this.options.endpoint) {
|
|
238
|
+
this.apply(k(this.options.config));
|
|
239
|
+
return;
|
|
240
|
+
}
|
|
241
|
+
const t = typeof AbortController < "u" ? new AbortController() : null, s = setTimeout(() => t == null ? void 0 : t.abort(), this.options.timeoutMs ?? C);
|
|
242
|
+
let i = "";
|
|
243
|
+
try {
|
|
244
|
+
const r = new URL(this.options.endpoint, document.baseURI);
|
|
245
|
+
for (const [d, u] of Object.entries(this.options.params ?? {})) r.searchParams.set(d, u);
|
|
246
|
+
i = r.href;
|
|
247
|
+
const o = await fetch(i, { ...this.options.fetchInit, signal: t == null ? void 0 : t.signal });
|
|
248
|
+
if (!o.ok) throw new Error(`HTTP ${o.status}`);
|
|
249
|
+
const a = await o.json();
|
|
250
|
+
if (this.destroyed || e !== this.requestSeq) return;
|
|
251
|
+
this.apply(k(a));
|
|
252
|
+
} catch (r) {
|
|
253
|
+
if (this.destroyed || e !== this.requestSeq) return;
|
|
254
|
+
this.ctx.log({ message: `Ad triggers API failed: ${String(r)}`, details: { url: i } }), !this.config && this.options.config && this.apply(k(this.options.config));
|
|
255
|
+
} finally {
|
|
256
|
+
clearTimeout(s);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
apply(e) {
|
|
260
|
+
const t = !this.loaded || JSON.stringify(e) !== JSON.stringify(this.config);
|
|
261
|
+
this.loaded = !0, this.config = e, t && (this.cancelDelayed(), e || this.close("content"), this.ctx.hostEl.dispatchEvent(new CustomEvent("hp:adtriggers", { detail: { config: e } })));
|
|
262
|
+
}
|
|
263
|
+
isLive() {
|
|
264
|
+
return this.ctx.videoEl.duration === 1 / 0;
|
|
265
|
+
}
|
|
266
|
+
/** Olay tipindeki tetikleyicisi olan her kural (gecikmeliyse zamanlanır). */
|
|
267
|
+
trigger(e) {
|
|
268
|
+
const t = this.config;
|
|
269
|
+
t && t.rules.forEach((s, i) => {
|
|
270
|
+
const r = s.triggers.find((d) => d.type === e);
|
|
271
|
+
if (!r) return;
|
|
272
|
+
const o = (r.delay ?? 0) * 1e3;
|
|
273
|
+
if (o <= 0) {
|
|
274
|
+
this.showRule(i, e);
|
|
275
|
+
return;
|
|
276
|
+
}
|
|
277
|
+
const a = setTimeout(() => {
|
|
278
|
+
this.delayed = this.delayed.filter((d) => d.timer !== a), this.showRule(i, e);
|
|
279
|
+
}, o);
|
|
280
|
+
this.delayed.push({ type: e, timer: a });
|
|
281
|
+
});
|
|
282
|
+
}
|
|
283
|
+
cancelDelayed(...e) {
|
|
284
|
+
this.delayed = this.delayed.filter((t) => e.length && !e.includes(t.type) ? !0 : (clearTimeout(t.timer), !1));
|
|
285
|
+
}
|
|
286
|
+
// ── gösterim ──
|
|
287
|
+
/** Koşullar uygunsa kuralın reklamını ister. Uygun değilse sessizce atlanır (sebep kayda düşer). */
|
|
288
|
+
showRule(e, t) {
|
|
289
|
+
var d, u;
|
|
290
|
+
const s = (d = this.config) == null ? void 0 : d.rules[e];
|
|
291
|
+
if (!s || this.destroyed) return;
|
|
292
|
+
const i = this.ctx.videoEl, r = this.ctx.isFullscreen(), o = (f) => this.ctx.log({ message: `Ad trigger skipped (${f})`, details: { rule: s.id, trigger: t } });
|
|
293
|
+
if (this.showing && !(this.showing.filled && this.showing.rule.layout === "none")) return o("another ad is showing");
|
|
294
|
+
if (this.ctx.isBlocked()) return o("video ad / intro screen");
|
|
295
|
+
if (document.hidden) return o("tab hidden");
|
|
296
|
+
if (this.ctx.isNativeFullscreen()) return o("native iOS fullscreen");
|
|
297
|
+
if (s.mode === "fullscreen" && !r) return o("not fullscreen");
|
|
298
|
+
if (s.mode === "normal" && r) return o("fullscreen");
|
|
299
|
+
if (t === "pause" && (!i.paused || i.ended) || t === "ended" && !i.ended || ["time", "percent", "interval", "start", "resume"].includes(t) && i.paused) return;
|
|
300
|
+
if (s.minPlayerWidth && this.ctx.overlayEl.getBoundingClientRect().width < s.minPlayerWidth) return o("player too narrow");
|
|
301
|
+
const a = Date.now();
|
|
302
|
+
if (s.maxShows && (this.shows.get(e) ?? 0) >= s.maxShows) return o("maxShows");
|
|
303
|
+
if (s.minGapSeconds && a - (this.lastShownAt.get(e) ?? 0) < s.minGapSeconds * 1e3) return o("rule minGapSeconds");
|
|
304
|
+
if (a - this.lastAnyAt < (((u = this.config) == null ? void 0 : u.minGapSeconds) ?? P) * 1e3) return o("minGapSeconds");
|
|
305
|
+
this.showing && this.close("replaced"), this.lastAnyAt = a, this.lastShownAt.set(e, a), this.request(e, s, t, r);
|
|
306
|
+
}
|
|
307
|
+
async request(e, t, s, i) {
|
|
308
|
+
const r = ++this.seq, o = `hp-adtrigger-${this.instance}`, a = this.buildBox(t, o), d = document.createElement("div");
|
|
309
|
+
d.id = `hp-adtrigger-${this.instance}-${r}`, d.slot = o;
|
|
310
|
+
const u = { rule: t, trigger: s, box: a, adHost: d, slot: null, filled: !1, pausedContent: !1, timers: [] };
|
|
311
|
+
this.showing = u, this.ctx.overlayEl.appendChild(a), this.ctx.hostEl.appendChild(d);
|
|
312
|
+
const f = { rule: t.id, trigger: s, adUnitPath: t.adUnitPath }, n = (h) => {
|
|
313
|
+
var p;
|
|
314
|
+
this.showing === u && (this.ctx.log({ message: `Ad trigger: no ad (${h})`, details: { ...f } }), b((p = t.tracking) == null ? void 0 : p.empty), this.ctx.hostEl.dispatchEvent(new CustomEvent("hp:adtriggerempty", { detail: f })), this.teardown(u));
|
|
315
|
+
};
|
|
316
|
+
u.timers.push(setTimeout(() => !u.filled && n("timeout"), this.options.renderTimeoutMs ?? F));
|
|
317
|
+
try {
|
|
318
|
+
this.googletag ?? (this.googletag = await T());
|
|
319
|
+
} catch (h) {
|
|
320
|
+
n(String(h));
|
|
321
|
+
return;
|
|
322
|
+
}
|
|
323
|
+
if (this.showing !== u) return;
|
|
324
|
+
const g = this.googletag;
|
|
325
|
+
g.cmd.push(() => {
|
|
326
|
+
if (this.showing !== u) return;
|
|
327
|
+
const h = g.defineOutOfPageSlot(t.adUnitPath, d.id);
|
|
328
|
+
if (!h) {
|
|
329
|
+
n("slot could not be defined");
|
|
330
|
+
return;
|
|
331
|
+
}
|
|
332
|
+
u.slot = h, h.addService(g.pubads());
|
|
333
|
+
const p = {
|
|
334
|
+
...v(this.options.targeting),
|
|
335
|
+
...v(this.options.custParams),
|
|
336
|
+
...t.targeting,
|
|
337
|
+
...v(t.custParams),
|
|
338
|
+
hp_trigger: s,
|
|
339
|
+
hp_mode: i ? "fullscreen" : "normal"
|
|
340
|
+
};
|
|
341
|
+
t.id && (p.hp_rule = t.id);
|
|
342
|
+
for (const [w, E] of Object.entries(p)) h.setTargeting(w, E);
|
|
343
|
+
u.custParams = p;
|
|
344
|
+
const y = (w) => {
|
|
345
|
+
var E, S;
|
|
346
|
+
w.slot === h && ((S = (E = g.pubads()).removeEventListener) == null || S.call(E, "slotRenderEnded", y), w.isEmpty ? n("empty") : this.reveal(e, u, i));
|
|
347
|
+
};
|
|
348
|
+
g.pubads().addEventListener("slotRenderEnded", y), g.enableServices(), g.display(d.id), g.pubads().isInitialLoadDisabled() && g.pubads().refresh([h]);
|
|
349
|
+
});
|
|
350
|
+
}
|
|
351
|
+
buildBox(e, t) {
|
|
352
|
+
const s = document.createElement("div");
|
|
353
|
+
s.className = "hp-adtrigger", s.setAttribute("part", "ad-trigger");
|
|
354
|
+
const i = e.layout === "none";
|
|
355
|
+
s.setAttribute("data-layout", e.layout ?? "none"), s.toggleAttribute("data-backdrop", !!e.backdrop);
|
|
356
|
+
const r = document.createElement("div");
|
|
357
|
+
if (r.className = "hp-adtrigger-frame", e.size && e.layout !== "full" && (r.style.setProperty("--hp-adtrigger-w", `${e.size[0]}px`), r.style.setProperty("--hp-adtrigger-h", `${e.size[1]}px`), r.setAttribute("data-sized", "")), e.label !== !1 && !i) {
|
|
358
|
+
const a = document.createElement("span");
|
|
359
|
+
a.className = "hp-adtrigger-label", a.textContent = e.label || this.ctx.i18n.adTriggerLabel, r.appendChild(a);
|
|
360
|
+
}
|
|
361
|
+
const o = document.createElement("slot");
|
|
362
|
+
if (o.name = t, r.appendChild(o), e.closeButton !== !1 && !i) {
|
|
363
|
+
const a = document.createElement("button");
|
|
364
|
+
a.type = "button", a.className = "hp-adtrigger-close", a.setAttribute("part", "ad-trigger-close"), a.setAttribute("aria-label", this.ctx.i18n.pauseAdClose), a.hidden = !0, a.innerHTML = '<svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" aria-hidden="true"><path d="M6 6l12 12M18 6L6 18"/></svg>', a.addEventListener("click", () => this.close("user")), r.appendChild(a);
|
|
365
|
+
}
|
|
366
|
+
s.appendChild(r);
|
|
367
|
+
for (const a of ["pointerdown", "click", "dblclick"]) s.addEventListener(a, (d) => d.stopPropagation());
|
|
368
|
+
return s;
|
|
369
|
+
}
|
|
370
|
+
reveal(e, t, s) {
|
|
371
|
+
var a;
|
|
372
|
+
if (this.showing !== t) return;
|
|
373
|
+
const { rule: i } = t;
|
|
374
|
+
if (t.filled = !0, this.shows.set(e, (this.shows.get(e) ?? 0) + 1), this.lastAnyAt = Date.now(), i.layout === "full" || i.size && i.layout !== "none") {
|
|
375
|
+
const d = t.adHost.querySelector("iframe");
|
|
376
|
+
d && Object.assign(d.style, { width: "100%", height: "100%", border: "0" }), Object.assign(t.adHost.style, { width: "100%", height: "100%" });
|
|
377
|
+
}
|
|
378
|
+
t.box.setAttribute("data-open", "");
|
|
379
|
+
const r = t.box.querySelector(".hp-adtrigger-close");
|
|
380
|
+
r && !i.closeDelay ? r.hidden = !1 : r && t.timers.push(setTimeout(() => r.hidden = !1, i.closeDelay * 1e3)), i.duration && t.timers.push(setTimeout(() => this.close("timeout"), i.duration * 1e3));
|
|
381
|
+
const o = this.ctx.videoEl;
|
|
382
|
+
i.pauseContent && !o.paused && (t.pausedContent = !0, this.selfPause = !0, o.pause()), b((a = i.tracking) == null ? void 0 : a.impression), this.ctx.hostEl.dispatchEvent(
|
|
383
|
+
new CustomEvent("hp:adtriggershow", { detail: { rule: i.id, trigger: t.trigger, adUnitPath: i.adUnitPath, fullscreen: s, custParams: t.custParams ?? {} } })
|
|
384
|
+
);
|
|
385
|
+
}
|
|
386
|
+
/** Gösterilen reklamı kapat (bekleyen istek varsa iptal). */
|
|
387
|
+
close(e) {
|
|
388
|
+
var i;
|
|
389
|
+
const t = this.showing;
|
|
390
|
+
if (!t) return;
|
|
391
|
+
const s = t.filled;
|
|
392
|
+
this.teardown(t), s && (b((i = t.rule.tracking) == null ? void 0 : i.close), this.ctx.hostEl.dispatchEvent(new CustomEvent("hp:adtriggerclose", { detail: { rule: t.rule.id, reason: e } })), t.pausedContent && e !== "content" && e !== "ad" && this.ctx.videoEl.play().catch(() => {
|
|
393
|
+
}));
|
|
394
|
+
}
|
|
395
|
+
teardown(e) {
|
|
396
|
+
this.showing === e && (this.showing = null);
|
|
397
|
+
for (const t of e.timers) clearTimeout(t);
|
|
398
|
+
if (e.slot && this.googletag)
|
|
399
|
+
try {
|
|
400
|
+
this.googletag.destroySlots([e.slot]);
|
|
401
|
+
} catch {
|
|
402
|
+
}
|
|
403
|
+
e.box.remove(), e.adHost.remove();
|
|
404
|
+
}
|
|
405
|
+
destroy() {
|
|
406
|
+
this.destroyed = !0, this.cancelDelayed(), this.close("content"), clearInterval(this.tickTimer), this.refreshTimer && clearInterval(this.refreshTimer);
|
|
407
|
+
const e = this.ctx.videoEl;
|
|
408
|
+
e.removeEventListener("timeupdate", this.onTimeUpdate), e.removeEventListener("seeking", this.onSeeking), e.removeEventListener("seeked", this.onSeeked), e.removeEventListener("playing", this.onPlaying), e.removeEventListener("pause", this.onPause), e.removeEventListener("ended", this.onEnded), e.removeEventListener("loadstart", this.onLoadStart), e.removeEventListener("webkitbeginfullscreen", this.onFullscreenChange), e.removeEventListener("webkitendfullscreen", this.onFullscreenChange), document.removeEventListener("fullscreenchange", this.onFullscreenChange), document.removeEventListener("webkitfullscreenchange", this.onFullscreenChange), this.ctx.hostEl.removeEventListener("hp:adstart", this.onVideoAdStart);
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
function G(l, e) {
|
|
412
|
+
return new $(l, e);
|
|
413
|
+
}
|
|
414
|
+
export {
|
|
415
|
+
$ as AdTriggers,
|
|
416
|
+
G as installAdTriggers,
|
|
417
|
+
k as normalizeAdTriggers
|
|
418
|
+
};
|
|
419
|
+
//# sourceMappingURL=adTriggers-BIAWe8o4.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adTriggers-BIAWe8o4.js","sources":["../../src/plugins/ad-triggers/AdTriggers.ts","../../src/plugins/ad-triggers/index.ts"],"sourcesContent":["import type { AdTrigger, AdTriggerLayout, AdTriggerRule, AdTriggersConfig, AdTriggersOptions } from '../../types';\nimport type { HopeLocaleStrings } from '../../i18n/types';\nimport { firePixels as fire } from '../shared/trackingPixel';\nimport { loadGpt, type GoogleTag, type GptSlot, type GptSlotRenderEndedEvent } from '../pause-ad/loadGpt';\n\nexport interface AdTriggersContext {\n /** Light DOM sahibi: GPT reklam div'ini id ile bulabilsin diye div buraya eklenir (tam ekranda da görünür). */\n hostEl: HTMLElement;\n videoEl: HTMLVideoElement;\n /** Reklam kutusunun ekleneceği alan (video alanı). */\n overlayEl: HTMLElement;\n i18n: HopeLocaleStrings;\n log(entry: { message: string; fatal?: boolean; details?: Record<string, string | number | boolean | undefined> }): void;\n /** Video reklamı (IMA) oynuyor ya da giriş ekranı (geri sayım / geo) açık — bu sırada istenmez. */\n isBlocked(): boolean;\n isFullscreen(): boolean;\n /** iPhone'un kendi video tam ekranı — player katmanları orada görünmez, reklam istenmez. */\n isNativeFullscreen(): boolean;\n /** İçerik kimliği — kalite değişimi / yedek kaynak aynı içerik sayılır; değişince sayaçlar sıfırlanır. */\n contentKey(): string;\n}\n\nconst DEFAULT_TIMEOUT_MS = 5000;\nconst DEFAULT_RENDER_TIMEOUT_MS = 8000;\nconst DEFAULT_GLOBAL_GAP_S = 30;\nconst LAYOUTS: AdTriggerLayout[] = ['none', 'full', 'center', 'top', 'bottom', 'top-left', 'top-right', 'bottom-left', 'bottom-right'];\nconst TRIGGER_TYPES = ['time', 'interval', 'percent', 'fullscreen', 'fullscreenExit', 'start', 'pause', 'resume', 'ended'] as const;\n/** Doğal ilerleme sayılan en büyük timeupdate adımı (sn) — daha büyük sıçrama ileri sarmadır, aradaki anlar atlanır. */\nconst MAX_NATURAL_STEP_S = 1.5;\nlet instanceCount = 0;\n\nfunction safeUrl(value: unknown): string | null {\n if (typeof value !== 'string' || !value.trim()) return null;\n try {\n const u = new URL(value, document.baseURI);\n return u.protocol === 'https:' || u.protocol === 'http:' ? u.href : null;\n } catch {\n return null;\n }\n}\n\nconst num = (n: unknown, min: number, max: number): number | undefined =>\n typeof n === 'number' && Number.isFinite(n) ? Math.min(max, Math.max(min, n)) : undefined;\n\ntype KeyValues = Record<string, string | string[]>;\nconst prim = (v: unknown): string | null =>\n typeof v === 'string' ? v.slice(0, 200) : typeof v === 'number' && Number.isFinite(v) ? String(v) : typeof v === 'boolean' ? String(v) : null;\n\n/**\n * Ad Manager key-value'ları (GPT slot hedeflemesi = VAST tag'lerindeki `cust_params`): JSON nesnesi\n * `{ \"kategori\": \"spor\", \"etiket\": [\"mac\", \"ozet\"], \"sezon\": 2026 }` ya da `\"kategori=spor&etiket=mac,ozet\"` metni.\n * Sayı / boolean metne çevrilir; geçersiz anahtar ve değerler atılır.\n */\nexport function parseCustParams(raw: unknown): KeyValues | undefined {\n let entries: Array<[string, unknown]>;\n if (typeof raw === 'string') {\n if (!raw.trim()) return undefined;\n entries = [...new URLSearchParams(raw.trim().replace(/^\\?/, '')).entries()].map(([k, v]) => [k, v.includes(',') ? v.split(',') : v]);\n } else if (raw && typeof raw === 'object' && !Array.isArray(raw)) {\n entries = Object.entries(raw as Record<string, unknown>);\n } else {\n return undefined;\n }\n const out: KeyValues = {};\n for (const [k, v] of entries.slice(0, 50)) {\n if (!/^[\\w.-]{1,40}$/.test(k)) continue;\n if (Array.isArray(v)) {\n const list = v.map(prim).filter((x): x is string => x !== null && x !== '').slice(0, 30);\n if (list.length) out[k] = list;\n } else {\n const one = prim(v);\n if (one !== null && one !== '') out[k] = one;\n }\n }\n return Object.keys(out).length ? out : undefined;\n}\n\nfunction normalizeTrigger(raw: unknown): AdTrigger | null {\n if (!raw || typeof raw !== 'object') return null;\n const t = raw as Record<string, unknown>;\n const type = t.type as (typeof TRIGGER_TYPES)[number];\n if (!TRIGGER_TYPES.includes(type)) return null;\n const list = (v: unknown, min: number, max: number): number[] =>\n (Array.isArray(v) ? v : [v]).map((x) => num(x, min, max)).filter((x): x is number => x !== undefined).slice(0, 50);\n if (type === 'time') {\n const at = list(t.at, 0, 86_400);\n return at.length ? { type, at } : null;\n }\n if (type === 'percent') {\n const at = list(t.at, 1, 99);\n return at.length ? { type, at } : null;\n }\n if (type === 'interval') {\n const every = num(t.every, 10, 86_400);\n return every ? { type, every, startAfter: num(t.startAfter, 0, 86_400) } : null;\n }\n return { type, delay: num(t.delay, 0, 600) };\n}\n\n/** API yanıtını doğrular, geçersiz kural/tetikleyicileri atar; modül kapalıysa ya da geçerli kural yoksa null. */\nexport function normalizeAdTriggers(raw: unknown): AdTriggersConfig | null {\n if (!raw || typeof raw !== 'object') return null;\n const r = raw as Partial<AdTriggersConfig>;\n if (r.active !== true || !Array.isArray(r.rules)) return null;\n const now = Date.now();\n const from = r.validFrom ? Date.parse(r.validFrom) : NaN;\n const until = r.validUntil ? Date.parse(r.validUntil) : NaN;\n if ((Number.isFinite(from) && now < from) || (Number.isFinite(until) && now > until)) return null;\n const urls = (list: unknown): string[] => (Array.isArray(list) ? list.map(safeUrl).filter((u): u is string => !!u).slice(0, 10) : []);\n const rules: AdTriggerRule[] = [];\n for (const raw of r.rules.slice(0, 20)) {\n if (!raw || typeof raw !== 'object') continue;\n const x = raw as Partial<AdTriggerRule>;\n // Reklam birimi yolu: \"/ağ kodu/birim/...\" biçimi.\n if (typeof x.adUnitPath !== 'string' || !/^\\/\\d+(?:[,/][\\w.\\-/]*)?$/.test(x.adUnitPath)) continue;\n const triggers = (Array.isArray(x.triggers) ? x.triggers : []).map(normalizeTrigger).filter((t): t is AdTrigger => !!t).slice(0, 20);\n if (!triggers.length) continue;\n const size = Array.isArray(x.size) && x.size.length === 2 ? [num(x.size[0], 1, 4000), num(x.size[1], 1, 4000)] : null;\n const layout = LAYOUTS.includes(x.layout as AdTriggerLayout) ? x.layout! : 'none';\n rules.push({\n id: typeof x.id === 'string' ? x.id.slice(0, 80) : undefined,\n adUnitPath: x.adUnitPath,\n mode: x.mode === 'fullscreen' || x.mode === 'normal' ? x.mode : 'any',\n triggers,\n targeting: parseCustParams(x.targeting),\n // API'lerde yaygın `cust_params` yazımı da kabul edilir.\n custParams: parseCustParams(x.custParams ?? (x as { cust_params?: unknown }).cust_params),\n layout,\n size: size && size[0] && size[1] ? [size[0], size[1]] : undefined,\n backdrop: typeof x.backdrop === 'boolean' ? x.backdrop : layout === 'full',\n pauseContent: x.pauseContent === true,\n closeButton: x.closeButton !== false,\n closeDelay: num(x.closeDelay, 0, 120) ?? 0,\n duration: num(x.duration, 1, 3600),\n label: x.label === false ? false : typeof x.label === 'string' ? x.label.slice(0, 40) : undefined,\n maxShows: num(x.maxShows, 1, 1000),\n minGapSeconds: num(x.minGapSeconds, 0, 86_400),\n minPlayerWidth: num(x.minPlayerWidth, 0, 4000),\n tracking: { impression: urls(x.tracking?.impression), close: urls(x.tracking?.close), empty: urls(x.tracking?.empty) },\n });\n }\n if (!rules.length) return null;\n return {\n active: true,\n id: typeof r.id === 'string' ? r.id.slice(0, 120) : undefined,\n minGapSeconds: num(r.minGapSeconds, 0, 86_400) ?? DEFAULT_GLOBAL_GAP_S,\n rules,\n };\n}\n\n\ntype TriggerType = AdTrigger['type'];\ntype CloseReason = 'user' | 'timeout' | 'mode' | 'ad' | 'content' | 'replaced';\n\ninterface Showing {\n rule: AdTriggerRule;\n trigger: TriggerType;\n box: HTMLDivElement;\n adHost: HTMLDivElement;\n slot: GptSlot | null;\n filled: boolean;\n pausedContent: boolean;\n timers: Array<ReturnType<typeof setTimeout>>;\n /** İsteğe giden key-value'ların son hali (olayda bildirilir). */\n custParams?: KeyValues;\n}\n\n/**\n * Reklam tetikleyici: kurallara göre Ad Manager out-of-page reklamı ister ve player içinde (tam ekranda da) gösterir.\n * Kurallar API'den (`endpoint`) ya da `config`'ten gelir; API hatasında son geçerli kurallar korunur.\n * Aynı anda tek reklam; video reklamı (IMA) oynarken, sekme arka plandayken ve iPhone native tam ekranında istenmez.\n */\nexport class AdTriggers {\n private options: AdTriggersOptions;\n private config: AdTriggersConfig | null = null;\n private loaded = false;\n private googletag: GoogleTag | null = null;\n private showing: Showing | null = null;\n private readonly instance = ++instanceCount;\n private seq = 0;\n private requestSeq = 0;\n private destroyed = false;\n private refreshTimer: ReturnType<typeof setInterval> | null = null;\n private readonly tickTimer: ReturnType<typeof setInterval>;\n /** Olaydan `delay` sn sonra çalışacak tetiklemeler — koşul bozulunca iptal edilir. */\n private delayed: Array<{ type: TriggerType; timer: ReturnType<typeof setTimeout> }> = [];\n // ── içerik başına durum (kaynak değişince sıfırlanır) ──\n private contentKey = '';\n private fired = new Set<string>();\n private shows = new Map<number, number>();\n private lastShownAt = new Map<number, number>();\n private lastAnyAt = 0;\n private watchedMs = 0;\n private lastTick = performance.now();\n private lastPos = 0;\n /** lastPos'un ölçüldüğü an — doğal ilerlemenin üst sınırı geçen gerçek süreden hesaplanır. */\n private lastPosAt = performance.now();\n /** `seeking` ile `seeked` arası: aradaki işaretler tetiklenmez. */\n private seekPending = false;\n private started = false;\n private userPaused = false;\n /** Player'ın kendi duraklatması (pauseContent) — pause/resume kuralı sayılmaz. */\n private selfPause = false;\n private wasFullscreen = false;\n\n constructor(\n private readonly ctx: AdTriggersContext,\n options: AdTriggersOptions\n ) {\n this.options = options;\n const v = ctx.videoEl;\n v.addEventListener('timeupdate', this.onTimeUpdate);\n v.addEventListener('seeking', this.onSeeking);\n v.addEventListener('seeked', this.onSeeked);\n v.addEventListener('playing', this.onPlaying);\n v.addEventListener('pause', this.onPause);\n v.addEventListener('ended', this.onEnded);\n v.addEventListener('loadstart', this.onLoadStart);\n v.addEventListener('webkitbeginfullscreen', this.onFullscreenChange);\n v.addEventListener('webkitendfullscreen', this.onFullscreenChange);\n document.addEventListener('fullscreenchange', this.onFullscreenChange);\n document.addEventListener('webkitfullscreenchange', this.onFullscreenChange);\n ctx.hostEl.addEventListener('hp:adstart', this.onVideoAdStart);\n this.wasFullscreen = ctx.isFullscreen();\n this.contentKey = ctx.contentKey();\n this.tickTimer = setInterval(this.tick, 1000);\n void this.load();\n this.scheduleRefresh();\n }\n\n update(options: AdTriggersOptions): void {\n const changed =\n options.endpoint !== this.options.endpoint ||\n JSON.stringify(options.params) !== JSON.stringify(this.options.params) ||\n JSON.stringify(options.config) !== JSON.stringify(this.options.config);\n const refreshChanged = options.refreshSeconds !== this.options.refreshSeconds;\n this.options = options;\n if (changed) void this.load();\n if (refreshChanged) this.scheduleRefresh();\n }\n\n get current(): AdTriggersConfig | null {\n return this.config;\n }\n\n /** Şu an bir reklam gösteriliyor mu. */\n get active(): boolean {\n return !!this.showing?.filled;\n }\n\n // ── kurallar ──\n\n private scheduleRefresh(): void {\n if (this.refreshTimer) clearInterval(this.refreshTimer);\n this.refreshTimer = null;\n const s = this.options.refreshSeconds;\n if (this.options.endpoint && typeof s === 'number' && s >= 10) this.refreshTimer = setInterval(() => void this.load(), s * 1000);\n }\n\n private async load(): Promise<void> {\n const seq = ++this.requestSeq;\n if (!this.options.endpoint) {\n this.apply(normalizeAdTriggers(this.options.config));\n return;\n }\n const ctrl = typeof AbortController !== 'undefined' ? new AbortController() : null;\n const timer = setTimeout(() => ctrl?.abort(), this.options.timeoutMs ?? DEFAULT_TIMEOUT_MS);\n let url = '';\n try {\n const u = new URL(this.options.endpoint, document.baseURI);\n for (const [k, v] of Object.entries(this.options.params ?? {})) u.searchParams.set(k, v);\n url = u.href;\n const res = await fetch(url, { ...this.options.fetchInit, signal: ctrl?.signal });\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n const json: unknown = await res.json();\n if (this.destroyed || seq !== this.requestSeq) return;\n this.apply(normalizeAdTriggers(json));\n } catch (err) {\n if (this.destroyed || seq !== this.requestSeq) return;\n this.ctx.log({ message: `Ad triggers API failed: ${String(err)}`, details: { url } });\n // Hiç kural yoksa yerel varsayılan (config) kullanılır; varsa son geçerli kurallar korunur.\n if (!this.config && this.options.config) this.apply(normalizeAdTriggers(this.options.config));\n } finally {\n clearTimeout(timer);\n }\n }\n\n private apply(config: AdTriggersConfig | null): void {\n // İlk yanıt her zaman bildirilir (kapalı olsa da) — sonrakiler yalnızca değişince.\n const changed = !this.loaded || JSON.stringify(config) !== JSON.stringify(this.config);\n this.loaded = true;\n this.config = config;\n if (!changed) return;\n this.cancelDelayed();\n if (!config) this.close('content');\n this.ctx.hostEl.dispatchEvent(new CustomEvent('hp:adtriggers', { detail: { config } }));\n }\n\n // ── olaylar → tetikleyiciler ──\n\n private readonly onLoadStart = (): void => {\n const key = this.ctx.contentKey();\n // Aynı içeriğin kalite değişimi de loadstart üretir — yalnızca gerçekten başka bir içerik gelince sıfırla.\n if (key === this.contentKey) return;\n this.contentKey = key;\n this.fired.clear();\n this.shows.clear();\n this.lastShownAt.clear();\n this.watchedMs = 0;\n this.lastPos = 0;\n this.lastPosAt = performance.now();\n this.seekPending = false;\n this.started = false;\n this.userPaused = false;\n this.cancelDelayed();\n this.close('content');\n };\n\n private readonly onPlaying = (): void => {\n if (this.ctx.isBlocked()) return;\n if (!this.started) {\n this.started = true;\n this.trigger('start');\n } else if (this.userPaused) {\n this.trigger('resume');\n }\n this.userPaused = false;\n this.cancelDelayed('pause');\n };\n\n private readonly onPause = (): void => {\n const v = this.ctx.videoEl;\n if (this.selfPause) {\n this.selfPause = false;\n return;\n }\n if (v.ended || v.seeking || this.ctx.isBlocked()) return;\n this.userPaused = true;\n this.cancelDelayed('start', 'resume');\n this.trigger('pause');\n };\n\n private readonly onEnded = (): void => {\n if (!this.ctx.isBlocked()) this.trigger('ended');\n };\n\n private readonly onSeeking = (): void => {\n this.seekPending = true;\n };\n\n private readonly onSeeked = (): void => {\n this.seekPending = false;\n this.lastPos = this.ctx.videoEl.currentTime;\n this.lastPosAt = performance.now();\n };\n\n private readonly onFullscreenChange = (): void => {\n const fs = this.ctx.isFullscreen();\n if (fs === this.wasFullscreen) return;\n this.wasFullscreen = fs;\n this.cancelDelayed(fs ? 'fullscreenExit' : 'fullscreen');\n // Tam ekran durumu değişti: o duruma özel gösterilen reklam kapanır.\n const mode = this.showing?.rule.mode;\n if ((mode === 'fullscreen' && !fs) || (mode === 'normal' && fs)) this.close('mode');\n this.trigger(fs ? 'fullscreen' : 'fullscreenExit');\n };\n\n private readonly onVideoAdStart = (e: Event): void => {\n if ((e as CustomEvent<{ linear?: boolean }>).detail?.linear === false) return;\n this.cancelDelayed();\n this.close('ad');\n };\n\n private isLive(): boolean {\n return this.ctx.videoEl.duration === Infinity;\n }\n\n private readonly onTimeUpdate = (): void => {\n const v = this.ctx.videoEl;\n const pos = v.currentTime;\n const prev = this.lastPos;\n const now = performance.now();\n const elapsed = (now - this.lastPosAt) / 1000;\n this.lastPos = pos;\n this.lastPosAt = now;\n const c = this.config;\n if (!c || v.paused || v.seeking || this.seekPending || this.isLive() || this.ctx.isBlocked()) return;\n // Yalnızca doğal ilerleme — ileri sarınca aradaki anlar tetiklenmez. Sarma `seeking` ile yakalanır; adım\n // sınırı geçen gerçek süreye göre (seyrek timeupdate'te — yavaş cihaz, arka plan sekmesi — işaret kaçmasın).\n const maxStep = Math.max(MAX_NATURAL_STEP_S, elapsed * (v.playbackRate || 1) + 0.5);\n if (pos <= prev || pos - prev > maxStep) return;\n const dur = v.duration;\n c.rules.forEach((rule, ri) =>\n rule.triggers.forEach((t, ti) => {\n if (t.type !== 'time' && t.type !== 'percent') return;\n for (const mark of t.at) {\n const at = t.type === 'percent' ? (Number.isFinite(dur) && dur > 0 ? (dur * mark) / 100 : NaN) : mark;\n const key = `${ri}:${ti}:${mark}`;\n if (prev < at && at <= pos && !this.fired.has(key)) {\n this.fired.add(key);\n this.showRule(ri, t.type);\n }\n }\n })\n );\n };\n\n /** Gerçek izleme süresi: interval kuralları (ve canlıda time kuralları) bununla sayılır. */\n private readonly tick = (): void => {\n const now = performance.now();\n const delta = Math.min(2000, Math.max(0, now - this.lastTick));\n this.lastTick = now;\n const v = this.ctx.videoEl;\n const c = this.config;\n if (!c || v.paused || v.ended || document.hidden || this.ctx.isBlocked() || this.showing?.filled) return;\n const before = this.watchedMs / 1000;\n this.watchedMs += delta;\n const after = this.watchedMs / 1000;\n c.rules.forEach((rule, ri) =>\n rule.triggers.forEach((t, ti) => {\n if (t.type === 'interval') {\n const first = t.startAfter ?? t.every;\n // Bu adımda geçilen eşik: first, first + every, first + 2·every…\n const n = Math.floor((after - first) / t.every);\n if (after >= first && first + n * t.every > before) this.showRule(ri, 'interval');\n } else if (t.type === 'time' && this.isLive()) {\n for (const at of t.at) {\n const key = `${ri}:${ti}:${at}:live`;\n if (before < at && at <= after && !this.fired.has(key)) {\n this.fired.add(key);\n this.showRule(ri, 'time');\n }\n }\n }\n })\n );\n };\n\n /** Olay tipindeki tetikleyicisi olan her kural (gecikmeliyse zamanlanır). */\n private trigger(type: TriggerType): void {\n const c = this.config;\n if (!c) return;\n c.rules.forEach((rule, ri) => {\n const t = rule.triggers.find((x) => x.type === type) as { delay?: number } | undefined;\n if (!t) return;\n const delay = (t.delay ?? 0) * 1000;\n if (delay <= 0) {\n this.showRule(ri, type);\n return;\n }\n const timer = setTimeout(() => {\n this.delayed = this.delayed.filter((d) => d.timer !== timer);\n this.showRule(ri, type);\n }, delay);\n this.delayed.push({ type, timer });\n });\n }\n\n private cancelDelayed(...types: TriggerType[]): void {\n this.delayed = this.delayed.filter((d) => {\n if (types.length && !types.includes(d.type)) return true;\n clearTimeout(d.timer);\n return false;\n });\n }\n\n // ── gösterim ──\n\n /** Koşullar uygunsa kuralın reklamını ister. Uygun değilse sessizce atlanır (sebep kayda düşer). */\n private showRule(index: number, trigger: TriggerType): void {\n const rule = this.config?.rules[index];\n if (!rule || this.destroyed) return;\n const v = this.ctx.videoEl;\n const fs = this.ctx.isFullscreen();\n const skip = (why: string): void => this.ctx.log({ message: `Ad trigger skipped (${why})`, details: { rule: rule.id, trigger } });\n // layout 'none' reklamının kapanışı kreatifte — yeni tetikleme onu değiştirir; diğerleri (ya da süren istek) bekletir.\n if (this.showing && !(this.showing.filled && this.showing.rule.layout === 'none')) return skip('another ad is showing');\n if (this.ctx.isBlocked()) return skip('video ad / intro screen');\n if (document.hidden) return skip('tab hidden');\n if (this.ctx.isNativeFullscreen()) return skip('native iOS fullscreen');\n if (rule.mode === 'fullscreen' && !fs) return skip('not fullscreen');\n if (rule.mode === 'normal' && fs) return skip('fullscreen');\n // Olay anındaki durum hâlâ geçerli mi (gecikmeli tetiklemeler için).\n if (trigger === 'pause' && (!v.paused || v.ended)) return;\n if (trigger === 'ended' && !v.ended) return;\n if (['time', 'percent', 'interval', 'start', 'resume'].includes(trigger) && v.paused) return;\n if (rule.minPlayerWidth && this.ctx.overlayEl.getBoundingClientRect().width < rule.minPlayerWidth) return skip('player too narrow');\n const now = Date.now();\n if (rule.maxShows && (this.shows.get(index) ?? 0) >= rule.maxShows) return skip('maxShows');\n if (rule.minGapSeconds && now - (this.lastShownAt.get(index) ?? 0) < rule.minGapSeconds * 1000) return skip('rule minGapSeconds');\n if (now - this.lastAnyAt < (this.config?.minGapSeconds ?? DEFAULT_GLOBAL_GAP_S) * 1000) return skip('minGapSeconds');\n if (this.showing) this.close('replaced');\n // İstek anı aralığa sayılır: boş dönen birim her saniye yeniden istenmesin.\n this.lastAnyAt = now;\n this.lastShownAt.set(index, now);\n void this.request(index, rule, trigger, fs);\n }\n\n private async request(index: number, rule: AdTriggerRule, trigger: TriggerType, fullscreen: boolean): Promise<void> {\n const id = ++this.seq;\n const slotName = `hp-adtrigger-${this.instance}`;\n const box = this.buildBox(rule, slotName);\n const adHost = document.createElement('div');\n adHost.id = `hp-adtrigger-${this.instance}-${id}`;\n adHost.slot = slotName;\n const s: Showing = { rule, trigger, box, adHost, slot: null, filled: false, pausedContent: false, timers: [] };\n this.showing = s;\n this.ctx.overlayEl.appendChild(box);\n this.ctx.hostEl.appendChild(adHost);\n const detail = { rule: rule.id, trigger, adUnitPath: rule.adUnitPath };\n const empty = (why: string): void => {\n if (this.showing !== s) return;\n this.ctx.log({ message: `Ad trigger: no ad (${why})`, details: { ...detail } });\n fire(rule.tracking?.empty);\n this.ctx.hostEl.dispatchEvent(new CustomEvent('hp:adtriggerempty', { detail }));\n this.teardown(s);\n };\n // GPT hiç yüklenemez / yanıt vermezse (engelleyici, ağ) kutu asılı kalmasın.\n s.timers.push(setTimeout(() => !s.filled && empty('timeout'), this.options.renderTimeoutMs ?? DEFAULT_RENDER_TIMEOUT_MS));\n try {\n this.googletag ??= await loadGpt();\n } catch (err) {\n empty(String(err));\n return;\n }\n if (this.showing !== s) return;\n const gt = this.googletag;\n gt.cmd.push(() => {\n if (this.showing !== s) return;\n const slot = gt.defineOutOfPageSlot(rule.adUnitPath, adHost.id);\n if (!slot) {\n empty('slot could not be defined');\n return;\n }\n s.slot = slot;\n slot.addService(gt.pubads());\n // Öncelik (sonraki ezer): sayfa targeting → sayfa custParams → kural targeting → kural custParams → hp_*.\n const targeting: Record<string, string | string[]> = {\n ...parseCustParams(this.options.targeting),\n ...parseCustParams(this.options.custParams),\n ...rule.targeting,\n ...parseCustParams(rule.custParams),\n hp_trigger: trigger,\n hp_mode: fullscreen ? 'fullscreen' : 'normal',\n };\n if (rule.id) targeting.hp_rule = rule.id;\n for (const [k, val] of Object.entries(targeting)) slot.setTargeting(k, val);\n s.custParams = targeting;\n const onRender = (e: GptSlotRenderEndedEvent): void => {\n if (e.slot !== slot) return;\n gt.pubads().removeEventListener?.('slotRenderEnded', onRender);\n if (e.isEmpty) empty('empty');\n else this.reveal(index, s, fullscreen);\n };\n gt.pubads().addEventListener('slotRenderEnded', onRender);\n gt.enableServices();\n gt.display(adHost.id);\n // Sayfa disableInitialLoad kullanıyorsa display istek atmaz — elle refresh.\n if (gt.pubads().isInitialLoadDisabled()) gt.pubads().refresh([slot]);\n });\n }\n\n private buildBox(rule: AdTriggerRule, slotName: string): HTMLDivElement {\n const box = document.createElement('div');\n box.className = 'hp-adtrigger';\n box.setAttribute('part', 'ad-trigger');\n const bare = rule.layout === 'none';\n box.setAttribute('data-layout', rule.layout ?? 'none');\n box.toggleAttribute('data-backdrop', !!rule.backdrop);\n const frame = document.createElement('div');\n frame.className = 'hp-adtrigger-frame';\n if (rule.size && rule.layout !== 'full') {\n frame.style.setProperty('--hp-adtrigger-w', `${rule.size[0]}px`);\n frame.style.setProperty('--hp-adtrigger-h', `${rule.size[1]}px`);\n frame.setAttribute('data-sized', '');\n }\n // 'none': player yalnızca isteği atar ve kreatifi yerleştirir — etiket, kapat butonu, boyut kreatifin işi.\n if (rule.label !== false && !bare) {\n const label = document.createElement('span');\n label.className = 'hp-adtrigger-label';\n label.textContent = rule.label || this.ctx.i18n.adTriggerLabel;\n frame.appendChild(label);\n }\n const slot = document.createElement('slot');\n slot.name = slotName;\n frame.appendChild(slot);\n if (rule.closeButton !== false && !bare) {\n const close = document.createElement('button');\n close.type = 'button';\n close.className = 'hp-adtrigger-close';\n close.setAttribute('part', 'ad-trigger-close');\n close.setAttribute('aria-label', this.ctx.i18n.pauseAdClose);\n close.hidden = true;\n close.innerHTML =\n '<svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" aria-hidden=\"true\"><path d=\"M6 6l12 12M18 6L6 18\"/></svg>';\n close.addEventListener('click', () => this.close('user'));\n frame.appendChild(close);\n }\n box.appendChild(frame);\n // Reklama tıklama / dokunma videoyu oynat-duraklat yapmasın, kontrolleri açmasın.\n for (const t of ['pointerdown', 'click', 'dblclick'] as const) box.addEventListener(t, (e) => e.stopPropagation());\n return box;\n }\n\n private reveal(index: number, s: Showing, fullscreen: boolean): void {\n if (this.showing !== s) return;\n const { rule } = s;\n s.filled = true;\n this.shows.set(index, (this.shows.get(index) ?? 0) + 1);\n this.lastAnyAt = Date.now();\n // Kutu boyutlu ya da tam alan ise reklam iframe'i kutuyu doldursun (out-of-page kreatifleri kendi boyutunu vermez).\n if (rule.layout === 'full' || (rule.size && rule.layout !== 'none')) {\n const iframe = s.adHost.querySelector('iframe');\n if (iframe) Object.assign(iframe.style, { width: '100%', height: '100%', border: '0' });\n Object.assign(s.adHost.style, { width: '100%', height: '100%' });\n }\n s.box.setAttribute('data-open', '');\n const close = s.box.querySelector<HTMLButtonElement>('.hp-adtrigger-close');\n // closeDelay 0: X kutuyla aynı anda görünsün (setTimeout(0) bir kare butonsuz kutu gösteriyordu).\n if (close && !rule.closeDelay) close.hidden = false;\n else if (close) s.timers.push(setTimeout(() => (close.hidden = false), rule.closeDelay! * 1000));\n if (rule.duration) s.timers.push(setTimeout(() => this.close('timeout'), rule.duration * 1000));\n const v = this.ctx.videoEl;\n if (rule.pauseContent && !v.paused) {\n s.pausedContent = true;\n this.selfPause = true;\n v.pause();\n }\n fire(rule.tracking?.impression);\n this.ctx.hostEl.dispatchEvent(\n new CustomEvent('hp:adtriggershow', { detail: { rule: rule.id, trigger: s.trigger, adUnitPath: rule.adUnitPath, fullscreen, custParams: s.custParams ?? {} } })\n );\n }\n\n /** Gösterilen reklamı kapat (bekleyen istek varsa iptal). */\n close(reason: CloseReason): void {\n const s = this.showing;\n if (!s) return;\n const wasFilled = s.filled;\n this.teardown(s);\n if (!wasFilled) return;\n fire(s.rule.tracking?.close);\n this.ctx.hostEl.dispatchEvent(new CustomEvent('hp:adtriggerclose', { detail: { rule: s.rule.id, reason } }));\n // Duraklattığımız içerik kaldığı yerden devam etsin (içerik değişmediyse / video reklamı başlamadıysa).\n if (s.pausedContent && reason !== 'content' && reason !== 'ad') void this.ctx.videoEl.play().catch(() => {});\n }\n\n private teardown(s: Showing): void {\n if (this.showing === s) this.showing = null;\n for (const t of s.timers) clearTimeout(t);\n if (s.slot && this.googletag) {\n try {\n this.googletag.destroySlots([s.slot]);\n } catch {\n /* zaten yok edildi */\n }\n }\n s.box.remove();\n s.adHost.remove();\n }\n\n destroy(): void {\n this.destroyed = true;\n this.cancelDelayed();\n this.close('content');\n clearInterval(this.tickTimer);\n if (this.refreshTimer) clearInterval(this.refreshTimer);\n const v = this.ctx.videoEl;\n v.removeEventListener('timeupdate', this.onTimeUpdate);\n v.removeEventListener('seeking', this.onSeeking);\n v.removeEventListener('seeked', this.onSeeked);\n v.removeEventListener('playing', this.onPlaying);\n v.removeEventListener('pause', this.onPause);\n v.removeEventListener('ended', this.onEnded);\n v.removeEventListener('loadstart', this.onLoadStart);\n v.removeEventListener('webkitbeginfullscreen', this.onFullscreenChange);\n v.removeEventListener('webkitendfullscreen', this.onFullscreenChange);\n document.removeEventListener('fullscreenchange', this.onFullscreenChange);\n document.removeEventListener('webkitfullscreenchange', this.onFullscreenChange);\n this.ctx.hostEl.removeEventListener('hp:adstart', this.onVideoAdStart);\n }\n}\n","import { AdTriggers, normalizeAdTriggers, type AdTriggersContext } from './AdTriggers';\nimport type { AdTriggersOptions } from '../../types';\n\n/** Reklam tetikleyicisini kurar (kuralları `endpoint`'ten ya da `config`'ten alır). */\nexport function installAdTriggers(ctx: AdTriggersContext, options: AdTriggersOptions): AdTriggers {\n return new AdTriggers(ctx, options);\n}\n\nexport { AdTriggers, normalizeAdTriggers };\nexport type { AdTriggersContext };\n"],"names":["DEFAULT_TIMEOUT_MS","DEFAULT_RENDER_TIMEOUT_MS","DEFAULT_GLOBAL_GAP_S","LAYOUTS","TRIGGER_TYPES","MAX_NATURAL_STEP_S","instanceCount","safeUrl","value","u","num","n","min","max","prim","v","parseCustParams","raw","entries","k","out","list","x","one","normalizeTrigger","t","type","at","every","normalizeAdTriggers","r","now","from","until","urls","rules","triggers","size","layout","_a","_b","_c","AdTriggers","ctx","options","__publicField","key","fs","mode","pos","prev","elapsed","c","maxStep","dur","rule","ri","ti","mark","delta","before","after","first","changed","refreshChanged","s","seq","ctrl","timer","url","res","json","err","config","delay","types","d","index","trigger","skip","why","fullscreen","id","slotName","box","adHost","detail","empty","fire","loadGpt","gt","slot","targeting","val","onRender","e","bare","frame","label","close","iframe","reason","wasFilled","installAdTriggers"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
var P = Object.defineProperty;
|
|
2
2
|
var k = (d, e, t) => e in d ? P(d, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : d[e] = t;
|
|
3
3
|
var r = (d, e, t) => k(d, typeof e != "symbol" ? e + "" : e, t);
|
|
4
|
-
import {
|
|
4
|
+
import { a as E, g as M, m as L } from "./player-D2_HRzot.js";
|
|
5
5
|
const x = 8e3;
|
|
6
6
|
class C {
|
|
7
7
|
constructor(e) {
|
|
@@ -641,7 +641,7 @@ class _ {
|
|
|
641
641
|
const m = await this.getOrCreatePrebidInstance(e, o);
|
|
642
642
|
m.isAvailable() && (a = await m.runAuction(a));
|
|
643
643
|
}
|
|
644
|
-
if (!this.adsLoader || !this.ima) return;
|
|
644
|
+
if (this.ctx.transformTag && (a = await this.ctx.transformTag(a, e.toLowerCase())), !this.adsLoader || !this.ima) return;
|
|
645
645
|
const l = new this.ima.AdsRequest();
|
|
646
646
|
l.adTagUrl = a, l.linearAdSlotWidth = this.ctx.videoEl.clientWidth || 640, l.linearAdSlotHeight = this.ctx.videoEl.clientHeight || 360, l.nonLinearAdSlotWidth = this.ctx.videoEl.clientWidth || 640, l.nonLinearAdSlotHeight = Math.round((this.ctx.videoEl.clientHeight || 360) / 3), l.vastLoadTimeout = this.options.vastLoadTimeoutMs ?? 1e4;
|
|
647
647
|
try {
|
|
@@ -819,4 +819,4 @@ export {
|
|
|
819
819
|
_ as AdsController,
|
|
820
820
|
G as installAds
|
|
821
821
|
};
|
|
822
|
-
//# sourceMappingURL=ads-
|
|
822
|
+
//# sourceMappingURL=ads-DlpHPpR9.js.map
|