dfx 0.0.5 → 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.
- package/DiscordConfig/index.d.ts +29 -0
- package/DiscordConfig/index.js +31 -0
- package/DiscordConfig/index.js.map +1 -0
- package/DiscordConfig/index.ts +45 -0
- package/DiscordGateway/index.d.ts +23 -0
- package/DiscordGateway/index.js +25 -0
- package/DiscordGateway/index.js.map +1 -0
- package/DiscordGateway/index.ts +34 -0
- package/DiscordGateway/utils.d.ts +3 -0
- package/DiscordGateway/utils.js +12 -0
- package/DiscordGateway/utils.js.map +1 -0
- package/DiscordGateway/utils.ts +17 -0
- package/DiscordREST/http.d.ts +3 -0
- package/DiscordREST/http.js +20 -0
- package/DiscordREST/http.js.map +1 -0
- package/DiscordREST/http.ts +21 -0
- package/DiscordREST/index.d.ts +11 -0
- package/DiscordREST/index.js +65 -0
- package/DiscordREST/index.js.map +1 -0
- package/DiscordREST/index.ts +83 -0
- package/DiscordREST/types.d.ts +5 -0
- package/DiscordREST/types.ts +9 -1
- package/DiscordShard/heartbeats.d.ts +2 -3
- package/DiscordShard/heartbeats.js +9 -13
- package/DiscordShard/heartbeats.js.map +1 -1
- package/DiscordShard/heartbeats.ts +23 -28
- package/DiscordShard/identify.d.ts +2 -3
- package/DiscordShard/identify.js +5 -5
- package/DiscordShard/identify.js.map +1 -1
- package/DiscordShard/identify.ts +11 -12
- package/DiscordShard/index.d.ts +14 -14
- package/DiscordShard/index.js +24 -21
- package/DiscordShard/index.js.map +1 -1
- package/DiscordShard/index.ts +45 -33
- package/DiscordShard/invalidSession.d.ts +2 -3
- package/DiscordShard/invalidSession.js +4 -4
- package/DiscordShard/invalidSession.js.map +1 -1
- package/DiscordShard/invalidSession.ts +7 -8
- package/DiscordShard/utils.d.ts +4 -6
- package/DiscordShard/utils.js +5 -12
- package/DiscordShard/utils.js.map +1 -1
- package/DiscordShard/utils.ts +22 -37
- package/DiscordWS/index.d.ts +10 -9
- package/DiscordWS/index.js +10 -8
- package/DiscordWS/index.js.map +1 -1
- package/DiscordWS/index.ts +25 -28
- package/Log/index.d.ts +7 -4
- package/Log/index.js +16 -7
- package/Log/index.js.map +1 -1
- package/Log/index.ts +21 -11
- package/Utils/memoize.d.ts +3 -0
- package/Utils/memoize.js +16 -0
- package/Utils/memoize.js.map +1 -0
- package/Utils/memoize.ts +15 -0
- package/WS/index.d.ts +8 -10
- package/WS/index.js +16 -16
- package/WS/index.js.map +1 -1
- package/WS/index.ts +33 -34
- package/bot.js +15 -20
- package/bot.js.map +1 -1
- package/bot.ts +35 -36
- package/esm/DiscordConfig/index.js +26 -0
- package/esm/DiscordConfig/index.js.map +1 -0
- package/esm/DiscordGateway/index.js +20 -0
- package/esm/DiscordGateway/index.js.map +1 -0
- package/esm/DiscordGateway/utils.js +7 -0
- package/esm/DiscordGateway/utils.js.map +1 -0
- package/esm/DiscordREST/http.js +15 -0
- package/esm/DiscordREST/http.js.map +1 -0
- package/esm/DiscordREST/index.js +61 -0
- package/esm/DiscordREST/index.js.map +1 -0
- package/esm/DiscordREST/types.js +3 -0
- package/esm/DiscordREST/types.js.map +1 -0
- package/esm/DiscordShard/commands.js +28 -0
- package/esm/DiscordShard/commands.js.map +1 -0
- package/esm/DiscordShard/heartbeats.js +24 -0
- package/esm/DiscordShard/heartbeats.js.map +1 -0
- package/esm/DiscordShard/identify.js +30 -0
- package/esm/DiscordShard/identify.js.map +1 -0
- package/esm/DiscordShard/index.js +58 -0
- package/esm/DiscordShard/index.js.map +1 -0
- package/esm/DiscordShard/invalidSession.js +12 -0
- package/esm/DiscordShard/invalidSession.js.map +1 -0
- package/esm/DiscordShard/utils.js +11 -0
- package/esm/DiscordShard/utils.js.map +1 -0
- package/esm/DiscordWS/index.js +34 -0
- package/esm/DiscordWS/index.js.map +1 -0
- package/esm/Log/index.js +22 -0
- package/esm/Log/index.js.map +1 -0
- package/esm/Utils/memoize.js +12 -0
- package/esm/Utils/memoize.js.map +1 -0
- package/esm/WS/index.js +65 -0
- package/esm/WS/index.js.map +1 -0
- package/esm/bot.js +25 -0
- package/esm/bot.js.map +1 -0
- package/esm/mod.js +16 -0
- package/esm/mod.js.map +1 -0
- package/esm/types.js +1559 -0
- package/esm/types.js.map +1 -0
- package/mod.d.ts +5 -1
- package/mod.js +15 -2
- package/mod.js.map +1 -1
- package/mod.ts +14 -3
- package/package.json +25 -10
- package/types.d.ts +19 -5
- package/types.js +2 -1
- package/types.js.map +1 -1
- package/types.ts +170 -149
package/DiscordShard/utils.ts
CHANGED
|
@@ -1,47 +1,32 @@
|
|
|
1
1
|
import * as T from "@effect-ts/core/Effect"
|
|
2
|
-
import * as S from "@effect-ts/core/Effect/Experimental/Stream"
|
|
3
|
-
import * as H from "@effect-ts/core/Effect/Hub"
|
|
4
2
|
import * as R from "@effect-ts/core/Effect/Ref"
|
|
5
3
|
import { flow, pipe } from "@effect-ts/core/Function"
|
|
6
4
|
import * as O from "@effect-ts/core/Option"
|
|
7
|
-
import
|
|
8
|
-
|
|
9
|
-
GatewayEvents,
|
|
10
|
-
GatewayOpcode,
|
|
11
|
-
GatewayPayload,
|
|
12
|
-
} from "../types"
|
|
5
|
+
import * as CB from "callbag-effect-ts"
|
|
6
|
+
import { GatewayOpcode, GatewayPayload } from "../types"
|
|
13
7
|
|
|
14
8
|
export const opCode =
|
|
15
|
-
(
|
|
16
|
-
<T = any>(code: GatewayOpcode)
|
|
9
|
+
<R, E>(source: CB.EffectSource<R, E, GatewayPayload>) =>
|
|
10
|
+
<T = any>(code: GatewayOpcode) =>
|
|
17
11
|
pipe(
|
|
18
|
-
|
|
19
|
-
|
|
12
|
+
source,
|
|
13
|
+
CB.filter((p): p is GatewayPayload<T> => p.op === code),
|
|
20
14
|
)
|
|
21
15
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
(a) => R.set_(ref, O.some(a))
|
|
34
|
-
)
|
|
35
|
-
)
|
|
36
|
-
),
|
|
37
|
-
] as const
|
|
38
|
-
})
|
|
16
|
+
const maybeUpdateRef = <T>(
|
|
17
|
+
f: (p: GatewayPayload) => O.Option<T>,
|
|
18
|
+
ref: R.Ref<O.Option<T>>,
|
|
19
|
+
) =>
|
|
20
|
+
flow(
|
|
21
|
+
f,
|
|
22
|
+
O.fold(
|
|
23
|
+
() => T.unit,
|
|
24
|
+
(a) => R.set_(ref, O.some(a)),
|
|
25
|
+
),
|
|
26
|
+
)
|
|
39
27
|
|
|
40
|
-
export const
|
|
41
|
-
(
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
S.filter((p): p is GatewayPayload<GatewayEvents[K]> => p.t === event),
|
|
46
|
-
S.map((p) => p.d as GatewayEvents[K])
|
|
47
|
-
)
|
|
28
|
+
export const latest = <T>(f: (p: GatewayPayload) => O.Option<T>) =>
|
|
29
|
+
pipe(
|
|
30
|
+
R.makeRef<O.Option<T>>(O.none),
|
|
31
|
+
T.map((ref) => [ref, CB.tap(maybeUpdateRef(f, ref))] as const),
|
|
32
|
+
)
|
package/DiscordWS/index.d.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
2
|
import * as T from "@effect-ts/core/Effect";
|
|
3
|
-
import * as
|
|
3
|
+
import * as L from "@effect-ts/core/Effect/Layer";
|
|
4
|
+
import * as Q from "@effect-ts/core/Effect/Queue";
|
|
5
|
+
import * as CB from "callbag-effect-ts";
|
|
4
6
|
import { RawData } from "ws";
|
|
5
7
|
import { GatewayPayload } from "../types";
|
|
6
8
|
import * as WS from "../WS";
|
|
@@ -9,7 +11,7 @@ export interface OpenOpts {
|
|
|
9
11
|
url?: string;
|
|
10
12
|
version?: number;
|
|
11
13
|
encoding?: Encoding;
|
|
12
|
-
|
|
14
|
+
outgoingQueue: Q.Queue<Message>;
|
|
13
15
|
}
|
|
14
16
|
export interface Encoding {
|
|
15
17
|
type: "json" | "etf";
|
|
@@ -17,16 +19,15 @@ export interface Encoding {
|
|
|
17
19
|
decode: (p: RawData) => GatewayPayload;
|
|
18
20
|
}
|
|
19
21
|
export declare const jsonEncoding: Encoding;
|
|
20
|
-
declare const openImpl: ({ url, version, encoding, outgoing, }: OpenOpts) =>
|
|
22
|
+
declare const openImpl: ({ url, version, encoding, outgoingQueue: outgoing, }: OpenOpts) => CB.EffectSource<import("@effect-ts/system/Has").Has<WS.WS> & import("@effect-ts/system/Has").Has<import("../Log").Log> & import("@effect-ts/system/Clock").HasClock, unknown, GatewayPayload<any>>;
|
|
21
23
|
export declare type Connection = ReturnType<typeof openImpl>;
|
|
22
|
-
declare const
|
|
24
|
+
declare const makeService: () => {
|
|
23
25
|
readonly _tag: "DiscordWSService";
|
|
24
|
-
readonly open: ({ url, version, encoding, outgoing, }: OpenOpts) =>
|
|
26
|
+
readonly open: ({ url, version, encoding, outgoingQueue: outgoing, }: OpenOpts) => CB.EffectSource<import("@effect-ts/system/Has").Has<WS.WS> & import("@effect-ts/system/Has").Has<import("../Log").Log> & import("@effect-ts/system/Clock").HasClock, unknown, GatewayPayload<any>>;
|
|
25
27
|
};
|
|
26
|
-
|
|
27
|
-
export interface DiscordWS extends Service {
|
|
28
|
+
export interface DiscordWS extends ReturnType<typeof makeService> {
|
|
28
29
|
}
|
|
29
30
|
export declare const DiscordWS: import("@effect-ts/system/Has").Tag<DiscordWS>;
|
|
30
|
-
export declare const LiveDiscordWS:
|
|
31
|
-
export declare const open: (opts: OpenOpts) => T.Effect<import("@effect-ts/system/Has").Has<DiscordWS>, never,
|
|
31
|
+
export declare const LiveDiscordWS: L.Layer<unknown, never, import("@effect-ts/system/Has").Has<DiscordWS>>;
|
|
32
|
+
export declare const open: (opts: OpenOpts) => T.Effect<import("@effect-ts/system/Has").Has<DiscordWS>, never, CB.EffectSource<import("@effect-ts/system/Has").Has<WS.WS> & import("@effect-ts/system/Has").Has<import("../Log").Log> & import("@effect-ts/system/Clock").HasClock, unknown, GatewayPayload<any>>>;
|
|
32
33
|
export {};
|
package/DiscordWS/index.js
CHANGED
|
@@ -5,10 +5,12 @@ const tslib_1 = require("tslib");
|
|
|
5
5
|
const tracing_1 = tslib_1.__importStar(require("@effect-ts/core/Tracing"));
|
|
6
6
|
const fileName_1 = "DiscordWS/index.ts";
|
|
7
7
|
const T = tslib_1.__importStar(require("@effect-ts/core/Effect"));
|
|
8
|
-
const
|
|
8
|
+
const L = tslib_1.__importStar(require("@effect-ts/core/Effect/Layer"));
|
|
9
|
+
const Q = tslib_1.__importStar(require("@effect-ts/core/Effect/Queue"));
|
|
9
10
|
const SC = tslib_1.__importStar(require("@effect-ts/core/Effect/Schedule"));
|
|
10
11
|
const Function_1 = require("@effect-ts/core/Function");
|
|
11
12
|
const Has_1 = require("@effect-ts/core/Has");
|
|
13
|
+
const CB = tslib_1.__importStar(require("callbag-effect-ts"));
|
|
12
14
|
const Log_1 = require("../Log");
|
|
13
15
|
const WS = tslib_1.__importStar(require("../WS"));
|
|
14
16
|
exports.jsonEncoding = {
|
|
@@ -16,22 +18,22 @@ exports.jsonEncoding = {
|
|
|
16
18
|
encode: (p) => JSON.stringify(p),
|
|
17
19
|
decode: (p) => JSON.parse(p.toString("utf8")),
|
|
18
20
|
};
|
|
19
|
-
const makeOutgoing = (
|
|
21
|
+
const makeOutgoing = (q, e) => Q.map_(q, (data) => {
|
|
20
22
|
if (data === WS.Reconnect) {
|
|
21
23
|
return data;
|
|
22
24
|
}
|
|
23
25
|
return e.encode(data);
|
|
24
|
-
})
|
|
25
|
-
const openImpl = ({ url = "wss://gateway.discord.gg/", version = 9, encoding = exports.jsonEncoding, outgoing, }) => (
|
|
26
|
+
});
|
|
27
|
+
const openImpl = ({ url = "wss://gateway.discord.gg/", version = 9, encoding = exports.jsonEncoding, outgoingQueue: outgoing, }) => (CB.map_(CB.retry_(CB.tapError_(CB.unwrap(WS.open(`${url}?v=${version}&encoding=${encoding.type}`, makeOutgoing(outgoing, encoding))), (e) => (0, Log_1.log)(serviceTag, "error", e)), SC.exponential(500)), encoding.decode));
|
|
26
28
|
// Service definition
|
|
27
29
|
const serviceTag = "DiscordWSService";
|
|
28
|
-
const
|
|
30
|
+
const makeService = () => ({
|
|
29
31
|
_tag: serviceTag,
|
|
30
32
|
open: openImpl,
|
|
31
|
-
};
|
|
33
|
+
});
|
|
32
34
|
exports.DiscordWS = (0, Has_1.tag)();
|
|
33
|
-
exports.LiveDiscordWS =
|
|
35
|
+
exports.LiveDiscordWS = L.fromFunction(exports.DiscordWS)(makeService);
|
|
34
36
|
// Helpers
|
|
35
|
-
const open = (opts) => T.accessService(exports.DiscordWS)(({ open }) => open(opts), fileName_1 + ":
|
|
37
|
+
const open = (opts) => T.accessService(exports.DiscordWS)(({ open }) => open(opts), fileName_1 + ":76:29");
|
|
36
38
|
exports.open = open;
|
|
37
39
|
//# sourceMappingURL=index.js.map
|
package/DiscordWS/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":";;;;;;AAAA,kEAA2C;AAC3C,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":";;;;;;AAAA,kEAA2C;AAC3C,wEAAiD;AACjD,wEAAiD;AACjD,4EAAqD;AACrD,uDAA+C;AAC/C,6CAAyC;AACzC,8DAAuC;AAEvC,gCAA4B;AAE5B,kDAA2B;AAiBd,QAAA,YAAY,GAAa;IACpC,IAAI,EAAE,MAAM;IACZ,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;IAChC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;CAC9C,CAAA;AAED,MAAM,YAAY,GAAG,CAAC,CAAmB,EAAE,CAAW,EAAoB,EAAE,CAC1E,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,IAAI,EAAc,EAAE;IAC7B,IAAI,IAAI,KAAK,EAAE,CAAC,SAAS,EAAE;QACzB,OAAO,IAAI,CAAA;KACZ;IAED,OAAO,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;AACvB,CAAC,CAAC,CAAA;AAEJ,MAAM,QAAQ,GAAG,CAAC,EAChB,GAAG,GAAG,2BAA2B,EACjC,OAAO,GAAG,CAAC,EACX,QAAQ,GAAG,oBAAY,EACvB,aAAa,EAAE,QAAQ,GACd,EAAE,EAAE,EASX,EAAE,MADF,EAAE,QADF,EAAE,WADF,EAAE,CAAC,MAAM,CAJT,EAAE,CAAC,IAAI,CACL,GAAG,GAAG,MAAM,OAAO,aAAa,QAAQ,CAAC,IAAI,EAAE,EAC/C,YAAY,CAAC,QAAQ,EAAE,QAAQ,CAAC,CACjC,GAEW,CAAC,CAAC,EAAE,EAAE,CAAC,IAAA,SAAG,EAAC,UAAU,EAAE,OAAO,EAAE,CAAC,CAAC,GACrC,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,GACrB,QAAQ,CAAC,MAAM,EACvB,CAAA;AAIH,qBAAqB;AACrB,MAAM,UAAU,GAAG,kBAA2B,CAAA;AAC9C,MAAM,WAAW,GAAG,GAAG,EAAE,CACvB,CAAC;IACC,IAAI,EAAE,UAAU;IAChB,IAAI,EAAE,QAAQ;CACL,CAAA,CAAA;AAGA,QAAA,SAAS,GAAG,IAAA,SAAG,GAAa,CAAA;AAC5B,QAAA,aAAa,GAAG,CAAC,CAAC,YAAY,CAAC,iBAAS,CAAC,CAAC,WAAW,CAAC,CAAA;AAEnE,UAAU;AACH,MAAM,IAAI,GAAG,CAAC,IAAc,EAAE,EAAE,CACrC,CAAC,CAAC,aAAa,CAAC,iBAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,wBAAC,CAAA;AADzC,QAAA,IAAI,QACqC"}
|
package/DiscordWS/index.ts
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import * as T from "@effect-ts/core/Effect"
|
|
2
|
-
import * as
|
|
2
|
+
import * as L from "@effect-ts/core/Effect/Layer"
|
|
3
|
+
import * as Q from "@effect-ts/core/Effect/Queue"
|
|
3
4
|
import * as SC from "@effect-ts/core/Effect/Schedule"
|
|
4
5
|
import { pipe } from "@effect-ts/core/Function"
|
|
5
6
|
import { tag } from "@effect-ts/core/Has"
|
|
6
|
-
import
|
|
7
|
+
import * as CB from "callbag-effect-ts"
|
|
7
8
|
import { RawData } from "ws"
|
|
8
9
|
import { log } from "../Log"
|
|
9
10
|
import { GatewayPayload } from "../types"
|
|
@@ -15,7 +16,7 @@ export interface OpenOpts {
|
|
|
15
16
|
url?: string
|
|
16
17
|
version?: number
|
|
17
18
|
encoding?: Encoding
|
|
18
|
-
|
|
19
|
+
outgoingQueue: Q.Queue<Message>
|
|
19
20
|
}
|
|
20
21
|
|
|
21
22
|
export interface Encoding {
|
|
@@ -30,49 +31,45 @@ export const jsonEncoding: Encoding = {
|
|
|
30
31
|
decode: (p) => JSON.parse(p.toString("utf8")),
|
|
31
32
|
}
|
|
32
33
|
|
|
33
|
-
const makeOutgoing = (
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
return data
|
|
39
|
-
}
|
|
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
|
+
}
|
|
40
39
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
)
|
|
40
|
+
return e.encode(data)
|
|
41
|
+
})
|
|
44
42
|
|
|
45
43
|
const openImpl = ({
|
|
46
44
|
url = "wss://gateway.discord.gg/",
|
|
47
45
|
version = 9,
|
|
48
46
|
encoding = jsonEncoding,
|
|
49
|
-
outgoing,
|
|
47
|
+
outgoingQueue: outgoing,
|
|
50
48
|
}: OpenOpts) =>
|
|
51
49
|
pipe(
|
|
52
50
|
WS.open(
|
|
53
51
|
`${url}?v=${version}&encoding=${encoding.type}`,
|
|
54
|
-
makeOutgoing(outgoing, encoding)
|
|
52
|
+
makeOutgoing(outgoing, encoding),
|
|
55
53
|
),
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
),
|
|
60
|
-
S.retry(SC.exponential(250)),
|
|
61
|
-
S.map(encoding.decode)
|
|
54
|
+
CB.unwrap,
|
|
55
|
+
CB.tapError((e) => log(serviceTag, "error", e)),
|
|
56
|
+
CB.retry(SC.exponential(500)),
|
|
57
|
+
CB.map(encoding.decode),
|
|
62
58
|
)
|
|
63
59
|
|
|
64
60
|
export type Connection = ReturnType<typeof openImpl>
|
|
65
61
|
|
|
66
62
|
// Service definition
|
|
67
63
|
const serviceTag = "DiscordWSService" as const
|
|
68
|
-
const
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
64
|
+
const makeService = () =>
|
|
65
|
+
({
|
|
66
|
+
_tag: serviceTag,
|
|
67
|
+
open: openImpl,
|
|
68
|
+
} as const)
|
|
69
|
+
|
|
70
|
+
export interface DiscordWS extends ReturnType<typeof makeService> {}
|
|
74
71
|
export const DiscordWS = tag<DiscordWS>()
|
|
75
|
-
export const LiveDiscordWS =
|
|
72
|
+
export const LiveDiscordWS = L.fromFunction(DiscordWS)(makeService)
|
|
76
73
|
|
|
77
74
|
// Helpers
|
|
78
75
|
export const open = (opts: OpenOpts) =>
|
package/Log/index.d.ts
CHANGED
|
@@ -1,12 +1,15 @@
|
|
|
1
|
+
import * as L from "@effect-ts/core/Effect/Layer";
|
|
1
2
|
import * as T from "@effect-ts/core/Effect";
|
|
2
|
-
declare const
|
|
3
|
+
declare const make: (debug?: boolean) => {
|
|
3
4
|
readonly _tag: "LogService";
|
|
4
5
|
readonly log: (...args: any[]) => T.UIO<void>;
|
|
6
|
+
readonly debug: (...args: any[]) => T.UIO<void>;
|
|
5
7
|
};
|
|
6
|
-
|
|
7
|
-
export interface Log extends Service {
|
|
8
|
+
export interface Log extends ReturnType<typeof make> {
|
|
8
9
|
}
|
|
9
10
|
export declare const Log: import("@effect-ts/system/Has").Tag<Log>;
|
|
10
|
-
export declare const LiveLog:
|
|
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>>;
|
|
11
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>;
|
|
12
15
|
export {};
|
package/Log/index.js
CHANGED
|
@@ -1,19 +1,28 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.log = exports.LiveLog = exports.Log = void 0;
|
|
3
|
+
exports.logDebug = exports.log = exports.LiveLogDebug = exports.LiveLog = exports.Log = 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 = "Log/index.ts";
|
|
7
|
+
const L = tslib_1.__importStar(require("@effect-ts/core/Effect/Layer"));
|
|
7
8
|
const T = tslib_1.__importStar(require("@effect-ts/core/Effect"));
|
|
8
9
|
const Has_1 = require("@effect-ts/core/Has");
|
|
9
|
-
const
|
|
10
|
+
const make = (debug = false) => ({
|
|
10
11
|
_tag: "LogService",
|
|
11
12
|
log: (...args) => T.succeedWith(() => {
|
|
12
|
-
console.error(...args);
|
|
13
|
-
}, fileName_1 + ":
|
|
14
|
-
|
|
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
|
+
});
|
|
15
21
|
exports.Log = (0, Has_1.tag)();
|
|
16
|
-
exports.LiveLog =
|
|
17
|
-
|
|
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");
|
|
18
25
|
exports.log = log;
|
|
26
|
+
const logDebug = (...args) => T.accessServiceM(exports.Log)(({ debug }) => debug(...args), fileName_1 + ":30:24");
|
|
27
|
+
exports.logDebug = logDebug;
|
|
19
28
|
//# sourceMappingURL=index.js.map
|
package/Log/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":";;;;;;AAAA,kEAA2C;AAC3C,6CAAyC;AAGzC,MAAM,
|
|
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
CHANGED
|
@@ -1,20 +1,30 @@
|
|
|
1
|
+
import * as L from "@effect-ts/core/Effect/Layer"
|
|
1
2
|
import * as T from "@effect-ts/core/Effect"
|
|
2
3
|
import { tag } from "@effect-ts/core/Has"
|
|
3
4
|
import { _A } from "@effect-ts/core/Utils"
|
|
4
5
|
|
|
5
|
-
const
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
}
|
|
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)
|
|
12
20
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
export interface Log extends Service {}
|
|
21
|
+
export interface Log extends ReturnType<typeof make> {}
|
|
16
22
|
export const Log = tag<Log>()
|
|
17
|
-
export const LiveLog =
|
|
23
|
+
export const LiveLog = L.fromValue(Log)(make(false))
|
|
24
|
+
export const LiveLogDebug = L.fromValue(Log)(make(true))
|
|
18
25
|
|
|
19
26
|
export const log = (...args: any[]) =>
|
|
20
27
|
T.accessServiceM(Log)(({ log }) => log(...args))
|
|
28
|
+
|
|
29
|
+
export const logDebug = (...args: any[]) =>
|
|
30
|
+
T.accessServiceM(Log)(({ debug }) => debug(...args))
|
package/Utils/memoize.js
ADDED
|
@@ -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"}
|
package/Utils/memoize.ts
ADDED
|
@@ -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
CHANGED
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
2
|
import * as T from "@effect-ts/core/Effect";
|
|
3
|
-
import * as
|
|
4
|
-
import
|
|
5
|
-
import { HasClock } from "@effect-ts/system/Clock";
|
|
3
|
+
import * as Q from "@effect-ts/core/Effect/Queue";
|
|
4
|
+
import * as CB from "callbag-effect-ts";
|
|
6
5
|
import * as Ws from "ws";
|
|
7
6
|
export declare type WsError = {
|
|
8
7
|
_tag: "close";
|
|
@@ -15,18 +14,17 @@ export declare type WsError = {
|
|
|
15
14
|
_tag: "write";
|
|
16
15
|
cause: unknown;
|
|
17
16
|
};
|
|
18
|
-
export declare type WebSocketStream<T = Ws.RawData> = S.Stream<HasClock, WsError, T>;
|
|
19
17
|
export declare const Reconnect: unique symbol;
|
|
20
18
|
export declare type Reconnect = typeof Reconnect;
|
|
21
19
|
export declare type Message = string | Buffer | ArrayBuffer | Reconnect;
|
|
22
|
-
export declare type
|
|
23
|
-
declare const
|
|
20
|
+
export declare type OutboundQueue = Q.Dequeue<Message>;
|
|
21
|
+
declare const makeService: () => {
|
|
24
22
|
readonly _tag: "WSService";
|
|
25
|
-
readonly open: (url: string, out:
|
|
26
|
-
}
|
|
27
|
-
export interface WS extends
|
|
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> {
|
|
28
26
|
}
|
|
29
27
|
export declare const WS: import("@effect-ts/system/Has").Tag<WS>;
|
|
30
28
|
export declare const LiveWS: import("@effect-ts/system/Layer").Layer<unknown, never, import("@effect-ts/system/Has").Has<WS>>;
|
|
31
|
-
export declare const open: (url: string, out:
|
|
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>>;
|
|
32
30
|
export {};
|
package/WS/index.js
CHANGED
|
@@ -5,19 +5,20 @@ 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
9
|
const SC = tslib_1.__importStar(require("@effect-ts/core/Effect/Schedule"));
|
|
10
|
+
const CB = tslib_1.__importStar(require("callbag-effect-ts"));
|
|
11
11
|
const Function_1 = require("@effect-ts/core/Function");
|
|
12
12
|
const Has_1 = require("@effect-ts/core/Has");
|
|
13
13
|
const Ws = tslib_1.__importStar(require("ws"));
|
|
14
|
+
const Log_1 = require("../Log");
|
|
14
15
|
exports.Reconnect = Symbol();
|
|
15
|
-
const openSocket = (url, options) => (M.makeExit_(T.succeedWith(() => new Ws.WebSocket(url, options), fileName_1 + ":
|
|
16
|
+
const openSocket = (url, options) => (M.makeExit_(T.succeedWith(() => new Ws.WebSocket(url, options), fileName_1 + ":23:18"), (ws) => T.succeedWith(() => {
|
|
16
17
|
ws.removeAllListeners();
|
|
17
18
|
ws.close();
|
|
18
|
-
}, fileName_1 + ":
|
|
19
|
-
const recv = (ws) =>
|
|
20
|
-
ws.on("message", (message) => emit.
|
|
19
|
+
}, fileName_1 + ":25:20"), fileName_1 + ":24:15"));
|
|
20
|
+
const recv = (ws) => CB.async((emit) => {
|
|
21
|
+
ws.on("message", (message) => emit.data(message));
|
|
21
22
|
ws.on("error", (cause) => {
|
|
22
23
|
emit.fail({
|
|
23
24
|
_tag: "error",
|
|
@@ -30,7 +31,7 @@ const recv = (ws) => S.async((emit) => {
|
|
|
30
31
|
reason: reason.toString("utf8"),
|
|
31
32
|
}));
|
|
32
33
|
});
|
|
33
|
-
const send = (out) => (
|
|
34
|
+
const send = (ws, out) => (CB.drain(CB.tap_(CB.tap_(CB.unwrap(T.map_(T.effectAsync((cb) => {
|
|
34
35
|
if (ws.readyState & ws.OPEN) {
|
|
35
36
|
cb(T.unit);
|
|
36
37
|
}
|
|
@@ -39,32 +40,31 @@ const send = (out) => (ws) => (S.drain(S.tap_(S.unwrap(T.map_(T.effectAsync((cb)
|
|
|
39
40
|
cb(T.unit);
|
|
40
41
|
});
|
|
41
42
|
}
|
|
42
|
-
}, fileName_1 + ":
|
|
43
|
+
}, fileName_1 + ":52:18"), () => CB.fromQueue(out), fileName_1 + ":61:10")), (p) => (0, Log_1.logDebug)("WSService", "send", p)), (data) => T.effectAsync((cb) => {
|
|
43
44
|
if (data === exports.Reconnect) {
|
|
44
45
|
ws.close(1012, "reconnecting");
|
|
45
46
|
cb(T.unit);
|
|
46
47
|
}
|
|
47
48
|
else {
|
|
48
|
-
console.error(data);
|
|
49
49
|
ws.send(data, (err) => {
|
|
50
50
|
if (err) {
|
|
51
|
-
cb(T.fail({ _tag: "write", cause: err }, fileName_1 + ":
|
|
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 + ":
|
|
59
|
-
const duplex = (out) => (ws) =>
|
|
60
|
-
const openDuplex = (url, out, options) => (
|
|
61
|
-
const
|
|
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 = () => ({
|
|
62
62
|
_tag: "WSService",
|
|
63
63
|
open: openDuplex,
|
|
64
|
-
}
|
|
64
|
+
});
|
|
65
65
|
exports.WS = (0, Has_1.tag)();
|
|
66
|
-
exports.LiveWS = T.toLayer(exports.WS)(
|
|
66
|
+
exports.LiveWS = T.toLayer(exports.WS)(T.succeedWith(makeService, fileName_1 + ":106:50"));
|
|
67
67
|
// Helpers
|
|
68
|
-
const open = (url, out, options) => T.accessService(exports.WS)(({ open }) => open(url, out, options), fileName_1 + ":
|
|
68
|
+
const open = (url, out, options) => T.accessService(exports.WS)(({ open }) => open(url, out, options), fileName_1 + ":113:25");
|
|
69
69
|
exports.open = open;
|
|
70
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":";;;;;;AAAA,kEAA2C;AAC3C,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"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"}
|