@sonoransoftware/sonoran.js 1.0.6 → 1.0.8
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/libs/rest/src/lib/REST.js +5 -0
- package/dist/libs/rest/src/lib/RequestManager.js +4 -0
- package/dist/managers/CADManager.d.ts +2 -0
- package/dist/managers/CADManager.js +7 -2
- package/dist/managers/CMSManager.d.ts +1 -0
- package/dist/managers/CMSManager.js +3 -4
- package/package.json +1 -1
- package/src/libs/rest/src/lib/REST.ts +5 -0
- package/src/libs/rest/src/lib/RequestManager.ts +259 -255
- package/src/managers/CADManager.ts +63 -58
- package/src/managers/CMSManager.ts +3 -4
|
@@ -8,7 +8,9 @@ import { CADServerManager } from './CADServerManager';
|
|
|
8
8
|
* Manages all Sonoran CAD data and methods to interact with the public API.
|
|
9
9
|
*/
|
|
10
10
|
export declare class CADManager extends BaseManager {
|
|
11
|
+
readonly ready = false;
|
|
11
12
|
readonly version: CADSubscriptionVersionEnum;
|
|
13
|
+
readonly failReason: unknown;
|
|
12
14
|
rest: REST | undefined;
|
|
13
15
|
servers: CADServerManager | undefined;
|
|
14
16
|
constructor(instance: Instance);
|
|
@@ -34,23 +34,28 @@ const CADServerManager_1 = require("./CADServerManager");
|
|
|
34
34
|
class CADManager extends BaseManager_1.BaseManager {
|
|
35
35
|
constructor(instance) {
|
|
36
36
|
super(instance);
|
|
37
|
+
this.ready = false;
|
|
37
38
|
this.version = 0;
|
|
39
|
+
this.failReason = null;
|
|
38
40
|
this.rest = new src_1.REST(instance, this, globalTypes.productEnums.CAD, src_1.DefaultCADRestOptions);
|
|
39
41
|
this.buildManager(instance);
|
|
40
42
|
}
|
|
41
43
|
async buildManager(instance) {
|
|
42
44
|
var _a;
|
|
45
|
+
const mutableThis = this;
|
|
43
46
|
try {
|
|
44
47
|
const versionResp = await ((_a = this.rest) === null || _a === void 0 ? void 0 : _a.request('GET_VERSION'));
|
|
45
|
-
const mutableThis = this;
|
|
46
48
|
mutableThis.version = Number.parseInt(versionResp.replace(/(^\d+)(.+$)/i, '$1'));
|
|
47
49
|
if (this.version >= globalTypes.CADSubscriptionVersionEnum.STANDARD) {
|
|
48
50
|
this.servers = new CADServerManager_1.CADServerManager(instance, this);
|
|
49
51
|
}
|
|
50
52
|
instance.isCADSuccessful = true;
|
|
53
|
+
instance.emit('CAD_SETUP_SUCCESSFUL');
|
|
51
54
|
}
|
|
52
55
|
catch (err) {
|
|
53
|
-
|
|
56
|
+
mutableThis.failReason = err;
|
|
57
|
+
instance.emit('CAD_SETUP_UNSUCCESSFUL', err);
|
|
58
|
+
throw err;
|
|
54
59
|
}
|
|
55
60
|
}
|
|
56
61
|
/**
|
|
@@ -10,6 +10,7 @@ import { CMSServerManager } from './CMSServerManager';
|
|
|
10
10
|
export declare class CMSManager extends BaseManager {
|
|
11
11
|
readonly ready: boolean;
|
|
12
12
|
readonly version: CMSSubscriptionVersionEnum;
|
|
13
|
+
readonly failReason: unknown;
|
|
13
14
|
rest: REST | undefined;
|
|
14
15
|
servers: CMSServerManager | undefined;
|
|
15
16
|
constructor(instance: Instance);
|
|
@@ -36,27 +36,26 @@ class CMSManager extends BaseManager_1.BaseManager {
|
|
|
36
36
|
super(instance);
|
|
37
37
|
this.ready = false;
|
|
38
38
|
this.version = 0;
|
|
39
|
+
this.failReason = null;
|
|
39
40
|
this.rest = new src_1.REST(instance, this, globalTypes.productEnums.CMS, src_1.DefaultCMSRestOptions);
|
|
40
41
|
this.buildManager(instance);
|
|
41
42
|
}
|
|
42
43
|
async buildManager(instance) {
|
|
43
44
|
var _a;
|
|
45
|
+
const mutableThis = this;
|
|
44
46
|
try {
|
|
45
47
|
const versionResp = await ((_a = this.rest) === null || _a === void 0 ? void 0 : _a.request('GET_SUB_VERSION'));
|
|
46
48
|
const version = Number.parseInt(versionResp.replace(/(^\d+)(.+$)/i, '$1'));
|
|
47
|
-
const mutableThis = this;
|
|
48
49
|
if (version >= globalTypes.CMSSubscriptionVersionEnum.STANDARD) {
|
|
49
50
|
this.servers = new CMSServerManager_1.CMSServerManager(instance, this);
|
|
50
51
|
}
|
|
51
52
|
mutableThis.ready = true;
|
|
52
53
|
mutableThis.version = version;
|
|
53
|
-
console.log(mutableThis.version);
|
|
54
|
-
console.log(this.version);
|
|
55
|
-
console.log(version);
|
|
56
54
|
instance.isCMSSuccessful = true;
|
|
57
55
|
instance.emit('CMS_SETUP_SUCCESSFUL');
|
|
58
56
|
}
|
|
59
57
|
catch (err) {
|
|
58
|
+
mutableThis.failReason = err;
|
|
60
59
|
instance.emit('CMS_SETUP_UNSUCCESSFUL', err);
|
|
61
60
|
throw err;
|
|
62
61
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sonoransoftware/sonoran.js",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.8",
|
|
4
4
|
"description": "Sonoran.js is a library that allows you to interact with the Sonoran CAD and Sonoran CMS API. Based off of and utilizes several Discord.js library techniques for ease of use.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -1,256 +1,260 @@
|
|
|
1
|
-
import Collection from '@discordjs/collection';
|
|
2
|
-
// import { DiscordSnowflake } from '@sapphire/snowflake';
|
|
3
|
-
import { EventEmitter } from 'events';
|
|
4
|
-
// import type { RequestInit, BodyInit } from 'node-fetch';
|
|
5
|
-
|
|
6
|
-
import type { Instance } from '../../../../instance/Instance';
|
|
7
|
-
import { RESTOptions, RateLimitData, RestEvents } from './REST';
|
|
8
|
-
import { DefaultCADRestOptions, DefaultCMSRestOptions, AllAPITypes/**, RESTTypedAPIDataStructs, PossibleRequestData*/ } from './utils/constants';
|
|
9
|
-
import { productEnums } from '../../../../constants';
|
|
10
|
-
// import { APIError, HTTPError } from './errors';
|
|
11
|
-
import { IHandler } from './handlers/IHandler';
|
|
12
|
-
import { SequentialHandler } from './handlers/SequentialHandler';
|
|
13
|
-
import { cloneObject } from '../../../../utils/utils';
|
|
14
|
-
|
|
15
|
-
export type RouteLike = `/${string}`;
|
|
16
|
-
|
|
17
|
-
export const enum RequestMethod {
|
|
18
|
-
Delete = 'delete',
|
|
19
|
-
Get = 'get',
|
|
20
|
-
Patch = 'patch',
|
|
21
|
-
Post = 'post',
|
|
22
|
-
Put = 'put',
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
export type ReqDataType = Array<unknown> | unknown;
|
|
26
|
-
|
|
27
|
-
export interface RequestData {
|
|
28
|
-
id: string;
|
|
29
|
-
key: string;
|
|
30
|
-
type: string;
|
|
31
|
-
data: any;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
export interface InternalRequestData extends RequestData {
|
|
35
|
-
product: productEnums;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
export interface RequestHeaders {
|
|
39
|
-
'User-Agent': string;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
export interface APIData {
|
|
43
|
-
requestTypeId: string;
|
|
44
|
-
typePath: string;
|
|
45
|
-
fullUrl: string;
|
|
46
|
-
method: string;
|
|
47
|
-
fetchOptions: RequestInit;
|
|
48
|
-
data: RequestData;
|
|
49
|
-
product: productEnums;
|
|
50
|
-
type: string;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
export interface RequestManager {
|
|
54
|
-
on: (<K extends keyof RestEvents>(event: K, listener: (...args: RestEvents[K]) => void) => this) &
|
|
55
|
-
(<S extends string | symbol>(event: Exclude<S, keyof RestEvents>, listener: (...args: any[]) => void) => this);
|
|
56
|
-
|
|
57
|
-
once: (<K extends keyof RestEvents>(event: K, listener: (...args: RestEvents[K]) => void) => this) &
|
|
58
|
-
(<S extends string | symbol>(event: Exclude<S, keyof RestEvents>, listener: (...args: any[]) => void) => this);
|
|
59
|
-
|
|
60
|
-
emit: (<K extends keyof RestEvents>(event: K, ...args: RestEvents[K]) => boolean) &
|
|
61
|
-
(<S extends string | symbol>(event: Exclude<S, keyof RestEvents>, ...args: any[]) => boolean);
|
|
62
|
-
|
|
63
|
-
off: (<K extends keyof RestEvents>(event: K, listener: (...args: RestEvents[K]) => void) => this) &
|
|
64
|
-
(<S extends string | symbol>(event: Exclude<S, keyof RestEvents>, listener: (...args: any[]) => void) => this);
|
|
65
|
-
|
|
66
|
-
removeAllListeners: (<K extends keyof RestEvents>(event?: K) => this) &
|
|
67
|
-
(<S extends string | symbol>(event?: Exclude<S, keyof RestEvents>) => this);
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
export class RequestManager extends EventEmitter {
|
|
71
|
-
public readonly ratelimitedTypes = new Collection<string, RateLimitData>();
|
|
72
|
-
public readonly handlers = new Collection<string, IHandler>();
|
|
73
|
-
public readonly product: productEnums;
|
|
74
|
-
public readonly options: RESTOptions;
|
|
75
|
-
private instance: Instance;
|
|
76
|
-
|
|
77
|
-
constructor(_instance: Instance, _product: productEnums, options: RESTOptions) {
|
|
78
|
-
super();
|
|
79
|
-
this.product = _product;
|
|
80
|
-
this.instance = _instance;
|
|
81
|
-
switch (_product) {
|
|
82
|
-
case productEnums.CAD: {
|
|
83
|
-
this.options = { ...DefaultCADRestOptions, ...options };
|
|
84
|
-
break;
|
|
85
|
-
}
|
|
86
|
-
case productEnums.CMS: {
|
|
87
|
-
this.options = { ...DefaultCMSRestOptions, ...options };
|
|
88
|
-
break;
|
|
89
|
-
}
|
|
90
|
-
default: {
|
|
91
|
-
throw new Error('No Product provided for RequestManager initialization');
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
public async queueRequest(request: InternalRequestData): Promise<unknown> {
|
|
97
|
-
let requestData = request as RequestData;
|
|
98
|
-
const resolvedData: APIData = RequestManager.resolveRequestData(this.instance, request.type, request.product, requestData);
|
|
99
|
-
const handler = this.handlers.get(`${resolvedData.typePath}:${String(request.product)}`) ?? this.createHandler(resolvedData);
|
|
100
|
-
return handler.queueRequest(resolvedData.fullUrl, resolvedData.fetchOptions as any, resolvedData);
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
public onRateLimit(id: string, rateLimitData: RateLimitData): void {
|
|
104
|
-
this.ratelimitedTypes.set(id, rateLimitData);
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
public removeRateLimit(id: string): void {
|
|
108
|
-
this.ratelimitedTypes.delete(id);
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
private createHandler(data: APIData) {
|
|
112
|
-
const queue = new SequentialHandler(this, data);
|
|
113
|
-
this.handlers.set(queue.id, queue);
|
|
114
|
-
return queue;
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
private static resolveRequestData(instance: Instance, type: string, product: productEnums, data: RequestData): APIData {
|
|
118
|
-
let apiURL: string | boolean = false;
|
|
119
|
-
let apiData: APIData = {
|
|
120
|
-
requestTypeId: `${type}:${String(product)}`,
|
|
121
|
-
typePath: '',
|
|
122
|
-
fullUrl: '',
|
|
123
|
-
method: '',
|
|
124
|
-
fetchOptions: {},
|
|
125
|
-
data,
|
|
126
|
-
product,
|
|
127
|
-
type
|
|
128
|
-
};
|
|
129
|
-
|
|
130
|
-
switch (product) {
|
|
131
|
-
case productEnums.CAD:
|
|
132
|
-
apiURL = instance.cadApiUrl;
|
|
133
|
-
break;
|
|
134
|
-
case productEnums.CMS:
|
|
135
|
-
apiURL = instance.cmsApiUrl;
|
|
136
|
-
break;
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
const findType = AllAPITypes.find((_type) => _type.type === type);
|
|
140
|
-
if (findType) {
|
|
141
|
-
apiData.fullUrl = `${apiURL}/${findType.path}`;
|
|
142
|
-
apiData.method = findType.method;
|
|
143
|
-
apiData.fetchOptions.method = findType.method;
|
|
144
|
-
apiData.typePath = findType.path;
|
|
145
|
-
|
|
146
|
-
const clonedData = cloneObject(data.data);
|
|
147
|
-
|
|
148
|
-
switch (findType.type) {
|
|
149
|
-
case 'SET_SERVERS': {
|
|
150
|
-
apiData.data.data = clonedData;
|
|
151
|
-
break;
|
|
152
|
-
}
|
|
153
|
-
case 'SET_PENAL_CODES': {
|
|
154
|
-
apiData.data.data = clonedData.data;
|
|
155
|
-
break;
|
|
156
|
-
}
|
|
157
|
-
case 'SET_API_ID': {
|
|
158
|
-
apiData.data.data = clonedData.data;
|
|
159
|
-
break;
|
|
160
|
-
}
|
|
161
|
-
case '
|
|
162
|
-
apiData.data.data = clonedData.data;
|
|
163
|
-
break;
|
|
164
|
-
}
|
|
165
|
-
case '
|
|
166
|
-
apiData.data.data = clonedData.data;
|
|
167
|
-
break;
|
|
168
|
-
}
|
|
169
|
-
case '
|
|
170
|
-
apiData.data.data = clonedData.data;
|
|
171
|
-
break;
|
|
172
|
-
}
|
|
173
|
-
case '
|
|
174
|
-
apiData.data.data = clonedData.data;
|
|
175
|
-
break;
|
|
176
|
-
}
|
|
177
|
-
case '
|
|
178
|
-
apiData.data.data = clonedData.data;
|
|
179
|
-
break;
|
|
180
|
-
}
|
|
181
|
-
case '
|
|
182
|
-
apiData.data.data = clonedData.data;
|
|
183
|
-
break;
|
|
184
|
-
}
|
|
185
|
-
case '
|
|
186
|
-
apiData.data.data = clonedData;
|
|
187
|
-
break;
|
|
188
|
-
}
|
|
189
|
-
case '
|
|
190
|
-
apiData.data.data = clonedData
|
|
191
|
-
break;
|
|
192
|
-
}
|
|
193
|
-
case '
|
|
194
|
-
apiData.data.data = clonedData.data;
|
|
195
|
-
break;
|
|
196
|
-
}
|
|
197
|
-
case '
|
|
198
|
-
apiData.data.data = clonedData.data;
|
|
199
|
-
break;
|
|
200
|
-
}
|
|
201
|
-
case '
|
|
202
|
-
apiData.data.data = clonedData.data;
|
|
203
|
-
break;
|
|
204
|
-
}
|
|
205
|
-
case '
|
|
206
|
-
apiData.data.data = clonedData.data;
|
|
207
|
-
break;
|
|
208
|
-
}
|
|
209
|
-
case '
|
|
210
|
-
apiData.data.data = clonedData.data;
|
|
211
|
-
break;
|
|
212
|
-
}
|
|
213
|
-
case '
|
|
214
|
-
apiData.data.data = clonedData.data;
|
|
215
|
-
break;
|
|
216
|
-
}
|
|
217
|
-
case '
|
|
218
|
-
apiData.data.data = clonedData.data;
|
|
219
|
-
break;
|
|
220
|
-
}
|
|
221
|
-
case '
|
|
222
|
-
apiData.data.data = clonedData.data;
|
|
223
|
-
break;
|
|
224
|
-
}
|
|
225
|
-
case '
|
|
226
|
-
apiData.data.data = clonedData.data;
|
|
227
|
-
break;
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
1
|
+
import Collection from '@discordjs/collection';
|
|
2
|
+
// import { DiscordSnowflake } from '@sapphire/snowflake';
|
|
3
|
+
import { EventEmitter } from 'events';
|
|
4
|
+
// import type { RequestInit, BodyInit } from 'node-fetch';
|
|
5
|
+
|
|
6
|
+
import type { Instance } from '../../../../instance/Instance';
|
|
7
|
+
import { RESTOptions, RateLimitData, RestEvents } from './REST';
|
|
8
|
+
import { DefaultCADRestOptions, DefaultCMSRestOptions, AllAPITypes/**, RESTTypedAPIDataStructs, PossibleRequestData*/ } from './utils/constants';
|
|
9
|
+
import { productEnums } from '../../../../constants';
|
|
10
|
+
// import { APIError, HTTPError } from './errors';
|
|
11
|
+
import { IHandler } from './handlers/IHandler';
|
|
12
|
+
import { SequentialHandler } from './handlers/SequentialHandler';
|
|
13
|
+
import { cloneObject } from '../../../../utils/utils';
|
|
14
|
+
|
|
15
|
+
export type RouteLike = `/${string}`;
|
|
16
|
+
|
|
17
|
+
export const enum RequestMethod {
|
|
18
|
+
Delete = 'delete',
|
|
19
|
+
Get = 'get',
|
|
20
|
+
Patch = 'patch',
|
|
21
|
+
Post = 'post',
|
|
22
|
+
Put = 'put',
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export type ReqDataType = Array<unknown> | unknown;
|
|
26
|
+
|
|
27
|
+
export interface RequestData {
|
|
28
|
+
id: string;
|
|
29
|
+
key: string;
|
|
30
|
+
type: string;
|
|
31
|
+
data: any;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export interface InternalRequestData extends RequestData {
|
|
35
|
+
product: productEnums;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export interface RequestHeaders {
|
|
39
|
+
'User-Agent': string;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export interface APIData {
|
|
43
|
+
requestTypeId: string;
|
|
44
|
+
typePath: string;
|
|
45
|
+
fullUrl: string;
|
|
46
|
+
method: string;
|
|
47
|
+
fetchOptions: RequestInit;
|
|
48
|
+
data: RequestData;
|
|
49
|
+
product: productEnums;
|
|
50
|
+
type: string;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export interface RequestManager {
|
|
54
|
+
on: (<K extends keyof RestEvents>(event: K, listener: (...args: RestEvents[K]) => void) => this) &
|
|
55
|
+
(<S extends string | symbol>(event: Exclude<S, keyof RestEvents>, listener: (...args: any[]) => void) => this);
|
|
56
|
+
|
|
57
|
+
once: (<K extends keyof RestEvents>(event: K, listener: (...args: RestEvents[K]) => void) => this) &
|
|
58
|
+
(<S extends string | symbol>(event: Exclude<S, keyof RestEvents>, listener: (...args: any[]) => void) => this);
|
|
59
|
+
|
|
60
|
+
emit: (<K extends keyof RestEvents>(event: K, ...args: RestEvents[K]) => boolean) &
|
|
61
|
+
(<S extends string | symbol>(event: Exclude<S, keyof RestEvents>, ...args: any[]) => boolean);
|
|
62
|
+
|
|
63
|
+
off: (<K extends keyof RestEvents>(event: K, listener: (...args: RestEvents[K]) => void) => this) &
|
|
64
|
+
(<S extends string | symbol>(event: Exclude<S, keyof RestEvents>, listener: (...args: any[]) => void) => this);
|
|
65
|
+
|
|
66
|
+
removeAllListeners: (<K extends keyof RestEvents>(event?: K) => this) &
|
|
67
|
+
(<S extends string | symbol>(event?: Exclude<S, keyof RestEvents>) => this);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export class RequestManager extends EventEmitter {
|
|
71
|
+
public readonly ratelimitedTypes = new Collection<string, RateLimitData>();
|
|
72
|
+
public readonly handlers = new Collection<string, IHandler>();
|
|
73
|
+
public readonly product: productEnums;
|
|
74
|
+
public readonly options: RESTOptions;
|
|
75
|
+
private instance: Instance;
|
|
76
|
+
|
|
77
|
+
constructor(_instance: Instance, _product: productEnums, options: RESTOptions) {
|
|
78
|
+
super();
|
|
79
|
+
this.product = _product;
|
|
80
|
+
this.instance = _instance;
|
|
81
|
+
switch (_product) {
|
|
82
|
+
case productEnums.CAD: {
|
|
83
|
+
this.options = { ...DefaultCADRestOptions, ...options };
|
|
84
|
+
break;
|
|
85
|
+
}
|
|
86
|
+
case productEnums.CMS: {
|
|
87
|
+
this.options = { ...DefaultCMSRestOptions, ...options };
|
|
88
|
+
break;
|
|
89
|
+
}
|
|
90
|
+
default: {
|
|
91
|
+
throw new Error('No Product provided for RequestManager initialization');
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
public async queueRequest(request: InternalRequestData): Promise<unknown> {
|
|
97
|
+
let requestData = request as RequestData;
|
|
98
|
+
const resolvedData: APIData = RequestManager.resolveRequestData(this.instance, request.type, request.product, requestData);
|
|
99
|
+
const handler = this.handlers.get(`${resolvedData.typePath}:${String(request.product)}`) ?? this.createHandler(resolvedData);
|
|
100
|
+
return handler.queueRequest(resolvedData.fullUrl, resolvedData.fetchOptions as any, resolvedData);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
public onRateLimit(id: string, rateLimitData: RateLimitData): void {
|
|
104
|
+
this.ratelimitedTypes.set(id, rateLimitData);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
public removeRateLimit(id: string): void {
|
|
108
|
+
this.ratelimitedTypes.delete(id);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
private createHandler(data: APIData) {
|
|
112
|
+
const queue = new SequentialHandler(this, data);
|
|
113
|
+
this.handlers.set(queue.id, queue);
|
|
114
|
+
return queue;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
private static resolveRequestData(instance: Instance, type: string, product: productEnums, data: RequestData): APIData {
|
|
118
|
+
let apiURL: string | boolean = false;
|
|
119
|
+
let apiData: APIData = {
|
|
120
|
+
requestTypeId: `${type}:${String(product)}`,
|
|
121
|
+
typePath: '',
|
|
122
|
+
fullUrl: '',
|
|
123
|
+
method: '',
|
|
124
|
+
fetchOptions: {},
|
|
125
|
+
data,
|
|
126
|
+
product,
|
|
127
|
+
type
|
|
128
|
+
};
|
|
129
|
+
|
|
130
|
+
switch (product) {
|
|
131
|
+
case productEnums.CAD:
|
|
132
|
+
apiURL = instance.cadApiUrl;
|
|
133
|
+
break;
|
|
134
|
+
case productEnums.CMS:
|
|
135
|
+
apiURL = instance.cmsApiUrl;
|
|
136
|
+
break;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
const findType = AllAPITypes.find((_type) => _type.type === type);
|
|
140
|
+
if (findType) {
|
|
141
|
+
apiData.fullUrl = `${apiURL}/${findType.path}`;
|
|
142
|
+
apiData.method = findType.method;
|
|
143
|
+
apiData.fetchOptions.method = findType.method;
|
|
144
|
+
apiData.typePath = findType.path;
|
|
145
|
+
|
|
146
|
+
const clonedData = cloneObject(data.data);
|
|
147
|
+
|
|
148
|
+
switch (findType.type) {
|
|
149
|
+
case 'SET_SERVERS': {
|
|
150
|
+
apiData.data.data = clonedData;
|
|
151
|
+
break;
|
|
152
|
+
}
|
|
153
|
+
case 'SET_PENAL_CODES': {
|
|
154
|
+
apiData.data.data = clonedData.data;
|
|
155
|
+
break;
|
|
156
|
+
}
|
|
157
|
+
case 'SET_API_ID': {
|
|
158
|
+
apiData.data.data = { secret: clonedData.data[0] };
|
|
159
|
+
break;
|
|
160
|
+
}
|
|
161
|
+
case 'VERIFY_SECRET': {
|
|
162
|
+
apiData.data.data = clonedData.data;
|
|
163
|
+
break;
|
|
164
|
+
}
|
|
165
|
+
case 'NEW_RECORD': {
|
|
166
|
+
apiData.data.data = clonedData.data;
|
|
167
|
+
break;
|
|
168
|
+
}
|
|
169
|
+
case 'EDIT_RECORD': {
|
|
170
|
+
apiData.data.data = clonedData.data;
|
|
171
|
+
break;
|
|
172
|
+
}
|
|
173
|
+
case 'LOOKUP_INT': {
|
|
174
|
+
apiData.data.data = clonedData.data;
|
|
175
|
+
break;
|
|
176
|
+
}
|
|
177
|
+
case 'LOOKUP': {
|
|
178
|
+
apiData.data.data = clonedData.data;
|
|
179
|
+
break;
|
|
180
|
+
}
|
|
181
|
+
case 'SET_ACCOUNT_PERMISSIONS': {
|
|
182
|
+
apiData.data.data = clonedData.data;
|
|
183
|
+
break;
|
|
184
|
+
}
|
|
185
|
+
case 'BAN_USER': {
|
|
186
|
+
apiData.data.data = clonedData.data;
|
|
187
|
+
break;
|
|
188
|
+
}
|
|
189
|
+
case 'AUTH_STREETSIGNS': {
|
|
190
|
+
apiData.data.data = clonedData;
|
|
191
|
+
break;
|
|
192
|
+
}
|
|
193
|
+
case 'SET_POSTALS': {
|
|
194
|
+
apiData.data.data = clonedData.data;
|
|
195
|
+
break;
|
|
196
|
+
}
|
|
197
|
+
case 'NEW_CHARACTER': {
|
|
198
|
+
apiData.data.data = clonedData.data;
|
|
199
|
+
break;
|
|
200
|
+
}
|
|
201
|
+
case 'EDIT_CHARACTER': {
|
|
202
|
+
apiData.data.data = clonedData.data;
|
|
203
|
+
break;
|
|
204
|
+
}
|
|
205
|
+
case 'MODIFY_IDENTIFIER': {
|
|
206
|
+
apiData.data.data = clonedData.data;
|
|
207
|
+
break;
|
|
208
|
+
}
|
|
209
|
+
case 'ADD_BLIP': {
|
|
210
|
+
apiData.data.data = clonedData.data;
|
|
211
|
+
break;
|
|
212
|
+
}
|
|
213
|
+
case 'MODIFY_BLIP': {
|
|
214
|
+
apiData.data.data = clonedData.data;
|
|
215
|
+
break;
|
|
216
|
+
}
|
|
217
|
+
case 'GET_CALLS': {
|
|
218
|
+
apiData.data.data = clonedData.data;
|
|
219
|
+
break;
|
|
220
|
+
}
|
|
221
|
+
case 'GET_ACTIVE_UNITS': {
|
|
222
|
+
apiData.data.data = clonedData.data;
|
|
223
|
+
break;
|
|
224
|
+
}
|
|
225
|
+
case 'NEW_DISPATCH': {
|
|
226
|
+
apiData.data.data = clonedData.data;
|
|
227
|
+
break;
|
|
228
|
+
}
|
|
229
|
+
case 'UNIT_LOCATION': {
|
|
230
|
+
apiData.data.data = clonedData.data;
|
|
231
|
+
break;
|
|
232
|
+
}
|
|
233
|
+
default: {
|
|
234
|
+
if (data.data) {
|
|
235
|
+
if (Array.isArray(data.data)) {
|
|
236
|
+
if (data.data.length > 0) {
|
|
237
|
+
apiData.data.data = [ clonedData ];
|
|
238
|
+
} else {
|
|
239
|
+
apiData.data.data = [];
|
|
240
|
+
}
|
|
241
|
+
} else {
|
|
242
|
+
apiData.data.data = [ clonedData ];
|
|
243
|
+
}
|
|
244
|
+
} else {
|
|
245
|
+
apiData.data.data = [];
|
|
246
|
+
}
|
|
247
|
+
break;
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
apiData.fetchOptions.body = JSON.stringify(apiData.data);
|
|
253
|
+
apiData.fetchOptions.headers = {
|
|
254
|
+
'Accept': 'application/json',
|
|
255
|
+
'Content-Type': 'application/json'
|
|
256
|
+
};
|
|
257
|
+
|
|
258
|
+
return apiData;
|
|
259
|
+
}
|
|
256
260
|
}
|
|
@@ -1,59 +1,64 @@
|
|
|
1
|
-
import { Instance } from '../instance/Instance';
|
|
2
|
-
import { CADSubscriptionVersionEnum } from '../constants';
|
|
3
|
-
import { APIError, DefaultCADRestOptions, REST } from '../libs/rest/src';
|
|
4
|
-
import { BaseManager } from './BaseManager';
|
|
5
|
-
import * as globalTypes from '../constants';
|
|
6
|
-
import type { Mutable } from '../constants';
|
|
7
|
-
import { CADServerManager } from './CADServerManager';
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* Manages all Sonoran CAD data and methods to interact with the public API.
|
|
11
|
-
*/
|
|
12
|
-
export class CADManager extends BaseManager {
|
|
13
|
-
public readonly
|
|
14
|
-
public
|
|
15
|
-
public
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
1
|
+
import { Instance } from '../instance/Instance';
|
|
2
|
+
import { CADSubscriptionVersionEnum } from '../constants';
|
|
3
|
+
import { APIError, DefaultCADRestOptions, REST } from '../libs/rest/src';
|
|
4
|
+
import { BaseManager } from './BaseManager';
|
|
5
|
+
import * as globalTypes from '../constants';
|
|
6
|
+
import type { Mutable } from '../constants';
|
|
7
|
+
import { CADServerManager } from './CADServerManager';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Manages all Sonoran CAD data and methods to interact with the public API.
|
|
11
|
+
*/
|
|
12
|
+
export class CADManager extends BaseManager {
|
|
13
|
+
public readonly ready = false;
|
|
14
|
+
public readonly version: CADSubscriptionVersionEnum = 0;
|
|
15
|
+
public readonly failReason: unknown = null;
|
|
16
|
+
public rest: REST | undefined;
|
|
17
|
+
public servers: CADServerManager | undefined;
|
|
18
|
+
|
|
19
|
+
constructor(instance: Instance) {
|
|
20
|
+
super(instance);
|
|
21
|
+
|
|
22
|
+
this.rest = new REST(instance, this, globalTypes.productEnums.CAD, DefaultCADRestOptions);
|
|
23
|
+
this.buildManager(instance);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
protected async buildManager(instance: Instance) {
|
|
27
|
+
const mutableThis = this as Mutable<CADManager>;
|
|
28
|
+
try {
|
|
29
|
+
const versionResp: any = await this.rest?.request('GET_VERSION');
|
|
30
|
+
mutableThis.version = Number.parseInt(versionResp.replace(/(^\d+)(.+$)/i,'$1'));
|
|
31
|
+
if (this.version >= globalTypes.CADSubscriptionVersionEnum.STANDARD) {
|
|
32
|
+
this.servers = new CADServerManager(instance, this);
|
|
33
|
+
}
|
|
34
|
+
instance.isCADSuccessful = true;
|
|
35
|
+
instance.emit('CAD_SETUP_SUCCESSFUL');
|
|
36
|
+
} catch (err) {
|
|
37
|
+
mutableThis.failReason = err;
|
|
38
|
+
instance.emit('CAD_SETUP_UNSUCCESSFUL', err);
|
|
39
|
+
throw err;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Gets a community account by `accId` or `apiId`.
|
|
45
|
+
* @param {Object} params The object that contains parameters to get a community account.
|
|
46
|
+
* @param {string} [data.accId] The account id to find a community account.
|
|
47
|
+
* @param {string} [data.apiId] The api id to find a community account.
|
|
48
|
+
* @returns {Promise} Promise object represents if the request was successful with reason for failure if needed and the account data object if found.
|
|
49
|
+
*/
|
|
50
|
+
public async getAccount(params: { apiId?: string, username?: string }): Promise<globalTypes.CADGetAccountPromiseResult> {
|
|
51
|
+
return new Promise(async (resolve, reject) => {
|
|
52
|
+
try {
|
|
53
|
+
const getAccountRequest: any = await this.rest?.request('GET_ACCOUNT', params.apiId, params.username);
|
|
54
|
+
resolve({ success: true, data: getAccountRequest });
|
|
55
|
+
} catch (err) {
|
|
56
|
+
if (err instanceof APIError) {
|
|
57
|
+
resolve({ success: false, reason: err.response });
|
|
58
|
+
} else {
|
|
59
|
+
reject(err);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
}
|
|
59
64
|
}
|
|
@@ -11,6 +11,7 @@ import { CMSServerManager } from './CMSServerManager';
|
|
|
11
11
|
export class CMSManager extends BaseManager {
|
|
12
12
|
public readonly ready: boolean = false;
|
|
13
13
|
public readonly version: CMSSubscriptionVersionEnum = 0;
|
|
14
|
+
public readonly failReason: unknown = null;
|
|
14
15
|
public rest: REST | undefined;
|
|
15
16
|
public servers: CMSServerManager | undefined;
|
|
16
17
|
|
|
@@ -22,21 +23,19 @@ export class CMSManager extends BaseManager {
|
|
|
22
23
|
}
|
|
23
24
|
|
|
24
25
|
protected async buildManager(instance: Instance) {
|
|
26
|
+
const mutableThis = this as globalTypes.Mutable<CMSManager>;
|
|
25
27
|
try {
|
|
26
28
|
const versionResp: any = await this.rest?.request('GET_SUB_VERSION');
|
|
27
29
|
const version = Number.parseInt(versionResp.replace(/(^\d+)(.+$)/i,'$1'));
|
|
28
|
-
const mutableThis = this as globalTypes.Mutable<CMSManager>;
|
|
29
30
|
if (version >= globalTypes.CMSSubscriptionVersionEnum.STANDARD) {
|
|
30
31
|
this.servers = new CMSServerManager(instance, this);
|
|
31
32
|
}
|
|
32
33
|
mutableThis.ready = true;
|
|
33
34
|
mutableThis.version = version;
|
|
34
|
-
console.log(mutableThis.version);
|
|
35
|
-
console.log(this.version);
|
|
36
|
-
console.log(version);
|
|
37
35
|
instance.isCMSSuccessful = true;
|
|
38
36
|
instance.emit('CMS_SETUP_SUCCESSFUL');
|
|
39
37
|
} catch (err) {
|
|
38
|
+
mutableThis.failReason = err;
|
|
40
39
|
instance.emit('CMS_SETUP_UNSUCCESSFUL', err);
|
|
41
40
|
throw err;
|
|
42
41
|
}
|