dfx 0.0.3 → 0.1.0

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.
Files changed (115) hide show
  1. package/DiscordConfig/index.d.ts +29 -0
  2. package/DiscordConfig/index.js +31 -0
  3. package/DiscordConfig/index.js.map +1 -0
  4. package/DiscordConfig/index.ts +45 -0
  5. package/DiscordGateway/index.d.ts +23 -0
  6. package/DiscordGateway/index.js +25 -0
  7. package/DiscordGateway/index.js.map +1 -0
  8. package/DiscordGateway/index.ts +34 -0
  9. package/DiscordGateway/utils.d.ts +3 -0
  10. package/DiscordGateway/utils.js +12 -0
  11. package/DiscordGateway/utils.js.map +1 -0
  12. package/DiscordGateway/utils.ts +17 -0
  13. package/DiscordREST/http.d.ts +3 -0
  14. package/DiscordREST/http.js +20 -0
  15. package/DiscordREST/http.js.map +1 -0
  16. package/DiscordREST/http.ts +21 -0
  17. package/DiscordREST/index.d.ts +11 -0
  18. package/DiscordREST/index.js +65 -0
  19. package/DiscordREST/index.js.map +1 -0
  20. package/DiscordREST/index.ts +83 -0
  21. package/DiscordREST/types.d.ts +12 -0
  22. package/DiscordREST/types.ts +9 -1
  23. package/DiscordShard/commands.d.ts +7 -0
  24. package/DiscordShard/commands.js +38 -0
  25. package/DiscordShard/commands.js.map +1 -0
  26. package/DiscordShard/commands.ts +40 -0
  27. package/DiscordShard/heartbeats.d.ts +6 -0
  28. package/DiscordShard/heartbeats.js +29 -0
  29. package/DiscordShard/heartbeats.js.map +1 -0
  30. package/DiscordShard/heartbeats.ts +65 -0
  31. package/DiscordShard/identify.d.ts +15 -0
  32. package/DiscordShard/identify.js +35 -0
  33. package/DiscordShard/identify.js.map +1 -0
  34. package/DiscordShard/identify.ts +75 -0
  35. package/DiscordShard/index.d.ts +32 -0
  36. package/DiscordShard/index.js +63 -0
  37. package/DiscordShard/index.js.map +1 -0
  38. package/DiscordShard/index.ts +122 -0
  39. package/DiscordShard/invalidSession.d.ts +6 -0
  40. package/DiscordShard/invalidSession.js +17 -0
  41. package/DiscordShard/invalidSession.js.map +1 -0
  42. package/DiscordShard/invalidSession.ts +24 -0
  43. package/DiscordShard/utils.d.ts +7 -0
  44. package/DiscordShard/utils.js +17 -0
  45. package/DiscordShard/utils.js.map +1 -0
  46. package/DiscordShard/utils.ts +32 -0
  47. package/DiscordWS/index.d.ts +33 -0
  48. package/DiscordWS/index.js +37 -0
  49. package/DiscordWS/index.js.map +1 -1
  50. package/DiscordWS/index.ts +76 -0
  51. package/Log/index.d.ts +15 -0
  52. package/Log/index.js +28 -0
  53. package/Log/index.js.map +1 -0
  54. package/Log/index.ts +30 -0
  55. package/Utils/memoize.d.ts +3 -0
  56. package/Utils/memoize.js +16 -0
  57. package/Utils/memoize.js.map +1 -0
  58. package/Utils/memoize.ts +15 -0
  59. package/WS/index.d.ts +30 -0
  60. package/WS/index.js +19 -20
  61. package/WS/index.js.map +1 -1
  62. package/WS/index.ts +42 -51
  63. package/bot.d.ts +1 -0
  64. package/bot.js +28 -0
  65. package/bot.js.map +1 -0
  66. package/bot.ts +50 -0
  67. package/esm/DiscordConfig/index.js +26 -0
  68. package/esm/DiscordConfig/index.js.map +1 -0
  69. package/esm/DiscordGateway/index.js +20 -0
  70. package/esm/DiscordGateway/index.js.map +1 -0
  71. package/esm/DiscordGateway/utils.js +7 -0
  72. package/esm/DiscordGateway/utils.js.map +1 -0
  73. package/esm/DiscordREST/http.js +15 -0
  74. package/esm/DiscordREST/http.js.map +1 -0
  75. package/esm/DiscordREST/index.js +61 -0
  76. package/esm/DiscordREST/index.js.map +1 -0
  77. package/esm/DiscordREST/types.js +3 -0
  78. package/esm/DiscordREST/types.js.map +1 -0
  79. package/esm/DiscordShard/commands.js +28 -0
  80. package/esm/DiscordShard/commands.js.map +1 -0
  81. package/esm/DiscordShard/heartbeats.js +24 -0
  82. package/esm/DiscordShard/heartbeats.js.map +1 -0
  83. package/esm/DiscordShard/identify.js +30 -0
  84. package/esm/DiscordShard/identify.js.map +1 -0
  85. package/esm/DiscordShard/index.js +58 -0
  86. package/esm/DiscordShard/index.js.map +1 -0
  87. package/esm/DiscordShard/invalidSession.js +12 -0
  88. package/esm/DiscordShard/invalidSession.js.map +1 -0
  89. package/esm/DiscordShard/utils.js +11 -0
  90. package/esm/DiscordShard/utils.js.map +1 -0
  91. package/esm/DiscordWS/index.js +34 -0
  92. package/esm/DiscordWS/index.js.map +1 -0
  93. package/esm/Log/index.js +22 -0
  94. package/esm/Log/index.js.map +1 -0
  95. package/esm/Utils/memoize.js +12 -0
  96. package/esm/Utils/memoize.js.map +1 -0
  97. package/esm/WS/index.js +65 -0
  98. package/esm/WS/index.js.map +1 -0
  99. package/esm/bot.js +25 -0
  100. package/esm/bot.js.map +1 -0
  101. package/esm/mod.js +16 -0
  102. package/esm/mod.js.map +1 -0
  103. package/esm/types.js +1559 -0
  104. package/esm/types.js.map +1 -0
  105. package/mod.d.ts +7 -0
  106. package/mod.js +18 -7
  107. package/mod.js.map +1 -1
  108. package/mod.ts +17 -22
  109. package/package.json +39 -6
  110. package/types.d.ts +3598 -0
  111. package/types.js +2 -1
  112. package/types.js.map +1 -1
  113. package/types.ts +170 -149
  114. package/websocket.js +0 -11
  115. package/websocket.js.map +0 -1
@@ -0,0 +1,76 @@
1
+ import * as T from "@effect-ts/core/Effect"
2
+ import * as L from "@effect-ts/core/Effect/Layer"
3
+ import * as Q from "@effect-ts/core/Effect/Queue"
4
+ import * as SC from "@effect-ts/core/Effect/Schedule"
5
+ import { pipe } from "@effect-ts/core/Function"
6
+ import { tag } from "@effect-ts/core/Has"
7
+ import * as CB from "callbag-effect-ts"
8
+ import { RawData } from "ws"
9
+ import { log } from "../Log"
10
+ import { GatewayPayload } from "../types"
11
+ import * as WS from "../WS"
12
+
13
+ export type Message = GatewayPayload | WS.Reconnect
14
+
15
+ export interface OpenOpts {
16
+ url?: string
17
+ version?: number
18
+ encoding?: Encoding
19
+ outgoingQueue: Q.Queue<Message>
20
+ }
21
+
22
+ export interface Encoding {
23
+ type: "json" | "etf"
24
+ encode: (p: GatewayPayload) => string | Buffer | ArrayBuffer
25
+ decode: (p: RawData) => GatewayPayload
26
+ }
27
+
28
+ export const jsonEncoding: Encoding = {
29
+ type: "json",
30
+ encode: (p) => JSON.stringify(p),
31
+ decode: (p) => JSON.parse(p.toString("utf8")),
32
+ }
33
+
34
+ const makeOutgoing = (q: Q.Queue<Message>, e: Encoding): WS.OutboundQueue =>
35
+ Q.map_(q, (data): WS.Message => {
36
+ if (data === WS.Reconnect) {
37
+ return data
38
+ }
39
+
40
+ return e.encode(data)
41
+ })
42
+
43
+ const openImpl = ({
44
+ url = "wss://gateway.discord.gg/",
45
+ version = 9,
46
+ encoding = jsonEncoding,
47
+ outgoingQueue: outgoing,
48
+ }: OpenOpts) =>
49
+ pipe(
50
+ WS.open(
51
+ `${url}?v=${version}&encoding=${encoding.type}`,
52
+ makeOutgoing(outgoing, encoding),
53
+ ),
54
+ CB.unwrap,
55
+ CB.tapError((e) => log(serviceTag, "error", e)),
56
+ CB.retry(SC.exponential(500)),
57
+ CB.map(encoding.decode),
58
+ )
59
+
60
+ export type Connection = ReturnType<typeof openImpl>
61
+
62
+ // Service definition
63
+ const serviceTag = "DiscordWSService" as const
64
+ const makeService = () =>
65
+ ({
66
+ _tag: serviceTag,
67
+ open: openImpl,
68
+ } as const)
69
+
70
+ export interface DiscordWS extends ReturnType<typeof makeService> {}
71
+ export const DiscordWS = tag<DiscordWS>()
72
+ export const LiveDiscordWS = L.fromFunction(DiscordWS)(makeService)
73
+
74
+ // Helpers
75
+ export const open = (opts: OpenOpts) =>
76
+ T.accessService(DiscordWS)(({ open }) => open(opts))
package/Log/index.d.ts ADDED
@@ -0,0 +1,15 @@
1
+ import * as L from "@effect-ts/core/Effect/Layer";
2
+ import * as T from "@effect-ts/core/Effect";
3
+ declare const make: (debug?: boolean) => {
4
+ readonly _tag: "LogService";
5
+ readonly log: (...args: any[]) => T.UIO<void>;
6
+ readonly debug: (...args: any[]) => T.UIO<void>;
7
+ };
8
+ export interface Log extends ReturnType<typeof make> {
9
+ }
10
+ export declare const Log: import("@effect-ts/system/Has").Tag<Log>;
11
+ export declare const LiveLog: L.Layer<{}, never, import("@effect-ts/system/Has").Has<Log>>;
12
+ export declare const LiveLogDebug: L.Layer<{}, never, import("@effect-ts/system/Has").Has<Log>>;
13
+ export declare const log: (...args: any[]) => T.Effect<import("@effect-ts/system/Has").Has<Log>, never, void>;
14
+ export declare const logDebug: (...args: any[]) => T.Effect<import("@effect-ts/system/Has").Has<Log>, never, void>;
15
+ export {};
package/Log/index.js ADDED
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.logDebug = exports.log = exports.LiveLogDebug = exports.LiveLog = exports.Log = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const tracing_1 = tslib_1.__importStar(require("@effect-ts/core/Tracing"));
6
+ const fileName_1 = "Log/index.ts";
7
+ const L = tslib_1.__importStar(require("@effect-ts/core/Effect/Layer"));
8
+ const T = tslib_1.__importStar(require("@effect-ts/core/Effect"));
9
+ const Has_1 = require("@effect-ts/core/Has");
10
+ const make = (debug = false) => ({
11
+ _tag: "LogService",
12
+ log: (...args) => T.succeedWith(() => {
13
+ console.error("INFO", ...args);
14
+ }, fileName_1 + ":10:20"),
15
+ debug: (...args) => debug
16
+ ? T.succeedWith(() => {
17
+ console.error("DEBUG", ...args);
18
+ }, fileName_1 + ":15:24")
19
+ : T.unit,
20
+ });
21
+ exports.Log = (0, Has_1.tag)();
22
+ exports.LiveLog = L.fromValue(exports.Log)(make(false));
23
+ exports.LiveLogDebug = L.fromValue(exports.Log)(make(true));
24
+ const log = (...args) => T.accessServiceM(exports.Log)(({ log }) => log(...args), fileName_1 + ":27:24");
25
+ exports.log = log;
26
+ const logDebug = (...args) => T.accessServiceM(exports.Log)(({ debug }) => debug(...args), fileName_1 + ":30:24");
27
+ exports.logDebug = logDebug;
28
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":";;;;;;AAAA,wEAAiD;AACjD,kEAA2C;AAC3C,6CAAyC;AAGzC,MAAM,IAAI,GAAG,CAAC,KAAK,GAAG,KAAK,EAAE,EAAE,CAC7B,CAAC;IACC,IAAI,EAAE,YAAY;IAClB,GAAG,EAAE,CAAC,GAAG,IAAW,EAAE,EAAE,CACtB,CAAC,CAAC,WAAW,CAAC,GAAG,EAAE;QACjB,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAA;IAChC,CAAC,wBAAC;IACJ,KAAK,EAAE,CAAC,GAAG,IAAW,EAAE,EAAE,CACxB,KAAK;QACH,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,EAAE;YACjB,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAA;QACjC,CAAC,wBAAC;QACJ,CAAC,CAAC,CAAC,CAAC,IAAI;CACH,CAAA,CAAA;AAGA,QAAA,GAAG,GAAG,IAAA,SAAG,GAAO,CAAA;AAChB,QAAA,OAAO,GAAG,CAAC,CAAC,SAAS,CAAC,WAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAA;AACvC,QAAA,YAAY,GAAG,CAAC,CAAC,SAAS,CAAC,WAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;AAEjD,MAAM,GAAG,GAAG,CAAC,GAAG,IAAW,EAAE,EAAE,CACpC,CAAC,CAAC,cAAc,CAAC,WAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,wBAAC,CAAA;AADrC,QAAA,GAAG,OACkC;AAE3C,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAW,EAAE,EAAE,CACzC,CAAC,CAAC,cAAc,CAAC,WAAG,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,wBAAC,CAAA;AADzC,QAAA,QAAQ,YACiC"}
package/Log/index.ts ADDED
@@ -0,0 +1,30 @@
1
+ import * as L from "@effect-ts/core/Effect/Layer"
2
+ import * as T from "@effect-ts/core/Effect"
3
+ import { tag } from "@effect-ts/core/Has"
4
+ import { _A } from "@effect-ts/core/Utils"
5
+
6
+ const make = (debug = false) =>
7
+ ({
8
+ _tag: "LogService",
9
+ log: (...args: any[]) =>
10
+ T.succeedWith(() => {
11
+ console.error("INFO", ...args)
12
+ }),
13
+ debug: (...args: any[]) =>
14
+ debug
15
+ ? T.succeedWith(() => {
16
+ console.error("DEBUG", ...args)
17
+ })
18
+ : T.unit,
19
+ } as const)
20
+
21
+ export interface Log extends ReturnType<typeof make> {}
22
+ export const Log = tag<Log>()
23
+ export const LiveLog = L.fromValue(Log)(make(false))
24
+ export const LiveLogDebug = L.fromValue(Log)(make(true))
25
+
26
+ export const log = (...args: any[]) =>
27
+ T.accessServiceM(Log)(({ log }) => log(...args))
28
+
29
+ export const logDebug = (...args: any[]) =>
30
+ T.accessServiceM(Log)(({ debug }) => debug(...args))
@@ -0,0 +1,3 @@
1
+ declare type Primitive = string | number | boolean;
2
+ export declare function memoize<A extends Primitive, T>(f: (a: A) => T): (a: A) => T;
3
+ export {};
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.memoize = void 0;
4
+ function memoize(f) {
5
+ const cache = new Map();
6
+ return (a) => {
7
+ if (cache.has(a)) {
8
+ return cache.get(a);
9
+ }
10
+ const value = f(a);
11
+ cache.set(a, value);
12
+ return value;
13
+ };
14
+ }
15
+ exports.memoize = memoize;
16
+ //# sourceMappingURL=memoize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memoize.js","sourceRoot":"","sources":["memoize.ts"],"names":[],"mappings":";;;AAEA,SAAgB,OAAO,CAAyB,CAAc;IAC5D,MAAM,KAAK,GAAG,IAAI,GAAG,EAAQ,CAAA;IAE7B,OAAO,CAAC,CAAI,EAAK,EAAE;QACjB,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;YAChB,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAM,CAAA;SACzB;QAED,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;QAClB,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA;QACnB,OAAO,KAAK,CAAA;IACd,CAAC,CAAA;AACH,CAAC;AAZD,0BAYC"}
@@ -0,0 +1,15 @@
1
+ type Primitive = string | number | boolean
2
+
3
+ export function memoize<A extends Primitive, T>(f: (a: A) => T) {
4
+ const cache = new Map<A, T>()
5
+
6
+ return (a: A): T => {
7
+ if (cache.has(a)) {
8
+ return cache.get(a) as T
9
+ }
10
+
11
+ const value = f(a)
12
+ cache.set(a, value)
13
+ return value
14
+ }
15
+ }
package/WS/index.d.ts ADDED
@@ -0,0 +1,30 @@
1
+ /// <reference types="node" />
2
+ import * as T from "@effect-ts/core/Effect";
3
+ import * as Q from "@effect-ts/core/Effect/Queue";
4
+ import * as CB from "callbag-effect-ts";
5
+ import * as Ws from "ws";
6
+ export declare type WsError = {
7
+ _tag: "close";
8
+ code: number;
9
+ reason: string;
10
+ } | {
11
+ _tag: "error";
12
+ cause: unknown;
13
+ } | {
14
+ _tag: "write";
15
+ cause: unknown;
16
+ };
17
+ export declare const Reconnect: unique symbol;
18
+ export declare type Reconnect = typeof Reconnect;
19
+ export declare type Message = string | Buffer | ArrayBuffer | Reconnect;
20
+ export declare type OutboundQueue = Q.Dequeue<Message>;
21
+ declare const makeService: () => {
22
+ readonly _tag: "WSService";
23
+ readonly open: (url: string, out: OutboundQueue, options?: Ws.ClientOptions | undefined) => CB.EffectSource<import("@effect-ts/system/Has").Has<import("../Log").Log> & import("@effect-ts/system/Clock").HasClock, WsError, Ws.RawData>;
24
+ };
25
+ export interface WS extends ReturnType<typeof makeService> {
26
+ }
27
+ export declare const WS: import("@effect-ts/system/Has").Tag<WS>;
28
+ export declare const LiveWS: import("@effect-ts/system/Layer").Layer<unknown, never, import("@effect-ts/system/Has").Has<WS>>;
29
+ export declare const open: (url: string, out: OutboundQueue, options?: Ws.ClientOptions | undefined) => T.Effect<import("@effect-ts/system/Has").Has<WS>, never, CB.EffectSource<import("@effect-ts/system/Has").Has<import("../Log").Log> & import("@effect-ts/system/Clock").HasClock, WsError, Ws.RawData>>;
30
+ export {};
package/WS/index.js CHANGED
@@ -1,24 +1,24 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.LiveWS = exports.WS = exports.Reconnect = void 0;
3
+ exports.open = exports.LiveWS = exports.WS = exports.Reconnect = void 0;
4
4
  const tslib_1 = require("tslib");
5
5
  const tracing_1 = tslib_1.__importStar(require("@effect-ts/core/Tracing"));
6
6
  const fileName_1 = "WS/index.ts";
7
7
  const T = tslib_1.__importStar(require("@effect-ts/core/Effect"));
8
- const S = tslib_1.__importStar(require("@effect-ts/core/Effect/Experimental/Stream"));
9
8
  const M = tslib_1.__importStar(require("@effect-ts/core/Effect/Managed"));
10
- const Q = tslib_1.__importStar(require("@effect-ts/core/Effect/Queue"));
11
9
  const SC = tslib_1.__importStar(require("@effect-ts/core/Effect/Schedule"));
10
+ const CB = tslib_1.__importStar(require("callbag-effect-ts"));
12
11
  const Function_1 = require("@effect-ts/core/Function");
13
12
  const Has_1 = require("@effect-ts/core/Has");
14
13
  const Ws = tslib_1.__importStar(require("ws"));
14
+ const Log_1 = require("../Log");
15
15
  exports.Reconnect = Symbol();
16
- const open = (url, options) => (M.makeExit_(T.succeedWith(() => new Ws.WebSocket(url, options), fileName_1 + ":29:18"), (ws) => T.succeedWith(() => {
16
+ const openSocket = (url, options) => (M.makeExit_(T.succeedWith(() => new Ws.WebSocket(url, options), fileName_1 + ":23:18"), (ws) => T.succeedWith(() => {
17
17
  ws.removeAllListeners();
18
18
  ws.close();
19
- }, fileName_1 + ":31:20"), fileName_1 + ":30:15"));
20
- const recv = (ws) => S.async((emit) => {
21
- ws.on("message", (message) => emit.single(message));
19
+ }, fileName_1 + ":25:20"), fileName_1 + ":24:15"));
20
+ const recv = (ws) => CB.async((emit) => {
21
+ ws.on("message", (message) => emit.data(message));
22
22
  ws.on("error", (cause) => {
23
23
  emit.fail({
24
24
  _tag: "error",
@@ -31,7 +31,7 @@ const recv = (ws) => S.async((emit) => {
31
31
  reason: reason.toString("utf8"),
32
32
  }));
33
33
  });
34
- const send = (out) => (ws) => (S.drain(S.tap_(S.unwrap(T.map_(T.effectAsync((cb) => {
34
+ const send = (ws, out) => (CB.drain(CB.tap_(CB.tap_(CB.unwrap(T.map_(T.effectAsync((cb) => {
35
35
  if (ws.readyState & ws.OPEN) {
36
36
  cb(T.unit);
37
37
  }
@@ -40,7 +40,7 @@ const send = (out) => (ws) => (S.drain(S.tap_(S.unwrap(T.map_(T.effectAsync((cb)
40
40
  cb(T.unit);
41
41
  });
42
42
  }
43
- }, fileName_1 + ":58:18"), () => S.fromQueue()(out), fileName_1 + ":67:10")), (data) => T.effectAsync((cb) => {
43
+ }, fileName_1 + ":52:18"), () => CB.fromQueue(out), fileName_1 + ":61:10")), (p) => (0, Log_1.logDebug)("WSService", "send", p)), (data) => T.effectAsync((cb) => {
44
44
  if (data === exports.Reconnect) {
45
45
  ws.close(1012, "reconnecting");
46
46
  cb(T.unit);
@@ -48,24 +48,23 @@ const send = (out) => (ws) => (S.drain(S.tap_(S.unwrap(T.map_(T.effectAsync((cb)
48
48
  else {
49
49
  ws.send(data, (err) => {
50
50
  if (err) {
51
- cb(T.fail({ _tag: "write", cause: err }, fileName_1 + ":77:24"));
51
+ cb(T.fail({ _tag: "write", cause: err }, fileName_1 + ":72:24"));
52
52
  }
53
53
  else {
54
54
  cb(T.unit);
55
55
  }
56
56
  });
57
57
  }
58
- }, fileName_1 + ":70:20"))));
59
- const duplex = (out) => (ws) => (S.mergeTerminateLeft_(recv(ws), send(out)(ws)));
60
- const openDuplexWithQueue = (url, out, options) => (S.retry_(S.unwrapManaged(M.map_(open(url, options), duplex(out), fileName_1 + ":98:10")), SC.recurWhile((e) => e._tag === "close" && e.code === 1012)));
61
- const openDuplex = (url, options) => (T.map_(Q.makeUnbounded(), (write) => ({
62
- read: openDuplexWithQueue(url, write, options),
63
- write,
64
- }), fileName_1 + ":109:10"));
65
- const makeWS = T.succeed({
58
+ }, fileName_1 + ":65:20"))));
59
+ const duplex = (out) => (ws) => CB.merge_(recv(ws), send(ws, out));
60
+ const openDuplex = (url, out, options) => (CB.retry_(CB.unwrapManaged(M.map_(openSocket(url, options), duplex(out), fileName_1 + ":93:10")), SC.recurWhile((e) => e._tag === "close" && e.code === 1012)));
61
+ const makeService = () => ({
66
62
  _tag: "WSService",
67
63
  open: openDuplex,
68
- }, fileName_1 + ":115:25");
64
+ });
69
65
  exports.WS = (0, Has_1.tag)();
70
- exports.LiveWS = T.toLayer(exports.WS)(makeWS);
66
+ exports.LiveWS = T.toLayer(exports.WS)(T.succeedWith(makeService, fileName_1 + ":106:50"));
67
+ // Helpers
68
+ const open = (url, out, options) => T.accessService(exports.WS)(({ open }) => open(url, out, options), fileName_1 + ":113:25");
69
+ exports.open = open;
71
70
  //# sourceMappingURL=index.js.map
package/WS/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"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"}
package/WS/index.ts CHANGED
@@ -1,43 +1,37 @@
1
1
  import * as T from "@effect-ts/core/Effect"
2
- import * as S from "@effect-ts/core/Effect/Experimental/Stream"
3
2
  import * as M from "@effect-ts/core/Effect/Managed"
4
3
  import * as Q from "@effect-ts/core/Effect/Queue"
5
4
  import * as SC from "@effect-ts/core/Effect/Schedule"
5
+ import * as CB from "callbag-effect-ts"
6
6
  import { pipe } from "@effect-ts/core/Function"
7
7
  import { tag } from "@effect-ts/core/Has"
8
- import type { _A } from "@effect-ts/core/Utils"
9
- import { HasClock } from "@effect-ts/system/Clock"
10
8
  import * as Ws from "ws"
9
+ import { logDebug } from "../Log"
11
10
 
12
11
  export type WsError =
13
12
  | { _tag: "close"; code: number; reason: string }
14
13
  | { _tag: "error"; cause: unknown }
15
14
  | { _tag: "write"; cause: unknown }
16
15
 
17
- type WebSocketStream = S.Stream<HasClock, WsError, Ws.RawData>
18
-
19
16
  export const Reconnect = Symbol()
20
- export type Message = Ws.RawData | typeof Reconnect
21
-
22
- export interface WebSocketConnection {
23
- read: WebSocketStream
24
- write: Q.Queue<Message>
25
- }
17
+ export type Reconnect = typeof Reconnect
18
+ export type Message = string | Buffer | ArrayBuffer | Reconnect
19
+ export type OutboundQueue = Q.Dequeue<Message>
26
20
 
27
- const open = (url: string, options?: Ws.ClientOptions) =>
21
+ const openSocket = (url: string, options?: Ws.ClientOptions) =>
28
22
  pipe(
29
23
  T.succeedWith(() => new Ws.WebSocket(url, options)),
30
24
  M.makeExit((ws) =>
31
25
  T.succeedWith(() => {
32
26
  ws.removeAllListeners()
33
27
  ws.close()
34
- })
35
- )
28
+ }),
29
+ ),
36
30
  )
37
31
 
38
- const recv = (ws: Ws.WebSocket): WebSocketStream =>
39
- S.async<unknown, WsError, Ws.RawData>((emit) => {
40
- ws.on("message", (message) => emit.single(message))
32
+ const recv = (ws: Ws.WebSocket) =>
33
+ CB.async<unknown, WsError, Ws.RawData>((emit) => {
34
+ ws.on("message", (message) => emit.data(message))
41
35
  ws.on("error", (cause) => {
42
36
  emit.fail({
43
37
  _tag: "error",
@@ -49,11 +43,11 @@ const recv = (ws: Ws.WebSocket): WebSocketStream =>
49
43
  _tag: "close",
50
44
  code,
51
45
  reason: reason.toString("utf8"),
52
- })
46
+ }),
53
47
  )
54
48
  })
55
49
 
56
- const send = (out: Q.Queue<Message>) => (ws: Ws.WebSocket) =>
50
+ const send = (ws: Ws.WebSocket, out: OutboundQueue) =>
57
51
  pipe(
58
52
  T.effectAsync<unknown, WsError, void>((cb) => {
59
53
  if (ws.readyState & ws.OPEN) {
@@ -64,9 +58,10 @@ const send = (out: Q.Queue<Message>) => (ws: Ws.WebSocket) =>
64
58
  })
65
59
  }
66
60
  }),
67
- T.map(() => S.fromQueue()(out)),
68
- S.unwrap,
69
- S.tap((data) =>
61
+ T.map(() => CB.fromQueue(out)),
62
+ CB.unwrap,
63
+ CB.tap((p) => logDebug("WSService", "send", p)),
64
+ CB.tap((data) =>
70
65
  T.effectAsync<unknown, WsError, void>((cb) => {
71
66
  if (data === Reconnect) {
72
67
  ws.close(1012, "reconnecting")
@@ -80,43 +75,39 @@ const send = (out: Q.Queue<Message>) => (ws: Ws.WebSocket) =>
80
75
  }
81
76
  })
82
77
  }
83
- })
78
+ }),
84
79
  ),
85
- S.drain
80
+ CB.drain,
86
81
  )
87
82
 
88
- const duplex = (out: Q.Queue<Message>) => (ws: Ws.WebSocket) =>
89
- pipe(recv(ws), S.mergeTerminateLeft(send(out)(ws)))
90
-
91
- const openDuplexWithQueue = (
92
- url: string,
93
- out: Q.Queue<Message>,
94
- options?: Ws.ClientOptions
95
- ): WebSocketStream =>
96
- pipe(
97
- open(url, options),
98
- M.map(duplex(out)),
99
- S.unwrapManaged,
100
- S.retry(SC.recurWhile((e) => e._tag === "close" && e.code === 1012))
101
- )
83
+ const duplex = (out: OutboundQueue) => (ws: Ws.WebSocket) =>
84
+ CB.merge_(recv(ws), send(ws, out))
102
85
 
103
86
  const openDuplex = (
104
87
  url: string,
105
- options?: Ws.ClientOptions
106
- ): T.UIO<WebSocketConnection> =>
88
+ out: OutboundQueue,
89
+ options?: Ws.ClientOptions,
90
+ ) =>
107
91
  pipe(
108
- Q.makeUnbounded<Message>(),
109
- T.map((write) => ({
110
- read: openDuplexWithQueue(url, write, options),
111
- write,
112
- }))
92
+ openSocket(url, options),
93
+ M.map(duplex(out)),
94
+ CB.unwrapManaged,
95
+ CB.retry(SC.recurWhile((e) => e._tag === "close" && e.code === 1012)),
113
96
  )
114
97
 
115
- const makeWS = T.succeed({
116
- _tag: "WSService",
117
- open: openDuplex,
118
- } as const)
98
+ const makeService = () =>
99
+ ({
100
+ _tag: "WSService",
101
+ open: openDuplex,
102
+ } as const)
119
103
 
120
- export interface WS extends _A<typeof makeWS> {}
104
+ export interface WS extends ReturnType<typeof makeService> {}
121
105
  export const WS = tag<WS>()
122
- export const LiveWS = T.toLayer(WS)(makeWS)
106
+ export const LiveWS = T.toLayer(WS)(T.succeedWith(makeService))
107
+
108
+ // Helpers
109
+ export const open = (
110
+ url: string,
111
+ out: OutboundQueue,
112
+ options?: Ws.ClientOptions,
113
+ ) => T.accessService(WS)(({ open }) => open(url, out, options))
package/bot.d.ts ADDED
@@ -0,0 +1 @@
1
+ export {};
package/bot.js ADDED
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ const tracing_1 = tslib_1.__importStar(require("@effect-ts/core/Tracing"));
5
+ const fileName_1 = "bot.ts";
6
+ const T = tslib_1.__importStar(require("@effect-ts/core/Effect"));
7
+ const Function_1 = require("@effect-ts/core/Function");
8
+ const R = tslib_1.__importStar(require("@effect-ts/node/Runtime"));
9
+ const CB = tslib_1.__importStar(require("callbag-effect-ts"));
10
+ const Dotenv = tslib_1.__importStar(require("dotenv"));
11
+ const Log_1 = require("./Log");
12
+ const mod_1 = require("./mod");
13
+ const types_1 = require("./types");
14
+ Dotenv.config();
15
+ const Config = (0, mod_1.makeConfigLayer)({
16
+ token: process.env.DISCORD_BOT_TOKEN,
17
+ gateway: {
18
+ intents: types_1.GatewayIntents.GUILDS | types_1.GatewayIntents.GUILD_MESSAGES,
19
+ },
20
+ });
21
+ // logger
22
+ const logger = T.chain_(mod_1.gateway, ({ raw }) => CB.forEach_(raw, (p) => (0, Log_1.log)(p)), fileName_1 + ":27:24");
23
+ // ping command
24
+ const pingPong = (CB.forEach_(CB.filter_((0, mod_1.fromDispatch)("MESSAGE_CREATE"), (msg) => msg.content.startsWith("!ping")), (msg) => (0, mod_1.rest)((r) => r.createMessage(msg.channel_id, {
25
+ content: "Pong!",
26
+ }), fileName_1 + ":34:9")));
27
+ (R.runMain(T.provideSomeLayer(Config)(T.provideSomeLayer(mod_1.DebugEnv)(T.zipPar(pingPong, fileName_1 + ":45:11")(T.zipPar(logger, fileName_1 + ":44:11")(mod_1.run))))));
28
+ //# sourceMappingURL=bot.js.map
package/bot.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bot.js","sourceRoot":"","sources":["bot.ts"],"names":[],"mappings":";;;;;AAAA,kEAA2C;AAC3C,uDAA+C;AAC/C,mEAA4C;AAC5C,8DAAuC;AACvC,uDAAgC;AAChC,+BAA2B;AAC3B,+BAOc;AACd,mCAAwC;AAExC,MAAM,CAAC,MAAM,EAAE,CAAA;AAEf,MAAM,MAAM,GAAG,IAAA,qBAAe,EAAC;IAC7B,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAkB;IACrC,OAAO,EAAE;QACP,OAAO,EAAE,sBAAc,CAAC,MAAM,GAAG,sBAAc,CAAC,cAAc;KAC/D;CACF,CAAC,CAAA;AAEF,SAAS;AACT,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,aAAO,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAA,SAAG,EAAC,CAAC,CAAC,CAAC,wBAAC,CAAA;AAE9E,eAAe;AACf,MAAM,QAAQ,IAGZ,EAAE,UADF,EAAE,SADF,IAAA,kBAAY,EAAC,gBAAgB,CAAC,EACpB,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,GACvC,CAAC,GAAG,EAAE,EAAE,CACjB,IAAA,UAAI,EAAC,CAAC,CAAC,EAAE,EAAE,CACT,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,UAAU,EAAE;IAC9B,OAAO,EAAE,OAAO;CACjB,CAAC,uBACH,EAEJ,CAAA;AAED,CAOE,CAAC,CAAC,OAAO,CADT,CAAC,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAD1B,CAAC,CAAC,gBAAgB,CAAC,cAAQ,CAAC,CAF5B,CAAC,CAAC,MAAM,CAAC,QAAQ,wBAAC,CADlB,CAAC,CAAC,MAAM,CAAC,MAAM,wBAAC,CADhB,SAAG,OAOJ"}
package/bot.ts ADDED
@@ -0,0 +1,50 @@
1
+ import * as T from "@effect-ts/core/Effect"
2
+ import { pipe } from "@effect-ts/core/Function"
3
+ import * as R from "@effect-ts/node/Runtime"
4
+ import * as CB from "callbag-effect-ts"
5
+ import * as Dotenv from "dotenv"
6
+ import { log } from "./Log"
7
+ import {
8
+ DebugEnv,
9
+ fromDispatch,
10
+ gateway,
11
+ makeConfigLayer,
12
+ rest,
13
+ run,
14
+ } from "./mod"
15
+ import { GatewayIntents } from "./types"
16
+
17
+ Dotenv.config()
18
+
19
+ const Config = makeConfigLayer({
20
+ token: process.env.DISCORD_BOT_TOKEN!,
21
+ gateway: {
22
+ intents: GatewayIntents.GUILDS | GatewayIntents.GUILD_MESSAGES,
23
+ },
24
+ })
25
+
26
+ // logger
27
+ const logger = T.chain_(gateway, ({ raw }) => CB.forEach_(raw, (p) => log(p)))
28
+
29
+ // ping command
30
+ const pingPong = pipe(
31
+ fromDispatch("MESSAGE_CREATE"),
32
+ CB.filter((msg) => msg.content.startsWith("!ping")),
33
+ CB.forEach((msg) =>
34
+ rest((r) =>
35
+ r.createMessage(msg.channel_id, {
36
+ content: "Pong!",
37
+ }),
38
+ ),
39
+ ),
40
+ )
41
+
42
+ pipe(
43
+ run,
44
+ T.zipPar(logger),
45
+ T.zipPar(pingPong),
46
+
47
+ T.provideSomeLayer(DebugEnv),
48
+ T.provideSomeLayer(Config),
49
+ R.runMain,
50
+ )
@@ -0,0 +1,26 @@
1
+ import * as tracing_1 from "@effect-ts/core/Tracing";
2
+ const fileName_1 = "DiscordConfig/index.ts";
3
+ import { tag } from "@effect-ts/system/Has";
4
+ import * as T from "@effect-ts/core/Effect";
5
+ import { flow } from "@effect-ts/system/Function";
6
+ import { fromValue } from "@effect-ts/system/Layer";
7
+ import { GatewayIntents } from "../types";
8
+ const VERSION = 9;
9
+ export const DiscordConfig = tag();
10
+ export const make = ({ token, rest, gateway }) => ({
11
+ _tag: "DiscordConfig",
12
+ token,
13
+ rest: {
14
+ baseUrl: `https://discord.com/api/v${VERSION}`,
15
+ ...(rest ?? {}),
16
+ },
17
+ gateway: {
18
+ intents: GatewayIntents.GUILDS,
19
+ ...(gateway ?? {}),
20
+ },
21
+ });
22
+ export const makeLayer = flow(make, fromValue(DiscordConfig));
23
+ export const token = T.accessService(DiscordConfig)(({ token }) => token, fileName_1 + ":43:52");
24
+ export const rest = T.accessService(DiscordConfig)(({ rest }) => rest, fileName_1 + ":44:51");
25
+ export const gateway = T.accessService(DiscordConfig)(({ gateway }) => gateway, fileName_1 + ":45:54");
26
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../DiscordConfig/index.ts"],"names":[],"mappings":";;AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,uBAAuB,CAAA;AAC3C,OAAO,KAAK,CAAC,MAAM,wBAAwB,CAAA;AAC3C,OAAO,EAAE,IAAI,EAAE,MAAM,4BAA4B,CAAA;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AACnD,OAAO,EAAE,cAAc,EAAkB,MAAM,UAAU,CAAA;AAEzD,MAAM,OAAO,GAAG,CAAC,CAAA;AAajB,MAAM,CAAC,MAAM,aAAa,GAAG,GAAG,EAAiB,CAAA;AAQjD,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAY,EAAiB,EAAE,CAAC,CAAC;IAC1E,IAAI,EAAE,eAAe;IACrB,KAAK;IACL,IAAI,EAAE;QACJ,OAAO,EAAE,4BAA4B,OAAO,EAAE;QAC9C,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;KAChB;IACD,OAAO,EAAE;QACP,OAAO,EAAE,cAAc,CAAC,MAAM;QAC9B,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC;KACnB;CACF,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,aAAa,CAAC,CAAC,CAAA;AAE7D,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,KAAK,wBAAC,CAAA;AACzE,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,wBAAC,CAAA;AACtE,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,OAAO,wBAAC,CAAA"}
@@ -0,0 +1,20 @@
1
+ import * as tracing_1 from "@effect-ts/core/Tracing";
2
+ const fileName_1 = "DiscordGateway/index.ts";
3
+ import * as T from "@effect-ts/core/Effect";
4
+ import * as M from "@effect-ts/core/Effect/Managed";
5
+ import { identity, pipe } from "@effect-ts/core/Function";
6
+ import { tag } from "@effect-ts/core/Has";
7
+ import * as Shard from "../DiscordShard";
8
+ import * as Utils from "./utils";
9
+ import * as CB from "callbag-effect-ts";
10
+ const make = (M.map_(Shard.make([0, 1]), (shard) => ({
11
+ _tag: "DiscordGatewayService",
12
+ ...shard,
13
+ fromDispatch: Utils.fromDispatch(shard.dispatch),
14
+ }), fileName_1 + ":13:8"));
15
+ export const DiscordGateway = tag();
16
+ export const LiveDiscordGateway = M.toLayer_(make, DiscordGateway);
17
+ export const gateway = T.accessService(DiscordGateway)(identity, fileName_1 + ":27:55");
18
+ export const run = T.accessServiceM(DiscordGateway)(({ run }) => run, fileName_1 + ":28:52");
19
+ export const fromDispatch = (event) => (CB.unwrap(T.accessService(DiscordGateway)(({ fromDispatch }) => fromDispatch(event), fileName_1 + ":32:36")));
20
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../DiscordGateway/index.ts"],"names":[],"mappings":";;AAAA,OAAO,KAAK,CAAC,MAAM,wBAAwB,CAAA;AAC3C,OAAO,KAAK,CAAC,MAAM,gCAAgC,CAAA;AACnD,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,0BAA0B,CAAA;AACzD,OAAO,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAA;AAEzC,OAAO,KAAK,KAAK,MAAM,iBAAiB,CAAA;AACxC,OAAO,KAAK,KAAK,MAAM,SAAS,CAAA;AAChC,OAAO,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAGvC,MAAM,IAAI,IAER,CAAC,MADD,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAEhB,CAAC,KAAK,EAAE,EAAE,CACR,CAAC;IACC,IAAI,EAAE,uBAAuB;IAC7B,GAAG,KAAK;IACR,YAAY,EAAE,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,QAAQ,CAAC;CACvC,CAAA,wBAEhB,CAAA;AAGD,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,EAAkB,CAAA;AACnD,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,UAAyB,IAAI,EAApB,cAAc,CAAO,CAAA;AAEjE,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC,QAAQ,wBAAC,CAAA;AAChE,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,GAAG,wBAAC,CAAA;AAErE,MAAM,CAAC,MAAM,YAAY,GAAG,CAAgC,KAAQ,EAAE,EAAE,EAGpE,EAAE,CAAC,MAAM,CADT,CAAC,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,wBAAC,EAE3E,CAAA"}
@@ -0,0 +1,7 @@
1
+ import * as tracing_1 from "@effect-ts/core/Tracing";
2
+ const fileName_1 = "DiscordGateway/utils.ts";
3
+ import { pipe } from "@effect-ts/core/Function";
4
+ import * as CB from "callbag-effect-ts";
5
+ import { memoize } from "../Utils/memoize";
6
+ export const fromDispatch = (source) => memoize((event) => (CB.share(CB.map_(CB.filter_(source, (p) => p.t === event), (p) => p.d))));
7
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../DiscordGateway/utils.ts"],"names":[],"mappings":";;AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,0BAA0B,CAAA;AAC/C,OAAO,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAEvC,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAE1C,MAAM,CAAC,MAAM,YAAY,GAAG,CAC1B,MAA2D,EAGf,EAAE,CAC9C,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,EAId,EAAE,CAAC,KAAK,CADR,EAAE,MADF,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,EACjC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAQ,GAEzB,CACF,CAAA"}