@sonoransoftware/sonoran.js 1.0.7 → 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.
@@ -110,6 +110,11 @@ class REST extends events_1.EventEmitter {
110
110
  remove: args[3],
111
111
  };
112
112
  }
113
+ case 'VERIFY_SECRET': {
114
+ return {
115
+ secret: args[0],
116
+ };
117
+ }
113
118
  default: {
114
119
  return args;
115
120
  }
@@ -87,6 +87,10 @@ class RequestManager extends events_1.EventEmitter {
87
87
  break;
88
88
  }
89
89
  case 'SET_API_ID': {
90
+ apiData.data.data = { secret: clonedData.data[0] };
91
+ break;
92
+ }
93
+ case 'VERIFY_SECRET': {
90
94
  apiData.data.data = clonedData.data;
91
95
  break;
92
96
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sonoransoftware/sonoran.js",
3
- "version": "1.0.7",
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",
@@ -215,6 +215,11 @@ export class REST extends EventEmitter {
215
215
  remove: args[3],
216
216
  };
217
217
  }
218
+ case 'VERIFY_SECRET': {
219
+ return {
220
+ secret: args[0],
221
+ };
222
+ }
218
223
  default: {
219
224
  return args;
220
225
  }
@@ -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 'NEW_RECORD': {
162
- apiData.data.data = clonedData.data;
163
- break;
164
- }
165
- case 'EDIT_RECORD': {
166
- apiData.data.data = clonedData.data;
167
- break;
168
- }
169
- case 'LOOKUP_INT': {
170
- apiData.data.data = clonedData.data;
171
- break;
172
- }
173
- case 'LOOKUP': {
174
- apiData.data.data = clonedData.data;
175
- break;
176
- }
177
- case 'SET_ACCOUNT_PERMISSIONS': {
178
- apiData.data.data = clonedData.data;
179
- break;
180
- }
181
- case 'BAN_USER': {
182
- apiData.data.data = clonedData.data;
183
- break;
184
- }
185
- case 'AUTH_STREETSIGNS': {
186
- apiData.data.data = clonedData;
187
- break;
188
- }
189
- case 'SET_POSTALS': {
190
- apiData.data.data = clonedData.data;
191
- break;
192
- }
193
- case 'NEW_CHARACTER': {
194
- apiData.data.data = clonedData.data;
195
- break;
196
- }
197
- case 'EDIT_CHARACTER': {
198
- apiData.data.data = clonedData.data;
199
- break;
200
- }
201
- case 'MODIFY_IDENTIFIER': {
202
- apiData.data.data = clonedData.data;
203
- break;
204
- }
205
- case 'ADD_BLIP': {
206
- apiData.data.data = clonedData.data;
207
- break;
208
- }
209
- case 'MODIFY_BLIP': {
210
- apiData.data.data = clonedData.data;
211
- break;
212
- }
213
- case 'GET_CALLS': {
214
- apiData.data.data = clonedData.data;
215
- break;
216
- }
217
- case 'GET_ACTIVE_UNITS': {
218
- apiData.data.data = clonedData.data;
219
- break;
220
- }
221
- case 'NEW_DISPATCH': {
222
- apiData.data.data = clonedData.data;
223
- break;
224
- }
225
- case 'UNIT_LOCATION': {
226
- apiData.data.data = clonedData.data;
227
- break;
228
- }
229
- default: {
230
- if (data.data) {
231
- if (Array.isArray(data.data)) {
232
- if (data.data.length > 0) {
233
- apiData.data.data = [ clonedData ];
234
- } else {
235
- apiData.data.data = [];
236
- }
237
- } else {
238
- apiData.data.data = [ clonedData ];
239
- }
240
- } else {
241
- apiData.data.data = [];
242
- }
243
- break;
244
- }
245
- }
246
- }
247
-
248
- apiData.fetchOptions.body = JSON.stringify(apiData.data);
249
- apiData.fetchOptions.headers = {
250
- 'Accept': 'application/json',
251
- 'Content-Type': 'application/json'
252
- };
253
-
254
- return apiData;
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
  }