@levrbet/shared 0.2.102 → 0.2.103

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.
@@ -169,7 +169,7 @@ exports.SportsGamePeriodClockConfig = {
169
169
  regular: [providers_1.LSPORTS_NCAA_PERIODS.FIRST_HALF, providers_1.LSPORTS_NCAA_PERIODS.SECOND_HALF],
170
170
  fullCycle: [],
171
171
  extraTime: [providers_1.LSPORTS_AMERICAN_FOOTBALL_PERIODS.OVERTIME],
172
- countUpClock: false,
172
+ countUpClock: true,
173
173
  },
174
174
  totalPeriodDurationInSeconds: 1800,
175
175
  totalPeriods: 2,
@@ -1 +1 @@
1
- {"version":3,"file":"sports.config.js","sourceRoot":"","sources":["../../../../../src/server/oracle/config/game-periods/sports.config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sports.config.js","sourceRoot":"","sources":["../../../../../src/server/oracle/config/game-periods/sports.config.ts"],"names":[],"mappings":"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"}
@@ -2,10 +2,6 @@ import { SportGroup } from "@prisma/client";
2
2
  /**
3
3
  * For sports like Baseball where we only track period (inning) progress, not time.
4
4
  * Baseball: 9 innings, each with top (0) and bottom (1) = 18 half-innings total.
5
- * Progress is calculated as being IN that half-inning (not completed).
6
- * @param period - Current inning (1-9)
7
- * @param totalPeriods - Total innings (typically 9)
8
- * @param isTopOfInning - true = top of inning (first half), false = bottom (second half)
9
5
  */
10
6
  export declare const calculateBaseballProgressBPS: (period: number, totalPeriods: number, isTopOfInning: boolean) => number;
11
7
  export declare const getGameProgressBPS: (gameClockInSeconds: number, totalPeriodDurationInSeconds: number, period: number, totalPeriods: number, sportGroup: SportGroup, clockCountUp: boolean, isTopOfInning?: boolean) => number | null;
@@ -3,123 +3,81 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getGameProgressBPS = exports.calculateBaseballProgressBPS = void 0;
4
4
  const client_1 = require("@prisma/client");
5
5
  const MAX_BASIS_POINTS = 1e4;
6
+ /**
7
+ * Clamps a BPS value between 0 and MAX_BASIS_POINTS
8
+ */
9
+ const clampBPS = (value) => Math.max(0, Math.min(Math.floor(value), MAX_BASIS_POINTS));
10
+ // Clamp per-period elapsed time to prevent exceeding max period duration
11
+ const clampPeriodElapsed = (elapsed, totalPeriodDurationInSeconds) => Math.max(0, Math.min(elapsed, totalPeriodDurationInSeconds));
12
+ /**
13
+ * Get elapsed seconds from game clock based on clock direction.
14
+ * For countdown: elapsed = total - remaining
15
+ * For count-up: elapsed = clock value directly
16
+ * Clamps per-period elapsed time to valid range [0, totalPeriodDurationInSeconds]
17
+ */
18
+ const getElapsedSeconds = (gameClockInSeconds, totalPeriodDurationInSeconds, period, isCumulative, clockCountUp) => {
19
+ if (clockCountUp) {
20
+ if (isCumulative) {
21
+ //if it's soccer only clamp if the game clock exceeds duration for that specific period
22
+ if (gameClockInSeconds > totalPeriodDurationInSeconds * period)
23
+ return clampPeriodElapsed(gameClockInSeconds, totalPeriodDurationInSeconds);
24
+ return Math.max(0, gameClockInSeconds);
25
+ }
26
+ return clampPeriodElapsed(gameClockInSeconds, totalPeriodDurationInSeconds);
27
+ }
28
+ // Countdown clock: elapsed = total - remaining
29
+ const elapsedInCurrentPeriod = clampPeriodElapsed(totalPeriodDurationInSeconds - gameClockInSeconds, totalPeriodDurationInSeconds);
30
+ if (isCumulative) {
31
+ // Soccer with countdown: add completed periods
32
+ return (period - 1) * totalPeriodDurationInSeconds + elapsedInCurrentPeriod;
33
+ }
34
+ return elapsedInCurrentPeriod;
35
+ };
6
36
  /**
7
37
  * For sports like Baseball where we only track period (inning) progress, not time.
8
38
  * Baseball: 9 innings, each with top (0) and bottom (1) = 18 half-innings total.
9
- * Progress is calculated as being IN that half-inning (not completed).
10
- * @param period - Current inning (1-9)
11
- * @param totalPeriods - Total innings (typically 9)
12
- * @param isTopOfInning - true = top of inning (first half), false = bottom (second half)
13
39
  */
14
40
  const calculateBaseballProgressBPS = (period, totalPeriods, isTopOfInning) => {
15
41
  if (period > totalPeriods)
16
42
  return MAX_BASIS_POINTS;
17
43
  if (period < 1)
18
44
  return 0;
19
- // Each inning has 2 half-innings (top and bottom)
20
45
  const totalHalfInnings = totalPeriods * 2;
21
- // Current half-inning number (1-indexed): (period - 1) * 2 + 1 for top, + 2 for bottom
22
46
  const currentHalfInning = (period - 1) * 2 + (isTopOfInning ? 1 : 2);
23
- // Progress represents being IN this half-inning (so 9th bottom = 18/18 = 100%)
24
- const progress = currentHalfInning / totalHalfInnings;
25
- const value = Math.round(progress * MAX_BASIS_POINTS);
26
- if (value > MAX_BASIS_POINTS)
27
- return MAX_BASIS_POINTS;
28
- if (value < 0)
29
- return 0;
30
- return value;
47
+ return clampBPS((currentHalfInning / totalHalfInnings) * MAX_BASIS_POINTS);
31
48
  };
32
49
  exports.calculateBaseballProgressBPS = calculateBaseballProgressBPS;
33
50
  /**
34
- * Calculate game progress in BPS (basis points, max 10000).
35
- * For most sports: elapsedSeconds is time elapsed in current period.
36
- * For soccer: elapsedSeconds is cumulative time across all periods (clock doesn't reset).
51
+ * Calculate game progress in BPS from elapsed time.
52
+ * @param elapsedSeconds - Time elapsed (cumulative for soccer, current period for others)
53
+ * @param totalPeriodDurationInSeconds - Duration of each period
54
+ * @param totalPeriods - Total number of periods
55
+ * @param period - Current period (only used for non-soccer sports)
56
+ * @param isCumulative - Whether elapsedSeconds is cumulative (soccer) or per-period (others)
37
57
  */
38
- const calculateProgressBPSFromElapsedTime = (elapsedSeconds, totalPeriodDurationInSeconds, totalPeriods, period, sportGroup) => {
58
+ const calculateProgressBPS = (elapsedSeconds, totalPeriodDurationInSeconds, totalPeriods, period, isCumulative) => {
39
59
  if (totalPeriodDurationInSeconds === 0)
40
60
  return 0;
41
- const totalGameDurationInSeconds = totalPeriods * totalPeriodDurationInSeconds;
42
- if (sportGroup === client_1.SportGroup.Soccer) {
43
- // Soccer: elapsedSeconds is cumulative time across all periods (clock doesn't reset)
44
- const cumulativeElapsed = Math.max(0, Math.min(elapsedSeconds, totalGameDurationInSeconds));
45
- const overallProgress = cumulativeElapsed / totalGameDurationInSeconds;
46
- //TODO: use floor division instead
47
- const value = Math.round(overallProgress * MAX_BASIS_POINTS);
48
- if (value > MAX_BASIS_POINTS)
49
- return MAX_BASIS_POINTS;
50
- if (value < 0)
51
- return 0;
52
- return value;
53
- }
54
- // Other sports: elapsedSeconds is time elapsed in current period (clock resets each period)
55
- const clampedElapsedSeconds = Math.max(0, Math.min(elapsedSeconds, totalPeriodDurationInSeconds));
56
- const periodProgress = clampedElapsedSeconds / totalPeriodDurationInSeconds;
57
- const periodsPassed = period - 1;
58
- // Progress from completed periods + progress in current period
59
- const pastProgressBPS = (periodsPassed / totalPeriods) * MAX_BASIS_POINTS;
60
- const currentPeriodProgressBPS = (periodProgress * MAX_BASIS_POINTS) / totalPeriods;
61
- //TODO: use floor division instead
62
- const value = Math.round(pastProgressBPS + currentPeriodProgressBPS);
63
- if (value > MAX_BASIS_POINTS)
64
- return MAX_BASIS_POINTS;
65
- if (value < 0)
66
- return 0;
67
- return value;
68
- };
69
- /**
70
- * For count-up clocks (stopwatch style).
71
- * Soccer: clock is cumulative across periods (0:00 → 90:00+), doesn't reset at halftime.
72
- * Other sports: clock typically resets each period (0:00 → period end).
73
- *
74
- * Example (Soccer): { totalPeriods: 2, totalPeriodDurationInSeconds: 45 * 60 }, gameClock: '57:20'
75
- * → 57:20 = 3440 seconds cumulative → 3440/5400 = ~63.7% game progress
76
- */
77
- const calculateGameProgressBPSWithGameClockCountUp = (gameClockInSeconds, totalPeriodDurationInSeconds, totalPeriods, period, sportGroup) => {
78
- if (gameClockInSeconds === null)
79
- return null;
80
- // For soccer the game clock is cumulative across all periods
81
- if (sportGroup === client_1.SportGroup.Soccer) {
82
- return calculateProgressBPSFromElapsedTime(gameClockInSeconds, totalPeriodDurationInSeconds, totalPeriods, period, sportGroup);
83
- }
84
- // For other sports with count-up clocks, the clock resets each period
85
- // So gameClockInSeconds is already the elapsed time in the current period
86
- return calculateProgressBPSFromElapsedTime(gameClockInSeconds, totalPeriodDurationInSeconds, totalPeriods, period, sportGroup);
87
- };
88
- /**
89
- * For countdown clocks (showing remaining time).
90
- * gameClockInSeconds = remaining time in current period.
91
- * Soccer (rare): Need to compute cumulative elapsed from previous periods.
92
- * Other sports: Clock shows remaining time in current period, compute elapsed.
93
- */
94
- const calculateGameProgressBPSWithGameClockCountDown = (gameClockInSeconds, totalPeriodDurationInSeconds, totalPeriods, period, sportGroup) => {
95
- if (gameClockInSeconds === null)
96
- return null;
97
- // Elapsed in current period = total period duration - remaining time
98
- const elapsedSecondsInCurrentPeriod = totalPeriodDurationInSeconds - gameClockInSeconds;
99
- if (sportGroup === client_1.SportGroup.Soccer) {
100
- // Soccer needs cumulative elapsed seconds (clock doesn't reset)
101
- const previousPeriodsSeconds = (period - 1) * totalPeriodDurationInSeconds;
102
- const cumulativeElapsedSeconds = previousPeriodsSeconds + elapsedSecondsInCurrentPeriod;
103
- return calculateProgressBPSFromElapsedTime(cumulativeElapsedSeconds, totalPeriodDurationInSeconds, totalPeriods, period, sportGroup);
61
+ const totalGameDuration = totalPeriods * totalPeriodDurationInSeconds;
62
+ if (isCumulative) {
63
+ // Soccer: elapsed is cumulative across all periods
64
+ const cumulativeElapsed = Math.max(0, Math.min(elapsedSeconds, totalGameDuration));
65
+ return clampBPS((cumulativeElapsed / totalGameDuration) * MAX_BASIS_POINTS);
104
66
  }
105
- // Other sports: pass elapsed time in current period
106
- return calculateProgressBPSFromElapsedTime(elapsedSecondsInCurrentPeriod, totalPeriodDurationInSeconds, totalPeriods, period, sportGroup);
67
+ // Other sports: elapsed is time in current period only
68
+ const clampedElapsed = Math.max(0, Math.min(elapsedSeconds, totalPeriodDurationInSeconds));
69
+ const periodProgress = clampedElapsed / totalPeriodDurationInSeconds;
70
+ const completedPeriodsProgress = (period - 1) / totalPeriods;
71
+ const currentPeriodContribution = periodProgress / totalPeriods;
72
+ return clampBPS((completedPeriodsProgress + currentPeriodContribution) * MAX_BASIS_POINTS);
107
73
  };
108
- const getGameProgressBPS = (gameClockInSeconds, totalPeriodDurationInSeconds, period, totalPeriods, sportGroup, clockCountUp, isTopOfInning // Only used for Baseball
109
- ) => {
110
- //TODO: if/else more appropriate
111
- switch (sportGroup) {
112
- case client_1.SportGroup.Baseball:
113
- // Default to top of inning if not specified
114
- return (0, exports.calculateBaseballProgressBPS)(period, totalPeriods, isTopOfInning ?? true);
115
- default:
116
- if (clockCountUp) {
117
- return calculateGameProgressBPSWithGameClockCountUp(gameClockInSeconds, totalPeriodDurationInSeconds, totalPeriods, period, sportGroup);
118
- }
119
- else {
120
- return calculateGameProgressBPSWithGameClockCountDown(gameClockInSeconds, totalPeriodDurationInSeconds, totalPeriods, period, sportGroup);
121
- }
74
+ const getGameProgressBPS = (gameClockInSeconds, totalPeriodDurationInSeconds, period, totalPeriods, sportGroup, clockCountUp, isTopOfInning) => {
75
+ if (sportGroup === client_1.SportGroup.Baseball) {
76
+ return (0, exports.calculateBaseballProgressBPS)(period, totalPeriods, isTopOfInning ?? true);
122
77
  }
78
+ const isCumulative = sportGroup === client_1.SportGroup.Soccer;
79
+ const elapsedSeconds = getElapsedSeconds(gameClockInSeconds, totalPeriodDurationInSeconds, period, isCumulative, clockCountUp);
80
+ return calculateProgressBPS(elapsedSeconds, totalPeriodDurationInSeconds, totalPeriods, period, isCumulative);
123
81
  };
124
82
  exports.getGameProgressBPS = getGameProgressBPS;
125
83
  //# sourceMappingURL=game.utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"game.utils.js","sourceRoot":"","sources":["../../../../src/server/utils/game_progress/game.utils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"game.utils.js","sourceRoot":"","sources":["../../../../src/server/utils/game_progress/game.utils.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@levrbet/shared",
3
- "version": "0.2.102",
3
+ "version": "0.2.103",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "exports": {