@playcademy/sdk 0.7.3-beta.8 → 0.7.4-beta.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/dist/index.js CHANGED
@@ -1692,34 +1692,47 @@ function createTimebackActivityTracker(client) {
1692
1692
  activity.windowPausedAtStart = pausedAtReset;
1693
1693
  startHeartbeatInterval(activity);
1694
1694
  }
1695
- function armPausedHeartbeatTimeout(activity) {
1695
+ function markPausedHeartbeatTimedOut(activity) {
1696
+ activity.pausedHeartbeatTimeoutId = null;
1697
+ activity.pausedHeartbeatTimedOut = true;
1698
+ stopHeartbeatInterval(activity);
1699
+ }
1700
+ function armPausedHeartbeatTimeout(activity, startedAt = Date.now()) {
1696
1701
  if (activity.pausedHeartbeatTimeoutMs === Infinity) {
1697
1702
  return;
1698
1703
  }
1699
1704
  clearPausedHeartbeatTimeout(activity);
1705
+ const now = Date.now();
1706
+ const elapsedPauseMs = Math.max(0, now - Math.min(startedAt, now));
1707
+ const remainingTimeoutMs = activity.pausedHeartbeatTimeoutMs - elapsedPauseMs;
1708
+ if (remainingTimeoutMs <= 0) {
1709
+ markPausedHeartbeatTimedOut(activity);
1710
+ return;
1711
+ }
1700
1712
  const trackedActivity = activity;
1701
1713
  activity.pausedHeartbeatTimeoutId = setTimeout(() => {
1702
1714
  if (currentActivity !== trackedActivity) {
1703
1715
  return;
1704
1716
  }
1705
- trackedActivity.pausedHeartbeatTimeoutId = null;
1706
- trackedActivity.pausedHeartbeatTimedOut = true;
1707
- stopHeartbeatInterval(trackedActivity);
1708
- }, activity.pausedHeartbeatTimeoutMs);
1717
+ markPausedHeartbeatTimedOut(trackedActivity);
1718
+ }, remainingTimeoutMs);
1709
1719
  }
1710
- function addPauseReason(reason) {
1720
+ function addPauseReason(reason, startedAt = Date.now()) {
1711
1721
  if (!currentActivity) {
1712
1722
  return;
1713
1723
  }
1724
+ if (reason !== "inactivity") {
1725
+ applyOverdueInactivity();
1726
+ }
1714
1727
  const wasPaused = currentActivity.pauseReasons.size > 0;
1715
1728
  const wasAutoPaused = hasAutoPauseReason(currentActivity);
1716
1729
  const alreadyHadReason = currentActivity.pauseReasons.has(reason);
1717
1730
  currentActivity.pauseReasons.add(reason);
1718
1731
  if (!wasPaused && currentActivity.pauseReasons.size > 0) {
1719
- currentActivity.pauseStartTime = Date.now();
1732
+ currentActivity.pauseStartTime = Math.min(startedAt, Date.now());
1720
1733
  }
1721
1734
  if (isAutoPauseReason(reason) && !alreadyHadReason && !wasAutoPaused) {
1722
- armPausedHeartbeatTimeout(currentActivity);
1735
+ armPausedHeartbeatTimeout(currentActivity, startedAt);
1723
1736
  }
1724
1737
  syncInactivityTracking();
1725
1738
  }
@@ -1772,16 +1785,31 @@ function createTimebackActivityTracker(client) {
1772
1785
  }
1773
1786
  clearInactivityTimeout(activity);
1774
1787
  const trackedActivity = activity;
1775
- activity.inactivityTimerStartedAt = Date.now();
1788
+ const timerStartedAt = Date.now();
1789
+ const inactivityStartedAt = timerStartedAt + trackedActivity.remainingInactivityMs;
1790
+ activity.inactivityTimerStartedAt = timerStartedAt;
1776
1791
  activity.inactivityTimeoutId = setTimeout(() => {
1777
1792
  if (currentActivity !== trackedActivity) {
1778
1793
  return;
1779
1794
  }
1780
1795
  trackedActivity.remainingInactivityMs = 0;
1781
1796
  clearInactivityTimeout(trackedActivity);
1782
- addPauseReason("inactivity");
1797
+ addPauseReason("inactivity", inactivityStartedAt);
1783
1798
  }, trackedActivity.remainingInactivityMs);
1784
1799
  }
1800
+ function applyOverdueInactivity(now = Date.now()) {
1801
+ const activity = currentActivity;
1802
+ if (!activity || activity.inactivityTimerStartedAt === null || activity.pauseReasons.has("inactivity")) {
1803
+ return;
1804
+ }
1805
+ const inactivityStartedAt = activity.inactivityTimerStartedAt + activity.remainingInactivityMs;
1806
+ if (now < inactivityStartedAt) {
1807
+ return;
1808
+ }
1809
+ activity.remainingInactivityMs = 0;
1810
+ clearInactivityTimeout(activity);
1811
+ addPauseReason("inactivity", inactivityStartedAt);
1812
+ }
1785
1813
  function syncInactivityTracking() {
1786
1814
  const activity = currentActivity;
1787
1815
  if (!activity) {
@@ -1802,6 +1830,7 @@ function createTimebackActivityTracker(client) {
1802
1830
  activity.remainingInactivityMs = activity.inactivityTimeoutMs;
1803
1831
  }
1804
1832
  function handleUserInteraction() {
1833
+ applyOverdueInactivity();
1805
1834
  const activity = currentActivity;
1806
1835
  if (!activity || activity.inactivityTimeoutMs === Infinity || isDocumentHidden()) {
1807
1836
  return;
@@ -1840,6 +1869,7 @@ function createTimebackActivityTracker(client) {
1840
1869
  };
1841
1870
  }
1842
1871
  async function flushHeartbeat(isFinal) {
1872
+ applyOverdueInactivity();
1843
1873
  const activity = currentActivity;
1844
1874
  if (!activity) {
1845
1875
  return;
@@ -1860,6 +1890,7 @@ function createTimebackActivityTracker(client) {
1860
1890
  });
1861
1891
  }
1862
1892
  function handlePageHide() {
1893
+ applyOverdueInactivity();
1863
1894
  const activity = currentActivity;
1864
1895
  if (!activity) {
1865
1896
  return;
@@ -1999,6 +2030,7 @@ function createTimebackActivityTracker(client) {
1999
2030
  throw new Error("No activity in progress. Call startActivity() before endActivity().");
2000
2031
  }
2001
2032
  const activity = currentActivity;
2033
+ applyOverdueInactivity();
2002
2034
  cleanupListeners();
2003
2035
  await flushHeartbeat(true);
2004
2036
  if (activity.pauseStartTime !== null) {
package/dist/internal.js CHANGED
@@ -1692,34 +1692,47 @@ function createTimebackActivityTracker(client) {
1692
1692
  activity.windowPausedAtStart = pausedAtReset;
1693
1693
  startHeartbeatInterval(activity);
1694
1694
  }
1695
- function armPausedHeartbeatTimeout(activity) {
1695
+ function markPausedHeartbeatTimedOut(activity) {
1696
+ activity.pausedHeartbeatTimeoutId = null;
1697
+ activity.pausedHeartbeatTimedOut = true;
1698
+ stopHeartbeatInterval(activity);
1699
+ }
1700
+ function armPausedHeartbeatTimeout(activity, startedAt = Date.now()) {
1696
1701
  if (activity.pausedHeartbeatTimeoutMs === Infinity) {
1697
1702
  return;
1698
1703
  }
1699
1704
  clearPausedHeartbeatTimeout(activity);
1705
+ const now = Date.now();
1706
+ const elapsedPauseMs = Math.max(0, now - Math.min(startedAt, now));
1707
+ const remainingTimeoutMs = activity.pausedHeartbeatTimeoutMs - elapsedPauseMs;
1708
+ if (remainingTimeoutMs <= 0) {
1709
+ markPausedHeartbeatTimedOut(activity);
1710
+ return;
1711
+ }
1700
1712
  const trackedActivity = activity;
1701
1713
  activity.pausedHeartbeatTimeoutId = setTimeout(() => {
1702
1714
  if (currentActivity !== trackedActivity) {
1703
1715
  return;
1704
1716
  }
1705
- trackedActivity.pausedHeartbeatTimeoutId = null;
1706
- trackedActivity.pausedHeartbeatTimedOut = true;
1707
- stopHeartbeatInterval(trackedActivity);
1708
- }, activity.pausedHeartbeatTimeoutMs);
1717
+ markPausedHeartbeatTimedOut(trackedActivity);
1718
+ }, remainingTimeoutMs);
1709
1719
  }
1710
- function addPauseReason(reason) {
1720
+ function addPauseReason(reason, startedAt = Date.now()) {
1711
1721
  if (!currentActivity) {
1712
1722
  return;
1713
1723
  }
1724
+ if (reason !== "inactivity") {
1725
+ applyOverdueInactivity();
1726
+ }
1714
1727
  const wasPaused = currentActivity.pauseReasons.size > 0;
1715
1728
  const wasAutoPaused = hasAutoPauseReason(currentActivity);
1716
1729
  const alreadyHadReason = currentActivity.pauseReasons.has(reason);
1717
1730
  currentActivity.pauseReasons.add(reason);
1718
1731
  if (!wasPaused && currentActivity.pauseReasons.size > 0) {
1719
- currentActivity.pauseStartTime = Date.now();
1732
+ currentActivity.pauseStartTime = Math.min(startedAt, Date.now());
1720
1733
  }
1721
1734
  if (isAutoPauseReason(reason) && !alreadyHadReason && !wasAutoPaused) {
1722
- armPausedHeartbeatTimeout(currentActivity);
1735
+ armPausedHeartbeatTimeout(currentActivity, startedAt);
1723
1736
  }
1724
1737
  syncInactivityTracking();
1725
1738
  }
@@ -1772,16 +1785,31 @@ function createTimebackActivityTracker(client) {
1772
1785
  }
1773
1786
  clearInactivityTimeout(activity);
1774
1787
  const trackedActivity = activity;
1775
- activity.inactivityTimerStartedAt = Date.now();
1788
+ const timerStartedAt = Date.now();
1789
+ const inactivityStartedAt = timerStartedAt + trackedActivity.remainingInactivityMs;
1790
+ activity.inactivityTimerStartedAt = timerStartedAt;
1776
1791
  activity.inactivityTimeoutId = setTimeout(() => {
1777
1792
  if (currentActivity !== trackedActivity) {
1778
1793
  return;
1779
1794
  }
1780
1795
  trackedActivity.remainingInactivityMs = 0;
1781
1796
  clearInactivityTimeout(trackedActivity);
1782
- addPauseReason("inactivity");
1797
+ addPauseReason("inactivity", inactivityStartedAt);
1783
1798
  }, trackedActivity.remainingInactivityMs);
1784
1799
  }
1800
+ function applyOverdueInactivity(now = Date.now()) {
1801
+ const activity = currentActivity;
1802
+ if (!activity || activity.inactivityTimerStartedAt === null || activity.pauseReasons.has("inactivity")) {
1803
+ return;
1804
+ }
1805
+ const inactivityStartedAt = activity.inactivityTimerStartedAt + activity.remainingInactivityMs;
1806
+ if (now < inactivityStartedAt) {
1807
+ return;
1808
+ }
1809
+ activity.remainingInactivityMs = 0;
1810
+ clearInactivityTimeout(activity);
1811
+ addPauseReason("inactivity", inactivityStartedAt);
1812
+ }
1785
1813
  function syncInactivityTracking() {
1786
1814
  const activity = currentActivity;
1787
1815
  if (!activity) {
@@ -1802,6 +1830,7 @@ function createTimebackActivityTracker(client) {
1802
1830
  activity.remainingInactivityMs = activity.inactivityTimeoutMs;
1803
1831
  }
1804
1832
  function handleUserInteraction() {
1833
+ applyOverdueInactivity();
1805
1834
  const activity = currentActivity;
1806
1835
  if (!activity || activity.inactivityTimeoutMs === Infinity || isDocumentHidden()) {
1807
1836
  return;
@@ -1840,6 +1869,7 @@ function createTimebackActivityTracker(client) {
1840
1869
  };
1841
1870
  }
1842
1871
  async function flushHeartbeat(isFinal) {
1872
+ applyOverdueInactivity();
1843
1873
  const activity = currentActivity;
1844
1874
  if (!activity) {
1845
1875
  return;
@@ -1860,6 +1890,7 @@ function createTimebackActivityTracker(client) {
1860
1890
  });
1861
1891
  }
1862
1892
  function handlePageHide() {
1893
+ applyOverdueInactivity();
1863
1894
  const activity = currentActivity;
1864
1895
  if (!activity) {
1865
1896
  return;
@@ -1999,6 +2030,7 @@ function createTimebackActivityTracker(client) {
1999
2030
  throw new Error("No activity in progress. Call startActivity() before endActivity().");
2000
2031
  }
2001
2032
  const activity = currentActivity;
2033
+ applyOverdueInactivity();
2002
2034
  cleanupListeners();
2003
2035
  await flushHeartbeat(true);
2004
2036
  if (activity.pauseStartTime !== null) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@playcademy/sdk",
3
- "version": "0.7.3-beta.8",
3
+ "version": "0.7.4-beta.1",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {