@effect-app/infra 1.20.0 → 1.20.1
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/CHANGELOG.md +6 -0
- package/_cjs/api/internal/events.cjs +2 -1
- package/_cjs/api/internal/events.cjs.map +1 -1
- package/dist/api/internal/events.d.ts +2 -2
- package/dist/api/internal/events.d.ts.map +1 -1
- package/dist/api/internal/events.js +4 -2
- package/package.json +3 -3
- package/src/api/internal/events.ts +42 -34
package/CHANGELOG.md
CHANGED
|
@@ -14,7 +14,8 @@ const keepAlive = _effectApp.Stream.schedule(_effectApp.Effect.succeed(":keep-al
|
|
|
14
14
|
const makeSSE = (events, schema) => _effectApp.Effect.gen(function* () {
|
|
15
15
|
yield* _effectApp.Effect.logInfo("$ start listening to events");
|
|
16
16
|
const enc = new TextEncoder();
|
|
17
|
-
const
|
|
17
|
+
const encode = _effectApp.S.encode(schema);
|
|
18
|
+
const eventStream = _effectApp.Stream.flatMap(events, _ => encode(_.evt).pipe(_effectApp.Effect.andThen(evt => `id: ${_.evt.id}\ndata: ${JSON.stringify(evt)}`)));
|
|
18
19
|
const stream = (0, _effectApp.pipe)(setRetry, _effectApp.Stream.merge(keepAlive), _effectApp.Stream.merge(eventStream), _effectApp.Stream.map(_ => enc.encode(_ + "\n\n")));
|
|
19
20
|
const ctx = yield* _effectApp.Effect.context();
|
|
20
21
|
const res = _http.HttpServerResponse.stream(stream.pipe(_effectApp.Stream.tapErrorCause((0, _errorReporter.reportError)("Request")), _effectApp.Stream.provideContext(ctx)), {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"events.cjs","names":["_setupRequest","require","_errorReporter","_effectApp","_http","setRetry","Stream","succeed","keepAlive","schedule","Effect","Schedule","fixed","Duration","seconds","makeSSE","events","schema","gen","logInfo","enc","TextEncoder","eventStream","
|
|
1
|
+
{"version":3,"file":"events.cjs","names":["_setupRequest","require","_errorReporter","_effectApp","_http","setRetry","Stream","succeed","keepAlive","schedule","Effect","Schedule","fixed","Duration","seconds","makeSSE","events","schema","gen","logInfo","enc","TextEncoder","encode","S","eventStream","flatMap","_","evt","pipe","andThen","id","JSON","stringify","stream","merge","map","ctx","context","res","HttpServerResponse","tapErrorCause","reportError","provideContext","contentType","headers","HttpHeaders","fromInput","setupRequestContext","exports"],"sources":["../../../src/api/internal/events.ts"],"sourcesContent":[null],"mappings":";;;;;;AAAA,IAAAA,aAAA,GAAAC,OAAA;AACA,IAAAC,cAAA,GAAAD,OAAA;AACA,IAAAE,UAAA,GAAAF,OAAA;AACA,IAAAG,KAAA,GAAAH,OAAA;AAEA;AACA,MAAMI,QAAQ,GAAGC,iBAAM,CAACC,OAAO,CAAC,cAAc,CAAC;AAC/C,MAAMC,SAAS,GAAGF,iBAAM,CAACG,QAAQ,CAACC,iBAAM,CAACH,OAAO,CAAC,aAAa,CAAC,EAAEI,mBAAQ,CAACC,KAAK,CAACC,mBAAQ,CAACC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;AAE/F,MAAMC,OAAO,GAAGA,CACrBC,MAA0D,EAC1DC,MAA2B,KAE3BP,iBAAM,CACHQ,GAAG,CAAC,aAAS;EACZ,OAAOR,iBAAM,CAACS,OAAO,CAAC,6BAA6B,CAAC;EAEpD,MAAMC,GAAG,GAAG,IAAIC,WAAW,EAAE;EAE7B,MAAMC,MAAM,GAAGC,YAAC,CAACD,MAAM,CAACL,MAAM,CAAC;EAE/B,MAAMO,WAAW,GAAGlB,iBAAM,CAACmB,OAAO,CAChCT,MAAM,EACLU,CAAC,IACAJ,MAAM,CAACI,CAAC,CAACC,GAAG,CAAC,CACVC,IAAI,CAAClB,iBAAM,CAACmB,OAAO,CAAEF,GAAG,IAAK,OAAOD,CAAC,CAACC,GAAG,CAACG,EAAE,WAAWC,IAAI,CAACC,SAAS,CAACL,GAAG,CAAC,EAAE,CAAC,CAAC,CACpF;EAED,MAAMM,MAAM,GAAG,IAAAL,eAAI,EACjBvB,QAAQ,EACRC,iBAAM,CAAC4B,KAAK,CAAC1B,SAAS,CAAC,EACvBF,iBAAM,CAAC4B,KAAK,CAACV,WAAW,CAAC,EACzBlB,iBAAM,CAAC6B,GAAG,CAAET,CAAC,IAAKN,GAAG,CAACE,MAAM,CAACI,CAAC,GAAG,MAAM,CAAC,CAAC,CAC1C;EAED,MAAMU,GAAG,GAAG,OAAO1B,iBAAM,CAAC2B,OAAO,EAAU;EAC3C,MAAMC,GAAG,GAAGC,wBAAkB,CAACN,MAAM,CACnCA,MAAM,CACHL,IAAI,CACHtB,iBAAM,CAACkC,aAAa,CAAC,IAAAC,0BAAW,EAAC,SAAS,CAAC,CAAC,EAC5CnC,iBAAM,CAACoC,cAAc,CAACN,GAAG,CAAC,CAC3B,EACH;IACEO,WAAW,EAAE,mBAAmB;IAChCC,OAAO,EAAEC,iBAAW,CAACC,SAAS,CAAC;MAC7B,cAAc,EAAE,mBAAmB;MACnC,eAAe,EAAE,UAAU;MAC3B,mBAAmB,EAAE,IAAI;MACzB,YAAY,EAAE,YAAY,CAAC;KAC5B;GACF,CACF;EACD,OAAOR,GAAG;AACZ,CAAC,CAAC,CACDV,IAAI,CAAClB,iBAAM,CAAC8B,aAAa,CAAC,IAAAC,0BAAW,EAAC,SAAS,CAAC,CAAC,EAAGf,CAAC,IAAK,IAAAqB,iCAAmB,EAACrB,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAAsB,OAAA,CAAAjC,OAAA,GAAAA,OAAA","ignoreList":[]}
|
|
@@ -2,8 +2,8 @@ import { Effect, S, Stream } from "effect-app";
|
|
|
2
2
|
import { HttpServerResponse } from "effect-app/http";
|
|
3
3
|
export declare const makeSSE: <A extends {
|
|
4
4
|
id: any;
|
|
5
|
-
}, E, R, SI>(events: Stream.Stream<{
|
|
5
|
+
}, E, R, SI, SR>(events: Stream.Stream<{
|
|
6
6
|
evt: A;
|
|
7
7
|
namespace: string;
|
|
8
|
-
}, E, R>, schema: S.Schema<A, SI>) => Effect.Effect<HttpServerResponse.HttpServerResponse, never, import("../../services/RequestContextContainer.js").RequestContextContainer | import("../../services/Store/ContextMapContainer.js").ContextMapContainer | Exclude<Exclude<R, import("effect/Tracer").ParentSpan>, never>>;
|
|
8
|
+
}, E, R>, schema: S.Schema<A, SI, SR>) => Effect.Effect<HttpServerResponse.HttpServerResponse, never, import("../../services/RequestContextContainer.js").RequestContextContainer | import("../../services/Store/ContextMapContainer.js").ContextMapContainer | Exclude<Exclude<R, import("effect/Tracer").ParentSpan>, never> | Exclude<Exclude<SR, import("effect/Tracer").ParentSpan>, never>>;
|
|
9
9
|
//# sourceMappingURL=events.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../../src/api/internal/events.ts"],"names":[],"mappings":"AAEA,OAAO,EAAY,MAAM,EAAQ,CAAC,EAAY,MAAM,EAAE,MAAM,YAAY,CAAA;AACxE,OAAO,EAAe,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AAMjE,eAAO,MAAM,OAAO,GAAI,CAAC,SAAS;IAAE,EAAE,EAAE,GAAG,CAAA;CAAE,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../../src/api/internal/events.ts"],"names":[],"mappings":"AAEA,OAAO,EAAY,MAAM,EAAQ,CAAC,EAAY,MAAM,EAAE,MAAM,YAAY,CAAA;AACxE,OAAO,EAAe,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AAMjE,eAAO,MAAM,OAAO,GAAI,CAAC,SAAS;IAAE,EAAE,EAAE,GAAG,CAAA;CAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,UACjD,MAAM,CAAC,MAAM,CAAC;IAAE,GAAG,EAAE,CAAC,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,EAAE,CAAC,EAAE,CAAC,CAAC,UAClD,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,4VA2CmE,CAAA"}
|
|
@@ -9,7 +9,9 @@ export const makeSSE = (events, schema) => Effect
|
|
|
9
9
|
.gen(function* () {
|
|
10
10
|
yield* Effect.logInfo("$ start listening to events");
|
|
11
11
|
const enc = new TextEncoder();
|
|
12
|
-
const
|
|
12
|
+
const encode = S.encode(schema);
|
|
13
|
+
const eventStream = Stream.flatMap(events, (_) => encode(_.evt)
|
|
14
|
+
.pipe(Effect.andThen((evt) => `id: ${_.evt.id}\ndata: ${JSON.stringify(evt)}`)));
|
|
13
15
|
const stream = pipe(setRetry, Stream.merge(keepAlive), Stream.merge(eventStream), Stream.map((_) => enc.encode(_ + "\n\n")));
|
|
14
16
|
const ctx = yield* Effect.context();
|
|
15
17
|
const res = HttpServerResponse.stream(stream
|
|
@@ -25,4 +27,4 @@ export const makeSSE = (events, schema) => Effect
|
|
|
25
27
|
return res;
|
|
26
28
|
})
|
|
27
29
|
.pipe(Effect.tapErrorCause(reportError("Request")), (_) => setupRequestContext(_, "events"));
|
|
28
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
30
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwaS9pbnRlcm5hbC9ldmVudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sb0NBQW9DLENBQUE7QUFDeEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGlDQUFpQyxDQUFBO0FBQzdELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLFlBQVksQ0FBQTtBQUN4RSxPQUFPLEVBQUUsV0FBVyxFQUFFLGtCQUFrQixFQUFFLE1BQU0saUJBQWlCLENBQUE7QUFFakUsb0VBQW9FO0FBQ3BFLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUE7QUFDL0MsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUE7QUFFdEcsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLENBQ3JCLE1BQTBELEVBQzFELE1BQTJCLEVBQzNCLEVBQUUsQ0FDRixNQUFNO0tBQ0gsR0FBRyxDQUFDLFFBQVEsQ0FBQztJQUNaLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsNkJBQTZCLENBQUMsQ0FBQTtJQUVwRCxNQUFNLEdBQUcsR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFBO0lBRTdCLE1BQU0sTUFBTSxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUE7SUFFL0IsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FDaEMsTUFBTSxFQUNOLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FDSixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztTQUNWLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxXQUFXLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQ3BGLENBQUE7SUFFRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQ2pCLFFBQVEsRUFDUixNQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxFQUN2QixNQUFNLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxFQUN6QixNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUMxQyxDQUFBO0lBRUQsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBVSxDQUFBO0lBQzNDLE1BQU0sR0FBRyxHQUFHLGtCQUFrQixDQUFDLE1BQU0sQ0FDbkMsTUFBTTtTQUNILElBQUksQ0FDSCxNQUFNLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUM1QyxNQUFNLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUMzQixFQUNIO1FBQ0UsV0FBVyxFQUFFLG1CQUFtQjtRQUNoQyxPQUFPLEVBQUUsV0FBVyxDQUFDLFNBQVMsQ0FBQztZQUM3QixjQUFjLEVBQUUsbUJBQW1CO1lBQ25DLGVBQWUsRUFBRSxVQUFVO1lBQzNCLG1CQUFtQixFQUFFLElBQUk7WUFDekIsWUFBWSxFQUFFLFlBQVksQ0FBQyxpQ0FBaUM7U0FDN0QsQ0FBQztLQUNILENBQ0YsQ0FBQTtJQUNELE9BQU8sR0FBRyxDQUFBO0FBQ1osQ0FBQyxDQUFDO0tBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLG1CQUFtQixDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFBIn0=
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@effect-app/infra",
|
|
3
|
-
"version": "1.20.
|
|
3
|
+
"version": "1.20.1",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"dependencies": {
|
|
@@ -18,10 +18,10 @@
|
|
|
18
18
|
"proper-lockfile": "^4.1.2",
|
|
19
19
|
"pure-rand": "6.1.0",
|
|
20
20
|
"redlock": "^4.2.0",
|
|
21
|
-
"@effect-app/
|
|
21
|
+
"@effect-app/core": "1.10.1",
|
|
22
22
|
"@effect-app/schema": "1.12.1",
|
|
23
23
|
"effect-app": "1.17.1",
|
|
24
|
-
"@effect-app/
|
|
24
|
+
"@effect-app/infra-adapters": "1.11.3"
|
|
25
25
|
},
|
|
26
26
|
"devDependencies": {
|
|
27
27
|
"@babel/cli": "^7.25.6",
|
|
@@ -7,41 +7,49 @@ import { HttpHeaders, HttpServerResponse } from "effect-app/http"
|
|
|
7
7
|
const setRetry = Stream.succeed("retry: 10000")
|
|
8
8
|
const keepAlive = Stream.schedule(Effect.succeed(":keep-alive"), Schedule.fixed(Duration.seconds(15)))
|
|
9
9
|
|
|
10
|
-
export const makeSSE = <A extends { id: any }, E,R, SI
|
|
11
|
-
.
|
|
12
|
-
|
|
10
|
+
export const makeSSE = <A extends { id: any }, E, R, SI, SR>(
|
|
11
|
+
events: Stream.Stream<{ evt: A; namespace: string }, E, R>,
|
|
12
|
+
schema: S.Schema<A, SI, SR>
|
|
13
|
+
) =>
|
|
14
|
+
Effect
|
|
15
|
+
.gen(function*() {
|
|
16
|
+
yield* Effect.logInfo("$ start listening to events")
|
|
13
17
|
|
|
14
|
-
|
|
18
|
+
const enc = new TextEncoder()
|
|
15
19
|
|
|
16
|
-
|
|
17
|
-
events,
|
|
18
|
-
(_) => `id: ${_.evt.id}\ndata: ${JSON.stringify(S.encodeSync(schema)(_.evt))}`
|
|
19
|
-
)
|
|
20
|
+
const encode = S.encode(schema)
|
|
20
21
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
22
|
+
const eventStream = Stream.flatMap(
|
|
23
|
+
events,
|
|
24
|
+
(_) =>
|
|
25
|
+
encode(_.evt)
|
|
26
|
+
.pipe(Effect.andThen((evt) => `id: ${_.evt.id}\ndata: ${JSON.stringify(evt)}`))
|
|
27
|
+
)
|
|
27
28
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
.
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
29
|
+
const stream = pipe(
|
|
30
|
+
setRetry,
|
|
31
|
+
Stream.merge(keepAlive),
|
|
32
|
+
Stream.merge(eventStream),
|
|
33
|
+
Stream.map((_) => enc.encode(_ + "\n\n"))
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
const ctx = yield* Effect.context<R | SR>()
|
|
37
|
+
const res = HttpServerResponse.stream(
|
|
38
|
+
stream
|
|
39
|
+
.pipe(
|
|
40
|
+
Stream.tapErrorCause(reportError("Request")),
|
|
41
|
+
Stream.provideContext(ctx)
|
|
42
|
+
),
|
|
43
|
+
{
|
|
44
|
+
contentType: "text/event-stream",
|
|
45
|
+
headers: HttpHeaders.fromInput({
|
|
46
|
+
"content-type": "text/event-stream",
|
|
47
|
+
"cache-control": "no-cache",
|
|
48
|
+
"x-accel-buffering": "no",
|
|
49
|
+
"connection": "keep-alive" // if (req.httpVersion !== "2.0")
|
|
50
|
+
})
|
|
51
|
+
}
|
|
52
|
+
)
|
|
53
|
+
return res
|
|
54
|
+
})
|
|
55
|
+
.pipe(Effect.tapErrorCause(reportError("Request")), (_) => setupRequestContext(_, "events"))
|