nodebb-plugin-ezoic-infinite 1.6.2 → 1.6.3

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.
Files changed (2) hide show
  1. package/package.json +1 -1
  2. package/public/client.js +25 -32
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nodebb-plugin-ezoic-infinite",
3
- "version": "1.6.2",
3
+ "version": "1.6.3",
4
4
  "description": "Production-ready Ezoic infinite ads integration for NodeBB 4.x",
5
5
  "main": "library.js",
6
6
  "license": "MIT",
package/public/client.js CHANGED
@@ -1348,32 +1348,32 @@ function buildOrdinalMap(items) {
1348
1348
 
1349
1349
  // ===== CLEAN REFRACTOR: visibility manager for Ezoic wraps =====
1350
1350
  (function () {
1351
- // v3 improvements:
1352
- // - Faster global rendering: larger preload margin, higher show throughput.
1353
- // - Reliable on UP-scroll: scroll-proximity scanner enqueues showAds for near-viewport wraps even if IO doesn't fire.
1351
+ // v2.1 (safe):
1352
+ // - Keep the v2 behavior that didn't break forum rendering.
1353
+ // - Improve speed moderately (earlier preload + slightly higher show throughput).
1354
+ // - Improve up-scroll reliability without scanning the whole DOM:
1355
+ // * on scroll, enqueue showAds for wraps currently in/near viewport (small bounded loop).
1354
1356
 
1355
1357
  var BETWEEN_SELECTOR = '.nodebb-ezoic-wrap.ezoic-ad-between';
1356
1358
  var MESSAGE_SELECTOR = '.nodebb-ezoic-wrap.ezoic-ad-message';
1357
1359
  var WRAP_SELECTOR = BETWEEN_SELECTOR + ', ' + MESSAGE_SELECTOR;
1358
1360
 
1359
- // We never remove message wraps; only very conservative cleanup for between wraps.
1360
- var KEEP_MARGIN_BETWEEN_DESKTOP = 3200;
1361
- var KEEP_MARGIN_BETWEEN_MOBILE = 2300;
1361
+ var KEEP_MARGIN_BETWEEN_DESKTOP = 2600;
1362
+ var KEEP_MARGIN_BETWEEN_MOBILE = 1900;
1362
1363
 
1363
- // Show tuning
1364
- var SHOW_COOLDOWN_MS = 650; // faster re-show when coming back up
1365
- var MAX_SHOW_PER_TICK = 10; // higher throughput for long scroll pages
1364
+ // Show tuning (moderate)
1365
+ var SHOW_COOLDOWN_MS = 900;
1366
+ var MAX_SHOW_PER_TICK = 6;
1366
1367
 
1367
- // Proximity scan (fix up-scroll non-display)
1368
- var PROXIMITY_SCAN_COOLDOWN_MS = 180;
1369
- var PROXIMITY_MARGIN_DESKTOP = 1400; // px above+below viewport
1370
- var PROXIMITY_MARGIN_MOBILE = 1100;
1368
+ // Up-scroll helper: only check near-viewport wraps, bounded
1369
+ var SCAN_COOLDOWN_MS = 220;
1370
+ var lastScan = 0;
1371
+ var SCAN_BUDGET = 10;
1371
1372
 
1372
1373
  function isMobile() {
1373
1374
  try { return window.matchMedia && window.matchMedia('(max-width: 767px)').matches; } catch (e) { return false; }
1374
1375
  }
1375
1376
  function keepMarginBetween() { return isMobile() ? KEEP_MARGIN_BETWEEN_MOBILE : KEEP_MARGIN_BETWEEN_DESKTOP; }
1376
- function proximityMargin() { return isMobile() ? PROXIMITY_MARGIN_MOBILE : PROXIMITY_MARGIN_DESKTOP; }
1377
1377
 
1378
1378
  var lastShowById = Object.create(null);
1379
1379
  var showQueue = [];
@@ -1430,7 +1430,7 @@ function buildOrdinalMap(items) {
1430
1430
  if (removed >= 3) return;
1431
1431
  try {
1432
1432
  var lv = parseInt(w.getAttribute('data-last-visible') || '0', 10);
1433
- if (lv && (Date.now() - lv) < 15000) return;
1433
+ if (lv && (Date.now() - lv) < 12000) return;
1434
1434
 
1435
1435
  var r = w.getBoundingClientRect();
1436
1436
  if (r.bottom < -margin || r.top > ((window.innerHeight || 0) + margin)) {
@@ -1441,7 +1441,7 @@ function buildOrdinalMap(items) {
1441
1441
  });
1442
1442
  }
1443
1443
 
1444
- // IntersectionObserver: preload well before viewport
1444
+ // IO: preload earlier for faster display
1445
1445
  var io = null;
1446
1446
  function installIO() {
1447
1447
  if (io || typeof IntersectionObserver === 'undefined') return;
@@ -1457,12 +1457,11 @@ function buildOrdinalMap(items) {
1457
1457
  }
1458
1458
  });
1459
1459
  } catch (e) {}
1460
- }, { root: null, rootMargin: '1400px 0px 1400px 0px', threshold: 0.01 });
1460
+ }, { root: null, rootMargin: '1200px 0px 1200px 0px', threshold: 0.01 });
1461
1461
 
1462
1462
  try { document.querySelectorAll(WRAP_SELECTOR).forEach(function (w) { try { io.observe(w); } catch(e) {} }); } catch (e) {}
1463
1463
  }
1464
1464
 
1465
- // Observe new wraps
1466
1465
  var moInstalled = false;
1467
1466
  function installMO() {
1468
1467
  if (moInstalled || typeof MutationObserver === 'undefined') return;
@@ -1496,20 +1495,18 @@ function buildOrdinalMap(items) {
1496
1495
  try { mo.observe(document.documentElement || document.body, { childList: true, subtree: true }); } catch (e) {}
1497
1496
  }
1498
1497
 
1499
- // Proximity scanner: ensures re-show on up-scroll even if IO doesn't trigger (e.g. cached intersection state)
1500
- var lastScan = 0;
1501
- function proximityScan() {
1498
+ // Small bounded scan near viewport on scroll (helps on up-scroll)
1499
+ function scanNearViewport() {
1502
1500
  var now = Date.now();
1503
- if (now - lastScan < PROXIMITY_SCAN_COOLDOWN_MS) return;
1501
+ if (now - lastScan < SCAN_COOLDOWN_MS) return;
1504
1502
  lastScan = now;
1505
1503
 
1506
- var margin = proximityMargin();
1507
1504
  var vh = window.innerHeight || document.documentElement.clientHeight || 0;
1508
-
1505
+ var margin = 900; // near viewport window
1509
1506
  var wraps;
1510
1507
  try { wraps = document.querySelectorAll(WRAP_SELECTOR); } catch (e) { return; }
1511
1508
 
1512
- var budget = 12; // don't scan too heavy
1509
+ var budget = SCAN_BUDGET;
1513
1510
  for (var i = 0; i < wraps.length && budget > 0; i++) {
1514
1511
  var w = wraps[i];
1515
1512
  try {
@@ -1523,10 +1520,9 @@ function buildOrdinalMap(items) {
1523
1520
  }
1524
1521
  }
1525
1522
 
1526
- // Sweep only between cleanup
1527
1523
  var sweepPending = false;
1528
1524
  var lastSweep = 0;
1529
- var SWEEP_COOLDOWN_MS = 700;
1525
+ var SWEEP_COOLDOWN_MS = 600;
1530
1526
 
1531
1527
  function scheduleSweep() {
1532
1528
  var now = Date.now();
@@ -1542,7 +1538,7 @@ function buildOrdinalMap(items) {
1542
1538
 
1543
1539
  function onScroll() {
1544
1540
  scheduleSweep();
1545
- proximityScan();
1541
+ scanNearViewport();
1546
1542
  scheduleShowTick();
1547
1543
  }
1548
1544
 
@@ -1555,10 +1551,7 @@ function buildOrdinalMap(items) {
1555
1551
 
1556
1552
  if (window.jQuery) {
1557
1553
  window.jQuery(window).on('action:ajaxify.end action:infiniteScroll.loaded', function () {
1558
- setTimeout(function () {
1559
- installIO();
1560
- onScroll();
1561
- }, 0);
1554
+ setTimeout(function () { installIO(); onScroll(); }, 0);
1562
1555
  });
1563
1556
  }
1564
1557