@medrunner/api-client 0.1.2 → 0.1.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.
- package/dist/index.d.mts +21 -4
- package/dist/index.d.ts +21 -4
- package/dist/index.js +38 -9
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +36 -9
- package/dist/index.mjs.map +1 -1
- package/package.json +16 -13
package/dist/index.d.mts
CHANGED
|
@@ -148,6 +148,7 @@ interface Person extends WritableDbItem {
|
|
|
148
148
|
clientStats: ClientStats;
|
|
149
149
|
activeEmergency?: string;
|
|
150
150
|
clientPortalPreferences: Record<string, unknown>;
|
|
151
|
+
redeemedCodes: RedeemedCode[];
|
|
151
152
|
}
|
|
152
153
|
declare enum UserRoles {
|
|
153
154
|
CLIENT = 1,
|
|
@@ -172,6 +173,14 @@ interface ClientStats {
|
|
|
172
173
|
interface BlockedStatus {
|
|
173
174
|
blocked: boolean;
|
|
174
175
|
}
|
|
176
|
+
interface RedeemedCode {
|
|
177
|
+
code: string;
|
|
178
|
+
type: CodeType;
|
|
179
|
+
}
|
|
180
|
+
declare enum CodeType {
|
|
181
|
+
Unknown = 0,
|
|
182
|
+
CitizenCon2954 = 1
|
|
183
|
+
}
|
|
175
184
|
|
|
176
185
|
declare class ClientEndpoint extends ApiEndpoint {
|
|
177
186
|
constructor(baseUrl: string | undefined, tokenManager: TokenManager, log?: Logger, headerProvider?: HeaderProvider);
|
|
@@ -184,6 +193,12 @@ declare class ClientEndpoint extends ApiEndpoint {
|
|
|
184
193
|
deactivate(): Promise<ApiResponse>;
|
|
185
194
|
}
|
|
186
195
|
|
|
196
|
+
declare class CodeEndpoint extends ApiEndpoint {
|
|
197
|
+
constructor(baseUrl: string | undefined, tokenManager: TokenManager, log?: Logger, headerProvider?: HeaderProvider);
|
|
198
|
+
protected endpoint(): string;
|
|
199
|
+
redeem(code: string): Promise<ApiResponse>;
|
|
200
|
+
}
|
|
201
|
+
|
|
187
202
|
declare enum CancellationReason {
|
|
188
203
|
NONE = 0,
|
|
189
204
|
OTHER = 1,
|
|
@@ -427,24 +442,26 @@ declare class WebsocketEndpoint extends ApiEndpoint {
|
|
|
427
442
|
initialize(): Promise<HubConnection>;
|
|
428
443
|
}
|
|
429
444
|
|
|
430
|
-
interface ApiClient<TEmergency extends EmergencyEndpoint = EmergencyEndpoint, TClient extends ClientEndpoint = ClientEndpoint, TStaff extends StaffEndpoint = StaffEndpoint, TChatMessage extends ChatMessageEndpoint = ChatMessageEndpoint, TAuth extends AuthEndpoint = AuthEndpoint, TWebsocket extends WebsocketEndpoint = WebsocketEndpoint> {
|
|
445
|
+
interface ApiClient<TEmergency extends EmergencyEndpoint = EmergencyEndpoint, TClient extends ClientEndpoint = ClientEndpoint, TStaff extends StaffEndpoint = StaffEndpoint, TChatMessage extends ChatMessageEndpoint = ChatMessageEndpoint, TCode extends CodeEndpoint = CodeEndpoint, TAuth extends AuthEndpoint = AuthEndpoint, TWebsocket extends WebsocketEndpoint = WebsocketEndpoint> {
|
|
431
446
|
emergency: TEmergency;
|
|
432
447
|
client: TClient;
|
|
433
448
|
staff: TStaff;
|
|
434
449
|
chatMessage: TChatMessage;
|
|
450
|
+
code: TCode;
|
|
435
451
|
auth: TAuth;
|
|
436
452
|
websocket: TWebsocket;
|
|
437
453
|
}
|
|
438
454
|
|
|
439
|
-
declare class MedrunnerApiClient<TEmergency extends EmergencyEndpoint = EmergencyEndpoint, TClient extends ClientEndpoint = ClientEndpoint, TStaff extends StaffEndpoint = StaffEndpoint, TChatMessage extends ChatMessageEndpoint = ChatMessageEndpoint, TAuth extends AuthEndpoint = AuthEndpoint, TWebsocket extends WebsocketEndpoint = WebsocketEndpoint> implements ApiClient<TEmergency, TClient, TStaff, TChatMessage, TAuth, TWebsocket> {
|
|
455
|
+
declare class MedrunnerApiClient<TEmergency extends EmergencyEndpoint = EmergencyEndpoint, TClient extends ClientEndpoint = ClientEndpoint, TStaff extends StaffEndpoint = StaffEndpoint, TChatMessage extends ChatMessageEndpoint = ChatMessageEndpoint, TCode extends CodeEndpoint = CodeEndpoint, TAuth extends AuthEndpoint = AuthEndpoint, TWebsocket extends WebsocketEndpoint = WebsocketEndpoint> implements ApiClient<TEmergency, TClient, TStaff, TChatMessage, TCode, TAuth, TWebsocket> {
|
|
440
456
|
readonly emergency: TEmergency;
|
|
441
457
|
readonly client: TClient;
|
|
442
458
|
readonly staff: TStaff;
|
|
443
459
|
readonly chatMessage: TChatMessage;
|
|
460
|
+
readonly code: TCode;
|
|
444
461
|
readonly auth: TAuth;
|
|
445
462
|
readonly websocket: TWebsocket;
|
|
446
|
-
protected constructor(emergency: TEmergency, client: TClient, staff: TStaff, chatMessage: TChatMessage, auth: TAuth, websocket: TWebsocket);
|
|
463
|
+
protected constructor(emergency: TEmergency, client: TClient, staff: TStaff, chatMessage: TChatMessage, code: TCode, auth: TAuth, websocket: TWebsocket);
|
|
447
464
|
static buildClient(config: ApiConfig, refreshCallback?: AsyncAction<TokenGrant>, log?: Logger): MedrunnerApiClient;
|
|
448
465
|
}
|
|
449
466
|
|
|
450
|
-
export { AccountDeactivationReason, type AfterActionReport, type AfterActionReportEdit, type ApiClient, type ApiConfig, ApiEndpoint, type ApiResponse, type ApiToken, type AsyncAction, type AsyncProvider, AuthEndpoint, type BlockedStatus, CancellationReason, type ChatMessage, ChatMessageEndpoint, type ChatMessageRequest, Class, type ClientData, ClientEndpoint, type ClientHistory, type ClientStats, type CreateEmergencyRequest, type DbItem, type Emergency, EmergencyEndpoint, type EmergencyStats, type Func, type HeaderProvider, type Headers, Level, type Location, type LocationDetail, LocationType, type MedalInformation, MedrunnerApiClient, type MessageCache, MissionServices, MissionStatus, Origin, type PaginatedResponse, type Person, PersonType, type ResponderDetails, type RespondingTeam, ResponseRating, StaffEndpoint, SubmissionSource, type Team, type TeamDetailsResponse, type TeamMember, ThreatLevel, type TokenGrant, TokenManager, UserRoles, WebsocketEndpoint, type WritableDbItem };
|
|
467
|
+
export { AccountDeactivationReason, type AfterActionReport, type AfterActionReportEdit, type ApiClient, type ApiConfig, ApiEndpoint, type ApiResponse, type ApiToken, type AsyncAction, type AsyncProvider, AuthEndpoint, type BlockedStatus, CancellationReason, type ChatMessage, ChatMessageEndpoint, type ChatMessageRequest, Class, type ClientData, ClientEndpoint, type ClientHistory, type ClientStats, CodeEndpoint, CodeType, type CreateEmergencyRequest, type DbItem, type Emergency, EmergencyEndpoint, type EmergencyStats, type Func, type HeaderProvider, type Headers, Level, type Location, type LocationDetail, LocationType, type MedalInformation, MedrunnerApiClient, type MessageCache, MissionServices, MissionStatus, Origin, type PaginatedResponse, type Person, PersonType, type RedeemedCode, type ResponderDetails, type RespondingTeam, ResponseRating, StaffEndpoint, SubmissionSource, type Team, type TeamDetailsResponse, type TeamMember, ThreatLevel, type TokenGrant, TokenManager, UserRoles, WebsocketEndpoint, type WritableDbItem };
|
package/dist/index.d.ts
CHANGED
|
@@ -148,6 +148,7 @@ interface Person extends WritableDbItem {
|
|
|
148
148
|
clientStats: ClientStats;
|
|
149
149
|
activeEmergency?: string;
|
|
150
150
|
clientPortalPreferences: Record<string, unknown>;
|
|
151
|
+
redeemedCodes: RedeemedCode[];
|
|
151
152
|
}
|
|
152
153
|
declare enum UserRoles {
|
|
153
154
|
CLIENT = 1,
|
|
@@ -172,6 +173,14 @@ interface ClientStats {
|
|
|
172
173
|
interface BlockedStatus {
|
|
173
174
|
blocked: boolean;
|
|
174
175
|
}
|
|
176
|
+
interface RedeemedCode {
|
|
177
|
+
code: string;
|
|
178
|
+
type: CodeType;
|
|
179
|
+
}
|
|
180
|
+
declare enum CodeType {
|
|
181
|
+
Unknown = 0,
|
|
182
|
+
CitizenCon2954 = 1
|
|
183
|
+
}
|
|
175
184
|
|
|
176
185
|
declare class ClientEndpoint extends ApiEndpoint {
|
|
177
186
|
constructor(baseUrl: string | undefined, tokenManager: TokenManager, log?: Logger, headerProvider?: HeaderProvider);
|
|
@@ -184,6 +193,12 @@ declare class ClientEndpoint extends ApiEndpoint {
|
|
|
184
193
|
deactivate(): Promise<ApiResponse>;
|
|
185
194
|
}
|
|
186
195
|
|
|
196
|
+
declare class CodeEndpoint extends ApiEndpoint {
|
|
197
|
+
constructor(baseUrl: string | undefined, tokenManager: TokenManager, log?: Logger, headerProvider?: HeaderProvider);
|
|
198
|
+
protected endpoint(): string;
|
|
199
|
+
redeem(code: string): Promise<ApiResponse>;
|
|
200
|
+
}
|
|
201
|
+
|
|
187
202
|
declare enum CancellationReason {
|
|
188
203
|
NONE = 0,
|
|
189
204
|
OTHER = 1,
|
|
@@ -427,24 +442,26 @@ declare class WebsocketEndpoint extends ApiEndpoint {
|
|
|
427
442
|
initialize(): Promise<HubConnection>;
|
|
428
443
|
}
|
|
429
444
|
|
|
430
|
-
interface ApiClient<TEmergency extends EmergencyEndpoint = EmergencyEndpoint, TClient extends ClientEndpoint = ClientEndpoint, TStaff extends StaffEndpoint = StaffEndpoint, TChatMessage extends ChatMessageEndpoint = ChatMessageEndpoint, TAuth extends AuthEndpoint = AuthEndpoint, TWebsocket extends WebsocketEndpoint = WebsocketEndpoint> {
|
|
445
|
+
interface ApiClient<TEmergency extends EmergencyEndpoint = EmergencyEndpoint, TClient extends ClientEndpoint = ClientEndpoint, TStaff extends StaffEndpoint = StaffEndpoint, TChatMessage extends ChatMessageEndpoint = ChatMessageEndpoint, TCode extends CodeEndpoint = CodeEndpoint, TAuth extends AuthEndpoint = AuthEndpoint, TWebsocket extends WebsocketEndpoint = WebsocketEndpoint> {
|
|
431
446
|
emergency: TEmergency;
|
|
432
447
|
client: TClient;
|
|
433
448
|
staff: TStaff;
|
|
434
449
|
chatMessage: TChatMessage;
|
|
450
|
+
code: TCode;
|
|
435
451
|
auth: TAuth;
|
|
436
452
|
websocket: TWebsocket;
|
|
437
453
|
}
|
|
438
454
|
|
|
439
|
-
declare class MedrunnerApiClient<TEmergency extends EmergencyEndpoint = EmergencyEndpoint, TClient extends ClientEndpoint = ClientEndpoint, TStaff extends StaffEndpoint = StaffEndpoint, TChatMessage extends ChatMessageEndpoint = ChatMessageEndpoint, TAuth extends AuthEndpoint = AuthEndpoint, TWebsocket extends WebsocketEndpoint = WebsocketEndpoint> implements ApiClient<TEmergency, TClient, TStaff, TChatMessage, TAuth, TWebsocket> {
|
|
455
|
+
declare class MedrunnerApiClient<TEmergency extends EmergencyEndpoint = EmergencyEndpoint, TClient extends ClientEndpoint = ClientEndpoint, TStaff extends StaffEndpoint = StaffEndpoint, TChatMessage extends ChatMessageEndpoint = ChatMessageEndpoint, TCode extends CodeEndpoint = CodeEndpoint, TAuth extends AuthEndpoint = AuthEndpoint, TWebsocket extends WebsocketEndpoint = WebsocketEndpoint> implements ApiClient<TEmergency, TClient, TStaff, TChatMessage, TCode, TAuth, TWebsocket> {
|
|
440
456
|
readonly emergency: TEmergency;
|
|
441
457
|
readonly client: TClient;
|
|
442
458
|
readonly staff: TStaff;
|
|
443
459
|
readonly chatMessage: TChatMessage;
|
|
460
|
+
readonly code: TCode;
|
|
444
461
|
readonly auth: TAuth;
|
|
445
462
|
readonly websocket: TWebsocket;
|
|
446
|
-
protected constructor(emergency: TEmergency, client: TClient, staff: TStaff, chatMessage: TChatMessage, auth: TAuth, websocket: TWebsocket);
|
|
463
|
+
protected constructor(emergency: TEmergency, client: TClient, staff: TStaff, chatMessage: TChatMessage, code: TCode, auth: TAuth, websocket: TWebsocket);
|
|
447
464
|
static buildClient(config: ApiConfig, refreshCallback?: AsyncAction<TokenGrant>, log?: Logger): MedrunnerApiClient;
|
|
448
465
|
}
|
|
449
466
|
|
|
450
|
-
export { AccountDeactivationReason, type AfterActionReport, type AfterActionReportEdit, type ApiClient, type ApiConfig, ApiEndpoint, type ApiResponse, type ApiToken, type AsyncAction, type AsyncProvider, AuthEndpoint, type BlockedStatus, CancellationReason, type ChatMessage, ChatMessageEndpoint, type ChatMessageRequest, Class, type ClientData, ClientEndpoint, type ClientHistory, type ClientStats, type CreateEmergencyRequest, type DbItem, type Emergency, EmergencyEndpoint, type EmergencyStats, type Func, type HeaderProvider, type Headers, Level, type Location, type LocationDetail, LocationType, type MedalInformation, MedrunnerApiClient, type MessageCache, MissionServices, MissionStatus, Origin, type PaginatedResponse, type Person, PersonType, type ResponderDetails, type RespondingTeam, ResponseRating, StaffEndpoint, SubmissionSource, type Team, type TeamDetailsResponse, type TeamMember, ThreatLevel, type TokenGrant, TokenManager, UserRoles, WebsocketEndpoint, type WritableDbItem };
|
|
467
|
+
export { AccountDeactivationReason, type AfterActionReport, type AfterActionReportEdit, type ApiClient, type ApiConfig, ApiEndpoint, type ApiResponse, type ApiToken, type AsyncAction, type AsyncProvider, AuthEndpoint, type BlockedStatus, CancellationReason, type ChatMessage, ChatMessageEndpoint, type ChatMessageRequest, Class, type ClientData, ClientEndpoint, type ClientHistory, type ClientStats, CodeEndpoint, CodeType, type CreateEmergencyRequest, type DbItem, type Emergency, EmergencyEndpoint, type EmergencyStats, type Func, type HeaderProvider, type Headers, Level, type Location, type LocationDetail, LocationType, type MedalInformation, MedrunnerApiClient, type MessageCache, MissionServices, MissionStatus, Origin, type PaginatedResponse, type Person, PersonType, type RedeemedCode, type ResponderDetails, type RespondingTeam, ResponseRating, StaffEndpoint, SubmissionSource, type Team, type TeamDetailsResponse, type TeamMember, ThreatLevel, type TokenGrant, TokenManager, UserRoles, WebsocketEndpoint, type WritableDbItem };
|
package/dist/index.js
CHANGED
|
@@ -38,6 +38,8 @@ __export(src_exports, {
|
|
|
38
38
|
ChatMessageEndpoint: () => ChatMessageEndpoint,
|
|
39
39
|
Class: () => Class,
|
|
40
40
|
ClientEndpoint: () => ClientEndpoint,
|
|
41
|
+
CodeEndpoint: () => CodeEndpoint,
|
|
42
|
+
CodeType: () => CodeType,
|
|
41
43
|
EmergencyEndpoint: () => EmergencyEndpoint,
|
|
42
44
|
Level: () => Level,
|
|
43
45
|
LocationType: () => LocationType,
|
|
@@ -225,13 +227,10 @@ var TokenManager = class _TokenManager extends ApiEndpoint {
|
|
|
225
227
|
async getAccessToken() {
|
|
226
228
|
if (this.accessToken !== void 0) {
|
|
227
229
|
const exp = _TokenManager.getJwtFromAccessToken(this.accessToken).exp;
|
|
228
|
-
if (exp > Date.now() / 1e3 - 60 * 5)
|
|
229
|
-
return this.accessToken;
|
|
230
|
+
if (exp > Date.now() / 1e3 - 60 * 5) return this.accessToken;
|
|
230
231
|
}
|
|
231
|
-
if (this.refreshToken === void 0)
|
|
232
|
-
|
|
233
|
-
if (!this.tokenFetchPromise)
|
|
234
|
-
this.tokenFetchPromise = this.fetchToken(this.refreshToken);
|
|
232
|
+
if (this.refreshToken === void 0) return this.accessToken;
|
|
233
|
+
if (!this.tokenFetchPromise) this.tokenFetchPromise = this.fetchToken(this.refreshToken);
|
|
235
234
|
try {
|
|
236
235
|
const tokens = await this.tokenFetchPromise;
|
|
237
236
|
this.accessToken = tokens.accessToken;
|
|
@@ -347,6 +346,27 @@ var ClientEndpoint = class extends ApiEndpoint {
|
|
|
347
346
|
}
|
|
348
347
|
};
|
|
349
348
|
|
|
349
|
+
// src/api/endpoints/code/CodeEndpoint.ts
|
|
350
|
+
var CodeEndpoint = class extends ApiEndpoint {
|
|
351
|
+
static {
|
|
352
|
+
__name(this, "CodeEndpoint");
|
|
353
|
+
}
|
|
354
|
+
constructor(baseUrl, tokenManager, log, headerProvider) {
|
|
355
|
+
super(baseUrl, tokenManager, log, headerProvider);
|
|
356
|
+
}
|
|
357
|
+
endpoint() {
|
|
358
|
+
return "code";
|
|
359
|
+
}
|
|
360
|
+
/**
|
|
361
|
+
* Redeems the specified promotional code for the current user
|
|
362
|
+
*
|
|
363
|
+
* @param code - The code to redeem.
|
|
364
|
+
* */
|
|
365
|
+
async redeem(code) {
|
|
366
|
+
return await this.postRequest(`/redeem/${code}`);
|
|
367
|
+
}
|
|
368
|
+
};
|
|
369
|
+
|
|
350
370
|
// src/api/endpoints/emergency/EmergencyEndpoint.ts
|
|
351
371
|
var EmergencyEndpoint = class extends ApiEndpoint {
|
|
352
372
|
static {
|
|
@@ -491,9 +511,9 @@ var WebsocketManager = class {
|
|
|
491
511
|
logger;
|
|
492
512
|
async establishConnection() {
|
|
493
513
|
return new import_signalr.HubConnectionBuilder().withAutomaticReconnect({
|
|
494
|
-
nextRetryDelayInMilliseconds: (retryContext) => retryContext.previousRetryCount > 5 ? null : 2e3
|
|
514
|
+
nextRetryDelayInMilliseconds: /* @__PURE__ */ __name((retryContext) => retryContext.previousRetryCount > 5 ? null : 2e3, "nextRetryDelayInMilliseconds")
|
|
495
515
|
}).withUrl(`${this.baseUrl}/hub/emergency`, {
|
|
496
|
-
accessTokenFactory: async () => await this.tokenManager.getAccessToken() ?? ""
|
|
516
|
+
accessTokenFactory: /* @__PURE__ */ __name(async () => await this.tokenManager.getAccessToken() ?? "", "accessTokenFactory")
|
|
497
517
|
}).configureLogging(new WSLogger(this.logger)).build();
|
|
498
518
|
}
|
|
499
519
|
};
|
|
@@ -524,11 +544,12 @@ var WebsocketEndpoint = class extends ApiEndpoint {
|
|
|
524
544
|
|
|
525
545
|
// src/api/MedrunnerApiClient.ts
|
|
526
546
|
var MedrunnerApiClient = class _MedrunnerApiClient {
|
|
527
|
-
constructor(emergency, client, staff, chatMessage, auth, websocket) {
|
|
547
|
+
constructor(emergency, client, staff, chatMessage, code, auth, websocket) {
|
|
528
548
|
this.emergency = emergency;
|
|
529
549
|
this.client = client;
|
|
530
550
|
this.staff = staff;
|
|
531
551
|
this.chatMessage = chatMessage;
|
|
552
|
+
this.code = code;
|
|
532
553
|
this.auth = auth;
|
|
533
554
|
this.websocket = websocket;
|
|
534
555
|
}
|
|
@@ -549,6 +570,7 @@ var MedrunnerApiClient = class _MedrunnerApiClient {
|
|
|
549
570
|
new ClientEndpoint(config.baseUrl, tokenManager, log),
|
|
550
571
|
new StaffEndpoint(config.baseUrl, tokenManager, log),
|
|
551
572
|
new ChatMessageEndpoint(config.baseUrl, tokenManager, log),
|
|
573
|
+
new CodeEndpoint(config.baseUrl, tokenManager, log),
|
|
552
574
|
new AuthEndpoint(config.baseUrl, tokenManager, log),
|
|
553
575
|
new WebsocketEndpoint(config.baseUrl, tokenManager, log)
|
|
554
576
|
);
|
|
@@ -651,6 +673,11 @@ var AccountDeactivationReason = /* @__PURE__ */ ((AccountDeactivationReason2) =>
|
|
|
651
673
|
AccountDeactivationReason2[AccountDeactivationReason2["BLOCKED"] = 3] = "BLOCKED";
|
|
652
674
|
return AccountDeactivationReason2;
|
|
653
675
|
})(AccountDeactivationReason || {});
|
|
676
|
+
var CodeType = /* @__PURE__ */ ((CodeType2) => {
|
|
677
|
+
CodeType2[CodeType2["Unknown"] = 0] = "Unknown";
|
|
678
|
+
CodeType2[CodeType2["CitizenCon2954"] = 1] = "CitizenCon2954";
|
|
679
|
+
return CodeType2;
|
|
680
|
+
})(CodeType || {});
|
|
654
681
|
|
|
655
682
|
// src/models/Level.ts
|
|
656
683
|
var Level = /* @__PURE__ */ ((Level2) => {
|
|
@@ -713,6 +740,8 @@ var ThreatLevel = /* @__PURE__ */ ((ThreatLevel2) => {
|
|
|
713
740
|
ChatMessageEndpoint,
|
|
714
741
|
Class,
|
|
715
742
|
ClientEndpoint,
|
|
743
|
+
CodeEndpoint,
|
|
744
|
+
CodeType,
|
|
716
745
|
EmergencyEndpoint,
|
|
717
746
|
Level,
|
|
718
747
|
LocationType,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/api/endpoints/ApiEndpoint.ts","../src/api/endpoints/auth/AuthEndpoint.ts","../src/api/endpoints/auth/TokenManager.ts","../src/api/endpoints/chatMessage/ChatMessageEndpoint.ts","../src/api/endpoints/client/ClientEndpoint.ts","../src/api/endpoints/emergency/EmergencyEndpoint.ts","../src/api/endpoints/staff/StaffEndpoint.ts","../src/api/endpoints/websocket/WebsocketManager.ts","../src/api/endpoints/websocket/WebsocketEndpoint.ts","../src/api/MedrunnerApiClient.ts","../src/api/endpoints/emergency/response/LocationDetail.ts","../src/models/CancellationReason.ts","../src/models/Class.ts","../src/models/Emergency.ts","../src/models/MissionStatus.ts","../src/models/Person.ts","../src/models/Level.ts","../src/models/ResponseRating.ts","../src/models/ThreatLevel.ts"],"sourcesContent":["import ApiClient from \"./api/ApiClient\";\nimport ApiConfig from \"./api/ApiConfig\";\nimport ApiResponse from \"./api/ApiResponse\";\nimport MedrunnerApiClient from \"./api/MedrunnerApiClient\";\nimport PaginatedResponse from \"./api/PaginatedResponse\";\n\nexport { MedrunnerApiClient, ApiClient, ApiResponse, PaginatedResponse, ApiConfig };\n\nexport * from \"./Func\";\n\nimport ApiEndpoint from \"./api/endpoints/ApiEndpoint\";\nimport AuthEndpoint from \"./api/endpoints/auth/AuthEndpoint\";\nimport TokenManager from \"./api/endpoints/auth/TokenManager\";\nimport ChatMessageEndpoint from \"./api/endpoints/chatMessage/ChatMessageEndpoint\";\nimport ChatMessageRequest from \"./api/endpoints/chatMessage/request/ChatMessageRequest\";\nimport ClientEndpoint from \"./api/endpoints/client/ClientEndpoint\";\nimport EmergencyEndpoint from \"./api/endpoints/emergency/EmergencyEndpoint\";\nimport CreateEmergencyRequest from \"./api/endpoints/emergency/request/CreateEmergencyRequest\";\nimport LocationDetail from \"./api/endpoints/emergency/response/LocationDetail\";\nimport TeamDetailsResponse from \"./api/endpoints/emergency/response/TeamDetailsResponse\";\nimport MedalInformation from \"./api/endpoints/staff/response/MedalInformation\";\nimport StaffEndpoint from \"./api/endpoints/staff/StaffEndpoint\";\nimport WebsocketEndpoint from \"./api/endpoints/websocket/WebsocketEndpoint\";\n\nexport * from \"./api/endpoints/emergency/request/CreateEmergencyRequest\";\nexport * from \"./api/endpoints/emergency/response/TeamDetailsResponse\";\nexport * from \"./api/endpoints/emergency/response/LocationDetail\";\n\nexport {\n ApiEndpoint,\n CreateEmergencyRequest,\n TeamDetailsResponse,\n LocationDetail,\n EmergencyEndpoint,\n ChatMessageEndpoint,\n ChatMessageRequest,\n AuthEndpoint,\n ClientEndpoint,\n StaffEndpoint,\n MedalInformation,\n WebsocketEndpoint,\n TokenManager,\n};\n\nexport * from \"./models/CancellationReason\";\nexport * from \"./models/Class\";\nexport * from \"./models/Emergency\";\nexport * from \"./models/EmergencyStats\";\nexport * from \"./models/MissionStatus\";\nexport * from \"./models/Person\";\nexport * from \"./models/Level\";\nexport * from \"./models/ResponseRating\";\nexport * from \"./models/Team\";\nexport * from \"./models/TeamMember\";\nexport * from \"./models/ThreatLevel\";\n\nimport ApiToken from \"./models/ApiToken\";\nimport ChatMessage from \"./models/ChatMessage\";\nimport ClientHistory from \"./models/ClientHistory\";\nimport DbItem from \"./models/DbItem\";\nimport Emergency from \"./models/Emergency\";\nimport EmergencyStats from \"./models/EmergencyStats\";\nimport Person from \"./models/Person\";\nimport Team from \"./models/Team\";\nimport TeamMember from \"./models/TeamMember\";\nimport TokenGrant from \"./models/TokenGrant\";\nimport WritableDbItem from \"./models/WritableDbItem\";\n\nexport {\n ApiToken,\n ChatMessage,\n DbItem,\n Emergency,\n EmergencyStats,\n ClientHistory,\n Person,\n Team,\n TeamMember,\n TokenGrant,\n WritableDbItem,\n};\n","import axios, { AxiosError, AxiosRequestConfig } from \"axios\";\nimport { Logger } from \"ts-log\";\n\nimport { HeaderProvider } from \"../../Func\";\nimport ApiResponse from \"../ApiResponse\";\nimport TokenManager from \"./auth/TokenManager\";\n\nexport default abstract class ApiEndpoint {\n public readonly baseUrl: string;\n\n protected constructor(\n baseUrl: string | undefined,\n public readonly tokenManager: TokenManager,\n protected readonly log?: Logger,\n private readonly headerProvider?: HeaderProvider,\n ) {\n this.baseUrl = baseUrl ?? \"https://api.medrunner.space\";\n }\n\n protected abstract endpoint(): string;\n\n protected endpointUrl(): string {\n return `${this.baseUrl}/${this.endpoint()}`;\n }\n\n private async headersForRequest(noAuthentication: boolean): Promise<AxiosRequestConfig> {\n const config: AxiosRequestConfig = {\n baseURL: this.baseUrl,\n headers: {},\n };\n\n if (config.headers !== undefined) {\n if (!noAuthentication) {\n const accessToken = await this.tokenManager.getAccessToken();\n if (accessToken !== undefined) {\n // only include auth header if we have a token\n config.headers.Authorization = `Bearer ${accessToken}`;\n }\n }\n\n if (this.headerProvider !== undefined) {\n for (const header of Object.entries(await this.headerProvider())) {\n config.headers[header[0]] = header[1];\n }\n }\n }\n\n return config;\n }\n\n protected async getRequest<T = unknown>(\n endpoint: string,\n queryParams?: { [key: string]: unknown },\n noAuthentication?: boolean,\n ): Promise<ApiResponse<T>> {\n return await this.makeRequestWithoutBody<T>(endpoint, \"GET\", axios.get, queryParams, noAuthentication);\n }\n\n protected async postRequest<T = unknown>(\n endpoint: string,\n data?: unknown,\n noAuthentication?: boolean,\n ): Promise<ApiResponse<T>> {\n return await this.makeRequestWithBody<T>(endpoint, \"POST\", axios.post, data, noAuthentication);\n }\n\n protected async putRequest<T = unknown>(\n endpoint: string,\n data?: unknown,\n noAuthentication?: boolean,\n ): Promise<ApiResponse<T>> {\n return await this.makeRequestWithBody<T>(endpoint, \"PUT\", axios.put, data, noAuthentication);\n }\n\n protected async patchRequest<T = unknown>(\n endpoint: string,\n data?: unknown,\n noAuthentication?: boolean,\n ): Promise<ApiResponse<T>> {\n return await this.makeRequestWithBody<T>(endpoint, \"PATCH\", axios.patch, data, noAuthentication);\n }\n\n protected async deleteRequest(\n endpoint: string,\n queryParams?: { [key: string]: unknown },\n noAuthentication?: boolean,\n ): Promise<ApiResponse> {\n return await this.makeRequestWithoutBody(endpoint, \"DELETE\", axios.delete, queryParams, noAuthentication);\n }\n\n private async makeRequestWithBody<T = unknown>(\n endpoint: string,\n requestType: \"POST\" | \"PUT\" | \"PATCH\",\n axiosRequest: AxiosRequestWithBody<T>,\n data?: unknown,\n noAuthentication?: boolean,\n ): Promise<ApiResponse<T>> {\n const wrappedRequest: AxiosWrapper<T> = async (requestUrl, config) => await axiosRequest(requestUrl, data, config);\n return await this.makeRequest<T>(endpoint, requestType, wrappedRequest, undefined, noAuthentication);\n }\n\n private async makeRequestWithoutBody<T = unknown>(\n endpoint: string,\n requestType: \"GET\" | \"DELETE\",\n axiosRequest: AxiosRequestWithoutBody<T>,\n queryParams?: { [key: string]: unknown },\n noAuthentication?: boolean,\n ): Promise<ApiResponse<T>> {\n const wrappedRequest: AxiosWrapper<T> = async (requestUrl, config) => await axiosRequest(requestUrl, config);\n return await this.makeRequest<T>(endpoint, requestType, wrappedRequest, queryParams, noAuthentication);\n }\n\n private buildUrl(endpoint: string): string {\n const baseUrl = this.endpointUrl();\n\n if (baseUrl.endsWith(\"/\")) {\n if (endpoint.startsWith(\"/\")) {\n return `${baseUrl}${endpoint.substring(1)}`;\n }\n\n return `${baseUrl}${endpoint}`;\n }\n\n if (endpoint.startsWith(\"/\")) {\n return `${baseUrl}${endpoint}`;\n }\n\n return `${baseUrl}/${endpoint}`;\n }\n\n private async makeRequest<T = unknown>(\n endpoint: string,\n requestType: \"GET\" | \"POST\" | \"PUT\" | \"PATCH\" | \"DELETE\",\n request: AxiosWrapper<T>,\n queryParams?: { [key: string]: unknown },\n noAuthentication = false,\n ): Promise<ApiResponse<T>> {\n const requestUrl = this.buildUrl(endpoint);\n\n this.log?.debug(`sending ${requestType} request to ${requestUrl}`);\n try {\n const config = await this.headersForRequest(noAuthentication);\n if (queryParams !== undefined) {\n config.params = queryParams;\n }\n\n const result = await request(requestUrl, config);\n\n return {\n success: true,\n data: result.data,\n };\n } catch (e) {\n this.log?.warn(`Error for ${requestType} request to ${requestUrl}: ${e}`);\n return {\n success: false,\n errorMessage: e instanceof AxiosError ? e.response?.data : undefined,\n statusCode: e instanceof AxiosError ? e.response?.status : undefined,\n };\n }\n }\n}\n\ntype AxiosWrapper<T = unknown> = (url: string, config: AxiosRequestConfig) => Promise<ApiResponse<T>>;\n\ntype AxiosRequestWithBody<T = unknown> = (\n url: string,\n data: unknown,\n config: AxiosRequestConfig,\n) => Promise<ApiResponse<T>>;\ntype AxiosRequestWithoutBody<T = unknown> = (url: string, config: AxiosRequestConfig) => Promise<ApiResponse<T>>;\n","import { Logger } from \"ts-log\";\n\nimport { HeaderProvider } from \"../../../Func\";\nimport ApiToken from \"../../../models/ApiToken\";\nimport ApiResponse from \"../../ApiResponse\";\nimport ApiEndpoint from \"../ApiEndpoint\";\nimport TokenManager from \"../auth/TokenManager\";\nimport CreateApiTokenRequest from \"./request/CreateApiTokenRequest\";\nimport SignOutRequest from \"./request/SignOutRequest\";\n\n/**\n * Endpoints for interacting with auth.\n * */\nexport default class AuthEndpoint extends ApiEndpoint {\n constructor(baseUrl: string | undefined, tokenManager: TokenManager, log?: Logger, headerProvider?: HeaderProvider) {\n super(baseUrl, tokenManager, log, headerProvider);\n }\n\n protected override endpoint(): string {\n return \"auth\";\n }\n\n /**\n * Invalidate a refresh token.\n *\n * @param oldToken - Token to be invalidated\n *\n * @virtual\n * */\n public async signOut(oldToken: SignOutRequest): Promise<ApiResponse> {\n return await this.postRequest<string>(\"/signOut\", oldToken);\n }\n\n /**\n * Gets all api tokens for the user.\n *\n * */\n public async getApiTokens(): Promise<ApiResponse<ApiToken[]>> {\n return await this.getRequest<ApiToken[]>(`/apiTokens`);\n }\n\n /**\n * Creates an api token.\n *\n * @param newToken - Emergency details for the new emergency\n * @returns The newly-created api token\n *\n * @virtual\n * */\n public async createApiToken(newToken: CreateApiTokenRequest): Promise<ApiResponse<string>> {\n return await this.postRequest<string>(\"/apiTokens\", {\n name: newToken.name,\n expirationDate: newToken.expirationDate?.toISOString(),\n });\n }\n\n /**\n * Delete an api token.\n *\n * @param id - The id of the api token to delete\n *\n * */\n public async deleteApiToken(id: string): Promise<ApiResponse> {\n return await this.deleteRequest(`/apiTokens/${id}`);\n }\n}\n","import { Logger } from \"ts-log\";\n\nimport { AsyncAction, HeaderProvider } from \"../../../Func\";\nimport TokenGrant from \"../../../models/TokenGrant\";\nimport ApiConfig from \"../../ApiConfig\";\nimport ApiEndpoint from \"../ApiEndpoint\";\n\nexport default class TokenManager extends ApiEndpoint {\n private accessToken?: string;\n private refreshToken?: string;\n private tokenFetchPromise?: Promise<TokenGrant>;\n\n public constructor(\n config: ApiConfig,\n private readonly refreshCallback?: AsyncAction<TokenGrant>,\n log?: Logger,\n headerProvider?: HeaderProvider,\n ) {\n // todo: I dunno fix this someday I guess?\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n super(config.baseUrl, null!, log, headerProvider);\n this.accessToken = config.accessToken;\n this.refreshToken = config.refreshToken;\n }\n\n protected override endpoint(): string {\n return \"auth\";\n }\n\n public async getAccessToken(): Promise<string | undefined> {\n if (this.accessToken !== undefined) {\n const exp = TokenManager.getJwtFromAccessToken(this.accessToken).exp;\n\n // check expiration minus 5 minutes to guard against race condition or timing issues creating unnecessary 403s\n if (exp > Date.now() / 1000 - 60 * 5) return this.accessToken;\n }\n\n // if the refresh token isn't present, nothing we can do\n if (this.refreshToken === undefined) return this.accessToken;\n\n // token is expired (or will expire soon) and there is not already one fetching, so fetch a new one\n if (!this.tokenFetchPromise) this.tokenFetchPromise = this.fetchToken(this.refreshToken);\n\n try {\n const tokens = await this.tokenFetchPromise;\n this.accessToken = tokens.accessToken;\n this.refreshToken = tokens.refreshToken;\n\n if (this.refreshCallback !== undefined) {\n await this.refreshCallback(tokens);\n }\n } finally {\n this.tokenFetchPromise = undefined;\n }\n\n return this.accessToken;\n }\n\n private async fetchToken(refreshToken: string): Promise<TokenGrant> {\n const result = await this.postRequest<TokenGrant>(\"/exchange\", { refreshToken: refreshToken }, true);\n\n if (!result.success || result.data === undefined) {\n throw Error(result.statusCode?.toString());\n }\n\n return result.data;\n }\n\n private static getJwtFromAccessToken(accessToken: string): Jwt {\n return JSON.parse(atob(accessToken.split(\".\")[1]));\n }\n}\n\ninterface Jwt {\n exp: number;\n}\n","import { Logger } from \"ts-log\";\n\nimport { HeaderProvider } from \"../../../Func\";\nimport ChatMessage from \"../../../models/ChatMessage\";\nimport ApiResponse from \"../../ApiResponse\";\nimport PaginatedResponse from \"../../PaginatedResponse\";\nimport ApiEndpoint from \"../ApiEndpoint\";\nimport TokenManager from \"../auth/TokenManager\";\nimport ChatMessageRequest from \"./request/ChatMessageRequest\";\n\n/**\n * Endpoints for interacting with chat messages.\n * */\nexport default class ChatMessageEndpoint extends ApiEndpoint {\n constructor(baseUrl: string | undefined, tokenManager: TokenManager, log?: Logger, headerProvider?: HeaderProvider) {\n super(baseUrl, tokenManager, log, headerProvider);\n }\n\n protected override endpoint(): string {\n return \"chatMessage\";\n }\n\n /**\n * Gets the specified amount of chat messages for a given emergency.\n *\n * @param emergencyId - The emergency for which to fetch the chat history\n * @param limit - The number of emergencies to get\n * @param paginationToken - The number to use for pagination\n * */\n public async getHistory(\n emergencyId: string,\n limit: number,\n paginationToken?: string,\n ): Promise<ApiResponse<PaginatedResponse<ChatMessage>>> {\n return await this.getRequest<PaginatedResponse<ChatMessage>>(`/${emergencyId}`, { limit, paginationToken });\n }\n\n /**\n * Sends a new chat message\n *\n * @param message - The message to send\n * @returns The newly-created chat message\n *\n * */\n public async sendMessage(message: ChatMessageRequest): Promise<ApiResponse<ChatMessage>> {\n return await this.postRequest<ChatMessage>(\"\", message);\n }\n}\n","import { Logger } from \"ts-log\";\n\nimport { HeaderProvider } from \"../../../Func\";\nimport ClientHistory from \"../../../models/ClientHistory\";\nimport Person, { BlockedStatus } from \"../../../models/Person\";\nimport ApiResponse from \"../../ApiResponse\";\nimport PaginatedResponse from \"../../PaginatedResponse\";\nimport ApiEndpoint from \"../ApiEndpoint\";\nimport TokenManager from \"../auth/TokenManager\";\n\n/**\n * Endpoints for interacting with clients.\n * */\nexport default class ClientEndpoint extends ApiEndpoint {\n constructor(baseUrl: string | undefined, tokenManager: TokenManager, log?: Logger, headerProvider?: HeaderProvider) {\n super(baseUrl, tokenManager, log, headerProvider);\n }\n\n protected override endpoint(): string {\n return \"client\";\n }\n\n /**\n * Gets the current client.\n * */\n public async get(): Promise<ApiResponse<Person>> {\n return await this.getRequest<Person>(\"\");\n }\n\n /**\n * Gets the specified amount of emergencies the client has created.\n * @param limit - The number of emergencies to get\n * @param paginationToken - The number to use for pagination\n * */\n public async getHistory(\n limit: number,\n paginationToken?: string,\n ): Promise<ApiResponse<PaginatedResponse<ClientHistory>>> {\n return await this.getRequest<PaginatedResponse<ClientHistory>>(\"/history\", { limit, paginationToken });\n }\n\n /**\n * Gets the blocklist status of the current client.\n * */\n public async getBlockedStatus(): Promise<ApiResponse<BlockedStatus>> {\n return await this.getRequest<BlockedStatus>(\"/blocked\");\n }\n\n /**\n * Links the current user to a rsiHandle.\n *\n * @param rsiHandle - The RSI handle of the client\n *\n * */\n public async linkClient(rsiHandle: string): Promise<ApiResponse> {\n return await this.postRequest(\"/link\", { rsiHandle });\n }\n\n /**\n * Updates the settings of the current user for the Client Portal.\n *\n * @param settings - The object settings to add or update\n * @returns The updated settings object\n *\n * */\n public async setSettings(settings: Record<string, unknown>): Promise<ApiResponse<Record<string, unknown>>> {\n return await this.patchRequest<Record<string, unknown>>(\"/settings/clientPortal\", settings);\n }\n\n /**\n * Deactivate the current client.\n * */\n public async deactivate(): Promise<ApiResponse> {\n return await this.deleteRequest(\"\");\n }\n}\n","import { Logger } from \"ts-log\";\n\nimport { HeaderProvider } from \"../../../Func\";\nimport { CancellationReason } from \"../../../models/CancellationReason\";\nimport Emergency from \"../../../models/Emergency\";\nimport { ResponseRating } from \"../../../models/ResponseRating\";\nimport ApiResponse from \"../../ApiResponse\";\nimport ApiEndpoint from \"../ApiEndpoint\";\nimport TokenManager from \"../auth/TokenManager\";\nimport CreateEmergencyRequest from \"./request/CreateEmergencyRequest\";\nimport LocationDetail from \"./response/LocationDetail\";\nimport TeamDetailsResponse from \"./response/TeamDetailsResponse\";\n\n/**\n * Endpoints for interacting with emergencies.\n * */\nexport default class EmergencyEndpoint extends ApiEndpoint {\n constructor(baseUrl: string | undefined, tokenManager: TokenManager, log?: Logger, headerProvider?: HeaderProvider) {\n super(baseUrl, tokenManager, log, headerProvider);\n }\n\n protected override endpoint(): string {\n return \"emergency\";\n }\n\n /**\n * Gets an emergency by id.\n *\n * @param id - The id of the emergency to retrieve\n * */\n public async getEmergency(id: string): Promise<ApiResponse<Emergency>> {\n return await this.getRequest<Emergency>(`/${id}`);\n }\n\n /**\n * Bulk fetches emergencies by id.\n *\n * @param ids - a list of emergencies to retrieve\n * */\n public async getEmergencies(ids: string[]): Promise<ApiResponse<Emergency[]>> {\n return await this.getRequest<Emergency[]>(`/bulk?id=${ids.join(\"&id=\")}`);\n }\n\n /**\n * Creates a new emergency.\n *\n * @param newEmergency - Emergency details for the new emergency\n * @returns The newly-created emergency\n *\n * @virtual\n * */\n public async createEmergency(newEmergency: CreateEmergencyRequest): Promise<ApiResponse<Emergency>> {\n return await this.postRequest<Emergency>(\"\", newEmergency);\n }\n\n /**\n * Cancels an existing emergency.\n *\n * @remarks\n * Emergency must still be in the {@link MissionStatus.RECEIVED} state in order to be canceled.\n *\n * @param id - The id of the emergency to cancel\n * @param reason - The reason the emergency was canceled\n * */\n public async cancelEmergencyWithReason(id: string, reason: CancellationReason): Promise<ApiResponse> {\n return await this.postRequest(`/${id}/cancelWithReason`, {\n reason: reason,\n });\n }\n\n /**\n * Allows the client to rate their emergency.\n *\n * @param id - The id of the emergency to rate\n * @param rating - The rating to give the services provided\n * @param remarks - Additional remarks provided by the client\n *\n * @internal\n * */\n public async rateServices(id: string, rating: ResponseRating, remarks?: string): Promise<ApiResponse> {\n return await this.postRequest(`/${id}/rate/`, {\n rating: rating,\n remarks: remarks,\n });\n }\n\n /**\n * Fetches additional details about the responding team for an alert.\n *\n * @param id - The id of the emergency to get team details about\n * */\n public async teamDetails(id: string): Promise<ApiResponse<TeamDetailsResponse>> {\n return await this.getRequest<TeamDetailsResponse>(`/${id}/teamDetails`);\n }\n\n /**\n * Gets a tree of valid locations from which an emergency may be submitted.\n * */\n public async emergencyLocations(): Promise<ApiResponse<LocationDetail[]>> {\n return await this.getRequest<LocationDetail[]>(\"/meta/locations\");\n }\n}\n","import { Logger } from \"ts-log\";\n\nimport { HeaderProvider } from \"../../../Func\";\nimport ApiResponse from \"../../ApiResponse\";\nimport ApiEndpoint from \"../ApiEndpoint\";\nimport TokenManager from \"../auth/TokenManager\";\nimport MedalInformation from \"./response/MedalInformation\";\n\n/**\n * Endpoints for interacting with staff.\n * */\nexport default class StaffEndpoint extends ApiEndpoint {\n constructor(baseUrl: string | undefined, tokenManager: TokenManager, log?: Logger, headerProvider?: HeaderProvider) {\n super(baseUrl, tokenManager, log, headerProvider);\n }\n\n protected override endpoint(): string {\n return \"staff\";\n }\n\n /**\n * Gets detailed information about medals.\n * */\n public async medalsInformation(): Promise<ApiResponse<MedalInformation[]>> {\n return await this.getRequest<MedalInformation[]>(\"/meta/medals\");\n }\n}\n","import { type HubConnection, HubConnectionBuilder, ILogger, LogLevel } from \"@microsoft/signalr\";\nimport { Logger } from \"ts-log\";\n\nimport TokenManager from \"../auth/TokenManager\";\n\nclass WSLogger implements ILogger {\n constructor(private logger?: Logger) {}\n\n log(logLevel: LogLevel, message: string): void {\n switch (logLevel) {\n case LogLevel.Trace:\n this.logger?.trace(`Websocket: ${message}`);\n break;\n case LogLevel.Information:\n this.logger?.info(`Websocket: ${message}`);\n break;\n case LogLevel.Warning:\n this.logger?.warn(`Websocket: ${message}`);\n break;\n case LogLevel.Error || LogLevel.Critical:\n this.logger?.error(`Websocket: ${message}`);\n break;\n case LogLevel.Debug:\n this.logger?.debug(`Websocket: ${message}`);\n break;\n }\n }\n}\n\nexport default class WebsocketManager {\n private tokenManager: TokenManager;\n protected readonly logger?: Logger;\n\n public constructor(\n private readonly baseUrl: string,\n tokenManager: TokenManager,\n logger?: Logger,\n ) {\n this.tokenManager = tokenManager;\n this.logger = logger;\n }\n\n public async establishConnection(): Promise<HubConnection> {\n return new HubConnectionBuilder()\n .withAutomaticReconnect({\n nextRetryDelayInMilliseconds: retryContext => (retryContext.previousRetryCount > 5 ? null : 2000),\n })\n .withUrl(`${this.baseUrl}/hub/emergency`, {\n accessTokenFactory: async () => (await this.tokenManager.getAccessToken()) ?? \"\",\n })\n .configureLogging(new WSLogger(this.logger))\n .build();\n }\n}\n","import { HubConnection } from \"@microsoft/signalr\";\nimport { Logger } from \"ts-log\";\n\nimport { HeaderProvider } from \"../../../Func\";\nimport ApiEndpoint from \"../ApiEndpoint\";\nimport TokenManager from \"../auth/TokenManager\";\nimport WebsocketManager from \".//WebsocketManager\";\n\n/**\n * Endpoints for interacting with emergencies.\n * */\nexport default class WebsocketEndpoint extends ApiEndpoint {\n constructor(baseUrl: string | undefined, tokenManager: TokenManager, log?: Logger, headerProvider?: HeaderProvider) {\n super(baseUrl, tokenManager, log, headerProvider);\n }\n\n private websocketManager = new WebsocketManager(this.baseUrl, this.tokenManager, this.log);\n\n protected override endpoint(): string {\n return \"websocket\";\n }\n\n /**\n * Gets realtime updates.\n *\n * */\n public async initialize(): Promise<HubConnection> {\n if (this.websocketManager === undefined) {\n throw new Error(\"WebsocketManager is undefined\");\n }\n return await this.websocketManager.establishConnection();\n }\n}\n","import { Logger } from \"ts-log\";\n\nimport { AsyncAction } from \"../Func\";\nimport TokenGrant from \"../models/TokenGrant\";\nimport ApiClient from \"./ApiClient\";\nimport ApiConfig from \"./ApiConfig\";\nimport AuthEndpoint from \"./endpoints/auth/AuthEndpoint\";\nimport TokenManager from \"./endpoints/auth/TokenManager\";\nimport ChatMessageEndpoint from \"./endpoints/chatMessage/ChatMessageEndpoint\";\nimport ClientEndpoint from \"./endpoints/client/ClientEndpoint\";\nimport EmergencyEndpoint from \"./endpoints/emergency/EmergencyEndpoint\";\nimport StaffEndpoint from \"./endpoints/staff/StaffEndpoint\";\nimport WebsocketEndpoint from \"./endpoints/websocket/WebsocketEndpoint\";\n\n/**\n * An API client for basic client interactions with the Medrunner API.\n * */\nexport default class MedrunnerApiClient<\n TEmergency extends EmergencyEndpoint = EmergencyEndpoint,\n TClient extends ClientEndpoint = ClientEndpoint,\n TStaff extends StaffEndpoint = StaffEndpoint,\n TChatMessage extends ChatMessageEndpoint = ChatMessageEndpoint,\n TAuth extends AuthEndpoint = AuthEndpoint,\n TWebsocket extends WebsocketEndpoint = WebsocketEndpoint,\n> implements ApiClient<TEmergency, TClient, TStaff, TChatMessage, TAuth, TWebsocket>\n{\n protected constructor(\n public readonly emergency: TEmergency,\n public readonly client: TClient,\n public readonly staff: TStaff,\n public readonly chatMessage: TChatMessage,\n public readonly auth: TAuth,\n public readonly websocket: TWebsocket,\n ) {}\n\n /**\n * Constructs a new API client.\n *\n * @param config - The API configuration\n * @param refreshCallback - a callback function called whenever a refresh token exchange is performed\n * @param log - A logger which logs request details\n * */\n public static buildClient(\n config: ApiConfig,\n refreshCallback?: AsyncAction<TokenGrant>,\n log?: Logger,\n ): MedrunnerApiClient {\n const tokenManager = new TokenManager(config, refreshCallback, log);\n\n return new MedrunnerApiClient(\n new EmergencyEndpoint(config.baseUrl, tokenManager, log),\n new ClientEndpoint(config.baseUrl, tokenManager, log),\n new StaffEndpoint(config.baseUrl, tokenManager, log),\n new ChatMessageEndpoint(config.baseUrl, tokenManager, log),\n new AuthEndpoint(config.baseUrl, tokenManager, log),\n new WebsocketEndpoint(config.baseUrl, tokenManager, log),\n );\n }\n}\n","/**\n * A supported location from which an emergency may be submitted.\n * */\nexport default interface LocationDetail {\n /**\n * The name of this location\n * */\n name: string;\n\n /**\n * The type of this location\n * */\n type: LocationType;\n\n /**\n * Additional locations which are within this location (e.g. moons of a planet, or planets of a system)\n * */\n children: LocationDetail[];\n}\n\n/**\n * The type of location.\n * */\nexport enum LocationType {\n /**\n * The location type is not known\n * */\n UNKNOWN,\n /**\n * A system, e.g. Stanton\n * */\n SYSTEM,\n /**\n * A planet, e.g. Crusader\n * */\n PLANET,\n /**\n * A moon, e.g. Daymar\n * */\n MOON,\n}\n","export enum CancellationReason {\n NONE,\n OTHER,\n SUCCUMBED_TO_WOUNDS,\n SERVER_ERROR,\n RESPAWNED,\n RESCUED,\n}\n","export enum Class {\n NONE,\n MEDIC,\n SECURITY,\n PILOT,\n LEAD,\n DISPATCH,\n DISPATCH_LEAD,\n DISPATCH_TRAINEE,\n DISPATCH_OBSERVER,\n QRF,\n LOGISTICS,\n}\n","import { CancellationReason } from \"./CancellationReason\";\nimport { MissionStatus } from \"./MissionStatus\";\nimport { ResponseRating } from \"./ResponseRating\";\nimport Team from \"./Team\";\nimport { ThreatLevel } from \"./ThreatLevel\";\nimport WritableDbItem from \"./WritableDbItem\";\n\nexport default interface Emergency extends WritableDbItem {\n system: string;\n subsystem: string;\n tertiaryLocation?: string;\n threatLevel: ThreatLevel;\n remarks?: string;\n clientRsiHandle: string;\n clientDiscordId?: string;\n clientId?: string;\n subscriptionTier: string;\n status: MissionStatus;\n alertMessage?: MessageCache;\n clientMessage?: MessageCache;\n coordinationThread?: MessageCache;\n afterActionReportMessage?: MessageCache;\n interactionMessageId?: string;\n respondingTeam: Team;\n respondingTeams: RespondingTeam[];\n creationTimestamp: number;\n acceptedTimestamp?: number;\n completionTimestamp?: number;\n rating: ResponseRating;\n ratingRemarks?: string;\n test: boolean;\n cancellationReason: CancellationReason;\n refusalReason?: string;\n origin: Origin;\n clientData?: ClientData;\n isComplete: boolean;\n missionName?: string;\n afterActionReport?: AfterActionReport;\n submissionSource: SubmissionSource;\n}\n\nexport interface MessageCache {\n id: string;\n channelId: string;\n}\n\nexport interface ClientData {\n rsiHandle: string;\n rsiProfileLink: string;\n gotClientData: boolean;\n redactedOrgOnProfile: boolean;\n reported: boolean;\n}\n\nexport interface AfterActionReport {\n remarks?: string;\n submitterStaffId: string;\n servicesProvided: MissionServices;\n suspectedTrap: boolean;\n hasBeenEdited: boolean;\n submittedOn: number;\n editHistory: AfterActionReportEdit[];\n}\n\nexport interface AfterActionReportEdit {\n editorStaffId: string;\n editTime: number;\n}\n\nexport enum MissionServices {\n NONE = 0,\n PVE = 1 << 0,\n PVP = 1 << 1,\n REVIVED_HEALED = 1 << 2,\n HEALED_IN_SHIP = 1 << 3,\n EXTRACT_SAFE_ZONE = 1 << 4,\n}\n\nexport enum Origin {\n UNKNOWN,\n REPORT,\n BEACON,\n EVALUATION,\n}\n\nexport enum SubmissionSource {\n UNKNOWN,\n API,\n BOT,\n}\n\nexport interface RespondingTeam {\n id: string;\n teamName: string;\n}\n","export enum MissionStatus {\n CREATED,\n RECEIVED,\n IN_PROGRESS,\n SUCCESS,\n FAILED,\n NO_CONTACT,\n CANCELED,\n REFUSED,\n ABORTED,\n SERVER_ERROR,\n}\n","import EmergencyStats from \"./EmergencyStats\";\nimport WritableDbItem from \"./WritableDbItem\";\n\nexport default interface Person extends WritableDbItem {\n discordId: string;\n rsiHandle?: string;\n roles: UserRoles;\n personType: PersonType;\n active: boolean;\n deactivationReason: AccountDeactivationReason;\n clientStats: ClientStats;\n activeEmergency?: string;\n clientPortalPreferences: Record<string, unknown>;\n}\n\nexport enum UserRoles {\n CLIENT = 1 << 0,\n STAFF = 1 << 1,\n DEVELOPER = 1 << 51,\n BOT = 1 << 52,\n}\n\nexport enum PersonType {\n CLIENT,\n STAFF,\n BOT,\n}\n\nexport enum AccountDeactivationReason {\n NONE,\n CLIENT_DRIVEN_DELETION,\n TERMINATED,\n BLOCKED,\n}\n\nexport interface ClientStats {\n missions: EmergencyStats;\n}\n\nexport interface BlockedStatus {\n blocked: boolean;\n}\n","export enum Level {\n None,\n Tier1Section1 = 101,\n Tier1Section2,\n Tier1Section3,\n Tier2Section1 = 201,\n Tier2Section2,\n Tier2Section3,\n Tier3Section1 = 301,\n Tier3Section2,\n Tier3Section3,\n Tier4Section1 = 401,\n Tier4Section2,\n Tier4Section3,\n Tier5Section1 = 501,\n Tier5Section2,\n Tier5Section3,\n Tier6Section1 = 601,\n Tier6Section2,\n Tier6Section3,\n Tier7Section1 = 701,\n Tier7Section2,\n Tier7Section3,\n Tier8Section1 = 801,\n Tier8Section2,\n Tier8Section3,\n Tier9Section1 = 901,\n Tier9Section2,\n Tier9Section3,\n Tier10Section1 = 1001,\n Tier10Section2,\n Tier10Section3,\n}\n","export enum ResponseRating {\n NONE,\n GOOD,\n BAD,\n}\n","export enum ThreatLevel {\n UNKNOWN,\n LOW,\n MEDIUM,\n HIGH,\n}\n"],"mappings":"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","names":["axios","LocationType","CancellationReason","Class","MissionServices","Origin","SubmissionSource","MissionStatus","UserRoles","PersonType","AccountDeactivationReason","Level","ResponseRating","ThreatLevel"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/api/endpoints/ApiEndpoint.ts","../src/api/endpoints/auth/AuthEndpoint.ts","../src/api/endpoints/auth/TokenManager.ts","../src/api/endpoints/chatMessage/ChatMessageEndpoint.ts","../src/api/endpoints/client/ClientEndpoint.ts","../src/api/endpoints/code/CodeEndpoint.ts","../src/api/endpoints/emergency/EmergencyEndpoint.ts","../src/api/endpoints/staff/StaffEndpoint.ts","../src/api/endpoints/websocket/WebsocketManager.ts","../src/api/endpoints/websocket/WebsocketEndpoint.ts","../src/api/MedrunnerApiClient.ts","../src/api/endpoints/emergency/response/LocationDetail.ts","../src/models/CancellationReason.ts","../src/models/Class.ts","../src/models/Emergency.ts","../src/models/MissionStatus.ts","../src/models/Person.ts","../src/models/Level.ts","../src/models/ResponseRating.ts","../src/models/ThreatLevel.ts"],"sourcesContent":["import ApiClient from \"./api/ApiClient\";\nimport ApiConfig from \"./api/ApiConfig\";\nimport ApiResponse from \"./api/ApiResponse\";\nimport MedrunnerApiClient from \"./api/MedrunnerApiClient\";\nimport PaginatedResponse from \"./api/PaginatedResponse\";\n\nexport { MedrunnerApiClient, ApiClient, ApiResponse, PaginatedResponse, ApiConfig };\n\nexport * from \"./Func\";\n\nimport ApiEndpoint from \"./api/endpoints/ApiEndpoint\";\nimport AuthEndpoint from \"./api/endpoints/auth/AuthEndpoint\";\nimport TokenManager from \"./api/endpoints/auth/TokenManager\";\nimport ChatMessageEndpoint from \"./api/endpoints/chatMessage/ChatMessageEndpoint\";\nimport ChatMessageRequest from \"./api/endpoints/chatMessage/request/ChatMessageRequest\";\nimport ClientEndpoint from \"./api/endpoints/client/ClientEndpoint\";\nimport CodeEndpoint from \"./api/endpoints/code/CodeEndpoint\";\nimport EmergencyEndpoint from \"./api/endpoints/emergency/EmergencyEndpoint\";\nimport CreateEmergencyRequest from \"./api/endpoints/emergency/request/CreateEmergencyRequest\";\nimport LocationDetail from \"./api/endpoints/emergency/response/LocationDetail\";\nimport TeamDetailsResponse from \"./api/endpoints/emergency/response/TeamDetailsResponse\";\nimport MedalInformation from \"./api/endpoints/staff/response/MedalInformation\";\nimport StaffEndpoint from \"./api/endpoints/staff/StaffEndpoint\";\nimport WebsocketEndpoint from \"./api/endpoints/websocket/WebsocketEndpoint\";\n\nexport * from \"./api/endpoints/emergency/request/CreateEmergencyRequest\";\nexport * from \"./api/endpoints/emergency/response/TeamDetailsResponse\";\nexport * from \"./api/endpoints/emergency/response/LocationDetail\";\n\nexport {\n ApiEndpoint,\n CreateEmergencyRequest,\n TeamDetailsResponse,\n LocationDetail,\n EmergencyEndpoint,\n ChatMessageEndpoint,\n ChatMessageRequest,\n CodeEndpoint,\n AuthEndpoint,\n ClientEndpoint,\n StaffEndpoint,\n MedalInformation,\n WebsocketEndpoint,\n TokenManager,\n};\n\nexport * from \"./models/CancellationReason\";\nexport * from \"./models/Class\";\nexport * from \"./models/Emergency\";\nexport * from \"./models/EmergencyStats\";\nexport * from \"./models/MissionStatus\";\nexport * from \"./models/Person\";\nexport * from \"./models/Level\";\nexport * from \"./models/ResponseRating\";\nexport * from \"./models/Team\";\nexport * from \"./models/TeamMember\";\nexport * from \"./models/ThreatLevel\";\n\nimport ApiToken from \"./models/ApiToken\";\nimport ChatMessage from \"./models/ChatMessage\";\nimport ClientHistory from \"./models/ClientHistory\";\nimport DbItem from \"./models/DbItem\";\nimport Emergency from \"./models/Emergency\";\nimport EmergencyStats from \"./models/EmergencyStats\";\nimport Person from \"./models/Person\";\nimport Team from \"./models/Team\";\nimport TeamMember from \"./models/TeamMember\";\nimport TokenGrant from \"./models/TokenGrant\";\nimport WritableDbItem from \"./models/WritableDbItem\";\n\nexport {\n ApiToken,\n ChatMessage,\n DbItem,\n Emergency,\n EmergencyStats,\n ClientHistory,\n Person,\n Team,\n TeamMember,\n TokenGrant,\n WritableDbItem,\n};\n","import axios, { AxiosError, AxiosRequestConfig } from \"axios\";\nimport { Logger } from \"ts-log\";\n\nimport { HeaderProvider } from \"../../Func\";\nimport ApiResponse from \"../ApiResponse\";\nimport TokenManager from \"./auth/TokenManager\";\n\nexport default abstract class ApiEndpoint {\n public readonly baseUrl: string;\n\n protected constructor(\n baseUrl: string | undefined,\n public readonly tokenManager: TokenManager,\n protected readonly log?: Logger,\n private readonly headerProvider?: HeaderProvider,\n ) {\n this.baseUrl = baseUrl ?? \"https://api.medrunner.space\";\n }\n\n protected abstract endpoint(): string;\n\n protected endpointUrl(): string {\n return `${this.baseUrl}/${this.endpoint()}`;\n }\n\n private async headersForRequest(noAuthentication: boolean): Promise<AxiosRequestConfig> {\n const config: AxiosRequestConfig = {\n baseURL: this.baseUrl,\n headers: {},\n };\n\n if (config.headers !== undefined) {\n if (!noAuthentication) {\n const accessToken = await this.tokenManager.getAccessToken();\n if (accessToken !== undefined) {\n // only include auth header if we have a token\n config.headers.Authorization = `Bearer ${accessToken}`;\n }\n }\n\n if (this.headerProvider !== undefined) {\n for (const header of Object.entries(await this.headerProvider())) {\n config.headers[header[0]] = header[1];\n }\n }\n }\n\n return config;\n }\n\n protected async getRequest<T = unknown>(\n endpoint: string,\n queryParams?: { [key: string]: unknown },\n noAuthentication?: boolean,\n ): Promise<ApiResponse<T>> {\n return await this.makeRequestWithoutBody<T>(endpoint, \"GET\", axios.get, queryParams, noAuthentication);\n }\n\n protected async postRequest<T = unknown>(\n endpoint: string,\n data?: unknown,\n noAuthentication?: boolean,\n ): Promise<ApiResponse<T>> {\n return await this.makeRequestWithBody<T>(endpoint, \"POST\", axios.post, data, noAuthentication);\n }\n\n protected async putRequest<T = unknown>(\n endpoint: string,\n data?: unknown,\n noAuthentication?: boolean,\n ): Promise<ApiResponse<T>> {\n return await this.makeRequestWithBody<T>(endpoint, \"PUT\", axios.put, data, noAuthentication);\n }\n\n protected async patchRequest<T = unknown>(\n endpoint: string,\n data?: unknown,\n noAuthentication?: boolean,\n ): Promise<ApiResponse<T>> {\n return await this.makeRequestWithBody<T>(endpoint, \"PATCH\", axios.patch, data, noAuthentication);\n }\n\n protected async deleteRequest(\n endpoint: string,\n queryParams?: { [key: string]: unknown },\n noAuthentication?: boolean,\n ): Promise<ApiResponse> {\n return await this.makeRequestWithoutBody(endpoint, \"DELETE\", axios.delete, queryParams, noAuthentication);\n }\n\n private async makeRequestWithBody<T = unknown>(\n endpoint: string,\n requestType: \"POST\" | \"PUT\" | \"PATCH\",\n axiosRequest: AxiosRequestWithBody<T>,\n data?: unknown,\n noAuthentication?: boolean,\n ): Promise<ApiResponse<T>> {\n const wrappedRequest: AxiosWrapper<T> = async (requestUrl, config) => await axiosRequest(requestUrl, data, config);\n return await this.makeRequest<T>(endpoint, requestType, wrappedRequest, undefined, noAuthentication);\n }\n\n private async makeRequestWithoutBody<T = unknown>(\n endpoint: string,\n requestType: \"GET\" | \"DELETE\",\n axiosRequest: AxiosRequestWithoutBody<T>,\n queryParams?: { [key: string]: unknown },\n noAuthentication?: boolean,\n ): Promise<ApiResponse<T>> {\n const wrappedRequest: AxiosWrapper<T> = async (requestUrl, config) => await axiosRequest(requestUrl, config);\n return await this.makeRequest<T>(endpoint, requestType, wrappedRequest, queryParams, noAuthentication);\n }\n\n private buildUrl(endpoint: string): string {\n const baseUrl = this.endpointUrl();\n\n if (baseUrl.endsWith(\"/\")) {\n if (endpoint.startsWith(\"/\")) {\n return `${baseUrl}${endpoint.substring(1)}`;\n }\n\n return `${baseUrl}${endpoint}`;\n }\n\n if (endpoint.startsWith(\"/\")) {\n return `${baseUrl}${endpoint}`;\n }\n\n return `${baseUrl}/${endpoint}`;\n }\n\n private async makeRequest<T = unknown>(\n endpoint: string,\n requestType: \"GET\" | \"POST\" | \"PUT\" | \"PATCH\" | \"DELETE\",\n request: AxiosWrapper<T>,\n queryParams?: { [key: string]: unknown },\n noAuthentication = false,\n ): Promise<ApiResponse<T>> {\n const requestUrl = this.buildUrl(endpoint);\n\n this.log?.debug(`sending ${requestType} request to ${requestUrl}`);\n try {\n const config = await this.headersForRequest(noAuthentication);\n if (queryParams !== undefined) {\n config.params = queryParams;\n }\n\n const result = await request(requestUrl, config);\n\n return {\n success: true,\n data: result.data,\n };\n } catch (e) {\n this.log?.warn(`Error for ${requestType} request to ${requestUrl}: ${e}`);\n return {\n success: false,\n errorMessage: e instanceof AxiosError ? e.response?.data : undefined,\n statusCode: e instanceof AxiosError ? e.response?.status : undefined,\n };\n }\n }\n}\n\ntype AxiosWrapper<T = unknown> = (url: string, config: AxiosRequestConfig) => Promise<ApiResponse<T>>;\n\ntype AxiosRequestWithBody<T = unknown> = (\n url: string,\n data: unknown,\n config: AxiosRequestConfig,\n) => Promise<ApiResponse<T>>;\ntype AxiosRequestWithoutBody<T = unknown> = (url: string, config: AxiosRequestConfig) => Promise<ApiResponse<T>>;\n","import { Logger } from \"ts-log\";\n\nimport { HeaderProvider } from \"../../../Func\";\nimport ApiToken from \"../../../models/ApiToken\";\nimport ApiResponse from \"../../ApiResponse\";\nimport ApiEndpoint from \"../ApiEndpoint\";\nimport TokenManager from \"../auth/TokenManager\";\nimport CreateApiTokenRequest from \"./request/CreateApiTokenRequest\";\nimport SignOutRequest from \"./request/SignOutRequest\";\n\n/**\n * Endpoints for interacting with auth.\n * */\nexport default class AuthEndpoint extends ApiEndpoint {\n constructor(baseUrl: string | undefined, tokenManager: TokenManager, log?: Logger, headerProvider?: HeaderProvider) {\n super(baseUrl, tokenManager, log, headerProvider);\n }\n\n protected override endpoint(): string {\n return \"auth\";\n }\n\n /**\n * Invalidate a refresh token.\n *\n * @param oldToken - Token to be invalidated\n *\n * @virtual\n * */\n public async signOut(oldToken: SignOutRequest): Promise<ApiResponse> {\n return await this.postRequest<string>(\"/signOut\", oldToken);\n }\n\n /**\n * Gets all api tokens for the user.\n *\n * */\n public async getApiTokens(): Promise<ApiResponse<ApiToken[]>> {\n return await this.getRequest<ApiToken[]>(`/apiTokens`);\n }\n\n /**\n * Creates an api token.\n *\n * @param newToken - Emergency details for the new emergency\n * @returns The newly-created api token\n *\n * @virtual\n * */\n public async createApiToken(newToken: CreateApiTokenRequest): Promise<ApiResponse<string>> {\n return await this.postRequest<string>(\"/apiTokens\", {\n name: newToken.name,\n expirationDate: newToken.expirationDate?.toISOString(),\n });\n }\n\n /**\n * Delete an api token.\n *\n * @param id - The id of the api token to delete\n *\n * */\n public async deleteApiToken(id: string): Promise<ApiResponse> {\n return await this.deleteRequest(`/apiTokens/${id}`);\n }\n}\n","import { Logger } from \"ts-log\";\n\nimport { AsyncAction, HeaderProvider } from \"../../../Func\";\nimport TokenGrant from \"../../../models/TokenGrant\";\nimport ApiConfig from \"../../ApiConfig\";\nimport ApiEndpoint from \"../ApiEndpoint\";\n\nexport default class TokenManager extends ApiEndpoint {\n private accessToken?: string;\n private refreshToken?: string;\n private tokenFetchPromise?: Promise<TokenGrant>;\n\n public constructor(\n config: ApiConfig,\n private readonly refreshCallback?: AsyncAction<TokenGrant>,\n log?: Logger,\n headerProvider?: HeaderProvider,\n ) {\n // todo: I dunno fix this someday I guess?\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n super(config.baseUrl, null!, log, headerProvider);\n this.accessToken = config.accessToken;\n this.refreshToken = config.refreshToken;\n }\n\n protected override endpoint(): string {\n return \"auth\";\n }\n\n public async getAccessToken(): Promise<string | undefined> {\n if (this.accessToken !== undefined) {\n const exp = TokenManager.getJwtFromAccessToken(this.accessToken).exp;\n\n // check expiration minus 5 minutes to guard against race condition or timing issues creating unnecessary 403s\n if (exp > Date.now() / 1000 - 60 * 5) return this.accessToken;\n }\n\n // if the refresh token isn't present, nothing we can do\n if (this.refreshToken === undefined) return this.accessToken;\n\n // token is expired (or will expire soon) and there is not already one fetching, so fetch a new one\n if (!this.tokenFetchPromise) this.tokenFetchPromise = this.fetchToken(this.refreshToken);\n\n try {\n const tokens = await this.tokenFetchPromise;\n this.accessToken = tokens.accessToken;\n this.refreshToken = tokens.refreshToken;\n\n if (this.refreshCallback !== undefined) {\n await this.refreshCallback(tokens);\n }\n } finally {\n this.tokenFetchPromise = undefined;\n }\n\n return this.accessToken;\n }\n\n private async fetchToken(refreshToken: string): Promise<TokenGrant> {\n const result = await this.postRequest<TokenGrant>(\"/exchange\", { refreshToken: refreshToken }, true);\n\n if (!result.success || result.data === undefined) {\n throw Error(result.statusCode?.toString());\n }\n\n return result.data;\n }\n\n private static getJwtFromAccessToken(accessToken: string): Jwt {\n return JSON.parse(atob(accessToken.split(\".\")[1]));\n }\n}\n\ninterface Jwt {\n exp: number;\n}\n","import { Logger } from \"ts-log\";\n\nimport { HeaderProvider } from \"../../../Func\";\nimport ChatMessage from \"../../../models/ChatMessage\";\nimport ApiResponse from \"../../ApiResponse\";\nimport PaginatedResponse from \"../../PaginatedResponse\";\nimport ApiEndpoint from \"../ApiEndpoint\";\nimport TokenManager from \"../auth/TokenManager\";\nimport ChatMessageRequest from \"./request/ChatMessageRequest\";\n\n/**\n * Endpoints for interacting with chat messages.\n * */\nexport default class ChatMessageEndpoint extends ApiEndpoint {\n constructor(baseUrl: string | undefined, tokenManager: TokenManager, log?: Logger, headerProvider?: HeaderProvider) {\n super(baseUrl, tokenManager, log, headerProvider);\n }\n\n protected override endpoint(): string {\n return \"chatMessage\";\n }\n\n /**\n * Gets the specified amount of chat messages for a given emergency.\n *\n * @param emergencyId - The emergency for which to fetch the chat history\n * @param limit - The number of emergencies to get\n * @param paginationToken - The number to use for pagination\n * */\n public async getHistory(\n emergencyId: string,\n limit: number,\n paginationToken?: string,\n ): Promise<ApiResponse<PaginatedResponse<ChatMessage>>> {\n return await this.getRequest<PaginatedResponse<ChatMessage>>(`/${emergencyId}`, { limit, paginationToken });\n }\n\n /**\n * Sends a new chat message\n *\n * @param message - The message to send\n * @returns The newly-created chat message\n *\n * */\n public async sendMessage(message: ChatMessageRequest): Promise<ApiResponse<ChatMessage>> {\n return await this.postRequest<ChatMessage>(\"\", message);\n }\n}\n","import { Logger } from \"ts-log\";\n\nimport { HeaderProvider } from \"../../../Func\";\nimport ClientHistory from \"../../../models/ClientHistory\";\nimport Person, { BlockedStatus } from \"../../../models/Person\";\nimport ApiResponse from \"../../ApiResponse\";\nimport PaginatedResponse from \"../../PaginatedResponse\";\nimport ApiEndpoint from \"../ApiEndpoint\";\nimport TokenManager from \"../auth/TokenManager\";\n\n/**\n * Endpoints for interacting with clients.\n * */\nexport default class ClientEndpoint extends ApiEndpoint {\n constructor(baseUrl: string | undefined, tokenManager: TokenManager, log?: Logger, headerProvider?: HeaderProvider) {\n super(baseUrl, tokenManager, log, headerProvider);\n }\n\n protected override endpoint(): string {\n return \"client\";\n }\n\n /**\n * Gets the current client.\n * */\n public async get(): Promise<ApiResponse<Person>> {\n return await this.getRequest<Person>(\"\");\n }\n\n /**\n * Gets the specified amount of emergencies the client has created.\n * @param limit - The number of emergencies to get\n * @param paginationToken - The number to use for pagination\n * */\n public async getHistory(\n limit: number,\n paginationToken?: string,\n ): Promise<ApiResponse<PaginatedResponse<ClientHistory>>> {\n return await this.getRequest<PaginatedResponse<ClientHistory>>(\"/history\", { limit, paginationToken });\n }\n\n /**\n * Gets the blocklist status of the current client.\n * */\n public async getBlockedStatus(): Promise<ApiResponse<BlockedStatus>> {\n return await this.getRequest<BlockedStatus>(\"/blocked\");\n }\n\n /**\n * Links the current user to a rsiHandle.\n *\n * @param rsiHandle - The RSI handle of the client\n *\n * */\n public async linkClient(rsiHandle: string): Promise<ApiResponse> {\n return await this.postRequest(\"/link\", { rsiHandle });\n }\n\n /**\n * Updates the settings of the current user for the Client Portal.\n *\n * @param settings - The object settings to add or update\n * @returns The updated settings object\n *\n * */\n public async setSettings(settings: Record<string, unknown>): Promise<ApiResponse<Record<string, unknown>>> {\n return await this.patchRequest<Record<string, unknown>>(\"/settings/clientPortal\", settings);\n }\n\n /**\n * Deactivate the current client.\n * */\n public async deactivate(): Promise<ApiResponse> {\n return await this.deleteRequest(\"\");\n }\n}\n","import { Logger } from \"ts-log\";\n\nimport { HeaderProvider } from \"../../../Func\";\nimport ApiResponse from \"../../ApiResponse\";\nimport ApiEndpoint from \"../ApiEndpoint\";\nimport TokenManager from \"../auth/TokenManager\";\n\n/**\n * Endpoints for interacting with promotional codes.\n * */\nexport default class CodeEndpoint extends ApiEndpoint {\n constructor(baseUrl: string | undefined, tokenManager: TokenManager, log?: Logger, headerProvider?: HeaderProvider) {\n super(baseUrl, tokenManager, log, headerProvider);\n }\n\n protected override endpoint(): string {\n return \"code\";\n }\n\n /**\n * Redeems the specified promotional code for the current user\n *\n * @param code - The code to redeem.\n * */\n public async redeem(code: string): Promise<ApiResponse> {\n return await this.postRequest(`/redeem/${code}`);\n }\n}\n","import { Logger } from \"ts-log\";\n\nimport { HeaderProvider } from \"../../../Func\";\nimport { CancellationReason } from \"../../../models/CancellationReason\";\nimport Emergency from \"../../../models/Emergency\";\nimport { ResponseRating } from \"../../../models/ResponseRating\";\nimport ApiResponse from \"../../ApiResponse\";\nimport ApiEndpoint from \"../ApiEndpoint\";\nimport TokenManager from \"../auth/TokenManager\";\nimport CreateEmergencyRequest from \"./request/CreateEmergencyRequest\";\nimport LocationDetail from \"./response/LocationDetail\";\nimport TeamDetailsResponse from \"./response/TeamDetailsResponse\";\n\n/**\n * Endpoints for interacting with emergencies.\n * */\nexport default class EmergencyEndpoint extends ApiEndpoint {\n constructor(baseUrl: string | undefined, tokenManager: TokenManager, log?: Logger, headerProvider?: HeaderProvider) {\n super(baseUrl, tokenManager, log, headerProvider);\n }\n\n protected override endpoint(): string {\n return \"emergency\";\n }\n\n /**\n * Gets an emergency by id.\n *\n * @param id - The id of the emergency to retrieve\n * */\n public async getEmergency(id: string): Promise<ApiResponse<Emergency>> {\n return await this.getRequest<Emergency>(`/${id}`);\n }\n\n /**\n * Bulk fetches emergencies by id.\n *\n * @param ids - a list of emergencies to retrieve\n * */\n public async getEmergencies(ids: string[]): Promise<ApiResponse<Emergency[]>> {\n return await this.getRequest<Emergency[]>(`/bulk?id=${ids.join(\"&id=\")}`);\n }\n\n /**\n * Creates a new emergency.\n *\n * @param newEmergency - Emergency details for the new emergency\n * @returns The newly-created emergency\n *\n * @virtual\n * */\n public async createEmergency(newEmergency: CreateEmergencyRequest): Promise<ApiResponse<Emergency>> {\n return await this.postRequest<Emergency>(\"\", newEmergency);\n }\n\n /**\n * Cancels an existing emergency.\n *\n * @remarks\n * Emergency must still be in the {@link MissionStatus.RECEIVED} state in order to be canceled.\n *\n * @param id - The id of the emergency to cancel\n * @param reason - The reason the emergency was canceled\n * */\n public async cancelEmergencyWithReason(id: string, reason: CancellationReason): Promise<ApiResponse> {\n return await this.postRequest(`/${id}/cancelWithReason`, {\n reason: reason,\n });\n }\n\n /**\n * Allows the client to rate their emergency.\n *\n * @param id - The id of the emergency to rate\n * @param rating - The rating to give the services provided\n * @param remarks - Additional remarks provided by the client\n *\n * @internal\n * */\n public async rateServices(id: string, rating: ResponseRating, remarks?: string): Promise<ApiResponse> {\n return await this.postRequest(`/${id}/rate/`, {\n rating: rating,\n remarks: remarks,\n });\n }\n\n /**\n * Fetches additional details about the responding team for an alert.\n *\n * @param id - The id of the emergency to get team details about\n * */\n public async teamDetails(id: string): Promise<ApiResponse<TeamDetailsResponse>> {\n return await this.getRequest<TeamDetailsResponse>(`/${id}/teamDetails`);\n }\n\n /**\n * Gets a tree of valid locations from which an emergency may be submitted.\n * */\n public async emergencyLocations(): Promise<ApiResponse<LocationDetail[]>> {\n return await this.getRequest<LocationDetail[]>(\"/meta/locations\");\n }\n}\n","import { Logger } from \"ts-log\";\n\nimport { HeaderProvider } from \"../../../Func\";\nimport ApiResponse from \"../../ApiResponse\";\nimport ApiEndpoint from \"../ApiEndpoint\";\nimport TokenManager from \"../auth/TokenManager\";\nimport MedalInformation from \"./response/MedalInformation\";\n\n/**\n * Endpoints for interacting with staff.\n * */\nexport default class StaffEndpoint extends ApiEndpoint {\n constructor(baseUrl: string | undefined, tokenManager: TokenManager, log?: Logger, headerProvider?: HeaderProvider) {\n super(baseUrl, tokenManager, log, headerProvider);\n }\n\n protected override endpoint(): string {\n return \"staff\";\n }\n\n /**\n * Gets detailed information about medals.\n * */\n public async medalsInformation(): Promise<ApiResponse<MedalInformation[]>> {\n return await this.getRequest<MedalInformation[]>(\"/meta/medals\");\n }\n}\n","import { type HubConnection, HubConnectionBuilder, ILogger, LogLevel } from \"@microsoft/signalr\";\nimport { Logger } from \"ts-log\";\n\nimport TokenManager from \"../auth/TokenManager\";\n\nclass WSLogger implements ILogger {\n constructor(private logger?: Logger) {}\n\n log(logLevel: LogLevel, message: string): void {\n switch (logLevel) {\n case LogLevel.Trace:\n this.logger?.trace(`Websocket: ${message}`);\n break;\n case LogLevel.Information:\n this.logger?.info(`Websocket: ${message}`);\n break;\n case LogLevel.Warning:\n this.logger?.warn(`Websocket: ${message}`);\n break;\n case LogLevel.Error || LogLevel.Critical:\n this.logger?.error(`Websocket: ${message}`);\n break;\n case LogLevel.Debug:\n this.logger?.debug(`Websocket: ${message}`);\n break;\n }\n }\n}\n\nexport default class WebsocketManager {\n private tokenManager: TokenManager;\n protected readonly logger?: Logger;\n\n public constructor(\n private readonly baseUrl: string,\n tokenManager: TokenManager,\n logger?: Logger,\n ) {\n this.tokenManager = tokenManager;\n this.logger = logger;\n }\n\n public async establishConnection(): Promise<HubConnection> {\n return new HubConnectionBuilder()\n .withAutomaticReconnect({\n nextRetryDelayInMilliseconds: retryContext => (retryContext.previousRetryCount > 5 ? null : 2000),\n })\n .withUrl(`${this.baseUrl}/hub/emergency`, {\n accessTokenFactory: async () => (await this.tokenManager.getAccessToken()) ?? \"\",\n })\n .configureLogging(new WSLogger(this.logger))\n .build();\n }\n}\n","import { HubConnection } from \"@microsoft/signalr\";\nimport { Logger } from \"ts-log\";\n\nimport { HeaderProvider } from \"../../../Func\";\nimport ApiEndpoint from \"../ApiEndpoint\";\nimport TokenManager from \"../auth/TokenManager\";\nimport WebsocketManager from \".//WebsocketManager\";\n\n/**\n * Endpoints for interacting with emergencies.\n * */\nexport default class WebsocketEndpoint extends ApiEndpoint {\n constructor(baseUrl: string | undefined, tokenManager: TokenManager, log?: Logger, headerProvider?: HeaderProvider) {\n super(baseUrl, tokenManager, log, headerProvider);\n }\n\n private websocketManager = new WebsocketManager(this.baseUrl, this.tokenManager, this.log);\n\n protected override endpoint(): string {\n return \"websocket\";\n }\n\n /**\n * Gets realtime updates.\n *\n * */\n public async initialize(): Promise<HubConnection> {\n if (this.websocketManager === undefined) {\n throw new Error(\"WebsocketManager is undefined\");\n }\n return await this.websocketManager.establishConnection();\n }\n}\n","import { Logger } from \"ts-log\";\n\nimport { AsyncAction } from \"../Func\";\nimport TokenGrant from \"../models/TokenGrant\";\nimport ApiClient from \"./ApiClient\";\nimport ApiConfig from \"./ApiConfig\";\nimport AuthEndpoint from \"./endpoints/auth/AuthEndpoint\";\nimport TokenManager from \"./endpoints/auth/TokenManager\";\nimport ChatMessageEndpoint from \"./endpoints/chatMessage/ChatMessageEndpoint\";\nimport ClientEndpoint from \"./endpoints/client/ClientEndpoint\";\nimport CodeEndpoint from \"./endpoints/code/CodeEndpoint\";\nimport EmergencyEndpoint from \"./endpoints/emergency/EmergencyEndpoint\";\nimport StaffEndpoint from \"./endpoints/staff/StaffEndpoint\";\nimport WebsocketEndpoint from \"./endpoints/websocket/WebsocketEndpoint\";\n\n/**\n * An API client for basic client interactions with the Medrunner API.\n * */\nexport default class MedrunnerApiClient<\n TEmergency extends EmergencyEndpoint = EmergencyEndpoint,\n TClient extends ClientEndpoint = ClientEndpoint,\n TStaff extends StaffEndpoint = StaffEndpoint,\n TChatMessage extends ChatMessageEndpoint = ChatMessageEndpoint,\n TCode extends CodeEndpoint = CodeEndpoint,\n TAuth extends AuthEndpoint = AuthEndpoint,\n TWebsocket extends WebsocketEndpoint = WebsocketEndpoint,\n> implements ApiClient<TEmergency, TClient, TStaff, TChatMessage, TCode, TAuth, TWebsocket>\n{\n protected constructor(\n public readonly emergency: TEmergency,\n public readonly client: TClient,\n public readonly staff: TStaff,\n public readonly chatMessage: TChatMessage,\n public readonly code: TCode,\n public readonly auth: TAuth,\n public readonly websocket: TWebsocket,\n ) {}\n\n /**\n * Constructs a new API client.\n *\n * @param config - The API configuration\n * @param refreshCallback - a callback function called whenever a refresh token exchange is performed\n * @param log - A logger which logs request details\n * */\n public static buildClient(\n config: ApiConfig,\n refreshCallback?: AsyncAction<TokenGrant>,\n log?: Logger,\n ): MedrunnerApiClient {\n const tokenManager = new TokenManager(config, refreshCallback, log);\n\n return new MedrunnerApiClient(\n new EmergencyEndpoint(config.baseUrl, tokenManager, log),\n new ClientEndpoint(config.baseUrl, tokenManager, log),\n new StaffEndpoint(config.baseUrl, tokenManager, log),\n new ChatMessageEndpoint(config.baseUrl, tokenManager, log),\n new CodeEndpoint(config.baseUrl, tokenManager, log),\n new AuthEndpoint(config.baseUrl, tokenManager, log),\n new WebsocketEndpoint(config.baseUrl, tokenManager, log),\n );\n }\n}\n","/**\n * A supported location from which an emergency may be submitted.\n * */\nexport default interface LocationDetail {\n /**\n * The name of this location\n * */\n name: string;\n\n /**\n * The type of this location\n * */\n type: LocationType;\n\n /**\n * Additional locations which are within this location (e.g. moons of a planet, or planets of a system)\n * */\n children: LocationDetail[];\n}\n\n/**\n * The type of location.\n * */\nexport enum LocationType {\n /**\n * The location type is not known\n * */\n UNKNOWN,\n /**\n * A system, e.g. Stanton\n * */\n SYSTEM,\n /**\n * A planet, e.g. Crusader\n * */\n PLANET,\n /**\n * A moon, e.g. Daymar\n * */\n MOON,\n}\n","export enum CancellationReason {\n NONE,\n OTHER,\n SUCCUMBED_TO_WOUNDS,\n SERVER_ERROR,\n RESPAWNED,\n RESCUED,\n}\n","export enum Class {\n NONE,\n MEDIC,\n SECURITY,\n PILOT,\n LEAD,\n DISPATCH,\n DISPATCH_LEAD,\n DISPATCH_TRAINEE,\n DISPATCH_OBSERVER,\n QRF,\n LOGISTICS,\n}\n","import { CancellationReason } from \"./CancellationReason\";\nimport { MissionStatus } from \"./MissionStatus\";\nimport { ResponseRating } from \"./ResponseRating\";\nimport Team from \"./Team\";\nimport { ThreatLevel } from \"./ThreatLevel\";\nimport WritableDbItem from \"./WritableDbItem\";\n\nexport default interface Emergency extends WritableDbItem {\n system: string;\n subsystem: string;\n tertiaryLocation?: string;\n threatLevel: ThreatLevel;\n remarks?: string;\n clientRsiHandle: string;\n clientDiscordId?: string;\n clientId?: string;\n subscriptionTier: string;\n status: MissionStatus;\n alertMessage?: MessageCache;\n clientMessage?: MessageCache;\n coordinationThread?: MessageCache;\n afterActionReportMessage?: MessageCache;\n interactionMessageId?: string;\n respondingTeam: Team;\n respondingTeams: RespondingTeam[];\n creationTimestamp: number;\n acceptedTimestamp?: number;\n completionTimestamp?: number;\n rating: ResponseRating;\n ratingRemarks?: string;\n test: boolean;\n cancellationReason: CancellationReason;\n refusalReason?: string;\n origin: Origin;\n clientData?: ClientData;\n isComplete: boolean;\n missionName?: string;\n afterActionReport?: AfterActionReport;\n submissionSource: SubmissionSource;\n}\n\nexport interface MessageCache {\n id: string;\n channelId: string;\n}\n\nexport interface ClientData {\n rsiHandle: string;\n rsiProfileLink: string;\n gotClientData: boolean;\n redactedOrgOnProfile: boolean;\n reported: boolean;\n}\n\nexport interface AfterActionReport {\n remarks?: string;\n submitterStaffId: string;\n servicesProvided: MissionServices;\n suspectedTrap: boolean;\n hasBeenEdited: boolean;\n submittedOn: number;\n editHistory: AfterActionReportEdit[];\n}\n\nexport interface AfterActionReportEdit {\n editorStaffId: string;\n editTime: number;\n}\n\nexport enum MissionServices {\n NONE = 0,\n PVE = 1 << 0,\n PVP = 1 << 1,\n REVIVED_HEALED = 1 << 2,\n HEALED_IN_SHIP = 1 << 3,\n EXTRACT_SAFE_ZONE = 1 << 4,\n}\n\nexport enum Origin {\n UNKNOWN,\n REPORT,\n BEACON,\n EVALUATION,\n}\n\nexport enum SubmissionSource {\n UNKNOWN,\n API,\n BOT,\n}\n\nexport interface RespondingTeam {\n id: string;\n teamName: string;\n}\n","export enum MissionStatus {\n CREATED,\n RECEIVED,\n IN_PROGRESS,\n SUCCESS,\n FAILED,\n NO_CONTACT,\n CANCELED,\n REFUSED,\n ABORTED,\n SERVER_ERROR,\n}\n","import EmergencyStats from \"./EmergencyStats\";\nimport WritableDbItem from \"./WritableDbItem\";\n\nexport default interface Person extends WritableDbItem {\n discordId: string;\n rsiHandle?: string;\n roles: UserRoles;\n personType: PersonType;\n active: boolean;\n deactivationReason: AccountDeactivationReason;\n clientStats: ClientStats;\n activeEmergency?: string;\n clientPortalPreferences: Record<string, unknown>;\n redeemedCodes: RedeemedCode[];\n}\n\nexport enum UserRoles {\n CLIENT = 1 << 0,\n STAFF = 1 << 1,\n DEVELOPER = 1 << 51,\n BOT = 1 << 52,\n}\n\nexport enum PersonType {\n CLIENT,\n STAFF,\n BOT,\n}\n\nexport enum AccountDeactivationReason {\n NONE,\n CLIENT_DRIVEN_DELETION,\n TERMINATED,\n BLOCKED,\n}\n\nexport interface ClientStats {\n missions: EmergencyStats;\n}\n\nexport interface BlockedStatus {\n blocked: boolean;\n}\n\nexport interface RedeemedCode {\n code: string;\n type: CodeType;\n}\n\nexport enum CodeType {\n Unknown,\n CitizenCon2954,\n}\n","export enum Level {\n None,\n Tier1Section1 = 101,\n Tier1Section2,\n Tier1Section3,\n Tier2Section1 = 201,\n Tier2Section2,\n Tier2Section3,\n Tier3Section1 = 301,\n Tier3Section2,\n Tier3Section3,\n Tier4Section1 = 401,\n Tier4Section2,\n Tier4Section3,\n Tier5Section1 = 501,\n Tier5Section2,\n Tier5Section3,\n Tier6Section1 = 601,\n Tier6Section2,\n Tier6Section3,\n Tier7Section1 = 701,\n Tier7Section2,\n Tier7Section3,\n Tier8Section1 = 801,\n Tier8Section2,\n Tier8Section3,\n Tier9Section1 = 901,\n Tier9Section2,\n Tier9Section3,\n Tier10Section1 = 1001,\n Tier10Section2,\n Tier10Section3,\n}\n","export enum ResponseRating {\n NONE,\n GOOD,\n BAD,\n}\n","export enum ThreatLevel {\n UNKNOWN,\n LOW,\n MEDIUM,\n HIGH,\n}\n"],"mappings":"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","names":["axios","LocationType","CancellationReason","Class","MissionServices","Origin","SubmissionSource","MissionStatus","UserRoles","PersonType","AccountDeactivationReason","CodeType","Level","ResponseRating","ThreatLevel"]}
|
package/dist/index.mjs
CHANGED
|
@@ -170,13 +170,10 @@ var TokenManager = class _TokenManager extends ApiEndpoint {
|
|
|
170
170
|
async getAccessToken() {
|
|
171
171
|
if (this.accessToken !== void 0) {
|
|
172
172
|
const exp = _TokenManager.getJwtFromAccessToken(this.accessToken).exp;
|
|
173
|
-
if (exp > Date.now() / 1e3 - 60 * 5)
|
|
174
|
-
return this.accessToken;
|
|
173
|
+
if (exp > Date.now() / 1e3 - 60 * 5) return this.accessToken;
|
|
175
174
|
}
|
|
176
|
-
if (this.refreshToken === void 0)
|
|
177
|
-
|
|
178
|
-
if (!this.tokenFetchPromise)
|
|
179
|
-
this.tokenFetchPromise = this.fetchToken(this.refreshToken);
|
|
175
|
+
if (this.refreshToken === void 0) return this.accessToken;
|
|
176
|
+
if (!this.tokenFetchPromise) this.tokenFetchPromise = this.fetchToken(this.refreshToken);
|
|
180
177
|
try {
|
|
181
178
|
const tokens = await this.tokenFetchPromise;
|
|
182
179
|
this.accessToken = tokens.accessToken;
|
|
@@ -292,6 +289,27 @@ var ClientEndpoint = class extends ApiEndpoint {
|
|
|
292
289
|
}
|
|
293
290
|
};
|
|
294
291
|
|
|
292
|
+
// src/api/endpoints/code/CodeEndpoint.ts
|
|
293
|
+
var CodeEndpoint = class extends ApiEndpoint {
|
|
294
|
+
static {
|
|
295
|
+
__name(this, "CodeEndpoint");
|
|
296
|
+
}
|
|
297
|
+
constructor(baseUrl, tokenManager, log, headerProvider) {
|
|
298
|
+
super(baseUrl, tokenManager, log, headerProvider);
|
|
299
|
+
}
|
|
300
|
+
endpoint() {
|
|
301
|
+
return "code";
|
|
302
|
+
}
|
|
303
|
+
/**
|
|
304
|
+
* Redeems the specified promotional code for the current user
|
|
305
|
+
*
|
|
306
|
+
* @param code - The code to redeem.
|
|
307
|
+
* */
|
|
308
|
+
async redeem(code) {
|
|
309
|
+
return await this.postRequest(`/redeem/${code}`);
|
|
310
|
+
}
|
|
311
|
+
};
|
|
312
|
+
|
|
295
313
|
// src/api/endpoints/emergency/EmergencyEndpoint.ts
|
|
296
314
|
var EmergencyEndpoint = class extends ApiEndpoint {
|
|
297
315
|
static {
|
|
@@ -436,9 +454,9 @@ var WebsocketManager = class {
|
|
|
436
454
|
logger;
|
|
437
455
|
async establishConnection() {
|
|
438
456
|
return new HubConnectionBuilder().withAutomaticReconnect({
|
|
439
|
-
nextRetryDelayInMilliseconds: (retryContext) => retryContext.previousRetryCount > 5 ? null : 2e3
|
|
457
|
+
nextRetryDelayInMilliseconds: /* @__PURE__ */ __name((retryContext) => retryContext.previousRetryCount > 5 ? null : 2e3, "nextRetryDelayInMilliseconds")
|
|
440
458
|
}).withUrl(`${this.baseUrl}/hub/emergency`, {
|
|
441
|
-
accessTokenFactory: async () => await this.tokenManager.getAccessToken() ?? ""
|
|
459
|
+
accessTokenFactory: /* @__PURE__ */ __name(async () => await this.tokenManager.getAccessToken() ?? "", "accessTokenFactory")
|
|
442
460
|
}).configureLogging(new WSLogger(this.logger)).build();
|
|
443
461
|
}
|
|
444
462
|
};
|
|
@@ -469,11 +487,12 @@ var WebsocketEndpoint = class extends ApiEndpoint {
|
|
|
469
487
|
|
|
470
488
|
// src/api/MedrunnerApiClient.ts
|
|
471
489
|
var MedrunnerApiClient = class _MedrunnerApiClient {
|
|
472
|
-
constructor(emergency, client, staff, chatMessage, auth, websocket) {
|
|
490
|
+
constructor(emergency, client, staff, chatMessage, code, auth, websocket) {
|
|
473
491
|
this.emergency = emergency;
|
|
474
492
|
this.client = client;
|
|
475
493
|
this.staff = staff;
|
|
476
494
|
this.chatMessage = chatMessage;
|
|
495
|
+
this.code = code;
|
|
477
496
|
this.auth = auth;
|
|
478
497
|
this.websocket = websocket;
|
|
479
498
|
}
|
|
@@ -494,6 +513,7 @@ var MedrunnerApiClient = class _MedrunnerApiClient {
|
|
|
494
513
|
new ClientEndpoint(config.baseUrl, tokenManager, log),
|
|
495
514
|
new StaffEndpoint(config.baseUrl, tokenManager, log),
|
|
496
515
|
new ChatMessageEndpoint(config.baseUrl, tokenManager, log),
|
|
516
|
+
new CodeEndpoint(config.baseUrl, tokenManager, log),
|
|
497
517
|
new AuthEndpoint(config.baseUrl, tokenManager, log),
|
|
498
518
|
new WebsocketEndpoint(config.baseUrl, tokenManager, log)
|
|
499
519
|
);
|
|
@@ -596,6 +616,11 @@ var AccountDeactivationReason = /* @__PURE__ */ ((AccountDeactivationReason2) =>
|
|
|
596
616
|
AccountDeactivationReason2[AccountDeactivationReason2["BLOCKED"] = 3] = "BLOCKED";
|
|
597
617
|
return AccountDeactivationReason2;
|
|
598
618
|
})(AccountDeactivationReason || {});
|
|
619
|
+
var CodeType = /* @__PURE__ */ ((CodeType2) => {
|
|
620
|
+
CodeType2[CodeType2["Unknown"] = 0] = "Unknown";
|
|
621
|
+
CodeType2[CodeType2["CitizenCon2954"] = 1] = "CitizenCon2954";
|
|
622
|
+
return CodeType2;
|
|
623
|
+
})(CodeType || {});
|
|
599
624
|
|
|
600
625
|
// src/models/Level.ts
|
|
601
626
|
var Level = /* @__PURE__ */ ((Level2) => {
|
|
@@ -657,6 +682,8 @@ export {
|
|
|
657
682
|
ChatMessageEndpoint,
|
|
658
683
|
Class,
|
|
659
684
|
ClientEndpoint,
|
|
685
|
+
CodeEndpoint,
|
|
686
|
+
CodeType,
|
|
660
687
|
EmergencyEndpoint,
|
|
661
688
|
Level,
|
|
662
689
|
LocationType,
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/api/endpoints/ApiEndpoint.ts","../src/api/endpoints/auth/AuthEndpoint.ts","../src/api/endpoints/auth/TokenManager.ts","../src/api/endpoints/chatMessage/ChatMessageEndpoint.ts","../src/api/endpoints/client/ClientEndpoint.ts","../src/api/endpoints/emergency/EmergencyEndpoint.ts","../src/api/endpoints/staff/StaffEndpoint.ts","../src/api/endpoints/websocket/WebsocketManager.ts","../src/api/endpoints/websocket/WebsocketEndpoint.ts","../src/api/MedrunnerApiClient.ts","../src/api/endpoints/emergency/response/LocationDetail.ts","../src/models/CancellationReason.ts","../src/models/Class.ts","../src/models/Emergency.ts","../src/models/MissionStatus.ts","../src/models/Person.ts","../src/models/Level.ts","../src/models/ResponseRating.ts","../src/models/ThreatLevel.ts"],"sourcesContent":["import axios, { AxiosError, AxiosRequestConfig } from \"axios\";\nimport { Logger } from \"ts-log\";\n\nimport { HeaderProvider } from \"../../Func\";\nimport ApiResponse from \"../ApiResponse\";\nimport TokenManager from \"./auth/TokenManager\";\n\nexport default abstract class ApiEndpoint {\n public readonly baseUrl: string;\n\n protected constructor(\n baseUrl: string | undefined,\n public readonly tokenManager: TokenManager,\n protected readonly log?: Logger,\n private readonly headerProvider?: HeaderProvider,\n ) {\n this.baseUrl = baseUrl ?? \"https://api.medrunner.space\";\n }\n\n protected abstract endpoint(): string;\n\n protected endpointUrl(): string {\n return `${this.baseUrl}/${this.endpoint()}`;\n }\n\n private async headersForRequest(noAuthentication: boolean): Promise<AxiosRequestConfig> {\n const config: AxiosRequestConfig = {\n baseURL: this.baseUrl,\n headers: {},\n };\n\n if (config.headers !== undefined) {\n if (!noAuthentication) {\n const accessToken = await this.tokenManager.getAccessToken();\n if (accessToken !== undefined) {\n // only include auth header if we have a token\n config.headers.Authorization = `Bearer ${accessToken}`;\n }\n }\n\n if (this.headerProvider !== undefined) {\n for (const header of Object.entries(await this.headerProvider())) {\n config.headers[header[0]] = header[1];\n }\n }\n }\n\n return config;\n }\n\n protected async getRequest<T = unknown>(\n endpoint: string,\n queryParams?: { [key: string]: unknown },\n noAuthentication?: boolean,\n ): Promise<ApiResponse<T>> {\n return await this.makeRequestWithoutBody<T>(endpoint, \"GET\", axios.get, queryParams, noAuthentication);\n }\n\n protected async postRequest<T = unknown>(\n endpoint: string,\n data?: unknown,\n noAuthentication?: boolean,\n ): Promise<ApiResponse<T>> {\n return await this.makeRequestWithBody<T>(endpoint, \"POST\", axios.post, data, noAuthentication);\n }\n\n protected async putRequest<T = unknown>(\n endpoint: string,\n data?: unknown,\n noAuthentication?: boolean,\n ): Promise<ApiResponse<T>> {\n return await this.makeRequestWithBody<T>(endpoint, \"PUT\", axios.put, data, noAuthentication);\n }\n\n protected async patchRequest<T = unknown>(\n endpoint: string,\n data?: unknown,\n noAuthentication?: boolean,\n ): Promise<ApiResponse<T>> {\n return await this.makeRequestWithBody<T>(endpoint, \"PATCH\", axios.patch, data, noAuthentication);\n }\n\n protected async deleteRequest(\n endpoint: string,\n queryParams?: { [key: string]: unknown },\n noAuthentication?: boolean,\n ): Promise<ApiResponse> {\n return await this.makeRequestWithoutBody(endpoint, \"DELETE\", axios.delete, queryParams, noAuthentication);\n }\n\n private async makeRequestWithBody<T = unknown>(\n endpoint: string,\n requestType: \"POST\" | \"PUT\" | \"PATCH\",\n axiosRequest: AxiosRequestWithBody<T>,\n data?: unknown,\n noAuthentication?: boolean,\n ): Promise<ApiResponse<T>> {\n const wrappedRequest: AxiosWrapper<T> = async (requestUrl, config) => await axiosRequest(requestUrl, data, config);\n return await this.makeRequest<T>(endpoint, requestType, wrappedRequest, undefined, noAuthentication);\n }\n\n private async makeRequestWithoutBody<T = unknown>(\n endpoint: string,\n requestType: \"GET\" | \"DELETE\",\n axiosRequest: AxiosRequestWithoutBody<T>,\n queryParams?: { [key: string]: unknown },\n noAuthentication?: boolean,\n ): Promise<ApiResponse<T>> {\n const wrappedRequest: AxiosWrapper<T> = async (requestUrl, config) => await axiosRequest(requestUrl, config);\n return await this.makeRequest<T>(endpoint, requestType, wrappedRequest, queryParams, noAuthentication);\n }\n\n private buildUrl(endpoint: string): string {\n const baseUrl = this.endpointUrl();\n\n if (baseUrl.endsWith(\"/\")) {\n if (endpoint.startsWith(\"/\")) {\n return `${baseUrl}${endpoint.substring(1)}`;\n }\n\n return `${baseUrl}${endpoint}`;\n }\n\n if (endpoint.startsWith(\"/\")) {\n return `${baseUrl}${endpoint}`;\n }\n\n return `${baseUrl}/${endpoint}`;\n }\n\n private async makeRequest<T = unknown>(\n endpoint: string,\n requestType: \"GET\" | \"POST\" | \"PUT\" | \"PATCH\" | \"DELETE\",\n request: AxiosWrapper<T>,\n queryParams?: { [key: string]: unknown },\n noAuthentication = false,\n ): Promise<ApiResponse<T>> {\n const requestUrl = this.buildUrl(endpoint);\n\n this.log?.debug(`sending ${requestType} request to ${requestUrl}`);\n try {\n const config = await this.headersForRequest(noAuthentication);\n if (queryParams !== undefined) {\n config.params = queryParams;\n }\n\n const result = await request(requestUrl, config);\n\n return {\n success: true,\n data: result.data,\n };\n } catch (e) {\n this.log?.warn(`Error for ${requestType} request to ${requestUrl}: ${e}`);\n return {\n success: false,\n errorMessage: e instanceof AxiosError ? e.response?.data : undefined,\n statusCode: e instanceof AxiosError ? e.response?.status : undefined,\n };\n }\n }\n}\n\ntype AxiosWrapper<T = unknown> = (url: string, config: AxiosRequestConfig) => Promise<ApiResponse<T>>;\n\ntype AxiosRequestWithBody<T = unknown> = (\n url: string,\n data: unknown,\n config: AxiosRequestConfig,\n) => Promise<ApiResponse<T>>;\ntype AxiosRequestWithoutBody<T = unknown> = (url: string, config: AxiosRequestConfig) => Promise<ApiResponse<T>>;\n","import { Logger } from \"ts-log\";\n\nimport { HeaderProvider } from \"../../../Func\";\nimport ApiToken from \"../../../models/ApiToken\";\nimport ApiResponse from \"../../ApiResponse\";\nimport ApiEndpoint from \"../ApiEndpoint\";\nimport TokenManager from \"../auth/TokenManager\";\nimport CreateApiTokenRequest from \"./request/CreateApiTokenRequest\";\nimport SignOutRequest from \"./request/SignOutRequest\";\n\n/**\n * Endpoints for interacting with auth.\n * */\nexport default class AuthEndpoint extends ApiEndpoint {\n constructor(baseUrl: string | undefined, tokenManager: TokenManager, log?: Logger, headerProvider?: HeaderProvider) {\n super(baseUrl, tokenManager, log, headerProvider);\n }\n\n protected override endpoint(): string {\n return \"auth\";\n }\n\n /**\n * Invalidate a refresh token.\n *\n * @param oldToken - Token to be invalidated\n *\n * @virtual\n * */\n public async signOut(oldToken: SignOutRequest): Promise<ApiResponse> {\n return await this.postRequest<string>(\"/signOut\", oldToken);\n }\n\n /**\n * Gets all api tokens for the user.\n *\n * */\n public async getApiTokens(): Promise<ApiResponse<ApiToken[]>> {\n return await this.getRequest<ApiToken[]>(`/apiTokens`);\n }\n\n /**\n * Creates an api token.\n *\n * @param newToken - Emergency details for the new emergency\n * @returns The newly-created api token\n *\n * @virtual\n * */\n public async createApiToken(newToken: CreateApiTokenRequest): Promise<ApiResponse<string>> {\n return await this.postRequest<string>(\"/apiTokens\", {\n name: newToken.name,\n expirationDate: newToken.expirationDate?.toISOString(),\n });\n }\n\n /**\n * Delete an api token.\n *\n * @param id - The id of the api token to delete\n *\n * */\n public async deleteApiToken(id: string): Promise<ApiResponse> {\n return await this.deleteRequest(`/apiTokens/${id}`);\n }\n}\n","import { Logger } from \"ts-log\";\n\nimport { AsyncAction, HeaderProvider } from \"../../../Func\";\nimport TokenGrant from \"../../../models/TokenGrant\";\nimport ApiConfig from \"../../ApiConfig\";\nimport ApiEndpoint from \"../ApiEndpoint\";\n\nexport default class TokenManager extends ApiEndpoint {\n private accessToken?: string;\n private refreshToken?: string;\n private tokenFetchPromise?: Promise<TokenGrant>;\n\n public constructor(\n config: ApiConfig,\n private readonly refreshCallback?: AsyncAction<TokenGrant>,\n log?: Logger,\n headerProvider?: HeaderProvider,\n ) {\n // todo: I dunno fix this someday I guess?\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n super(config.baseUrl, null!, log, headerProvider);\n this.accessToken = config.accessToken;\n this.refreshToken = config.refreshToken;\n }\n\n protected override endpoint(): string {\n return \"auth\";\n }\n\n public async getAccessToken(): Promise<string | undefined> {\n if (this.accessToken !== undefined) {\n const exp = TokenManager.getJwtFromAccessToken(this.accessToken).exp;\n\n // check expiration minus 5 minutes to guard against race condition or timing issues creating unnecessary 403s\n if (exp > Date.now() / 1000 - 60 * 5) return this.accessToken;\n }\n\n // if the refresh token isn't present, nothing we can do\n if (this.refreshToken === undefined) return this.accessToken;\n\n // token is expired (or will expire soon) and there is not already one fetching, so fetch a new one\n if (!this.tokenFetchPromise) this.tokenFetchPromise = this.fetchToken(this.refreshToken);\n\n try {\n const tokens = await this.tokenFetchPromise;\n this.accessToken = tokens.accessToken;\n this.refreshToken = tokens.refreshToken;\n\n if (this.refreshCallback !== undefined) {\n await this.refreshCallback(tokens);\n }\n } finally {\n this.tokenFetchPromise = undefined;\n }\n\n return this.accessToken;\n }\n\n private async fetchToken(refreshToken: string): Promise<TokenGrant> {\n const result = await this.postRequest<TokenGrant>(\"/exchange\", { refreshToken: refreshToken }, true);\n\n if (!result.success || result.data === undefined) {\n throw Error(result.statusCode?.toString());\n }\n\n return result.data;\n }\n\n private static getJwtFromAccessToken(accessToken: string): Jwt {\n return JSON.parse(atob(accessToken.split(\".\")[1]));\n }\n}\n\ninterface Jwt {\n exp: number;\n}\n","import { Logger } from \"ts-log\";\n\nimport { HeaderProvider } from \"../../../Func\";\nimport ChatMessage from \"../../../models/ChatMessage\";\nimport ApiResponse from \"../../ApiResponse\";\nimport PaginatedResponse from \"../../PaginatedResponse\";\nimport ApiEndpoint from \"../ApiEndpoint\";\nimport TokenManager from \"../auth/TokenManager\";\nimport ChatMessageRequest from \"./request/ChatMessageRequest\";\n\n/**\n * Endpoints for interacting with chat messages.\n * */\nexport default class ChatMessageEndpoint extends ApiEndpoint {\n constructor(baseUrl: string | undefined, tokenManager: TokenManager, log?: Logger, headerProvider?: HeaderProvider) {\n super(baseUrl, tokenManager, log, headerProvider);\n }\n\n protected override endpoint(): string {\n return \"chatMessage\";\n }\n\n /**\n * Gets the specified amount of chat messages for a given emergency.\n *\n * @param emergencyId - The emergency for which to fetch the chat history\n * @param limit - The number of emergencies to get\n * @param paginationToken - The number to use for pagination\n * */\n public async getHistory(\n emergencyId: string,\n limit: number,\n paginationToken?: string,\n ): Promise<ApiResponse<PaginatedResponse<ChatMessage>>> {\n return await this.getRequest<PaginatedResponse<ChatMessage>>(`/${emergencyId}`, { limit, paginationToken });\n }\n\n /**\n * Sends a new chat message\n *\n * @param message - The message to send\n * @returns The newly-created chat message\n *\n * */\n public async sendMessage(message: ChatMessageRequest): Promise<ApiResponse<ChatMessage>> {\n return await this.postRequest<ChatMessage>(\"\", message);\n }\n}\n","import { Logger } from \"ts-log\";\n\nimport { HeaderProvider } from \"../../../Func\";\nimport ClientHistory from \"../../../models/ClientHistory\";\nimport Person, { BlockedStatus } from \"../../../models/Person\";\nimport ApiResponse from \"../../ApiResponse\";\nimport PaginatedResponse from \"../../PaginatedResponse\";\nimport ApiEndpoint from \"../ApiEndpoint\";\nimport TokenManager from \"../auth/TokenManager\";\n\n/**\n * Endpoints for interacting with clients.\n * */\nexport default class ClientEndpoint extends ApiEndpoint {\n constructor(baseUrl: string | undefined, tokenManager: TokenManager, log?: Logger, headerProvider?: HeaderProvider) {\n super(baseUrl, tokenManager, log, headerProvider);\n }\n\n protected override endpoint(): string {\n return \"client\";\n }\n\n /**\n * Gets the current client.\n * */\n public async get(): Promise<ApiResponse<Person>> {\n return await this.getRequest<Person>(\"\");\n }\n\n /**\n * Gets the specified amount of emergencies the client has created.\n * @param limit - The number of emergencies to get\n * @param paginationToken - The number to use for pagination\n * */\n public async getHistory(\n limit: number,\n paginationToken?: string,\n ): Promise<ApiResponse<PaginatedResponse<ClientHistory>>> {\n return await this.getRequest<PaginatedResponse<ClientHistory>>(\"/history\", { limit, paginationToken });\n }\n\n /**\n * Gets the blocklist status of the current client.\n * */\n public async getBlockedStatus(): Promise<ApiResponse<BlockedStatus>> {\n return await this.getRequest<BlockedStatus>(\"/blocked\");\n }\n\n /**\n * Links the current user to a rsiHandle.\n *\n * @param rsiHandle - The RSI handle of the client\n *\n * */\n public async linkClient(rsiHandle: string): Promise<ApiResponse> {\n return await this.postRequest(\"/link\", { rsiHandle });\n }\n\n /**\n * Updates the settings of the current user for the Client Portal.\n *\n * @param settings - The object settings to add or update\n * @returns The updated settings object\n *\n * */\n public async setSettings(settings: Record<string, unknown>): Promise<ApiResponse<Record<string, unknown>>> {\n return await this.patchRequest<Record<string, unknown>>(\"/settings/clientPortal\", settings);\n }\n\n /**\n * Deactivate the current client.\n * */\n public async deactivate(): Promise<ApiResponse> {\n return await this.deleteRequest(\"\");\n }\n}\n","import { Logger } from \"ts-log\";\n\nimport { HeaderProvider } from \"../../../Func\";\nimport { CancellationReason } from \"../../../models/CancellationReason\";\nimport Emergency from \"../../../models/Emergency\";\nimport { ResponseRating } from \"../../../models/ResponseRating\";\nimport ApiResponse from \"../../ApiResponse\";\nimport ApiEndpoint from \"../ApiEndpoint\";\nimport TokenManager from \"../auth/TokenManager\";\nimport CreateEmergencyRequest from \"./request/CreateEmergencyRequest\";\nimport LocationDetail from \"./response/LocationDetail\";\nimport TeamDetailsResponse from \"./response/TeamDetailsResponse\";\n\n/**\n * Endpoints for interacting with emergencies.\n * */\nexport default class EmergencyEndpoint extends ApiEndpoint {\n constructor(baseUrl: string | undefined, tokenManager: TokenManager, log?: Logger, headerProvider?: HeaderProvider) {\n super(baseUrl, tokenManager, log, headerProvider);\n }\n\n protected override endpoint(): string {\n return \"emergency\";\n }\n\n /**\n * Gets an emergency by id.\n *\n * @param id - The id of the emergency to retrieve\n * */\n public async getEmergency(id: string): Promise<ApiResponse<Emergency>> {\n return await this.getRequest<Emergency>(`/${id}`);\n }\n\n /**\n * Bulk fetches emergencies by id.\n *\n * @param ids - a list of emergencies to retrieve\n * */\n public async getEmergencies(ids: string[]): Promise<ApiResponse<Emergency[]>> {\n return await this.getRequest<Emergency[]>(`/bulk?id=${ids.join(\"&id=\")}`);\n }\n\n /**\n * Creates a new emergency.\n *\n * @param newEmergency - Emergency details for the new emergency\n * @returns The newly-created emergency\n *\n * @virtual\n * */\n public async createEmergency(newEmergency: CreateEmergencyRequest): Promise<ApiResponse<Emergency>> {\n return await this.postRequest<Emergency>(\"\", newEmergency);\n }\n\n /**\n * Cancels an existing emergency.\n *\n * @remarks\n * Emergency must still be in the {@link MissionStatus.RECEIVED} state in order to be canceled.\n *\n * @param id - The id of the emergency to cancel\n * @param reason - The reason the emergency was canceled\n * */\n public async cancelEmergencyWithReason(id: string, reason: CancellationReason): Promise<ApiResponse> {\n return await this.postRequest(`/${id}/cancelWithReason`, {\n reason: reason,\n });\n }\n\n /**\n * Allows the client to rate their emergency.\n *\n * @param id - The id of the emergency to rate\n * @param rating - The rating to give the services provided\n * @param remarks - Additional remarks provided by the client\n *\n * @internal\n * */\n public async rateServices(id: string, rating: ResponseRating, remarks?: string): Promise<ApiResponse> {\n return await this.postRequest(`/${id}/rate/`, {\n rating: rating,\n remarks: remarks,\n });\n }\n\n /**\n * Fetches additional details about the responding team for an alert.\n *\n * @param id - The id of the emergency to get team details about\n * */\n public async teamDetails(id: string): Promise<ApiResponse<TeamDetailsResponse>> {\n return await this.getRequest<TeamDetailsResponse>(`/${id}/teamDetails`);\n }\n\n /**\n * Gets a tree of valid locations from which an emergency may be submitted.\n * */\n public async emergencyLocations(): Promise<ApiResponse<LocationDetail[]>> {\n return await this.getRequest<LocationDetail[]>(\"/meta/locations\");\n }\n}\n","import { Logger } from \"ts-log\";\n\nimport { HeaderProvider } from \"../../../Func\";\nimport ApiResponse from \"../../ApiResponse\";\nimport ApiEndpoint from \"../ApiEndpoint\";\nimport TokenManager from \"../auth/TokenManager\";\nimport MedalInformation from \"./response/MedalInformation\";\n\n/**\n * Endpoints for interacting with staff.\n * */\nexport default class StaffEndpoint extends ApiEndpoint {\n constructor(baseUrl: string | undefined, tokenManager: TokenManager, log?: Logger, headerProvider?: HeaderProvider) {\n super(baseUrl, tokenManager, log, headerProvider);\n }\n\n protected override endpoint(): string {\n return \"staff\";\n }\n\n /**\n * Gets detailed information about medals.\n * */\n public async medalsInformation(): Promise<ApiResponse<MedalInformation[]>> {\n return await this.getRequest<MedalInformation[]>(\"/meta/medals\");\n }\n}\n","import { type HubConnection, HubConnectionBuilder, ILogger, LogLevel } from \"@microsoft/signalr\";\nimport { Logger } from \"ts-log\";\n\nimport TokenManager from \"../auth/TokenManager\";\n\nclass WSLogger implements ILogger {\n constructor(private logger?: Logger) {}\n\n log(logLevel: LogLevel, message: string): void {\n switch (logLevel) {\n case LogLevel.Trace:\n this.logger?.trace(`Websocket: ${message}`);\n break;\n case LogLevel.Information:\n this.logger?.info(`Websocket: ${message}`);\n break;\n case LogLevel.Warning:\n this.logger?.warn(`Websocket: ${message}`);\n break;\n case LogLevel.Error || LogLevel.Critical:\n this.logger?.error(`Websocket: ${message}`);\n break;\n case LogLevel.Debug:\n this.logger?.debug(`Websocket: ${message}`);\n break;\n }\n }\n}\n\nexport default class WebsocketManager {\n private tokenManager: TokenManager;\n protected readonly logger?: Logger;\n\n public constructor(\n private readonly baseUrl: string,\n tokenManager: TokenManager,\n logger?: Logger,\n ) {\n this.tokenManager = tokenManager;\n this.logger = logger;\n }\n\n public async establishConnection(): Promise<HubConnection> {\n return new HubConnectionBuilder()\n .withAutomaticReconnect({\n nextRetryDelayInMilliseconds: retryContext => (retryContext.previousRetryCount > 5 ? null : 2000),\n })\n .withUrl(`${this.baseUrl}/hub/emergency`, {\n accessTokenFactory: async () => (await this.tokenManager.getAccessToken()) ?? \"\",\n })\n .configureLogging(new WSLogger(this.logger))\n .build();\n }\n}\n","import { HubConnection } from \"@microsoft/signalr\";\nimport { Logger } from \"ts-log\";\n\nimport { HeaderProvider } from \"../../../Func\";\nimport ApiEndpoint from \"../ApiEndpoint\";\nimport TokenManager from \"../auth/TokenManager\";\nimport WebsocketManager from \".//WebsocketManager\";\n\n/**\n * Endpoints for interacting with emergencies.\n * */\nexport default class WebsocketEndpoint extends ApiEndpoint {\n constructor(baseUrl: string | undefined, tokenManager: TokenManager, log?: Logger, headerProvider?: HeaderProvider) {\n super(baseUrl, tokenManager, log, headerProvider);\n }\n\n private websocketManager = new WebsocketManager(this.baseUrl, this.tokenManager, this.log);\n\n protected override endpoint(): string {\n return \"websocket\";\n }\n\n /**\n * Gets realtime updates.\n *\n * */\n public async initialize(): Promise<HubConnection> {\n if (this.websocketManager === undefined) {\n throw new Error(\"WebsocketManager is undefined\");\n }\n return await this.websocketManager.establishConnection();\n }\n}\n","import { Logger } from \"ts-log\";\n\nimport { AsyncAction } from \"../Func\";\nimport TokenGrant from \"../models/TokenGrant\";\nimport ApiClient from \"./ApiClient\";\nimport ApiConfig from \"./ApiConfig\";\nimport AuthEndpoint from \"./endpoints/auth/AuthEndpoint\";\nimport TokenManager from \"./endpoints/auth/TokenManager\";\nimport ChatMessageEndpoint from \"./endpoints/chatMessage/ChatMessageEndpoint\";\nimport ClientEndpoint from \"./endpoints/client/ClientEndpoint\";\nimport EmergencyEndpoint from \"./endpoints/emergency/EmergencyEndpoint\";\nimport StaffEndpoint from \"./endpoints/staff/StaffEndpoint\";\nimport WebsocketEndpoint from \"./endpoints/websocket/WebsocketEndpoint\";\n\n/**\n * An API client for basic client interactions with the Medrunner API.\n * */\nexport default class MedrunnerApiClient<\n TEmergency extends EmergencyEndpoint = EmergencyEndpoint,\n TClient extends ClientEndpoint = ClientEndpoint,\n TStaff extends StaffEndpoint = StaffEndpoint,\n TChatMessage extends ChatMessageEndpoint = ChatMessageEndpoint,\n TAuth extends AuthEndpoint = AuthEndpoint,\n TWebsocket extends WebsocketEndpoint = WebsocketEndpoint,\n> implements ApiClient<TEmergency, TClient, TStaff, TChatMessage, TAuth, TWebsocket>\n{\n protected constructor(\n public readonly emergency: TEmergency,\n public readonly client: TClient,\n public readonly staff: TStaff,\n public readonly chatMessage: TChatMessage,\n public readonly auth: TAuth,\n public readonly websocket: TWebsocket,\n ) {}\n\n /**\n * Constructs a new API client.\n *\n * @param config - The API configuration\n * @param refreshCallback - a callback function called whenever a refresh token exchange is performed\n * @param log - A logger which logs request details\n * */\n public static buildClient(\n config: ApiConfig,\n refreshCallback?: AsyncAction<TokenGrant>,\n log?: Logger,\n ): MedrunnerApiClient {\n const tokenManager = new TokenManager(config, refreshCallback, log);\n\n return new MedrunnerApiClient(\n new EmergencyEndpoint(config.baseUrl, tokenManager, log),\n new ClientEndpoint(config.baseUrl, tokenManager, log),\n new StaffEndpoint(config.baseUrl, tokenManager, log),\n new ChatMessageEndpoint(config.baseUrl, tokenManager, log),\n new AuthEndpoint(config.baseUrl, tokenManager, log),\n new WebsocketEndpoint(config.baseUrl, tokenManager, log),\n );\n }\n}\n","/**\n * A supported location from which an emergency may be submitted.\n * */\nexport default interface LocationDetail {\n /**\n * The name of this location\n * */\n name: string;\n\n /**\n * The type of this location\n * */\n type: LocationType;\n\n /**\n * Additional locations which are within this location (e.g. moons of a planet, or planets of a system)\n * */\n children: LocationDetail[];\n}\n\n/**\n * The type of location.\n * */\nexport enum LocationType {\n /**\n * The location type is not known\n * */\n UNKNOWN,\n /**\n * A system, e.g. Stanton\n * */\n SYSTEM,\n /**\n * A planet, e.g. Crusader\n * */\n PLANET,\n /**\n * A moon, e.g. Daymar\n * */\n MOON,\n}\n","export enum CancellationReason {\n NONE,\n OTHER,\n SUCCUMBED_TO_WOUNDS,\n SERVER_ERROR,\n RESPAWNED,\n RESCUED,\n}\n","export enum Class {\n NONE,\n MEDIC,\n SECURITY,\n PILOT,\n LEAD,\n DISPATCH,\n DISPATCH_LEAD,\n DISPATCH_TRAINEE,\n DISPATCH_OBSERVER,\n QRF,\n LOGISTICS,\n}\n","import { CancellationReason } from \"./CancellationReason\";\nimport { MissionStatus } from \"./MissionStatus\";\nimport { ResponseRating } from \"./ResponseRating\";\nimport Team from \"./Team\";\nimport { ThreatLevel } from \"./ThreatLevel\";\nimport WritableDbItem from \"./WritableDbItem\";\n\nexport default interface Emergency extends WritableDbItem {\n system: string;\n subsystem: string;\n tertiaryLocation?: string;\n threatLevel: ThreatLevel;\n remarks?: string;\n clientRsiHandle: string;\n clientDiscordId?: string;\n clientId?: string;\n subscriptionTier: string;\n status: MissionStatus;\n alertMessage?: MessageCache;\n clientMessage?: MessageCache;\n coordinationThread?: MessageCache;\n afterActionReportMessage?: MessageCache;\n interactionMessageId?: string;\n respondingTeam: Team;\n respondingTeams: RespondingTeam[];\n creationTimestamp: number;\n acceptedTimestamp?: number;\n completionTimestamp?: number;\n rating: ResponseRating;\n ratingRemarks?: string;\n test: boolean;\n cancellationReason: CancellationReason;\n refusalReason?: string;\n origin: Origin;\n clientData?: ClientData;\n isComplete: boolean;\n missionName?: string;\n afterActionReport?: AfterActionReport;\n submissionSource: SubmissionSource;\n}\n\nexport interface MessageCache {\n id: string;\n channelId: string;\n}\n\nexport interface ClientData {\n rsiHandle: string;\n rsiProfileLink: string;\n gotClientData: boolean;\n redactedOrgOnProfile: boolean;\n reported: boolean;\n}\n\nexport interface AfterActionReport {\n remarks?: string;\n submitterStaffId: string;\n servicesProvided: MissionServices;\n suspectedTrap: boolean;\n hasBeenEdited: boolean;\n submittedOn: number;\n editHistory: AfterActionReportEdit[];\n}\n\nexport interface AfterActionReportEdit {\n editorStaffId: string;\n editTime: number;\n}\n\nexport enum MissionServices {\n NONE = 0,\n PVE = 1 << 0,\n PVP = 1 << 1,\n REVIVED_HEALED = 1 << 2,\n HEALED_IN_SHIP = 1 << 3,\n EXTRACT_SAFE_ZONE = 1 << 4,\n}\n\nexport enum Origin {\n UNKNOWN,\n REPORT,\n BEACON,\n EVALUATION,\n}\n\nexport enum SubmissionSource {\n UNKNOWN,\n API,\n BOT,\n}\n\nexport interface RespondingTeam {\n id: string;\n teamName: string;\n}\n","export enum MissionStatus {\n CREATED,\n RECEIVED,\n IN_PROGRESS,\n SUCCESS,\n FAILED,\n NO_CONTACT,\n CANCELED,\n REFUSED,\n ABORTED,\n SERVER_ERROR,\n}\n","import EmergencyStats from \"./EmergencyStats\";\nimport WritableDbItem from \"./WritableDbItem\";\n\nexport default interface Person extends WritableDbItem {\n discordId: string;\n rsiHandle?: string;\n roles: UserRoles;\n personType: PersonType;\n active: boolean;\n deactivationReason: AccountDeactivationReason;\n clientStats: ClientStats;\n activeEmergency?: string;\n clientPortalPreferences: Record<string, unknown>;\n}\n\nexport enum UserRoles {\n CLIENT = 1 << 0,\n STAFF = 1 << 1,\n DEVELOPER = 1 << 51,\n BOT = 1 << 52,\n}\n\nexport enum PersonType {\n CLIENT,\n STAFF,\n BOT,\n}\n\nexport enum AccountDeactivationReason {\n NONE,\n CLIENT_DRIVEN_DELETION,\n TERMINATED,\n BLOCKED,\n}\n\nexport interface ClientStats {\n missions: EmergencyStats;\n}\n\nexport interface BlockedStatus {\n blocked: boolean;\n}\n","export enum Level {\n None,\n Tier1Section1 = 101,\n Tier1Section2,\n Tier1Section3,\n Tier2Section1 = 201,\n Tier2Section2,\n Tier2Section3,\n Tier3Section1 = 301,\n Tier3Section2,\n Tier3Section3,\n Tier4Section1 = 401,\n Tier4Section2,\n Tier4Section3,\n Tier5Section1 = 501,\n Tier5Section2,\n Tier5Section3,\n Tier6Section1 = 601,\n Tier6Section2,\n Tier6Section3,\n Tier7Section1 = 701,\n Tier7Section2,\n Tier7Section3,\n Tier8Section1 = 801,\n Tier8Section2,\n Tier8Section3,\n Tier9Section1 = 901,\n Tier9Section2,\n Tier9Section3,\n Tier10Section1 = 1001,\n Tier10Section2,\n Tier10Section3,\n}\n","export enum ResponseRating {\n NONE,\n GOOD,\n BAD,\n}\n","export enum ThreatLevel {\n UNKNOWN,\n LOW,\n MEDIUM,\n HIGH,\n}\n"],"mappings":"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","names":["LocationType","CancellationReason","Class","MissionServices","Origin","SubmissionSource","MissionStatus","UserRoles","PersonType","AccountDeactivationReason","Level","ResponseRating","ThreatLevel"]}
|
|
1
|
+
{"version":3,"sources":["../src/api/endpoints/ApiEndpoint.ts","../src/api/endpoints/auth/AuthEndpoint.ts","../src/api/endpoints/auth/TokenManager.ts","../src/api/endpoints/chatMessage/ChatMessageEndpoint.ts","../src/api/endpoints/client/ClientEndpoint.ts","../src/api/endpoints/code/CodeEndpoint.ts","../src/api/endpoints/emergency/EmergencyEndpoint.ts","../src/api/endpoints/staff/StaffEndpoint.ts","../src/api/endpoints/websocket/WebsocketManager.ts","../src/api/endpoints/websocket/WebsocketEndpoint.ts","../src/api/MedrunnerApiClient.ts","../src/api/endpoints/emergency/response/LocationDetail.ts","../src/models/CancellationReason.ts","../src/models/Class.ts","../src/models/Emergency.ts","../src/models/MissionStatus.ts","../src/models/Person.ts","../src/models/Level.ts","../src/models/ResponseRating.ts","../src/models/ThreatLevel.ts"],"sourcesContent":["import axios, { AxiosError, AxiosRequestConfig } from \"axios\";\nimport { Logger } from \"ts-log\";\n\nimport { HeaderProvider } from \"../../Func\";\nimport ApiResponse from \"../ApiResponse\";\nimport TokenManager from \"./auth/TokenManager\";\n\nexport default abstract class ApiEndpoint {\n public readonly baseUrl: string;\n\n protected constructor(\n baseUrl: string | undefined,\n public readonly tokenManager: TokenManager,\n protected readonly log?: Logger,\n private readonly headerProvider?: HeaderProvider,\n ) {\n this.baseUrl = baseUrl ?? \"https://api.medrunner.space\";\n }\n\n protected abstract endpoint(): string;\n\n protected endpointUrl(): string {\n return `${this.baseUrl}/${this.endpoint()}`;\n }\n\n private async headersForRequest(noAuthentication: boolean): Promise<AxiosRequestConfig> {\n const config: AxiosRequestConfig = {\n baseURL: this.baseUrl,\n headers: {},\n };\n\n if (config.headers !== undefined) {\n if (!noAuthentication) {\n const accessToken = await this.tokenManager.getAccessToken();\n if (accessToken !== undefined) {\n // only include auth header if we have a token\n config.headers.Authorization = `Bearer ${accessToken}`;\n }\n }\n\n if (this.headerProvider !== undefined) {\n for (const header of Object.entries(await this.headerProvider())) {\n config.headers[header[0]] = header[1];\n }\n }\n }\n\n return config;\n }\n\n protected async getRequest<T = unknown>(\n endpoint: string,\n queryParams?: { [key: string]: unknown },\n noAuthentication?: boolean,\n ): Promise<ApiResponse<T>> {\n return await this.makeRequestWithoutBody<T>(endpoint, \"GET\", axios.get, queryParams, noAuthentication);\n }\n\n protected async postRequest<T = unknown>(\n endpoint: string,\n data?: unknown,\n noAuthentication?: boolean,\n ): Promise<ApiResponse<T>> {\n return await this.makeRequestWithBody<T>(endpoint, \"POST\", axios.post, data, noAuthentication);\n }\n\n protected async putRequest<T = unknown>(\n endpoint: string,\n data?: unknown,\n noAuthentication?: boolean,\n ): Promise<ApiResponse<T>> {\n return await this.makeRequestWithBody<T>(endpoint, \"PUT\", axios.put, data, noAuthentication);\n }\n\n protected async patchRequest<T = unknown>(\n endpoint: string,\n data?: unknown,\n noAuthentication?: boolean,\n ): Promise<ApiResponse<T>> {\n return await this.makeRequestWithBody<T>(endpoint, \"PATCH\", axios.patch, data, noAuthentication);\n }\n\n protected async deleteRequest(\n endpoint: string,\n queryParams?: { [key: string]: unknown },\n noAuthentication?: boolean,\n ): Promise<ApiResponse> {\n return await this.makeRequestWithoutBody(endpoint, \"DELETE\", axios.delete, queryParams, noAuthentication);\n }\n\n private async makeRequestWithBody<T = unknown>(\n endpoint: string,\n requestType: \"POST\" | \"PUT\" | \"PATCH\",\n axiosRequest: AxiosRequestWithBody<T>,\n data?: unknown,\n noAuthentication?: boolean,\n ): Promise<ApiResponse<T>> {\n const wrappedRequest: AxiosWrapper<T> = async (requestUrl, config) => await axiosRequest(requestUrl, data, config);\n return await this.makeRequest<T>(endpoint, requestType, wrappedRequest, undefined, noAuthentication);\n }\n\n private async makeRequestWithoutBody<T = unknown>(\n endpoint: string,\n requestType: \"GET\" | \"DELETE\",\n axiosRequest: AxiosRequestWithoutBody<T>,\n queryParams?: { [key: string]: unknown },\n noAuthentication?: boolean,\n ): Promise<ApiResponse<T>> {\n const wrappedRequest: AxiosWrapper<T> = async (requestUrl, config) => await axiosRequest(requestUrl, config);\n return await this.makeRequest<T>(endpoint, requestType, wrappedRequest, queryParams, noAuthentication);\n }\n\n private buildUrl(endpoint: string): string {\n const baseUrl = this.endpointUrl();\n\n if (baseUrl.endsWith(\"/\")) {\n if (endpoint.startsWith(\"/\")) {\n return `${baseUrl}${endpoint.substring(1)}`;\n }\n\n return `${baseUrl}${endpoint}`;\n }\n\n if (endpoint.startsWith(\"/\")) {\n return `${baseUrl}${endpoint}`;\n }\n\n return `${baseUrl}/${endpoint}`;\n }\n\n private async makeRequest<T = unknown>(\n endpoint: string,\n requestType: \"GET\" | \"POST\" | \"PUT\" | \"PATCH\" | \"DELETE\",\n request: AxiosWrapper<T>,\n queryParams?: { [key: string]: unknown },\n noAuthentication = false,\n ): Promise<ApiResponse<T>> {\n const requestUrl = this.buildUrl(endpoint);\n\n this.log?.debug(`sending ${requestType} request to ${requestUrl}`);\n try {\n const config = await this.headersForRequest(noAuthentication);\n if (queryParams !== undefined) {\n config.params = queryParams;\n }\n\n const result = await request(requestUrl, config);\n\n return {\n success: true,\n data: result.data,\n };\n } catch (e) {\n this.log?.warn(`Error for ${requestType} request to ${requestUrl}: ${e}`);\n return {\n success: false,\n errorMessage: e instanceof AxiosError ? e.response?.data : undefined,\n statusCode: e instanceof AxiosError ? e.response?.status : undefined,\n };\n }\n }\n}\n\ntype AxiosWrapper<T = unknown> = (url: string, config: AxiosRequestConfig) => Promise<ApiResponse<T>>;\n\ntype AxiosRequestWithBody<T = unknown> = (\n url: string,\n data: unknown,\n config: AxiosRequestConfig,\n) => Promise<ApiResponse<T>>;\ntype AxiosRequestWithoutBody<T = unknown> = (url: string, config: AxiosRequestConfig) => Promise<ApiResponse<T>>;\n","import { Logger } from \"ts-log\";\n\nimport { HeaderProvider } from \"../../../Func\";\nimport ApiToken from \"../../../models/ApiToken\";\nimport ApiResponse from \"../../ApiResponse\";\nimport ApiEndpoint from \"../ApiEndpoint\";\nimport TokenManager from \"../auth/TokenManager\";\nimport CreateApiTokenRequest from \"./request/CreateApiTokenRequest\";\nimport SignOutRequest from \"./request/SignOutRequest\";\n\n/**\n * Endpoints for interacting with auth.\n * */\nexport default class AuthEndpoint extends ApiEndpoint {\n constructor(baseUrl: string | undefined, tokenManager: TokenManager, log?: Logger, headerProvider?: HeaderProvider) {\n super(baseUrl, tokenManager, log, headerProvider);\n }\n\n protected override endpoint(): string {\n return \"auth\";\n }\n\n /**\n * Invalidate a refresh token.\n *\n * @param oldToken - Token to be invalidated\n *\n * @virtual\n * */\n public async signOut(oldToken: SignOutRequest): Promise<ApiResponse> {\n return await this.postRequest<string>(\"/signOut\", oldToken);\n }\n\n /**\n * Gets all api tokens for the user.\n *\n * */\n public async getApiTokens(): Promise<ApiResponse<ApiToken[]>> {\n return await this.getRequest<ApiToken[]>(`/apiTokens`);\n }\n\n /**\n * Creates an api token.\n *\n * @param newToken - Emergency details for the new emergency\n * @returns The newly-created api token\n *\n * @virtual\n * */\n public async createApiToken(newToken: CreateApiTokenRequest): Promise<ApiResponse<string>> {\n return await this.postRequest<string>(\"/apiTokens\", {\n name: newToken.name,\n expirationDate: newToken.expirationDate?.toISOString(),\n });\n }\n\n /**\n * Delete an api token.\n *\n * @param id - The id of the api token to delete\n *\n * */\n public async deleteApiToken(id: string): Promise<ApiResponse> {\n return await this.deleteRequest(`/apiTokens/${id}`);\n }\n}\n","import { Logger } from \"ts-log\";\n\nimport { AsyncAction, HeaderProvider } from \"../../../Func\";\nimport TokenGrant from \"../../../models/TokenGrant\";\nimport ApiConfig from \"../../ApiConfig\";\nimport ApiEndpoint from \"../ApiEndpoint\";\n\nexport default class TokenManager extends ApiEndpoint {\n private accessToken?: string;\n private refreshToken?: string;\n private tokenFetchPromise?: Promise<TokenGrant>;\n\n public constructor(\n config: ApiConfig,\n private readonly refreshCallback?: AsyncAction<TokenGrant>,\n log?: Logger,\n headerProvider?: HeaderProvider,\n ) {\n // todo: I dunno fix this someday I guess?\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n super(config.baseUrl, null!, log, headerProvider);\n this.accessToken = config.accessToken;\n this.refreshToken = config.refreshToken;\n }\n\n protected override endpoint(): string {\n return \"auth\";\n }\n\n public async getAccessToken(): Promise<string | undefined> {\n if (this.accessToken !== undefined) {\n const exp = TokenManager.getJwtFromAccessToken(this.accessToken).exp;\n\n // check expiration minus 5 minutes to guard against race condition or timing issues creating unnecessary 403s\n if (exp > Date.now() / 1000 - 60 * 5) return this.accessToken;\n }\n\n // if the refresh token isn't present, nothing we can do\n if (this.refreshToken === undefined) return this.accessToken;\n\n // token is expired (or will expire soon) and there is not already one fetching, so fetch a new one\n if (!this.tokenFetchPromise) this.tokenFetchPromise = this.fetchToken(this.refreshToken);\n\n try {\n const tokens = await this.tokenFetchPromise;\n this.accessToken = tokens.accessToken;\n this.refreshToken = tokens.refreshToken;\n\n if (this.refreshCallback !== undefined) {\n await this.refreshCallback(tokens);\n }\n } finally {\n this.tokenFetchPromise = undefined;\n }\n\n return this.accessToken;\n }\n\n private async fetchToken(refreshToken: string): Promise<TokenGrant> {\n const result = await this.postRequest<TokenGrant>(\"/exchange\", { refreshToken: refreshToken }, true);\n\n if (!result.success || result.data === undefined) {\n throw Error(result.statusCode?.toString());\n }\n\n return result.data;\n }\n\n private static getJwtFromAccessToken(accessToken: string): Jwt {\n return JSON.parse(atob(accessToken.split(\".\")[1]));\n }\n}\n\ninterface Jwt {\n exp: number;\n}\n","import { Logger } from \"ts-log\";\n\nimport { HeaderProvider } from \"../../../Func\";\nimport ChatMessage from \"../../../models/ChatMessage\";\nimport ApiResponse from \"../../ApiResponse\";\nimport PaginatedResponse from \"../../PaginatedResponse\";\nimport ApiEndpoint from \"../ApiEndpoint\";\nimport TokenManager from \"../auth/TokenManager\";\nimport ChatMessageRequest from \"./request/ChatMessageRequest\";\n\n/**\n * Endpoints for interacting with chat messages.\n * */\nexport default class ChatMessageEndpoint extends ApiEndpoint {\n constructor(baseUrl: string | undefined, tokenManager: TokenManager, log?: Logger, headerProvider?: HeaderProvider) {\n super(baseUrl, tokenManager, log, headerProvider);\n }\n\n protected override endpoint(): string {\n return \"chatMessage\";\n }\n\n /**\n * Gets the specified amount of chat messages for a given emergency.\n *\n * @param emergencyId - The emergency for which to fetch the chat history\n * @param limit - The number of emergencies to get\n * @param paginationToken - The number to use for pagination\n * */\n public async getHistory(\n emergencyId: string,\n limit: number,\n paginationToken?: string,\n ): Promise<ApiResponse<PaginatedResponse<ChatMessage>>> {\n return await this.getRequest<PaginatedResponse<ChatMessage>>(`/${emergencyId}`, { limit, paginationToken });\n }\n\n /**\n * Sends a new chat message\n *\n * @param message - The message to send\n * @returns The newly-created chat message\n *\n * */\n public async sendMessage(message: ChatMessageRequest): Promise<ApiResponse<ChatMessage>> {\n return await this.postRequest<ChatMessage>(\"\", message);\n }\n}\n","import { Logger } from \"ts-log\";\n\nimport { HeaderProvider } from \"../../../Func\";\nimport ClientHistory from \"../../../models/ClientHistory\";\nimport Person, { BlockedStatus } from \"../../../models/Person\";\nimport ApiResponse from \"../../ApiResponse\";\nimport PaginatedResponse from \"../../PaginatedResponse\";\nimport ApiEndpoint from \"../ApiEndpoint\";\nimport TokenManager from \"../auth/TokenManager\";\n\n/**\n * Endpoints for interacting with clients.\n * */\nexport default class ClientEndpoint extends ApiEndpoint {\n constructor(baseUrl: string | undefined, tokenManager: TokenManager, log?: Logger, headerProvider?: HeaderProvider) {\n super(baseUrl, tokenManager, log, headerProvider);\n }\n\n protected override endpoint(): string {\n return \"client\";\n }\n\n /**\n * Gets the current client.\n * */\n public async get(): Promise<ApiResponse<Person>> {\n return await this.getRequest<Person>(\"\");\n }\n\n /**\n * Gets the specified amount of emergencies the client has created.\n * @param limit - The number of emergencies to get\n * @param paginationToken - The number to use for pagination\n * */\n public async getHistory(\n limit: number,\n paginationToken?: string,\n ): Promise<ApiResponse<PaginatedResponse<ClientHistory>>> {\n return await this.getRequest<PaginatedResponse<ClientHistory>>(\"/history\", { limit, paginationToken });\n }\n\n /**\n * Gets the blocklist status of the current client.\n * */\n public async getBlockedStatus(): Promise<ApiResponse<BlockedStatus>> {\n return await this.getRequest<BlockedStatus>(\"/blocked\");\n }\n\n /**\n * Links the current user to a rsiHandle.\n *\n * @param rsiHandle - The RSI handle of the client\n *\n * */\n public async linkClient(rsiHandle: string): Promise<ApiResponse> {\n return await this.postRequest(\"/link\", { rsiHandle });\n }\n\n /**\n * Updates the settings of the current user for the Client Portal.\n *\n * @param settings - The object settings to add or update\n * @returns The updated settings object\n *\n * */\n public async setSettings(settings: Record<string, unknown>): Promise<ApiResponse<Record<string, unknown>>> {\n return await this.patchRequest<Record<string, unknown>>(\"/settings/clientPortal\", settings);\n }\n\n /**\n * Deactivate the current client.\n * */\n public async deactivate(): Promise<ApiResponse> {\n return await this.deleteRequest(\"\");\n }\n}\n","import { Logger } from \"ts-log\";\n\nimport { HeaderProvider } from \"../../../Func\";\nimport ApiResponse from \"../../ApiResponse\";\nimport ApiEndpoint from \"../ApiEndpoint\";\nimport TokenManager from \"../auth/TokenManager\";\n\n/**\n * Endpoints for interacting with promotional codes.\n * */\nexport default class CodeEndpoint extends ApiEndpoint {\n constructor(baseUrl: string | undefined, tokenManager: TokenManager, log?: Logger, headerProvider?: HeaderProvider) {\n super(baseUrl, tokenManager, log, headerProvider);\n }\n\n protected override endpoint(): string {\n return \"code\";\n }\n\n /**\n * Redeems the specified promotional code for the current user\n *\n * @param code - The code to redeem.\n * */\n public async redeem(code: string): Promise<ApiResponse> {\n return await this.postRequest(`/redeem/${code}`);\n }\n}\n","import { Logger } from \"ts-log\";\n\nimport { HeaderProvider } from \"../../../Func\";\nimport { CancellationReason } from \"../../../models/CancellationReason\";\nimport Emergency from \"../../../models/Emergency\";\nimport { ResponseRating } from \"../../../models/ResponseRating\";\nimport ApiResponse from \"../../ApiResponse\";\nimport ApiEndpoint from \"../ApiEndpoint\";\nimport TokenManager from \"../auth/TokenManager\";\nimport CreateEmergencyRequest from \"./request/CreateEmergencyRequest\";\nimport LocationDetail from \"./response/LocationDetail\";\nimport TeamDetailsResponse from \"./response/TeamDetailsResponse\";\n\n/**\n * Endpoints for interacting with emergencies.\n * */\nexport default class EmergencyEndpoint extends ApiEndpoint {\n constructor(baseUrl: string | undefined, tokenManager: TokenManager, log?: Logger, headerProvider?: HeaderProvider) {\n super(baseUrl, tokenManager, log, headerProvider);\n }\n\n protected override endpoint(): string {\n return \"emergency\";\n }\n\n /**\n * Gets an emergency by id.\n *\n * @param id - The id of the emergency to retrieve\n * */\n public async getEmergency(id: string): Promise<ApiResponse<Emergency>> {\n return await this.getRequest<Emergency>(`/${id}`);\n }\n\n /**\n * Bulk fetches emergencies by id.\n *\n * @param ids - a list of emergencies to retrieve\n * */\n public async getEmergencies(ids: string[]): Promise<ApiResponse<Emergency[]>> {\n return await this.getRequest<Emergency[]>(`/bulk?id=${ids.join(\"&id=\")}`);\n }\n\n /**\n * Creates a new emergency.\n *\n * @param newEmergency - Emergency details for the new emergency\n * @returns The newly-created emergency\n *\n * @virtual\n * */\n public async createEmergency(newEmergency: CreateEmergencyRequest): Promise<ApiResponse<Emergency>> {\n return await this.postRequest<Emergency>(\"\", newEmergency);\n }\n\n /**\n * Cancels an existing emergency.\n *\n * @remarks\n * Emergency must still be in the {@link MissionStatus.RECEIVED} state in order to be canceled.\n *\n * @param id - The id of the emergency to cancel\n * @param reason - The reason the emergency was canceled\n * */\n public async cancelEmergencyWithReason(id: string, reason: CancellationReason): Promise<ApiResponse> {\n return await this.postRequest(`/${id}/cancelWithReason`, {\n reason: reason,\n });\n }\n\n /**\n * Allows the client to rate their emergency.\n *\n * @param id - The id of the emergency to rate\n * @param rating - The rating to give the services provided\n * @param remarks - Additional remarks provided by the client\n *\n * @internal\n * */\n public async rateServices(id: string, rating: ResponseRating, remarks?: string): Promise<ApiResponse> {\n return await this.postRequest(`/${id}/rate/`, {\n rating: rating,\n remarks: remarks,\n });\n }\n\n /**\n * Fetches additional details about the responding team for an alert.\n *\n * @param id - The id of the emergency to get team details about\n * */\n public async teamDetails(id: string): Promise<ApiResponse<TeamDetailsResponse>> {\n return await this.getRequest<TeamDetailsResponse>(`/${id}/teamDetails`);\n }\n\n /**\n * Gets a tree of valid locations from which an emergency may be submitted.\n * */\n public async emergencyLocations(): Promise<ApiResponse<LocationDetail[]>> {\n return await this.getRequest<LocationDetail[]>(\"/meta/locations\");\n }\n}\n","import { Logger } from \"ts-log\";\n\nimport { HeaderProvider } from \"../../../Func\";\nimport ApiResponse from \"../../ApiResponse\";\nimport ApiEndpoint from \"../ApiEndpoint\";\nimport TokenManager from \"../auth/TokenManager\";\nimport MedalInformation from \"./response/MedalInformation\";\n\n/**\n * Endpoints for interacting with staff.\n * */\nexport default class StaffEndpoint extends ApiEndpoint {\n constructor(baseUrl: string | undefined, tokenManager: TokenManager, log?: Logger, headerProvider?: HeaderProvider) {\n super(baseUrl, tokenManager, log, headerProvider);\n }\n\n protected override endpoint(): string {\n return \"staff\";\n }\n\n /**\n * Gets detailed information about medals.\n * */\n public async medalsInformation(): Promise<ApiResponse<MedalInformation[]>> {\n return await this.getRequest<MedalInformation[]>(\"/meta/medals\");\n }\n}\n","import { type HubConnection, HubConnectionBuilder, ILogger, LogLevel } from \"@microsoft/signalr\";\nimport { Logger } from \"ts-log\";\n\nimport TokenManager from \"../auth/TokenManager\";\n\nclass WSLogger implements ILogger {\n constructor(private logger?: Logger) {}\n\n log(logLevel: LogLevel, message: string): void {\n switch (logLevel) {\n case LogLevel.Trace:\n this.logger?.trace(`Websocket: ${message}`);\n break;\n case LogLevel.Information:\n this.logger?.info(`Websocket: ${message}`);\n break;\n case LogLevel.Warning:\n this.logger?.warn(`Websocket: ${message}`);\n break;\n case LogLevel.Error || LogLevel.Critical:\n this.logger?.error(`Websocket: ${message}`);\n break;\n case LogLevel.Debug:\n this.logger?.debug(`Websocket: ${message}`);\n break;\n }\n }\n}\n\nexport default class WebsocketManager {\n private tokenManager: TokenManager;\n protected readonly logger?: Logger;\n\n public constructor(\n private readonly baseUrl: string,\n tokenManager: TokenManager,\n logger?: Logger,\n ) {\n this.tokenManager = tokenManager;\n this.logger = logger;\n }\n\n public async establishConnection(): Promise<HubConnection> {\n return new HubConnectionBuilder()\n .withAutomaticReconnect({\n nextRetryDelayInMilliseconds: retryContext => (retryContext.previousRetryCount > 5 ? null : 2000),\n })\n .withUrl(`${this.baseUrl}/hub/emergency`, {\n accessTokenFactory: async () => (await this.tokenManager.getAccessToken()) ?? \"\",\n })\n .configureLogging(new WSLogger(this.logger))\n .build();\n }\n}\n","import { HubConnection } from \"@microsoft/signalr\";\nimport { Logger } from \"ts-log\";\n\nimport { HeaderProvider } from \"../../../Func\";\nimport ApiEndpoint from \"../ApiEndpoint\";\nimport TokenManager from \"../auth/TokenManager\";\nimport WebsocketManager from \".//WebsocketManager\";\n\n/**\n * Endpoints for interacting with emergencies.\n * */\nexport default class WebsocketEndpoint extends ApiEndpoint {\n constructor(baseUrl: string | undefined, tokenManager: TokenManager, log?: Logger, headerProvider?: HeaderProvider) {\n super(baseUrl, tokenManager, log, headerProvider);\n }\n\n private websocketManager = new WebsocketManager(this.baseUrl, this.tokenManager, this.log);\n\n protected override endpoint(): string {\n return \"websocket\";\n }\n\n /**\n * Gets realtime updates.\n *\n * */\n public async initialize(): Promise<HubConnection> {\n if (this.websocketManager === undefined) {\n throw new Error(\"WebsocketManager is undefined\");\n }\n return await this.websocketManager.establishConnection();\n }\n}\n","import { Logger } from \"ts-log\";\n\nimport { AsyncAction } from \"../Func\";\nimport TokenGrant from \"../models/TokenGrant\";\nimport ApiClient from \"./ApiClient\";\nimport ApiConfig from \"./ApiConfig\";\nimport AuthEndpoint from \"./endpoints/auth/AuthEndpoint\";\nimport TokenManager from \"./endpoints/auth/TokenManager\";\nimport ChatMessageEndpoint from \"./endpoints/chatMessage/ChatMessageEndpoint\";\nimport ClientEndpoint from \"./endpoints/client/ClientEndpoint\";\nimport CodeEndpoint from \"./endpoints/code/CodeEndpoint\";\nimport EmergencyEndpoint from \"./endpoints/emergency/EmergencyEndpoint\";\nimport StaffEndpoint from \"./endpoints/staff/StaffEndpoint\";\nimport WebsocketEndpoint from \"./endpoints/websocket/WebsocketEndpoint\";\n\n/**\n * An API client for basic client interactions with the Medrunner API.\n * */\nexport default class MedrunnerApiClient<\n TEmergency extends EmergencyEndpoint = EmergencyEndpoint,\n TClient extends ClientEndpoint = ClientEndpoint,\n TStaff extends StaffEndpoint = StaffEndpoint,\n TChatMessage extends ChatMessageEndpoint = ChatMessageEndpoint,\n TCode extends CodeEndpoint = CodeEndpoint,\n TAuth extends AuthEndpoint = AuthEndpoint,\n TWebsocket extends WebsocketEndpoint = WebsocketEndpoint,\n> implements ApiClient<TEmergency, TClient, TStaff, TChatMessage, TCode, TAuth, TWebsocket>\n{\n protected constructor(\n public readonly emergency: TEmergency,\n public readonly client: TClient,\n public readonly staff: TStaff,\n public readonly chatMessage: TChatMessage,\n public readonly code: TCode,\n public readonly auth: TAuth,\n public readonly websocket: TWebsocket,\n ) {}\n\n /**\n * Constructs a new API client.\n *\n * @param config - The API configuration\n * @param refreshCallback - a callback function called whenever a refresh token exchange is performed\n * @param log - A logger which logs request details\n * */\n public static buildClient(\n config: ApiConfig,\n refreshCallback?: AsyncAction<TokenGrant>,\n log?: Logger,\n ): MedrunnerApiClient {\n const tokenManager = new TokenManager(config, refreshCallback, log);\n\n return new MedrunnerApiClient(\n new EmergencyEndpoint(config.baseUrl, tokenManager, log),\n new ClientEndpoint(config.baseUrl, tokenManager, log),\n new StaffEndpoint(config.baseUrl, tokenManager, log),\n new ChatMessageEndpoint(config.baseUrl, tokenManager, log),\n new CodeEndpoint(config.baseUrl, tokenManager, log),\n new AuthEndpoint(config.baseUrl, tokenManager, log),\n new WebsocketEndpoint(config.baseUrl, tokenManager, log),\n );\n }\n}\n","/**\n * A supported location from which an emergency may be submitted.\n * */\nexport default interface LocationDetail {\n /**\n * The name of this location\n * */\n name: string;\n\n /**\n * The type of this location\n * */\n type: LocationType;\n\n /**\n * Additional locations which are within this location (e.g. moons of a planet, or planets of a system)\n * */\n children: LocationDetail[];\n}\n\n/**\n * The type of location.\n * */\nexport enum LocationType {\n /**\n * The location type is not known\n * */\n UNKNOWN,\n /**\n * A system, e.g. Stanton\n * */\n SYSTEM,\n /**\n * A planet, e.g. Crusader\n * */\n PLANET,\n /**\n * A moon, e.g. Daymar\n * */\n MOON,\n}\n","export enum CancellationReason {\n NONE,\n OTHER,\n SUCCUMBED_TO_WOUNDS,\n SERVER_ERROR,\n RESPAWNED,\n RESCUED,\n}\n","export enum Class {\n NONE,\n MEDIC,\n SECURITY,\n PILOT,\n LEAD,\n DISPATCH,\n DISPATCH_LEAD,\n DISPATCH_TRAINEE,\n DISPATCH_OBSERVER,\n QRF,\n LOGISTICS,\n}\n","import { CancellationReason } from \"./CancellationReason\";\nimport { MissionStatus } from \"./MissionStatus\";\nimport { ResponseRating } from \"./ResponseRating\";\nimport Team from \"./Team\";\nimport { ThreatLevel } from \"./ThreatLevel\";\nimport WritableDbItem from \"./WritableDbItem\";\n\nexport default interface Emergency extends WritableDbItem {\n system: string;\n subsystem: string;\n tertiaryLocation?: string;\n threatLevel: ThreatLevel;\n remarks?: string;\n clientRsiHandle: string;\n clientDiscordId?: string;\n clientId?: string;\n subscriptionTier: string;\n status: MissionStatus;\n alertMessage?: MessageCache;\n clientMessage?: MessageCache;\n coordinationThread?: MessageCache;\n afterActionReportMessage?: MessageCache;\n interactionMessageId?: string;\n respondingTeam: Team;\n respondingTeams: RespondingTeam[];\n creationTimestamp: number;\n acceptedTimestamp?: number;\n completionTimestamp?: number;\n rating: ResponseRating;\n ratingRemarks?: string;\n test: boolean;\n cancellationReason: CancellationReason;\n refusalReason?: string;\n origin: Origin;\n clientData?: ClientData;\n isComplete: boolean;\n missionName?: string;\n afterActionReport?: AfterActionReport;\n submissionSource: SubmissionSource;\n}\n\nexport interface MessageCache {\n id: string;\n channelId: string;\n}\n\nexport interface ClientData {\n rsiHandle: string;\n rsiProfileLink: string;\n gotClientData: boolean;\n redactedOrgOnProfile: boolean;\n reported: boolean;\n}\n\nexport interface AfterActionReport {\n remarks?: string;\n submitterStaffId: string;\n servicesProvided: MissionServices;\n suspectedTrap: boolean;\n hasBeenEdited: boolean;\n submittedOn: number;\n editHistory: AfterActionReportEdit[];\n}\n\nexport interface AfterActionReportEdit {\n editorStaffId: string;\n editTime: number;\n}\n\nexport enum MissionServices {\n NONE = 0,\n PVE = 1 << 0,\n PVP = 1 << 1,\n REVIVED_HEALED = 1 << 2,\n HEALED_IN_SHIP = 1 << 3,\n EXTRACT_SAFE_ZONE = 1 << 4,\n}\n\nexport enum Origin {\n UNKNOWN,\n REPORT,\n BEACON,\n EVALUATION,\n}\n\nexport enum SubmissionSource {\n UNKNOWN,\n API,\n BOT,\n}\n\nexport interface RespondingTeam {\n id: string;\n teamName: string;\n}\n","export enum MissionStatus {\n CREATED,\n RECEIVED,\n IN_PROGRESS,\n SUCCESS,\n FAILED,\n NO_CONTACT,\n CANCELED,\n REFUSED,\n ABORTED,\n SERVER_ERROR,\n}\n","import EmergencyStats from \"./EmergencyStats\";\nimport WritableDbItem from \"./WritableDbItem\";\n\nexport default interface Person extends WritableDbItem {\n discordId: string;\n rsiHandle?: string;\n roles: UserRoles;\n personType: PersonType;\n active: boolean;\n deactivationReason: AccountDeactivationReason;\n clientStats: ClientStats;\n activeEmergency?: string;\n clientPortalPreferences: Record<string, unknown>;\n redeemedCodes: RedeemedCode[];\n}\n\nexport enum UserRoles {\n CLIENT = 1 << 0,\n STAFF = 1 << 1,\n DEVELOPER = 1 << 51,\n BOT = 1 << 52,\n}\n\nexport enum PersonType {\n CLIENT,\n STAFF,\n BOT,\n}\n\nexport enum AccountDeactivationReason {\n NONE,\n CLIENT_DRIVEN_DELETION,\n TERMINATED,\n BLOCKED,\n}\n\nexport interface ClientStats {\n missions: EmergencyStats;\n}\n\nexport interface BlockedStatus {\n blocked: boolean;\n}\n\nexport interface RedeemedCode {\n code: string;\n type: CodeType;\n}\n\nexport enum CodeType {\n Unknown,\n CitizenCon2954,\n}\n","export enum Level {\n None,\n Tier1Section1 = 101,\n Tier1Section2,\n Tier1Section3,\n Tier2Section1 = 201,\n Tier2Section2,\n Tier2Section3,\n Tier3Section1 = 301,\n Tier3Section2,\n Tier3Section3,\n Tier4Section1 = 401,\n Tier4Section2,\n Tier4Section3,\n Tier5Section1 = 501,\n Tier5Section2,\n Tier5Section3,\n Tier6Section1 = 601,\n Tier6Section2,\n Tier6Section3,\n Tier7Section1 = 701,\n Tier7Section2,\n Tier7Section3,\n Tier8Section1 = 801,\n Tier8Section2,\n Tier8Section3,\n Tier9Section1 = 901,\n Tier9Section2,\n Tier9Section3,\n Tier10Section1 = 1001,\n Tier10Section2,\n Tier10Section3,\n}\n","export enum ResponseRating {\n NONE,\n GOOD,\n BAD,\n}\n","export enum ThreatLevel {\n UNKNOWN,\n LOW,\n MEDIUM,\n HIGH,\n}\n"],"mappings":"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","names":["LocationType","CancellationReason","Class","MissionServices","Origin","SubmissionSource","MissionStatus","UserRoles","PersonType","AccountDeactivationReason","CodeType","Level","ResponseRating","ThreatLevel"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@medrunner/api-client",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.3",
|
|
4
4
|
"description": "Wrapper library for the Medrunner API",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"build": "tsup",
|
|
@@ -47,21 +47,24 @@
|
|
|
47
47
|
"dist"
|
|
48
48
|
],
|
|
49
49
|
"dependencies": {
|
|
50
|
-
"@
|
|
50
|
+
"@eslint/eslintrc": "^3.1.0",
|
|
51
|
+
"@eslint/js": "^9.11.1",
|
|
52
|
+
"@microsoft/signalr": "^8.0.7",
|
|
51
53
|
"axios": "^1.4.0",
|
|
52
54
|
"ts-log": "^2.2.5"
|
|
53
55
|
},
|
|
54
56
|
"devDependencies": {
|
|
55
|
-
"@types/node": "^20.
|
|
56
|
-
"@typescript-eslint/eslint-plugin": "^
|
|
57
|
-
"@typescript-eslint/parser": "^
|
|
58
|
-
"eslint": "^
|
|
59
|
-
"eslint-plugin-simple-import-sort": "^
|
|
60
|
-
"eslint-plugin-tsdoc": "^0.
|
|
61
|
-
"prettier": "^3.3.
|
|
62
|
-
"ts-node": "^10.9.
|
|
63
|
-
"
|
|
64
|
-
"
|
|
65
|
-
"
|
|
57
|
+
"@types/node": "^20.16.7",
|
|
58
|
+
"@typescript-eslint/eslint-plugin": "^8.7.0",
|
|
59
|
+
"@typescript-eslint/parser": "^8.7.0",
|
|
60
|
+
"eslint": "^9.11.1",
|
|
61
|
+
"eslint-plugin-simple-import-sort": "^12.1.1",
|
|
62
|
+
"eslint-plugin-tsdoc": "^0.3.0",
|
|
63
|
+
"prettier": "^3.3.3",
|
|
64
|
+
"ts-node": "^10.9.2",
|
|
65
|
+
"tslib": "^2.7.0",
|
|
66
|
+
"tsup": "^8.3.0",
|
|
67
|
+
"typescript": "~5.5.4",
|
|
68
|
+
"vitepress": "^1.3.4"
|
|
66
69
|
}
|
|
67
70
|
}
|