halo-infinite-api 8.0.7 → 8.1.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.
@@ -1,16 +1,18 @@
1
1
  export declare enum GameVariantCategory {
2
2
  MultiplayerSlayer = 6,
3
3
  MultiplayerAttrition = 7,
4
+ MultiplayerElimination = 8,
4
5
  MultiplayerFiesta = 9,
5
6
  MultiplayerStrongholds = 11,
6
7
  MultiplayerKingOfTheHill = 12,
7
8
  MultiplayerTotalControl = 14,
8
9
  MultiplayerCtf = 15,
10
+ MultiplayerExtraction = 17,
9
11
  MultiplayerOddball = 18,
10
12
  MultiplayerStockpile = 19,
11
13
  MultiplayerInfection = 22,
12
14
  MultiplayerGrifball = 25,
13
15
  MultiplayerLandGrab = 39,
14
- MultiplayerExtraction = 17,
16
+ MultiplayerMinigame = 41,
15
17
  MultiplayerFirefight = 42
16
18
  }
@@ -2,17 +2,19 @@ export var GameVariantCategory;
2
2
  (function (GameVariantCategory) {
3
3
  GameVariantCategory[GameVariantCategory["MultiplayerSlayer"] = 6] = "MultiplayerSlayer";
4
4
  GameVariantCategory[GameVariantCategory["MultiplayerAttrition"] = 7] = "MultiplayerAttrition";
5
+ GameVariantCategory[GameVariantCategory["MultiplayerElimination"] = 8] = "MultiplayerElimination";
5
6
  GameVariantCategory[GameVariantCategory["MultiplayerFiesta"] = 9] = "MultiplayerFiesta";
6
7
  GameVariantCategory[GameVariantCategory["MultiplayerStrongholds"] = 11] = "MultiplayerStrongholds";
7
8
  GameVariantCategory[GameVariantCategory["MultiplayerKingOfTheHill"] = 12] = "MultiplayerKingOfTheHill";
8
9
  GameVariantCategory[GameVariantCategory["MultiplayerTotalControl"] = 14] = "MultiplayerTotalControl";
9
10
  GameVariantCategory[GameVariantCategory["MultiplayerCtf"] = 15] = "MultiplayerCtf";
11
+ GameVariantCategory[GameVariantCategory["MultiplayerExtraction"] = 17] = "MultiplayerExtraction";
10
12
  GameVariantCategory[GameVariantCategory["MultiplayerOddball"] = 18] = "MultiplayerOddball";
11
13
  GameVariantCategory[GameVariantCategory["MultiplayerStockpile"] = 19] = "MultiplayerStockpile";
12
14
  GameVariantCategory[GameVariantCategory["MultiplayerInfection"] = 22] = "MultiplayerInfection";
13
15
  GameVariantCategory[GameVariantCategory["MultiplayerGrifball"] = 25] = "MultiplayerGrifball";
14
16
  GameVariantCategory[GameVariantCategory["MultiplayerLandGrab"] = 39] = "MultiplayerLandGrab";
15
- GameVariantCategory[GameVariantCategory["MultiplayerExtraction"] = 17] = "MultiplayerExtraction";
17
+ GameVariantCategory[GameVariantCategory["MultiplayerMinigame"] = 41] = "MultiplayerMinigame";
16
18
  GameVariantCategory[GameVariantCategory["MultiplayerFirefight"] = 42] = "MultiplayerFirefight";
17
19
  })(GameVariantCategory || (GameVariantCategory = {}));
18
20
  //# sourceMappingURL=game-variant-category.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"game-variant-category.js","sourceRoot":"","sources":["../../../src/models/halo-infinite/game-variant-category.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,mBAeX;AAfD,WAAY,mBAAmB;IAC7B,uFAAqB,CAAA;IACrB,6FAAwB,CAAA;IACxB,uFAAqB,CAAA;IACrB,kGAA2B,CAAA;IAC3B,sGAA6B,CAAA;IAC7B,oGAA4B,CAAA;IAC5B,kFAAmB,CAAA;IACnB,0FAAuB,CAAA;IACvB,8FAAyB,CAAA;IACzB,8FAAyB,CAAA;IACzB,4FAAwB,CAAA;IACxB,4FAAwB,CAAA;IACxB,gGAA0B,CAAA;IAC1B,8FAAyB,CAAA;AAC3B,CAAC,EAfW,mBAAmB,KAAnB,mBAAmB,QAe9B"}
1
+ {"version":3,"file":"game-variant-category.js","sourceRoot":"","sources":["../../../src/models/halo-infinite/game-variant-category.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,mBAiBX;AAjBD,WAAY,mBAAmB;IAC7B,uFAAqB,CAAA;IACrB,6FAAwB,CAAA;IACxB,iGAA0B,CAAA;IAC1B,uFAAqB,CAAA;IACrB,kGAA2B,CAAA;IAC3B,sGAA6B,CAAA;IAC7B,oGAA4B,CAAA;IAC5B,kFAAmB,CAAA;IACnB,gGAA0B,CAAA;IAC1B,0FAAuB,CAAA;IACvB,8FAAyB,CAAA;IACzB,8FAAyB,CAAA;IACzB,4FAAwB,CAAA;IACxB,4FAAwB,CAAA;IACxB,4FAAwB,CAAA;IACxB,8FAAyB,CAAA;AAC3B,CAAC,EAjBW,mBAAmB,KAAnB,mBAAmB,QAiB9B"}
@@ -68,30 +68,66 @@ export interface StockpileStats {
68
68
  TimeAsPowerSeedCarrier: string;
69
69
  TimeAsPowerSeedDriver: string;
70
70
  }
71
+ export interface PvpStats {
72
+ Kills: number;
73
+ Deaths: number;
74
+ Assists: number;
75
+ KDA: number;
76
+ }
77
+ export interface PveStats {
78
+ Kills: number;
79
+ Deaths: number;
80
+ Assists: number;
81
+ KDA: number;
82
+ MarineKills: number;
83
+ GruntKills: number;
84
+ JackalKills: number;
85
+ EliteKills: number;
86
+ BruteKills: number;
87
+ HunterKills: number;
88
+ SkimmerKills: number;
89
+ SentinelKills: number;
90
+ BossKills: number;
91
+ }
71
92
  type StatsMap = {
72
93
  [GameVariantCategory.MultiplayerOddball]: {
73
94
  OddballStats: OddballStats;
95
+ PvpStats: PvpStats;
74
96
  };
75
97
  [GameVariantCategory.MultiplayerStrongholds]: {
76
98
  ZonesStats: ZonesStats;
99
+ PvpStats: PvpStats;
77
100
  };
78
101
  [GameVariantCategory.MultiplayerCtf]: {
79
102
  CaptureTheFlagStats: CaptureTheFlagStats;
103
+ PvpStats: PvpStats;
80
104
  };
81
105
  [GameVariantCategory.MultiplayerKingOfTheHill]: {
82
106
  ZonesStats: ZonesStats;
107
+ PvpStats: PvpStats;
83
108
  };
84
109
  [GameVariantCategory.MultiplayerExtraction]: {
85
110
  ExtractionStats: ExtractionStats;
111
+ PvpStats: PvpStats;
86
112
  };
87
113
  [GameVariantCategory.MultiplayerFirefight]: {
88
114
  EliminationStats: EliminationStats;
115
+ PveStats: PveStats;
89
116
  };
90
117
  [GameVariantCategory.MultiplayerInfection]: {
91
118
  InfectionSTats: InfectionStats;
119
+ PvpStats: PvpStats;
92
120
  };
93
121
  [GameVariantCategory.MultiplayerStockpile]: {
94
122
  StockpileStats: StockpileStats;
123
+ PvpStats: PvpStats;
124
+ };
125
+ [GameVariantCategory.MultiplayerElimination]: {
126
+ EliminationStats: EliminationStats;
127
+ PvpStats: PvpStats;
128
+ };
129
+ [GameVariantCategory.MultiplayerMinigame]: {
130
+ PvpStats: PvpStats;
95
131
  };
96
132
  };
97
133
  export type Stats<TCategory extends GameVariantCategory = GameVariantCategory> = {
@@ -21,39 +21,45 @@ export class ExpiryTokenCache {
21
21
  }
22
22
  else {
23
23
  // Current token expired, start a new promise
24
- this.tokenFetchPromise = new ResolvablePromise();
24
+ const newPromise = new ResolvablePromise();
25
+ this.tokenFetchPromise = newPromise;
25
26
  try {
26
27
  const newToken = await this.generateNewToken(...args);
27
- this.tokenFetchPromise?.resolve(newToken);
28
+ newPromise.resolve(newToken);
28
29
  return newToken;
29
30
  }
30
31
  catch (e) {
31
- this.tokenFetchPromise?.reject(e);
32
- this.tokenFetchPromise = undefined;
32
+ newPromise.reject(e);
33
+ if (this.tokenFetchPromise === newPromise) {
34
+ this.tokenFetchPromise = undefined;
35
+ }
33
36
  throw e;
34
37
  }
35
38
  }
36
39
  }
37
40
  else {
38
41
  // No one has a token, start a new promise
39
- this.tokenFetchPromise = new ResolvablePromise();
42
+ const newPromise = new ResolvablePromise();
43
+ this.tokenFetchPromise = newPromise;
40
44
  try {
41
45
  const existingToken = await this.getExistingToken();
42
46
  if (existingToken?.expiresAt) {
43
47
  const expiresAt = coalesceDateTime(existingToken.expiresAt);
44
48
  if (expiresAt && expiresAt > DateTime.now()) {
45
49
  const newToken = { ...existingToken, expiresAt };
46
- this.tokenFetchPromise?.resolve(newToken);
50
+ newPromise.resolve(newToken);
47
51
  return newToken;
48
52
  }
49
53
  }
50
54
  const newToken = await this.generateNewToken(...args);
51
- this.tokenFetchPromise?.resolve(newToken);
55
+ newPromise.resolve(newToken);
52
56
  return newToken;
53
57
  }
54
58
  catch (e) {
55
- this.tokenFetchPromise?.reject(e);
56
- this.tokenFetchPromise = undefined;
59
+ newPromise.reject(e);
60
+ if (this.tokenFetchPromise === newPromise) {
61
+ this.tokenFetchPromise = undefined;
62
+ }
57
63
  throw e;
58
64
  }
59
65
  }
@@ -1 +1 @@
1
- {"version":3,"file":"expiry-token-cache.js","sourceRoot":"","sources":["../../src/util/expiry-token-cache.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"expiry-token-cache.js","sourceRoot":"","sources":["../../src/util/expiry-token-cache.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "halo-infinite-api",
3
3
  "type": "module",
4
- "version": "8.0.7",
4
+ "version": "8.1.0",
5
5
  "description": "An NPM package for accessing the official Halo Infinite API.",
6
6
  "main": "dist/index.js",
7
7
  "exports": {
@@ -1,16 +1,18 @@
1
1
  export enum GameVariantCategory {
2
2
  MultiplayerSlayer = 6,
3
3
  MultiplayerAttrition = 7,
4
+ MultiplayerElimination = 8,
4
5
  MultiplayerFiesta = 9,
5
6
  MultiplayerStrongholds = 11,
6
7
  MultiplayerKingOfTheHill = 12,
7
8
  MultiplayerTotalControl = 14,
8
9
  MultiplayerCtf = 15,
10
+ MultiplayerExtraction = 17,
9
11
  MultiplayerOddball = 18,
10
12
  MultiplayerStockpile = 19,
11
13
  MultiplayerInfection = 22,
12
14
  MultiplayerGrifball = 25,
13
15
  MultiplayerLandGrab = 39,
14
- MultiplayerExtraction = 17,
16
+ MultiplayerMinigame = 41,
15
17
  MultiplayerFirefight = 42,
16
18
  }
@@ -76,24 +76,68 @@ export interface StockpileStats {
76
76
  TimeAsPowerSeedDriver: string;
77
77
  }
78
78
 
79
+ export interface PvpStats {
80
+ Kills: number;
81
+ Deaths: number;
82
+ Assists: number;
83
+ KDA: number;
84
+ }
85
+
86
+ export interface PveStats {
87
+ Kills: number;
88
+ Deaths: number;
89
+ Assists: number;
90
+ KDA: number;
91
+ MarineKills: number;
92
+ GruntKills: number;
93
+ JackalKills: number;
94
+ EliteKills: number;
95
+ BruteKills: number;
96
+ HunterKills: number;
97
+ SkimmerKills: number;
98
+ SentinelKills: number;
99
+ BossKills: number;
100
+ }
101
+
79
102
  type StatsMap = {
80
- [GameVariantCategory.MultiplayerOddball]: { OddballStats: OddballStats };
81
- [GameVariantCategory.MultiplayerStrongholds]: { ZonesStats: ZonesStats };
103
+ [GameVariantCategory.MultiplayerOddball]: {
104
+ OddballStats: OddballStats;
105
+ PvpStats: PvpStats;
106
+ };
107
+ [GameVariantCategory.MultiplayerStrongholds]: {
108
+ ZonesStats: ZonesStats;
109
+ PvpStats: PvpStats;
110
+ };
82
111
  [GameVariantCategory.MultiplayerCtf]: {
83
112
  CaptureTheFlagStats: CaptureTheFlagStats;
113
+ PvpStats: PvpStats;
114
+ };
115
+ [GameVariantCategory.MultiplayerKingOfTheHill]: {
116
+ ZonesStats: ZonesStats;
117
+ PvpStats: PvpStats;
84
118
  };
85
- [GameVariantCategory.MultiplayerKingOfTheHill]: { ZonesStats: ZonesStats };
86
119
  [GameVariantCategory.MultiplayerExtraction]: {
87
120
  ExtractionStats: ExtractionStats;
121
+ PvpStats: PvpStats;
88
122
  };
89
123
  [GameVariantCategory.MultiplayerFirefight]: {
90
124
  EliminationStats: EliminationStats;
125
+ PveStats: PveStats;
91
126
  };
92
127
  [GameVariantCategory.MultiplayerInfection]: {
93
128
  InfectionSTats: InfectionStats;
129
+ PvpStats: PvpStats;
94
130
  };
95
131
  [GameVariantCategory.MultiplayerStockpile]: {
96
132
  StockpileStats: StockpileStats;
133
+ PvpStats: PvpStats;
134
+ };
135
+ [GameVariantCategory.MultiplayerElimination]: {
136
+ EliminationStats: EliminationStats;
137
+ PvpStats: PvpStats;
138
+ };
139
+ [GameVariantCategory.MultiplayerMinigame]: {
140
+ PvpStats: PvpStats;
97
141
  };
98
142
  };
99
143
 
@@ -27,21 +27,25 @@ export class ExpiryTokenCache<
27
27
  return currentToken;
28
28
  } else {
29
29
  // Current token expired, start a new promise
30
- this.tokenFetchPromise = new ResolvablePromise<TToken>();
30
+ const newPromise = new ResolvablePromise<TToken>();
31
+ this.tokenFetchPromise = newPromise;
31
32
 
32
33
  try {
33
34
  const newToken = await this.generateNewToken(...args);
34
- this.tokenFetchPromise?.resolve(newToken);
35
+ newPromise.resolve(newToken);
35
36
  return newToken;
36
37
  } catch (e) {
37
- this.tokenFetchPromise?.reject(e);
38
- this.tokenFetchPromise = undefined;
38
+ newPromise.reject(e);
39
+ if (this.tokenFetchPromise === newPromise) {
40
+ this.tokenFetchPromise = undefined;
41
+ }
39
42
  throw e;
40
43
  }
41
44
  }
42
45
  } else {
43
46
  // No one has a token, start a new promise
44
- this.tokenFetchPromise = new ResolvablePromise<TToken>();
47
+ const newPromise = new ResolvablePromise<TToken>();
48
+ this.tokenFetchPromise = newPromise;
45
49
 
46
50
  try {
47
51
  const existingToken = await this.getExistingToken();
@@ -50,17 +54,19 @@ export class ExpiryTokenCache<
50
54
  const expiresAt = coalesceDateTime(existingToken.expiresAt);
51
55
  if (expiresAt && expiresAt > DateTime.now()) {
52
56
  const newToken = { ...existingToken, expiresAt } as TToken;
53
- this.tokenFetchPromise?.resolve(newToken);
57
+ newPromise.resolve(newToken);
54
58
  return newToken;
55
59
  }
56
60
  }
57
61
 
58
62
  const newToken = await this.generateNewToken(...args);
59
- this.tokenFetchPromise?.resolve(newToken);
63
+ newPromise.resolve(newToken);
60
64
  return newToken;
61
65
  } catch (e) {
62
- this.tokenFetchPromise?.reject(e);
63
- this.tokenFetchPromise = undefined;
66
+ newPromise.reject(e);
67
+ if (this.tokenFetchPromise === newPromise) {
68
+ this.tokenFetchPromise = undefined;
69
+ }
64
70
  throw e;
65
71
  }
66
72
  }