@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.
- package/dist/server/oracle/config/game-periods/sports.config.js +1 -1
- package/dist/server/oracle/config/game-periods/sports.config.js.map +1 -1
- package/dist/server/utils/game_progress/game.utils.d.ts +0 -4
- package/dist/server/utils/game_progress/game.utils.js +55 -97
- package/dist/server/utils/game_progress/game.utils.js.map +1 -1
- package/package.json +1 -1
|
@@ -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:
|
|
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":";;;AAAA,2CAA2C;AAC3C,2CAA+C;AAC/C,2CAWoB;AACpB,mCAAgF;AAEhF;;GAEG;AACU,QAAA,2BAA2B,GAAoC;IACxE,CAAC,mBAAU,CAAC,UAAU,CAAC,EAAE;QACrB,4BAA4B,EAAE,GAAG,EAAE,yBAAyB;QAC5D,YAAY,EAAE,CAAC;QACf,CAAC,mBAAY,CAAC,OAAO,CAAC,EAAE;YACpB,YAAY,EAAE;gBACV,OAAO,EAAE;oBACL,sCAA0B,CAAC,aAAa;oBACxC,sCAA0B,CAAC,cAAc;oBACzC,sCAA0B,CAAC,aAAa;oBACxC,sCAA0B,CAAC,cAAc;iBAC5C;gBACD,SAAS,EAAE;oBACP,sCAA0B,CAAC,QAAQ;oBACnC,sCAA0B,CAAC,SAAS;oBACpC,sCAA0B,CAAC,wBAAwB;iBACtD;gBACD,SAAS,EAAE,CAAC,sCAA0B,CAAC,QAAQ,CAAC;gBAChD,YAAY,EAAE,KAAK;aACtB;YACD,aAAa,EAAE;gBACX,CAAC,wBAAgB,CAAC,eAAe,CAAC,EAAE;oBAChC,YAAY,EAAE;wBACV,OAAO,EAAE,CAAC,gCAAoB,CAAC,UAAU,EAAE,gCAAoB,CAAC,WAAW,CAAC;wBAC5E,SAAS,EAAE;4BACP,sCAA0B,CAAC,QAAQ;4BACnC,sCAA0B,CAAC,SAAS;4BACpC,sCAA0B,CAAC,wBAAwB;yBACtD;wBACD,SAAS,EAAE,CAAC,sCAA0B,CAAC,QAAQ,CAAC;wBAChD,YAAY,EAAE,KAAK;qBACtB;oBACD,4BAA4B,EAAE,IAAI;oBAClC,YAAY,EAAE,CAAC;iBAClB;aACJ,EAAE,4CAA4C;SAClD;QACD,CAAC,mBAAY,CAAC,UAAU,CAAC,EAAE;YACvB,YAAY,EAAE;gBACV,OAAO,EAAE;oBACL,yCAA6B,CAAC,aAAa;oBAC3C,yCAA6B,CAAC,cAAc;oBAC5C,yCAA6B,CAAC,aAAa;oBAC3C,yCAA6B,CAAC,cAAc;iBAC/C;gBACD,SAAS,EAAE,EAAE;gBACb,SAAS,EAAE,EAAE;gBACb,YAAY,EAAE,IAAI;aACrB;YACD,aAAa,EAAE;gBACX,CAAC,wBAAgB,CAAC,eAAe,CAAC,EAAE;oBAChC,YAAY,EAAE;wBACV,OAAO,EAAE,CAAC,mCAAuB,CAAC,UAAU,EAAE,mCAAuB,CAAC,WAAW,CAAC;wBAClF,SAAS,EAAE,EAAE;wBACb,SAAS,EAAE,EAAE;wBACb,YAAY,EAAE,IAAI;qBACrB;oBACD,4BAA4B,EAAE,IAAI;oBAClC,YAAY,EAAE,CAAC;iBAClB;aACJ;SACJ;KACJ;IACD,CAAC,mBAAU,CAAC,MAAM,CAAC,EAAE;QACjB,4BAA4B,EAAE,IAAI,EAAE,sBAAsB;QAC1D,YAAY,EAAE,CAAC;QACf,CAAC,mBAAY,CAAC,OAAO,CAAC,EAAE;YACpB,YAAY,EAAE;gBACV,OAAO,EAAE,CAAC,kCAAsB,CAAC,UAAU,EAAE,kCAAsB,CAAC,WAAW,CAAC;gBAChF,SAAS,EAAE;oBACP,kCAAsB,CAAC,SAAS;oBAChC,kCAAsB,CAAC,SAAS;oBAChC,kCAAsB,CAAC,wBAAwB;oBAC/C,kCAAsB,CAAC,yBAAyB;iBACnD;gBACD,SAAS,EAAE;oBACP,kCAAsB,CAAC,UAAU;oBACjC,kCAAsB,CAAC,mBAAmB;oBAC1C,kCAAsB,CAAC,oBAAoB;iBAC9C;gBACD,YAAY,EAAE,IAAI;aACrB;YACD,aAAa,EAAE,IAAI;SACtB;QACD,CAAC,mBAAY,CAAC,UAAU,CAAC,EAAE;YACvB,YAAY,EAAE;gBACV,OAAO,EAAE,CAAC,qCAAyB,CAAC,UAAU,EAAE,qCAAyB,CAAC,WAAW,CAAC;gBACtF,SAAS,EAAE,EAAE;gBACb,SAAS,EAAE,EAAE;gBACb,YAAY,EAAE,IAAI;aACrB;YACD,aAAa,EAAE,IAAI;SACtB;KACJ;IACD,CAAC,mBAAU,CAAC,QAAQ,CAAC,EAAE;QACnB,yFAAyF;QACzF,4BAA4B,EAAE,IAAI,EAAE,0CAA0C;QAC9E,YAAY,EAAE,CAAC;QACf,CAAC,mBAAY,CAAC,OAAO,CAAC,EAAE;YACpB,YAAY,EAAE;gBACV,OAAO,EAAE;oBACL,oCAAwB,CAAC,YAAY;oBACrC,oCAAwB,CAAC,aAAa;oBACtC,oCAAwB,CAAC,YAAY;oBACrC,oCAAwB,CAAC,aAAa;oBACtC,oCAAwB,CAAC,YAAY;oBACrC,oCAAwB,CAAC,YAAY;oBACrC,oCAAwB,CAAC,cAAc;oBACvC,oCAAwB,CAAC,aAAa;oBACtC,oCAAwB,CAAC,YAAY;iBACxC;gBACD,SAAS,EAAE,CAAC,oCAAwB,CAAC,SAAS,EAAE,oCAAwB,CAAC,0BAA0B,CAAC;gBACpG,SAAS,EAAE,CAAC,oCAAwB,CAAC,aAAa,CAAC;gBACnD,YAAY,EAAE,IAAI;aACrB;YACD,aAAa,EAAE,IAAI;SACtB;QACD,CAAC,mBAAY,CAAC,UAAU,CAAC,EAAE;YACvB,YAAY,EAAE;gBACV,OAAO,EAAE;oBACL,uCAA2B,CAAC,YAAY;oBACxC,uCAA2B,CAAC,aAAa;oBACzC,uCAA2B,CAAC,YAAY;oBACxC,uCAA2B,CAAC,aAAa;oBACzC,uCAA2B,CAAC,YAAY;oBACxC,uCAA2B,CAAC,YAAY;oBACxC,uCAA2B,CAAC,cAAc;oBAC1C,uCAA2B,CAAC,aAAa;oBACzC,uCAA2B,CAAC,YAAY;iBAC3C;gBACD,SAAS,EAAE,EAAE;gBACb,SAAS,EAAE,EAAE;gBACb,YAAY,EAAE,IAAI;aACrB;YACD,aAAa,EAAE,IAAI;SACtB;KACJ;IACD,CAAC,mBAAU,CAAC,QAAQ,CAAC,EAAE;QACnB,4BAA4B,EAAE,GAAG,EAAE,yBAAyB;QAC5D,YAAY,EAAE,CAAC;QACf,CAAC,mBAAY,CAAC,OAAO,CAAC,EAAE;YACpB,YAAY,EAAE;gBACV,OAAO,EAAE;oBACL,6CAAiC,CAAC,aAAa;oBAC/C,6CAAiC,CAAC,cAAc;oBAChD,6CAAiC,CAAC,aAAa;oBAC/C,6CAAiC,CAAC,cAAc;iBACnD;gBACD,SAAS,EAAE;oBACP,6CAAiC,CAAC,SAAS;oBAC3C,6CAAiC,CAAC,wBAAwB;iBAC7D;gBACD,SAAS,EAAE,CAAC,6CAAiC,CAAC,QAAQ,CAAC;gBACvD,YAAY,EAAE,KAAK;aACtB;YACD,aAAa,EAAE;gBACX,CAAC,wBAAgB,CAAC,aAAa,CAAC,EAAE;oBAC9B,YAAY,EAAE;wBACV,OAAO,EAAE,CAAC,gCAAoB,CAAC,UAAU,EAAE,gCAAoB,CAAC,WAAW,CAAC;wBAC5E,SAAS,EAAE,EAAE;wBACb,SAAS,EAAE,CAAC,6CAAiC,CAAC,QAAQ,CAAC;wBACvD,YAAY,EAAE,
|
|
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
|
-
|
|
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
|
|
35
|
-
*
|
|
36
|
-
*
|
|
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
|
|
58
|
+
const calculateProgressBPS = (elapsedSeconds, totalPeriodDurationInSeconds, totalPeriods, period, isCumulative) => {
|
|
39
59
|
if (totalPeriodDurationInSeconds === 0)
|
|
40
60
|
return 0;
|
|
41
|
-
const
|
|
42
|
-
if (
|
|
43
|
-
// Soccer:
|
|
44
|
-
const cumulativeElapsed = Math.max(0, Math.min(elapsedSeconds,
|
|
45
|
-
|
|
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:
|
|
106
|
-
|
|
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
|
|
109
|
-
)
|
|
110
|
-
|
|
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":";;;AAAA,2CAA2C;AAE3C,MAAM,gBAAgB,GAAG,GAAG,CAAA;AAE5B
|
|
1
|
+
{"version":3,"file":"game.utils.js","sourceRoot":"","sources":["../../../../src/server/utils/game_progress/game.utils.ts"],"names":[],"mappings":"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"}
|