@sonoransoftware/sonoran.js 1.0.0 → 1.0.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/.github/workflows/npm-publish.yml +34 -0
- package/dist/builders/cad/DispatchCall.d.ts +92 -0
- package/dist/builders/cad/DispatchCall.js +144 -0
- package/dist/builders/cad/index.d.ts +1 -0
- package/dist/builders/cad/index.js +17 -0
- package/dist/builders/index.d.ts +1 -0
- package/dist/builders/index.js +19 -0
- package/dist/constants.d.ts +174 -0
- package/dist/constants.js +27 -0
- package/dist/errors/LibraryErrors.d.ts +19 -0
- package/dist/errors/LibraryErrors.js +47 -0
- package/dist/errors/Messages.d.ts +1 -0
- package/dist/errors/Messages.js +8 -0
- package/dist/errors/index.d.ts +2 -0
- package/dist/errors/index.js +18 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +24 -0
- package/dist/instance/Instance.d.ts +23 -0
- package/dist/instance/Instance.js +135 -0
- package/dist/instance/instance.types.d.ts +16 -0
- package/dist/instance/instance.types.js +2 -0
- package/dist/libs/rest/src/index.d.ts +6 -0
- package/dist/libs/rest/src/index.js +22 -0
- package/dist/libs/rest/src/lib/REST.d.ts +99 -0
- package/dist/libs/rest/src/lib/REST.js +102 -0
- package/dist/libs/rest/src/lib/RequestManager.d.ts +58 -0
- package/dist/libs/rest/src/lib/RequestManager.js +190 -0
- package/dist/libs/rest/src/lib/errors/APIError.d.ts +9 -0
- package/dist/libs/rest/src/lib/errors/APIError.js +17 -0
- package/dist/libs/rest/src/lib/errors/HTTPError.d.ts +17 -0
- package/dist/libs/rest/src/lib/errors/HTTPError.js +23 -0
- package/dist/libs/rest/src/lib/errors/RateLimitError.d.ts +13 -0
- package/dist/libs/rest/src/lib/errors/RateLimitError.js +19 -0
- package/dist/libs/rest/src/lib/errors/index.d.ts +4 -0
- package/dist/libs/rest/src/lib/errors/index.js +20 -0
- package/dist/libs/rest/src/lib/handlers/IHandler.d.ts +7 -0
- package/dist/libs/rest/src/lib/handlers/IHandler.js +2 -0
- package/dist/libs/rest/src/lib/handlers/SequentialHandler.d.ts +45 -0
- package/dist/libs/rest/src/lib/handlers/SequentialHandler.js +143 -0
- package/dist/libs/rest/src/lib/utils/Utils.d.ts +1 -0
- package/dist/libs/rest/src/lib/utils/Utils.js +22 -0
- package/dist/libs/rest/src/lib/utils/constants.d.ts +501 -0
- package/dist/libs/rest/src/lib/utils/constants.js +423 -0
- package/dist/managers/BaseManager.d.ts +14 -0
- package/dist/managers/BaseManager.js +18 -0
- package/dist/managers/CADActiveUnitsManager.d.ts +15 -0
- package/dist/managers/CADActiveUnitsManager.js +38 -0
- package/dist/managers/CADManager.d.ts +27 -0
- package/dist/managers/CADManager.js +81 -0
- package/dist/managers/CADServerManager.d.ts +8 -0
- package/dist/managers/CADServerManager.js +28 -0
- package/dist/managers/CMSManager.d.ts +81 -0
- package/dist/managers/CMSManager.js +212 -0
- package/dist/managers/CMSServerManager.d.ts +8 -0
- package/dist/managers/CMSServerManager.js +28 -0
- package/dist/managers/CacheManager.d.ts +10 -0
- package/dist/managers/CacheManager.js +39 -0
- package/dist/managers/DataManager.d.ts +31 -0
- package/dist/managers/DataManager.js +61 -0
- package/dist/structures/Base.d.ts +9 -0
- package/dist/structures/Base.js +24 -0
- package/dist/structures/CADActiveUnit.d.ts +47 -0
- package/dist/structures/CADActiveUnit.js +66 -0
- package/dist/structures/CADServer.d.ts +26 -0
- package/dist/structures/CADServer.js +15 -0
- package/dist/structures/CMSServer.d.ts +18 -0
- package/dist/structures/CMSServer.js +12 -0
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.js +17 -0
- package/dist/utils/utils.d.ts +13 -0
- package/dist/utils/utils.js +82 -0
- package/package.json +48 -42
- package/src/constants.ts +27 -10
- package/src/index.ts +1 -9
- package/src/instance/Instance.ts +2 -2
- package/src/libs/rest/src/lib/REST.ts +7 -2
- package/src/libs/rest/src/lib/RequestManager.ts +2 -2
- package/src/libs/rest/src/lib/handlers/SequentialHandler.ts +1 -0
- package/src/libs/rest/src/lib/utils/constants.ts +21 -1
- package/src/managers/BaseManager.ts +1 -1
- package/src/managers/CADActiveUnitsManager.ts +1 -1
- package/src/managers/CADManager.ts +2 -1
- package/src/managers/CADServerManager.ts +1 -1
- package/src/managers/CMSManager.ts +49 -3
- package/src/managers/CMSServerManager.ts +1 -1
- package/src/managers/CacheManager.ts +1 -1
- package/src/managers/DataManager.ts +1 -1
- package/src/structures/Base.ts +1 -1
- package/src/structures/CADActiveUnit.ts +1 -1
- package/src/structures/CADServer.ts +1 -1
- package/src/structures/CMSServer.ts +1 -1
- package/tsconfig.json +4 -4
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Represents a HTTP error
|
|
3
|
+
*/
|
|
4
|
+
export declare class HTTPError extends Error {
|
|
5
|
+
name: string;
|
|
6
|
+
status: number;
|
|
7
|
+
method: string;
|
|
8
|
+
url: string;
|
|
9
|
+
/**
|
|
10
|
+
* @param message The error message
|
|
11
|
+
* @param name The name of the error
|
|
12
|
+
* @param status The status code of the response
|
|
13
|
+
* @param method The method of the request that erred
|
|
14
|
+
* @param url The url of the request that erred
|
|
15
|
+
*/
|
|
16
|
+
constructor(message: string, name: string, status: number, method: string, url: string);
|
|
17
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.HTTPError = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Represents a HTTP error
|
|
6
|
+
*/
|
|
7
|
+
class HTTPError extends Error {
|
|
8
|
+
/**
|
|
9
|
+
* @param message The error message
|
|
10
|
+
* @param name The name of the error
|
|
11
|
+
* @param status The status code of the response
|
|
12
|
+
* @param method The method of the request that erred
|
|
13
|
+
* @param url The url of the request that erred
|
|
14
|
+
*/
|
|
15
|
+
constructor(message, name, status, method, url) {
|
|
16
|
+
super(message);
|
|
17
|
+
this.name = name;
|
|
18
|
+
this.status = status;
|
|
19
|
+
this.method = method;
|
|
20
|
+
this.url = url;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
exports.HTTPError = HTTPError;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import type { RateLimitData } from '../REST';
|
|
3
|
+
import { productEnums } from '../../../../../constants';
|
|
4
|
+
export declare class RateLimitError extends Error implements RateLimitData {
|
|
5
|
+
product: productEnums;
|
|
6
|
+
type: string;
|
|
7
|
+
timeTill: NodeJS.Timer;
|
|
8
|
+
constructor({ product, type, timeTill }: RateLimitData);
|
|
9
|
+
/**
|
|
10
|
+
* The name of the error
|
|
11
|
+
*/
|
|
12
|
+
get name(): string;
|
|
13
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RateLimitError = void 0;
|
|
4
|
+
const constants_1 = require("../../../../../constants");
|
|
5
|
+
class RateLimitError extends Error {
|
|
6
|
+
constructor({ product, type, timeTill }) {
|
|
7
|
+
super();
|
|
8
|
+
this.product = product;
|
|
9
|
+
this.type = type;
|
|
10
|
+
this.timeTill = timeTill;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* The name of the error
|
|
14
|
+
*/
|
|
15
|
+
get name() {
|
|
16
|
+
return `Ratelimit Hit - [${this.product === constants_1.productEnums.CAD ? 'Sonoran CAD' : this.product === constants_1.productEnums.CMS ? 'Sonoran CMS' : 'Invalid Product'} '${this.type}']`;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
exports.RateLimitError = RateLimitError;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./APIError"), exports);
|
|
18
|
+
__exportStar(require("./APIError"), exports);
|
|
19
|
+
__exportStar(require("./HTTPError"), exports);
|
|
20
|
+
__exportStar(require("./RateLimitError"), exports);
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { RequestInit } from 'node-fetch';
|
|
2
|
+
import type { APIData } from '../RequestManager';
|
|
3
|
+
export interface IHandler {
|
|
4
|
+
queueRequest: (url: string, options: RequestInit, data: APIData) => Promise<unknown>;
|
|
5
|
+
get inactive(): boolean;
|
|
6
|
+
readonly id: string;
|
|
7
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { RequestInit } from 'node-fetch';
|
|
2
|
+
import type { RequestManager, APIData } from '../RequestManager';
|
|
3
|
+
import type { IHandler } from './IHandler';
|
|
4
|
+
export declare class SequentialHandler implements IHandler {
|
|
5
|
+
#private;
|
|
6
|
+
private readonly manager;
|
|
7
|
+
private readonly data;
|
|
8
|
+
/**
|
|
9
|
+
* The unique id of the handler
|
|
10
|
+
*/
|
|
11
|
+
readonly id: string;
|
|
12
|
+
/**
|
|
13
|
+
* @param manager The request manager
|
|
14
|
+
* @param hash The hash that this RequestHandler handles
|
|
15
|
+
* @param majorParameter The major parameter for this handler
|
|
16
|
+
*/
|
|
17
|
+
constructor(manager: RequestManager, data: APIData);
|
|
18
|
+
/**
|
|
19
|
+
* If the bucket is currently inactive (no pending requests)
|
|
20
|
+
*/
|
|
21
|
+
get inactive(): boolean;
|
|
22
|
+
getMang(): RequestManager;
|
|
23
|
+
/**
|
|
24
|
+
* Emits a debug message
|
|
25
|
+
* @param message The message to debug
|
|
26
|
+
*/
|
|
27
|
+
/**
|
|
28
|
+
* Queues a request to be sent
|
|
29
|
+
* @param routeId The generalized api route with literal ids for major parameters
|
|
30
|
+
* @param url The url to do the request on
|
|
31
|
+
* @param options All the information needed to make a request
|
|
32
|
+
* @param requestData Extra data from the user's request needed for errors and additional processing
|
|
33
|
+
*/
|
|
34
|
+
queueRequest(url: string, options: RequestInit, data: APIData): Promise<unknown>;
|
|
35
|
+
/**
|
|
36
|
+
* The method that actually makes the request to the api, and updates info about the bucket accordingly
|
|
37
|
+
* @param routeId The generalized api route with literal ids for major parameters
|
|
38
|
+
* @param url The fully resolved url to make the request to
|
|
39
|
+
* @param options The node-fetch options needed to make the request
|
|
40
|
+
* @param requestData Extra data from the user's request needed for errors and additional processing
|
|
41
|
+
* @param retries The number of retries this request has already attempted (recursion)
|
|
42
|
+
*/
|
|
43
|
+
private runRequest;
|
|
44
|
+
private static parseResponse;
|
|
45
|
+
}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
3
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
4
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
5
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
6
|
+
};
|
|
7
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
8
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
9
|
+
};
|
|
10
|
+
var _SequentialHandler_asyncQueue;
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.SequentialHandler = void 0;
|
|
13
|
+
// import { setTimeout as sleep } from 'node:timers/promises';
|
|
14
|
+
const async_queue_1 = require("@sapphire/async-queue");
|
|
15
|
+
const node_fetch_1 = __importDefault(require("node-fetch"));
|
|
16
|
+
const node_abort_controller_1 = require("node-abort-controller");
|
|
17
|
+
// import { DiscordAPIError, DiscordErrorData, OAuthErrorData } from '../errors/DiscordAPIError';
|
|
18
|
+
const errors_1 = require("../errors");
|
|
19
|
+
const HTTPError_1 = require("../errors/HTTPError");
|
|
20
|
+
class SequentialHandler {
|
|
21
|
+
/**
|
|
22
|
+
* @param manager The request manager
|
|
23
|
+
* @param hash The hash that this RequestHandler handles
|
|
24
|
+
* @param majorParameter The major parameter for this handler
|
|
25
|
+
*/
|
|
26
|
+
constructor(manager, data) {
|
|
27
|
+
this.manager = manager;
|
|
28
|
+
this.data = data;
|
|
29
|
+
/**
|
|
30
|
+
* The total number of requests that can be made before we are rate limited
|
|
31
|
+
*/
|
|
32
|
+
// private limit = Infinity;
|
|
33
|
+
/**
|
|
34
|
+
* The interface used to sequence async requests sequentially
|
|
35
|
+
*/
|
|
36
|
+
// eslint-disable-next-line @typescript-eslint/explicit-member-accessibility
|
|
37
|
+
_SequentialHandler_asyncQueue.set(this, new async_queue_1.AsyncQueue());
|
|
38
|
+
this.id = `${this.data.typePath}:${String(this.data.product)}`;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* If the bucket is currently inactive (no pending requests)
|
|
42
|
+
*/
|
|
43
|
+
get inactive() {
|
|
44
|
+
return (__classPrivateFieldGet(this, _SequentialHandler_asyncQueue, "f").remaining === 0);
|
|
45
|
+
}
|
|
46
|
+
getMang() {
|
|
47
|
+
return this.manager;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Emits a debug message
|
|
51
|
+
* @param message The message to debug
|
|
52
|
+
*/
|
|
53
|
+
// private debug(message: string) {
|
|
54
|
+
// this.manager.emit(RESTEvents.Debug, `[REST ${this.id}] ${message}`);
|
|
55
|
+
// }
|
|
56
|
+
/*
|
|
57
|
+
* Determines whether the request should be queued or whether a RateLimitError should be thrown
|
|
58
|
+
*/
|
|
59
|
+
// private async onRateLimit(rateLimitData: RateLimitData) {
|
|
60
|
+
// const { options } = this.manager;
|
|
61
|
+
// if (options.rejectOnRateLimit) {
|
|
62
|
+
// throw new RateLimitError(rateLimitData);
|
|
63
|
+
// }
|
|
64
|
+
// }
|
|
65
|
+
/**
|
|
66
|
+
* Queues a request to be sent
|
|
67
|
+
* @param routeId The generalized api route with literal ids for major parameters
|
|
68
|
+
* @param url The url to do the request on
|
|
69
|
+
* @param options All the information needed to make a request
|
|
70
|
+
* @param requestData Extra data from the user's request needed for errors and additional processing
|
|
71
|
+
*/
|
|
72
|
+
async queueRequest(url, options, data) {
|
|
73
|
+
let queue = __classPrivateFieldGet(this, _SequentialHandler_asyncQueue, "f");
|
|
74
|
+
// Wait for any previous requests to be completed before this one is run
|
|
75
|
+
await queue.wait();
|
|
76
|
+
try {
|
|
77
|
+
// Make the request, and return the results
|
|
78
|
+
return await this.runRequest(url, options, data);
|
|
79
|
+
}
|
|
80
|
+
finally {
|
|
81
|
+
// Allow the next request to fire
|
|
82
|
+
queue.shift();
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* The method that actually makes the request to the api, and updates info about the bucket accordingly
|
|
87
|
+
* @param routeId The generalized api route with literal ids for major parameters
|
|
88
|
+
* @param url The fully resolved url to make the request to
|
|
89
|
+
* @param options The node-fetch options needed to make the request
|
|
90
|
+
* @param requestData Extra data from the user's request needed for errors and additional processing
|
|
91
|
+
* @param retries The number of retries this request has already attempted (recursion)
|
|
92
|
+
*/
|
|
93
|
+
async runRequest(url, options, data) {
|
|
94
|
+
const controller = new node_abort_controller_1.AbortController();
|
|
95
|
+
const timeout = setTimeout(() => controller.abort(), 30000).unref();
|
|
96
|
+
let res;
|
|
97
|
+
try {
|
|
98
|
+
// node-fetch typings are a bit weird, so we have to cast to any to get the correct signature
|
|
99
|
+
// Type 'AbortSignal' is not assignable to type 'import('discord.js-modules/node_modules/@types/node-fetch/externals').AbortSignal'
|
|
100
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
101
|
+
res = await (0, node_fetch_1.default)(url, { ...options, signal: controller.signal });
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
throw error;
|
|
105
|
+
}
|
|
106
|
+
finally {
|
|
107
|
+
clearTimeout(timeout);
|
|
108
|
+
}
|
|
109
|
+
if (res.ok) {
|
|
110
|
+
const parsedRes = await SequentialHandler.parseResponse(res);
|
|
111
|
+
return parsedRes;
|
|
112
|
+
}
|
|
113
|
+
else if (res.status === 400 || res.status === 401 || res.status === 404) {
|
|
114
|
+
const parsedRes = await SequentialHandler.parseResponse(res);
|
|
115
|
+
// throw new HTTPError(String(parsedRes), res.constructor.name, res.status, data.method, url);
|
|
116
|
+
throw new errors_1.APIError(parsedRes, data.type, data.fullUrl, res.status, data);
|
|
117
|
+
}
|
|
118
|
+
else if (res.status === 429) {
|
|
119
|
+
const timeout = setTimeout(() => {
|
|
120
|
+
this.manager.removeRateLimit(data.requestTypeId);
|
|
121
|
+
}, 60 * 1000);
|
|
122
|
+
const ratelimitData = {
|
|
123
|
+
product: data.product,
|
|
124
|
+
type: data.type,
|
|
125
|
+
timeTill: timeout
|
|
126
|
+
};
|
|
127
|
+
this.manager.onRateLimit(data.requestTypeId, ratelimitData);
|
|
128
|
+
}
|
|
129
|
+
else if (res.status >= 500 && res.status < 600) {
|
|
130
|
+
throw new HTTPError_1.HTTPError(res.statusText, res.constructor.name, res.status, data.method, url);
|
|
131
|
+
}
|
|
132
|
+
return null;
|
|
133
|
+
}
|
|
134
|
+
static parseResponse(res) {
|
|
135
|
+
var _a;
|
|
136
|
+
if ((_a = res.headers.get('Content-Type')) === null || _a === void 0 ? void 0 : _a.startsWith('application/json')) {
|
|
137
|
+
return res.json();
|
|
138
|
+
}
|
|
139
|
+
return res.text();
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
exports.SequentialHandler = SequentialHandler;
|
|
143
|
+
_SequentialHandler_asyncQueue = new WeakMap();
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function convertSubNumToName(subLevel: number): "FREE" | "STARTER" | "STANDARD" | "PLUS" | "PRO" | "ONE";
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.convertSubNumToName = void 0;
|
|
4
|
+
function convertSubNumToName(subLevel) {
|
|
5
|
+
switch (subLevel) {
|
|
6
|
+
case 0:
|
|
7
|
+
return 'FREE';
|
|
8
|
+
case 1:
|
|
9
|
+
return 'STARTER';
|
|
10
|
+
case 2:
|
|
11
|
+
return 'STANDARD';
|
|
12
|
+
case 3:
|
|
13
|
+
return 'PLUS';
|
|
14
|
+
case 4:
|
|
15
|
+
return 'PRO';
|
|
16
|
+
case 6:
|
|
17
|
+
return 'ONE';
|
|
18
|
+
default:
|
|
19
|
+
return 'FREE';
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
exports.convertSubNumToName = convertSubNumToName;
|