dfx 0.13.3 → 0.13.4
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/DiscordREST/index.js +83 -48
- package/DiscordREST/index.js.map +1 -1
- package/global.d.ts +4 -0
- package/package.json +2 -2
package/DiscordREST/index.js
CHANGED
|
@@ -1,55 +1,90 @@
|
|
|
1
1
|
import * as tsplus_module_1 from "@effect/io/Effect";
|
|
2
|
-
import * as tsplus_module_2 from "
|
|
3
|
-
import * as tsplus_module_3 from "@fp-ts/data/
|
|
4
|
-
import * as tsplus_module_4 from "
|
|
5
|
-
import * as tsplus_module_5 from "@
|
|
2
|
+
import * as tsplus_module_2 from "@fp-ts/data/Duration";
|
|
3
|
+
import * as tsplus_module_3 from "@fp-ts/data/Option";
|
|
4
|
+
import * as tsplus_module_4 from "dfx/common";
|
|
5
|
+
import * as tsplus_module_5 from "@fp-ts/data/HashSet";
|
|
6
|
+
import * as tsplus_module_6 from "@effect/io/Ref";
|
|
7
|
+
import * as tsplus_module_7 from "@effect/io/Layer";
|
|
6
8
|
import { millis } from "@fp-ts/data/Duration";
|
|
7
|
-
import { rateLimitFromHeaders, routeFromConfig } from "./utils.js";
|
|
9
|
+
import { rateLimitFromHeaders, routeFromConfig, retryAfter } from "./utils.js";
|
|
8
10
|
import Pkg from "../package.json" assert { type: "json" };
|
|
9
|
-
const make = tsplus_module_1.flatMap(({ token, rest }) => tsplus_module_1.flatMap(log => tsplus_module_1.flatMap(store => tsplus_module_1.
|
|
11
|
+
const make = tsplus_module_1.flatMap(({ token, rest }) => tsplus_module_1.flatMap(log => tsplus_module_1.flatMap(store => tsplus_module_1.flatMap(({ maybeWait }) => {
|
|
10
12
|
const globalRateLimit = maybeWait("rest.global", rest.globalRateLimit.window, rest.globalRateLimit.limit);
|
|
11
|
-
|
|
12
|
-
const
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
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
|
-
|
|
13
|
+
return tsplus_module_1.map(badRoutesRef => {
|
|
14
|
+
const addBadRoute = (route) => tsplus_module_1.collectAllParDiscard([
|
|
15
|
+
log.info("DiscordREST", "addBadRoute", route),
|
|
16
|
+
tsplus_module_6.update((s) => tsplus_module_5.add(route)(s))(badRoutesRef),
|
|
17
|
+
store.incrementCounter("rest.invalid", tsplus_module_2.minutes(10).millis, 10000),
|
|
18
|
+
]);
|
|
19
|
+
const isBadRoute = (route) => tsplus_module_1.map((s) => tsplus_module_5.has(route)(s))(tsplus_module_6.get(badRoutesRef));
|
|
20
|
+
const removeBadRoute = (route) => tsplus_module_6.update((s) => tsplus_module_5.remove(route)(s))(badRoutesRef);
|
|
21
|
+
const invalidRateLimit = (route) => tsplus_module_1.asUnit(tsplus_module_1.tap((invalid) => invalid
|
|
22
|
+
? maybeWait("rest.invalid", tsplus_module_2.minutes(10), 10000)
|
|
23
|
+
: tsplus_module_1.unit())(isBadRoute(route)));
|
|
24
|
+
// Request rate limiting
|
|
25
|
+
const requestRateLimit = (path, init) => (() => {
|
|
26
|
+
const route = routeFromConfig(path, init);
|
|
27
|
+
return tsplus_module_1.flatMap(maybeBucket => {
|
|
28
|
+
const bucket = tsplus_module_3.getOrElse(() => ({
|
|
29
|
+
key: `?.${route}`,
|
|
30
|
+
resetAfter: 5000,
|
|
31
|
+
limit: 1,
|
|
32
|
+
}))(maybeBucket);
|
|
33
|
+
const resetAfter = millis(bucket.resetAfter);
|
|
34
|
+
return tsplus_module_1.flatMap(() => tsplus_module_1.map(() => void 0)(maybeWait(`rest.bucket.${bucket.key}`, resetAfter, bucket.limit)))(invalidRateLimit(route));
|
|
35
|
+
})(store.getBucketForRoute(route));
|
|
36
|
+
})();
|
|
37
|
+
// Update rate limit buckets
|
|
38
|
+
const updateBuckets = (path, init, response) => tsplus_module_1.ignore((() => {
|
|
39
|
+
const route = routeFromConfig(path, init);
|
|
40
|
+
return tsplus_module_1.flatMap(({ bucket, retryAfter, limit, remaining }) => {
|
|
41
|
+
const effectsToRun = [
|
|
42
|
+
removeBadRoute(route),
|
|
43
|
+
store.putBucketRoute(route, bucket),
|
|
44
|
+
];
|
|
45
|
+
return tsplus_module_1.flatMap(hasBucket => {
|
|
46
|
+
if (!hasBucket || limit - 1 === remaining) {
|
|
47
|
+
effectsToRun.push(store.putBucket({
|
|
48
|
+
key: bucket,
|
|
49
|
+
resetAfter: retryAfter.millis,
|
|
50
|
+
limit: !hasBucket && remaining > 0 ? remaining : limit,
|
|
51
|
+
}));
|
|
52
|
+
}
|
|
53
|
+
return tsplus_module_1.map(() => void 0)(tsplus_module_1.collectAllParDiscard(effectsToRun));
|
|
54
|
+
})(store.hasBucket(bucket));
|
|
55
|
+
})(tsplus_module_1.fromOption(rateLimitFromHeaders(response.headers)));
|
|
56
|
+
})());
|
|
57
|
+
const request = (path, init = {}) => tsplus_module_1.catchTag("StatusCodeError", (e) => {
|
|
58
|
+
switch (e.code) {
|
|
59
|
+
case 403:
|
|
60
|
+
return tsplus_module_1.flatMap(() => tsplus_module_1.fail(e))(tsplus_module_1.collectAllParDiscard([
|
|
61
|
+
log.info("DiscordREST", "403", path),
|
|
62
|
+
addBadRoute(routeFromConfig(path, init)),
|
|
63
|
+
updateBuckets(path, init, e.response),
|
|
64
|
+
]));
|
|
65
|
+
case 429:
|
|
66
|
+
return tsplus_module_1.flatMap(() => request(path, init))(tsplus_module_1.collectAllParDiscard([
|
|
67
|
+
log.info("DiscordREST", "429", path),
|
|
68
|
+
addBadRoute(routeFromConfig(path, init)),
|
|
69
|
+
updateBuckets(path, init, e.response),
|
|
70
|
+
tsplus_module_1.sleep(tsplus_module_3.getOrElse(() => tsplus_module_2.seconds(5))(retryAfter(e.response.headers))),
|
|
71
|
+
]));
|
|
72
|
+
}
|
|
73
|
+
return tsplus_module_1.fail(e);
|
|
74
|
+
})(tsplus_module_1.flatMap(() => tsplus_module_1.flatMap(() => tsplus_module_1.flatMap(response => tsplus_module_1.map(() => response)(updateBuckets(path, init, response.response)))(tsplus_module_4.Http.requestWithJson(`${rest.baseUrl}${path}`, {
|
|
75
|
+
...init,
|
|
76
|
+
headers: {
|
|
77
|
+
...(init?.headers ?? {}),
|
|
78
|
+
Authorization: `Bot ${token}`,
|
|
79
|
+
"User-Agent": `DiscordBot (https://github.com/tim-smart/dfx, ${Pkg.version})`,
|
|
80
|
+
},
|
|
81
|
+
})))(globalRateLimit))(requestRateLimit(path, init)));
|
|
82
|
+
return { request };
|
|
83
|
+
})(tsplus_module_6.make(tsplus_module_5.empty()));
|
|
84
|
+
})(tsplus_module_1.service(tsplus_module_4.RateLimitStore.RateLimiter)))(tsplus_module_1.service(tsplus_module_4.RateLimitStore.RateLimitStore)))(tsplus_module_1.service(tsplus_module_4.Log.Log)))(tsplus_module_1.service(tsplus_module_4.Config.DiscordConfig));
|
|
85
|
+
export const DiscordREST = tsplus_module_4.Tag();
|
|
86
|
+
export const LiveDiscordREST = tsplus_module_7.fromEffect(DiscordREST)(make);
|
|
87
|
+
export const rest = tsplus_module_4.Discord.createRoutes(({ method, url, params, options = {} }) => tsplus_module_1.serviceWithEffect(DiscordREST)(({ request }) => {
|
|
53
88
|
const hasBody = method !== "GET" && method !== "DELETE";
|
|
54
89
|
let hasFormData = typeof options?.body?.append === "function";
|
|
55
90
|
let body = undefined;
|
package/DiscordREST/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/DiscordREST/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/DiscordREST/index.ts"],"names":[],"mappings":"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"}
|
package/global.d.ts
CHANGED
|
@@ -2,6 +2,10 @@
|
|
|
2
2
|
* @tsplus global
|
|
3
3
|
*/
|
|
4
4
|
import type { Effect, Layer, Either, Maybe, Tag, Context, Cause, Chunk, Duration, Equal, Exit, HashMap, Schedule, EffectSource, EffectSink, Ref, Config, Discord, Http, Log, RateLimitStore, Rest, Ix, Flags, Intents, IxHelpers, Members, Perms, UI, } from "dfx/common";
|
|
5
|
+
/**
|
|
6
|
+
* @tsplus global
|
|
7
|
+
*/
|
|
8
|
+
import type { HashSet } from "@fp-ts/data/HashSet";
|
|
5
9
|
/**
|
|
6
10
|
* @tsplus global
|
|
7
11
|
*/
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dfx",
|
|
3
|
-
"version": "0.13.
|
|
3
|
+
"version": "0.13.4",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public",
|
|
@@ -47,5 +47,5 @@
|
|
|
47
47
|
"@fp-ts/data": "^0.0.20"
|
|
48
48
|
}
|
|
49
49
|
},
|
|
50
|
-
"gitHead": "
|
|
50
|
+
"gitHead": "52183dc6a3fa7e607aa464bda65b81fa3db1f951"
|
|
51
51
|
}
|