@effect-app/infra 1.20.0 → 1.21.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/CHANGELOG.md +12 -0
- package/_cjs/RequestContext.cjs +4 -2
- package/_cjs/RequestContext.cjs.map +1 -1
- package/_cjs/api/internal/RequestContextMiddleware.cjs +57 -0
- package/_cjs/api/internal/RequestContextMiddleware.cjs.map +1 -0
- package/_cjs/api/internal/events.cjs +2 -1
- package/_cjs/api/internal/events.cjs.map +1 -1
- package/_cjs/api/internal/health.cjs +13 -0
- package/_cjs/api/internal/health.cjs.map +1 -0
- package/_cjs/api/middlewares.cjs +24 -0
- package/_cjs/api/middlewares.cjs.map +1 -1
- package/dist/RequestContext.d.ts +5 -3
- package/dist/RequestContext.d.ts.map +1 -1
- package/dist/RequestContext.js +4 -2
- package/dist/api/internal/RequestContextMiddleware.d.ts +6 -0
- package/dist/api/internal/RequestContextMiddleware.d.ts.map +1 -0
- package/dist/api/internal/RequestContextMiddleware.js +55 -0
- 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/dist/api/internal/health.d.ts +3 -0
- package/dist/api/internal/health.d.ts.map +1 -0
- package/dist/api/internal/health.js +5 -0
- package/dist/api/middlewares.d.ts +2 -0
- package/dist/api/middlewares.d.ts.map +1 -1
- package/dist/api/middlewares.js +3 -1
- package/package.json +3 -3
- package/src/RequestContext.ts +5 -1
- package/src/api/internal/RequestContextMiddleware.ts +64 -0
- package/src/api/internal/events.ts +42 -34
- package/src/api/internal/health.ts +8 -0
- package/src/api/middlewares.ts +2 -0
package/CHANGELOG.md
CHANGED
package/_cjs/RequestContext.cjs
CHANGED
|
@@ -3,17 +3,19 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.spanAttributes = exports.RequestContextParent = exports.RequestContext = void 0;
|
|
6
|
+
exports.spanAttributes = exports.RequestContextParent = exports.RequestContext = exports.Locale = void 0;
|
|
7
7
|
var _schema = require("@effect-app/schema");
|
|
8
8
|
var _effectApp = require("effect-app");
|
|
9
9
|
var _ids = require("effect-app/ids");
|
|
10
|
+
const Locale = exports.Locale = _effectApp.S.Literal("en", "de");
|
|
11
|
+
// TPDP: kind of obsolete now that we use actual spans
|
|
10
12
|
class RequestContextParent extends (0, _schema.ExtendedTaggedClass)()("RequestContext", {
|
|
11
13
|
id: _ids.RequestId,
|
|
12
14
|
name: _schema.NonEmptyString255,
|
|
13
15
|
userProfile: _effectApp.S.optional(_effectApp.S.Struct({
|
|
14
16
|
sub: _ids.UserProfileId
|
|
15
17
|
})),
|
|
16
|
-
locale:
|
|
18
|
+
locale: Locale,
|
|
17
19
|
createdAt: _effectApp.S.Date.withDefault
|
|
18
20
|
}) {}
|
|
19
21
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RequestContext.cjs","names":["_schema","require","_effectApp","_ids","RequestContextParent","ExtendedTaggedClass","id","RequestId","name","NonEmptyString255","userProfile","
|
|
1
|
+
{"version":3,"file":"RequestContext.cjs","names":["_schema","require","_effectApp","_ids","Locale","exports","S","Literal","RequestContextParent","ExtendedTaggedClass","id","RequestId","name","NonEmptyString255","userProfile","optional","Struct","sub","UserProfileId","locale","createdAt","Date","withDefault","RequestContext","omit","rootId","sourceId","parent","namespace","inherit","newSelf","toMonitoring","self","operationName","parentOperationName","parentLocale","spanAttributes","ctx","roles","undefined"],"sources":["../src/RequestContext.ts"],"sourcesContent":[null],"mappings":";;;;;;AAAA,IAAAA,OAAA,GAAAC,OAAA;AACA,IAAAC,UAAA,GAAAD,OAAA;AACA,IAAAE,IAAA,GAAAF,OAAA;AAEO,MAAMG,MAAM,GAAAC,OAAA,CAAAD,MAAA,GAAGE,YAAC,CAACC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC;AAG3C;AACM,MAAOC,oBAAqB,SAAQ,IAAAC,2BAAmB,GAG1D,CAAC,gBAAgB,EAAE;EACpBC,EAAE,EAAEC,cAAS;EACbC,IAAI,EAAEC,yBAAiB;EACvBC,WAAW,EAAER,YAAC,CAACS,QAAQ,CAACT,YAAC,CAACU,MAAM,CAAC;IAAEC,GAAG,EAAEC;EAAa,CAAE,CAAC,CAAC;EACzDC,MAAM,EAAEf,MAAM;EACdgB,SAAS,EAAEd,YAAC,CAACe,IAAI,CAACC;CACnB,CAAC;AAEF;;;;AAAAjB,OAAA,CAAAG,oBAAA,GAAAA,oBAAA;AAIM,MAAOe,cAAe,SAAQ,IAAAd,2BAAmB,GAGpD,CAAC,gBAAgB,EAAE;EACpB,GAAGD,oBAAoB,CAACgB,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;EAC1Cd,EAAE,EAAEC,cAAS,CAACW,WAAW;EACzBG,MAAM,EAAEd,cAAS;EACjBe,QAAQ,EAAEpB,YAAC,CAACS,QAAQ,CAACF,yBAAiB,CAAC;EACvCc,MAAM,EAAErB,YAAC,CAACS,QAAQ,CAACP,oBAAoB,CAAC;EACxCoB,SAAS,EAAEtB,YAAC,CAACS,QAAQ,CAACF,yBAAiB;EACvC;EACA;EACA;EACA;EACA;EACA;CACD,CAAC;EACA;EACA,OAAOgB,OAAOA,CAEZF,MAAsB,EACtBG,OAA8D;IAE9D,OAAO,IAAIP,cAAc,CAAC;MACxBK,SAAS,EAAED,MAAM,EAAEC,SAAS;MAC5B,GAAGE,OAAO;MACVL,MAAM,EAAEE,MAAM,CAACF,MAAM;MACrBE;KACD,CAAC;EACJ;EAEA,OAAOI,YAAYA,CAAaC,IAAoB;IAClD,OAAO;MACLC,aAAa,EAAED,IAAI,CAACpB,IAAI;MACxBO,MAAM,EAAEa,IAAI,CAACb,MAAM;MACnB,IAAIa,IAAI,CAACL,MAAM,GACX;QAAEO,mBAAmB,EAAEF,IAAI,CAACL,MAAM,CAACf,IAAI;QAAEuB,YAAY,EAAEH,IAAI,CAACL,MAAM,CAACR;MAAM,CAAE,GAC3E,EAAE;KACP;EACH;;AACDd,OAAA,CAAAkB,cAAA,GAAAA,cAAA;AAEM,MAAMa,cAAc,GAAIC,GAAmB,KAAM;EACtD,YAAY,EAAEA,GAAG,CAAC3B,EAAE;EACpB,iBAAiB,EAAE2B,GAAG,CAACZ,MAAM;EAC7B,cAAc,EAAEY,GAAG,CAACzB,IAAI;EACxB,gBAAgB,EAAEyB,GAAG,CAAClB,MAAM;EAC5B,mBAAmB,EAAEkB,GAAG,CAACT,SAAS;EAClC,IAAGS,GAAG,CAACX,QAAQ,GAAG;IAAE,mBAAmB,EAAEW,GAAG,CAACX;EAAQ,CAAE,GAAG,EAAE;EAC5D,IAAIW,GAAG,CAACvB,WAAW,EAAEG,GAAG,GACpB;IACA,kBAAkB,EAAEoB,GAAG,CACpBvB,WAAW,CACXG,GAAG;IACN,oBAAoB,EAAE,OAAO,IAAIoB,GAAG,CAC/BvB,WAAW,GACZuB,GAAG,CAACvB,WAAW,CAACwB,KAAK,GACrBC;GACL,GACC,EAAE;CACP,CAAC;AAWF;AACA;AACA;AACA;AAAAlC,OAAA,CAAA+B,cAAA,GAAAA,cAAA","ignoreList":[]}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.RequestContextMiddleware = void 0;
|
|
7
|
+
var _effectApp = require("effect-app");
|
|
8
|
+
var _http = require("effect-app/http");
|
|
9
|
+
var _ids = require("effect-app/ids");
|
|
10
|
+
var _schema = require("effect-app/schema");
|
|
11
|
+
var _RequestContext = require("../../RequestContext.cjs");
|
|
12
|
+
var _RequestContextContainer = require("../../services/RequestContextContainer.cjs");
|
|
13
|
+
var _setupRequest = require("../setupRequest.cjs");
|
|
14
|
+
const RequestContextMiddleware = (defaultLocale = "en") => _http.HttpMiddleware.make(app => _effectApp.Effect.gen(function* () {
|
|
15
|
+
const req = yield* _http.HttpServerRequest.HttpServerRequest;
|
|
16
|
+
const currentSpan = yield* _effectApp.Effect.currentSpan;
|
|
17
|
+
const parent = currentSpan?.parent ? currentSpan.parent.value : undefined;
|
|
18
|
+
const start = new Date();
|
|
19
|
+
const supported = _RequestContext.Locale.literals;
|
|
20
|
+
const desiredLocale = req.headers["x-locale"];
|
|
21
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-explicit-any
|
|
22
|
+
const locale = desiredLocale && supported.includes(desiredLocale) ? desiredLocale : defaultLocale;
|
|
23
|
+
const requestId = req.headers["request-id"];
|
|
24
|
+
const rootId = parent?.spanId ? (0, _ids.RequestId)(parent.spanId) : requestId ? (0, _ids.RequestId)(requestId) : _ids.RequestId.make();
|
|
25
|
+
const storeId = req.headers["x-store-id"];
|
|
26
|
+
const namespace = (0, _schema.NonEmptyString255)(storeId && (Array.isArray(storeId) ? storeId[0] : storeId) || "primary");
|
|
27
|
+
const deviceId = req.headers["x-fe-device-id"];
|
|
28
|
+
const requestContext = new _RequestContext.RequestContext({
|
|
29
|
+
id: currentSpan?.spanId ? (0, _ids.RequestId)(currentSpan.spanId) : _ids.RequestId.make(),
|
|
30
|
+
rootId,
|
|
31
|
+
name: (0, _schema.NonEmptyString255)(req.originalUrl),
|
|
32
|
+
// set more detailed elsewhere
|
|
33
|
+
locale,
|
|
34
|
+
createdAt: start,
|
|
35
|
+
namespace,
|
|
36
|
+
sourceId: deviceId ? (0, _schema.NonEmptyString255)(deviceId) : undefined
|
|
37
|
+
// ...(context.operation.parentId
|
|
38
|
+
// ? {
|
|
39
|
+
// parent: new RequestContextParent({
|
|
40
|
+
// id: RequestId(context.operation.parentId),
|
|
41
|
+
// locale,
|
|
42
|
+
// name: NonEmptyString255("API Request")
|
|
43
|
+
// })
|
|
44
|
+
// }
|
|
45
|
+
// : {})
|
|
46
|
+
});
|
|
47
|
+
const rcc = yield* _RequestContextContainer.RequestContextContainer;
|
|
48
|
+
yield* rcc.update(_ => requestContext);
|
|
49
|
+
const res = yield* (0, _setupRequest.setupExistingRequestContext)(app, requestContext);
|
|
50
|
+
// TODO: how to set also on errors?
|
|
51
|
+
return _http.HttpServerResponse.setHeaders(res, {
|
|
52
|
+
"request-id": requestContext.rootId,
|
|
53
|
+
"Content-Language": requestContext.locale
|
|
54
|
+
});
|
|
55
|
+
}));
|
|
56
|
+
exports.RequestContextMiddleware = RequestContextMiddleware;
|
|
57
|
+
//# sourceMappingURL=RequestContextMiddleware.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RequestContextMiddleware.cjs","names":["_effectApp","require","_http","_ids","_schema","_RequestContext","_RequestContextContainer","_setupRequest","RequestContextMiddleware","defaultLocale","HttpMiddleware","make","app","Effect","gen","req","HttpServerRequest","currentSpan","parent","value","undefined","start","Date","supported","Locale","literals","desiredLocale","headers","locale","includes","requestId","rootId","spanId","RequestId","storeId","namespace","NonEmptyString255","Array","isArray","deviceId","requestContext","RequestContext","id","name","originalUrl","createdAt","sourceId","rcc","RequestContextContainer","update","_","res","setupExistingRequestContext","HttpServerResponse","setHeaders","exports"],"sources":["../../../src/api/internal/RequestContextMiddleware.ts"],"sourcesContent":[null],"mappings":";;;;;;AAAA,IAAAA,UAAA,GAAAC,OAAA;AACA,IAAAC,KAAA,GAAAD,OAAA;AACA,IAAAE,IAAA,GAAAF,OAAA;AACA,IAAAG,OAAA,GAAAH,OAAA;AACA,IAAAI,eAAA,GAAAJ,OAAA;AACA,IAAAK,wBAAA,GAAAL,OAAA;AACA,IAAAM,aAAA,GAAAN,OAAA;AAEO,MAAMO,wBAAwB,GAAGA,CAACC,aAAA,GAAwB,IAAI,KACnEC,oBAAc,CAACC,IAAI,CAAEC,GAAG,IACtBC,iBAAM,CAACC,GAAG,CAAC,aAAS;EAClB,MAAMC,GAAG,GAAG,OAAOC,uBAAiB,CAACA,iBAAiB;EAEtD,MAAMC,WAAW,GAAG,OAAOJ,iBAAM,CAACI,WAAW;EAC7C,MAAMC,MAAM,GAAGD,WAAW,EAAEC,MAAM,GAAGD,WAAW,CAACC,MAAM,CAACC,KAAK,GAAGC,SAAS;EACzE,MAAMC,KAAK,GAAG,IAAIC,IAAI,EAAE;EACxB,MAAMC,SAAS,GAAGC,sBAAM,CAACC,QAAQ;EACjC,MAAMC,aAAa,GAAGX,GAAG,CAACY,OAAO,CAAC,UAAU,CAAC;EAC7C;EACA,MAAMC,MAAM,GAAGF,aAAa,IAAIH,SAAS,CAACM,QAAQ,CAACH,aAAoB,CAAC,GACnEA,aAA0C,GAC3CjB,aAAa;EAEjB,MAAMqB,SAAS,GAAGf,GAAG,CAACY,OAAO,CAAC,YAAY,CAAC;EAC3C,MAAMI,MAAM,GAAGb,MAAM,EAAEc,MAAM,GACzB,IAAAC,cAAS,EAACf,MAAM,CAACc,MAAM,CAAC,GACxBF,SAAS,GACT,IAAAG,cAAS,EAACH,SAAS,CAAC,GACpBG,cAAS,CAACtB,IAAI,EAAE;EAEpB,MAAMuB,OAAO,GAAGnB,GAAG,CAACY,OAAO,CAAC,YAAY,CAAC;EACzC,MAAMQ,SAAS,GAAG,IAAAC,yBAAiB,EAAEF,OAAO,KAAKG,KAAK,CAACC,OAAO,CAACJ,OAAO,CAAC,GAAGA,OAAO,CAAC,CAAC,CAAC,GAAGA,OAAO,CAAC,IAAK,SAAS,CAAC;EAE9G,MAAMK,QAAQ,GAAGxB,GAAG,CAACY,OAAO,CAAC,gBAAgB,CAAC;EAE9C,MAAMa,cAAc,GAAG,IAAIC,8BAAc,CAAC;IACxCC,EAAE,EAAEzB,WAAW,EAAEe,MAAM,GAAG,IAAAC,cAAS,EAAChB,WAAW,CAACe,MAAM,CAAC,GAAGC,cAAS,CAACtB,IAAI,EAAE;IAC1EoB,MAAM;IACNY,IAAI,EAAE,IAAAP,yBAAiB,EAACrB,GAAG,CAAC6B,WAAW,CAAC;IAAE;IAC1ChB,MAAM;IACNiB,SAAS,EAAExB,KAAK;IAChBc,SAAS;IACTW,QAAQ,EAAEP,QAAQ,GAAG,IAAAH,yBAAiB,EAACG,QAAQ,CAAC,GAAGnB;IACnD;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;GACD,CAAC;EACF,MAAM2B,GAAG,GAAG,OAAOC,gDAAuB;EAC1C,OAAOD,GAAG,CAACE,MAAM,CAAEC,CAAC,IAAKV,cAAc,CAAC;EACxC,MAAMW,GAAG,GAAG,OAAO,IAAAC,yCAA2B,EAACxC,GAAG,EAAE4B,cAAc,CAAC;EAEnE;EACA,OAAOa,wBAAkB,CAACC,UAAU,CAACH,GAAG,EAAE;IACxC,YAAY,EAAEX,cAAc,CAACT,MAAM;IACnC,kBAAkB,EAAES,cAAc,CAACZ;GACpC,CAAC;AACJ,CAAC,CAAC,CACH;AAAA2B,OAAA,CAAA/C,wBAAA,GAAAA,wBAAA","ignoreList":[]}
|
|
@@ -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":[]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.serverHealth = serverHealth;
|
|
7
|
+
var _http = require("effect-app/http");
|
|
8
|
+
function serverHealth(version) {
|
|
9
|
+
return _http.HttpRouter.get("/.well-known/local/server-health", _http.HttpServerResponse.unsafeJson({
|
|
10
|
+
version
|
|
11
|
+
}).pipe(_http.HttpMiddleware.withLoggerDisabled));
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=health.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health.cjs","names":["_http","require","serverHealth","version","HttpRouter","get","HttpServerResponse","unsafeJson","pipe","HttpMiddleware","withLoggerDisabled"],"sources":["../../../src/api/internal/health.ts"],"sourcesContent":[null],"mappings":";;;;;;AAAA,IAAAA,KAAA,GAAAC,OAAA;AAEM,SAAUC,YAAYA,CAACC,OAAe;EAC1C,OAAOC,gBAAU,CAACC,GAAG,CACnB,kCAAkC,EAClCC,wBAAkB,CAACC,UAAU,CAAC;IAAEJ;EAAO,CAAE,CAAC,CAACK,IAAI,CAACC,oBAAc,CAACC,kBAAkB,CAAC,CACnF;AACH","ignoreList":[]}
|
package/_cjs/api/middlewares.cjs
CHANGED
|
@@ -25,6 +25,30 @@ Object.keys(_events).forEach(function (key) {
|
|
|
25
25
|
}
|
|
26
26
|
});
|
|
27
27
|
});
|
|
28
|
+
var _health = require("./internal/health.cjs");
|
|
29
|
+
Object.keys(_health).forEach(function (key) {
|
|
30
|
+
if (key === "default" || key === "__esModule") return;
|
|
31
|
+
if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
|
|
32
|
+
if (key in exports && exports[key] === _health[key]) return;
|
|
33
|
+
Object.defineProperty(exports, key, {
|
|
34
|
+
enumerable: true,
|
|
35
|
+
get: function () {
|
|
36
|
+
return _health[key];
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
var _RequestContextMiddleware = require("./internal/RequestContextMiddleware.cjs");
|
|
41
|
+
Object.keys(_RequestContextMiddleware).forEach(function (key) {
|
|
42
|
+
if (key === "default" || key === "__esModule") return;
|
|
43
|
+
if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
|
|
44
|
+
if (key in exports && exports[key] === _RequestContextMiddleware[key]) return;
|
|
45
|
+
Object.defineProperty(exports, key, {
|
|
46
|
+
enumerable: true,
|
|
47
|
+
get: function () {
|
|
48
|
+
return _RequestContextMiddleware[key];
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
});
|
|
28
52
|
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
29
53
|
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
30
54
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"middlewares.cjs","names":["internal","_interopRequireWildcard","require","_events","Object","keys","forEach","key","prototype","hasOwnProperty","call","_exportNames","exports","defineProperty","enumerable","get","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","n","__proto__","a","getOwnPropertyDescriptor","u","i","set","accessLog","uuidLogAnnotation","endpointCallsMetric","errorLog","basicAuth","cors"],"sources":["../../src/api/middlewares.ts"],"sourcesContent":[null],"mappings":";;;;;;;;;;;;;;AAQA,IAAAA,QAAA,GAAAC,uBAAA,CAAAC,OAAA;AAEA,IAAAC,OAAA,GAAAD,OAAA;AAAAE,MAAA,CAAAC,IAAA,CAAAF,OAAA,EAAAG,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAH,MAAA,CAAAI,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAC,YAAA,EAAAJ,GAAA;EAAA,IAAAA,GAAA,IAAAK,OAAA,IAAAA,OAAA,CAAAL,GAAA,MAAAJ,OAAA,CAAAI,GAAA;EAAAH,MAAA,CAAAS,cAAA,CAAAD,OAAA,EAAAL,GAAA;IAAAO,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAZ,OAAA,CAAAI,GAAA;IAAA;EAAA;AAAA;
|
|
1
|
+
{"version":3,"file":"middlewares.cjs","names":["internal","_interopRequireWildcard","require","_events","Object","keys","forEach","key","prototype","hasOwnProperty","call","_exportNames","exports","defineProperty","enumerable","get","_health","_RequestContextMiddleware","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","n","__proto__","a","getOwnPropertyDescriptor","u","i","set","accessLog","uuidLogAnnotation","endpointCallsMetric","errorLog","basicAuth","cors"],"sources":["../../src/api/middlewares.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
package/dist/RequestContext.d.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { NonEmptyString255 } from "@effect-app/schema";
|
|
2
2
|
import { S } from "effect-app";
|
|
3
|
+
export declare const Locale: S.Literal<["en", "de"]>;
|
|
4
|
+
export type Locale = typeof Locale.Type;
|
|
3
5
|
declare const RequestContextParent_base: S.EnhancedClass<RequestContextParent, {
|
|
4
6
|
readonly _tag: S.tag<"RequestContext">;
|
|
5
7
|
} & {
|
|
@@ -25,11 +27,11 @@ declare const RequestContextParent_base: S.EnhancedClass<RequestContextParent, {
|
|
|
25
27
|
}, RequestContextParent.From, never, {
|
|
26
28
|
readonly id: NonEmptyString255;
|
|
27
29
|
readonly name: string & S.NonEmptyString255Brand;
|
|
30
|
+
readonly locale: "en" | "de";
|
|
28
31
|
readonly createdAt?: Date;
|
|
29
32
|
readonly userProfile?: {
|
|
30
33
|
readonly sub: string & S.StringIdBrand & import("effect-app/ids").UserProfileIdBrand;
|
|
31
34
|
} | undefined;
|
|
32
|
-
readonly locale: "en" | "de";
|
|
33
35
|
}, {}, {}>;
|
|
34
36
|
export declare class RequestContextParent extends RequestContextParent_base {
|
|
35
37
|
}
|
|
@@ -48,6 +50,7 @@ declare const RequestContext_base: S.EnhancedClass<RequestContext, {
|
|
|
48
50
|
parent: S.optional<typeof RequestContextParent>;
|
|
49
51
|
namespace: S.optional<S.WithDefaults<S.Schema<string & S.NonEmptyString255Brand, string, never>> & S.Schema<string & S.NonEmptyString255Brand, string, never>>;
|
|
50
52
|
name: S.WithDefaults<S.Schema<string & S.NonEmptyString255Brand, string, never>> & S.Schema<string & S.NonEmptyString255Brand, string, never>;
|
|
53
|
+
locale: S.Literal<["en", "de"]>;
|
|
51
54
|
createdAt: S.PropertySignature<":", Date, never, ":", string, true, never>;
|
|
52
55
|
userProfile: S.optional<import("@effect/schema/Schema").Struct<{
|
|
53
56
|
sub: S.WithDefaults<S.Schema<string & S.StringIdBrand & import("effect-app/ids").UserProfileIdBrand, string, never> & {
|
|
@@ -58,15 +61,14 @@ declare const RequestContext_base: S.EnhancedClass<RequestContext, {
|
|
|
58
61
|
withDefault: S.PropertySignature<":", string & S.StringIdBrand & import("effect-app/ids").UserProfileIdBrand, never, ":", string, true, never>;
|
|
59
62
|
} & S.WithDefaults<S.Schema<string & S.StringIdBrand & import("effect-app/ids").UserProfileIdBrand, string, never>>;
|
|
60
63
|
}>>;
|
|
61
|
-
locale: S.Literal<["en", "de"]>;
|
|
62
64
|
}, RequestContext.From, never, {
|
|
63
65
|
readonly id?: string & S.NonEmptyString255Brand;
|
|
64
66
|
readonly name: string & S.NonEmptyString255Brand;
|
|
67
|
+
readonly locale: "en" | "de";
|
|
65
68
|
readonly createdAt?: Date;
|
|
66
69
|
readonly userProfile?: {
|
|
67
70
|
readonly sub: string & S.StringIdBrand & import("effect-app/ids").UserProfileIdBrand;
|
|
68
71
|
} | undefined;
|
|
69
|
-
readonly locale: "en" | "de";
|
|
70
72
|
readonly rootId: NonEmptyString255;
|
|
71
73
|
readonly sourceId?: (string & S.NonEmptyString255Brand) | undefined;
|
|
72
74
|
readonly parent?: RequestContextParent | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RequestContext.d.ts","sourceRoot":"","sources":["../src/RequestContext.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AAC3E,OAAO,EAAE,CAAC,EAAE,MAAM,YAAY,CAAA;;;;;;
|
|
1
|
+
{"version":3,"file":"RequestContext.d.ts","sourceRoot":"","sources":["../src/RequestContext.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AAC3E,OAAO,EAAE,CAAC,EAAE,MAAM,YAAY,CAAA;AAG9B,eAAO,MAAM,MAAM,yBAAwB,CAAA;AAC3C,MAAM,MAAM,MAAM,GAAG,OAAO,MAAM,CAAC,IAAI,CAAA;;;;;;qBAW/B,EAAG,iBAAiB,eAI3B,EAAE,sBAAqB;;;qBAKb,EAAG,iBACL,eACP,EAAA,sBAAsB;;;;;;yBAaR,EAAE,iBAAiB;;;yBAcA,EAAG,iBAAiB;;;;;;;;;;;;;;AA9CvD,qBAAa,oBAAqB,SAAQ,yBASxC;CAAG;;;;;;;qBADG,EAAG,iBAAiB,eAI3B,EAAE,sBAAqB;;;qBAKb,EAAG,iBACL,eACP,EAAA,sBAAsB;;;;;;;;;;;yBAaR,EAAE,iBAAiB;;;yBAcA,EAAG,iBAAiB;;;;;;;;;;;;;;;;AAnCvD;;;GAGG;AACH,qBAAa,cAAe,SAAQ,mBAgBlC;IAEA,MAAM,CAAC,OAAO,CACZ,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,cAAc,EACtB,OAAO,EAAE,qBAAqB,CAAC,OAAO,oBAAoB,CAAC,CAAC,CAAC,CAAC;IAUhE,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc;;;;;;CASrD;AAED,eAAO,MAAM,cAAc,QAAS,cAAc;;;;;;;;;CAkBhD,CAAA;AAKF,yBAAiB,oBAAoB,CAAC;IACpC,UAAiB,IAAK,SAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,oBAAoB,CAAC,QAAQ,CAAC,CAAC;KAAG;CACzF;AACD,yBAAiB,cAAc,CAAC;IAC9B,UAAiB,IAAK,SAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,cAAc,CAAC,QAAQ,CAAC,CAAC;KAAG;CACnF"}
|
package/dist/RequestContext.js
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import { ExtendedTaggedClass, NonEmptyString255 } from "@effect-app/schema";
|
|
2
2
|
import { S } from "effect-app";
|
|
3
3
|
import { RequestId, UserProfileId } from "effect-app/ids";
|
|
4
|
+
export const Locale = S.Literal("en", "de");
|
|
5
|
+
// TPDP: kind of obsolete now that we use actual spans
|
|
4
6
|
export class RequestContextParent extends ExtendedTaggedClass()("RequestContext", {
|
|
5
7
|
id: RequestId,
|
|
6
8
|
name: NonEmptyString255,
|
|
7
9
|
userProfile: S.optional(S.Struct({ sub: UserProfileId })),
|
|
8
|
-
locale:
|
|
10
|
+
locale: Locale,
|
|
9
11
|
createdAt: S.Date.withDefault
|
|
10
12
|
}) {
|
|
11
13
|
}
|
|
@@ -69,4 +71,4 @@ export const spanAttributes = (ctx) => ({
|
|
|
69
71
|
//
|
|
70
72
|
// codegen:end
|
|
71
73
|
//
|
|
72
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
74
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVxdWVzdENvbnRleHQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvUmVxdWVzdENvbnRleHQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLG1CQUFtQixFQUFFLGlCQUFpQixFQUFFLE1BQU0sb0JBQW9CLENBQUE7QUFDM0UsT0FBTyxFQUFFLENBQUMsRUFBRSxNQUFNLFlBQVksQ0FBQTtBQUM5QixPQUFPLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBRSxNQUFNLGdCQUFnQixDQUFBO0FBRXpELE1BQU0sQ0FBQyxNQUFNLE1BQU0sR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQTtBQUczQyxzREFBc0Q7QUFDdEQsTUFBTSxPQUFPLG9CQUFxQixTQUFRLG1CQUFtQixFQUcxRCxDQUFDLGdCQUFnQixFQUFFO0lBQ3BCLEVBQUUsRUFBRSxTQUFTO0lBQ2IsSUFBSSxFQUFFLGlCQUFpQjtJQUN2QixXQUFXLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxFQUFFLGFBQWEsRUFBRSxDQUFDLENBQUM7SUFDekQsTUFBTSxFQUFFLE1BQU07SUFDZCxTQUFTLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXO0NBQzlCLENBQUM7Q0FBRztBQUVMOzs7R0FHRztBQUNILE1BQU0sT0FBTyxjQUFlLFNBQVEsbUJBQW1CLEVBR3BELENBQUMsZ0JBQWdCLEVBQUU7SUFDcEIsR0FBRyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQztJQUMxQyxFQUFFLEVBQUUsU0FBUyxDQUFDLFdBQVc7SUFDekIsTUFBTSxFQUFFLFNBQVM7SUFDakIsUUFBUSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsaUJBQWlCLENBQUM7SUFDdkMsTUFBTSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsb0JBQW9CLENBQUM7SUFDeEMsU0FBUyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsaUJBQWlCLENBQUM7SUFDeEMsOENBQThDO0lBQzlDLCtCQUErQjtJQUMvQix1QkFBdUI7SUFDdkIsNkNBQTZDO0lBQzdDLDRDQUE0QztJQUM1QyxLQUFLO0NBQ04sQ0FBQztJQUNBLDZDQUE2QztJQUM3QyxNQUFNLENBQUMsT0FBTyxDQUVaLE1BQXNCLEVBQ3RCLE9BQThEO1FBRTlELE9BQU8sSUFBSSxjQUFjLENBQUM7WUFDeEIsU0FBUyxFQUFFLE1BQU0sRUFBRSxTQUFTO1lBQzVCLEdBQUcsT0FBTztZQUNWLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTTtZQUNyQixNQUFNO1NBQ1AsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVELE1BQU0sQ0FBQyxZQUFZLENBQWEsSUFBb0I7UUFDbEQsT0FBTztZQUNMLGFBQWEsRUFBRSxJQUFJLENBQUMsSUFBSTtZQUN4QixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07WUFDbkIsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNO2dCQUNiLENBQUMsQ0FBQyxFQUFFLG1CQUFtQixFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLFlBQVksRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRTtnQkFDN0UsQ0FBQyxDQUFDLEVBQUUsQ0FBQztTQUNSLENBQUE7SUFDSCxDQUFDO0NBQ0Y7QUFFRCxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsQ0FBQyxHQUFtQixFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3RELFlBQVksRUFBRSxHQUFHLENBQUMsRUFBRTtJQUNwQixpQkFBaUIsRUFBRSxHQUFHLENBQUMsTUFBTTtJQUM3QixjQUFjLEVBQUUsR0FBRyxDQUFDLElBQUk7SUFDeEIsZ0JBQWdCLEVBQUUsR0FBRyxDQUFDLE1BQU07SUFDNUIsbUJBQW1CLEVBQUUsR0FBRyxDQUFDLFNBQVM7SUFDbEMsR0FBRyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLG1CQUFtQixFQUFFLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRTtJQUM1RCxHQUFHLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxHQUFHO1FBQ3RCLENBQUMsQ0FBQztZQUNBLGtCQUFrQixFQUFFLEdBQUc7aUJBQ3BCLFdBQVc7aUJBQ1gsR0FBRztZQUNOLG9CQUFvQixFQUFFLE9BQU8sSUFBSSxHQUFHO2lCQUMvQixXQUFXO2dCQUNkLENBQUMsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLEtBQUs7Z0JBQ3ZCLENBQUMsQ0FBQyxTQUFTO1NBQ2Q7UUFDRCxDQUFDLENBQUMsRUFBRSxDQUFDO0NBQ1IsQ0FBQyxDQUFBO0FBV0YsbUJBQW1CO0FBQ25CLEVBQUU7QUFDRixjQUFjO0FBQ2QsRUFBRSJ9
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { Effect } from "effect-app";
|
|
2
|
+
import { HttpServerRequest, HttpServerResponse } from "effect-app/http";
|
|
3
|
+
import { Locale } from "../../RequestContext.js";
|
|
4
|
+
import { RequestContextContainer } from "../../services/RequestContextContainer.js";
|
|
5
|
+
export declare const RequestContextMiddleware: (defaultLocale?: Locale) => <E, R>(app: import("@effect/platform/HttpApp").Default<E, R>) => Effect.Effect<HttpServerResponse.HttpServerResponse, import("effect/Cause").NoSuchElementException | E, RequestContextContainer | HttpServerRequest.HttpServerRequest | import("../../services/Store/ContextMapContainer.js").ContextMapContainer | Exclude<R, never>>;
|
|
6
|
+
//# sourceMappingURL=RequestContextMiddleware.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RequestContextMiddleware.d.ts","sourceRoot":"","sources":["../../../src/api/internal/RequestContextMiddleware.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AACnC,OAAO,EAAkB,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AAGvF,OAAO,EAAE,MAAM,EAAkB,MAAM,yBAAyB,CAAA;AAChE,OAAO,EAAE,uBAAuB,EAAE,MAAM,2CAA2C,CAAA;AAGnF,eAAO,MAAM,wBAAwB,mBAAmB,MAAM,4UAuD3D,CAAA"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { Effect } from "effect-app";
|
|
2
|
+
import { HttpMiddleware, HttpServerRequest, HttpServerResponse } from "effect-app/http";
|
|
3
|
+
import { RequestId } from "effect-app/ids";
|
|
4
|
+
import { NonEmptyString255 } from "effect-app/schema";
|
|
5
|
+
import { Locale, RequestContext } from "../../RequestContext.js";
|
|
6
|
+
import { RequestContextContainer } from "../../services/RequestContextContainer.js";
|
|
7
|
+
import { setupExistingRequestContext } from "../setupRequest.js";
|
|
8
|
+
export const RequestContextMiddleware = (defaultLocale = "en") => HttpMiddleware.make((app) => Effect.gen(function* () {
|
|
9
|
+
const req = yield* HttpServerRequest.HttpServerRequest;
|
|
10
|
+
const currentSpan = yield* Effect.currentSpan;
|
|
11
|
+
const parent = currentSpan?.parent ? currentSpan.parent.value : undefined;
|
|
12
|
+
const start = new Date();
|
|
13
|
+
const supported = Locale.literals;
|
|
14
|
+
const desiredLocale = req.headers["x-locale"];
|
|
15
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-explicit-any
|
|
16
|
+
const locale = desiredLocale && supported.includes(desiredLocale)
|
|
17
|
+
? desiredLocale
|
|
18
|
+
: defaultLocale;
|
|
19
|
+
const requestId = req.headers["request-id"];
|
|
20
|
+
const rootId = parent?.spanId
|
|
21
|
+
? RequestId(parent.spanId)
|
|
22
|
+
: requestId
|
|
23
|
+
? RequestId(requestId)
|
|
24
|
+
: RequestId.make();
|
|
25
|
+
const storeId = req.headers["x-store-id"];
|
|
26
|
+
const namespace = NonEmptyString255((storeId && (Array.isArray(storeId) ? storeId[0] : storeId)) || "primary");
|
|
27
|
+
const deviceId = req.headers["x-fe-device-id"];
|
|
28
|
+
const requestContext = new RequestContext({
|
|
29
|
+
id: currentSpan?.spanId ? RequestId(currentSpan.spanId) : RequestId.make(),
|
|
30
|
+
rootId,
|
|
31
|
+
name: NonEmptyString255(req.originalUrl), // set more detailed elsewhere
|
|
32
|
+
locale,
|
|
33
|
+
createdAt: start,
|
|
34
|
+
namespace,
|
|
35
|
+
sourceId: deviceId ? NonEmptyString255(deviceId) : undefined
|
|
36
|
+
// ...(context.operation.parentId
|
|
37
|
+
// ? {
|
|
38
|
+
// parent: new RequestContextParent({
|
|
39
|
+
// id: RequestId(context.operation.parentId),
|
|
40
|
+
// locale,
|
|
41
|
+
// name: NonEmptyString255("API Request")
|
|
42
|
+
// })
|
|
43
|
+
// }
|
|
44
|
+
// : {})
|
|
45
|
+
});
|
|
46
|
+
const rcc = yield* RequestContextContainer;
|
|
47
|
+
yield* rcc.update((_) => requestContext);
|
|
48
|
+
const res = yield* setupExistingRequestContext(app, requestContext);
|
|
49
|
+
// TODO: how to set also on errors?
|
|
50
|
+
return HttpServerResponse.setHeaders(res, {
|
|
51
|
+
"request-id": requestContext.rootId,
|
|
52
|
+
"Content-Language": requestContext.locale
|
|
53
|
+
});
|
|
54
|
+
}));
|
|
55
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVxdWVzdENvbnRleHRNaWRkbGV3YXJlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwaS9pbnRlcm5hbC9SZXF1ZXN0Q29udGV4dE1pZGRsZXdhcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFlBQVksQ0FBQTtBQUNuQyxPQUFPLEVBQUUsY0FBYyxFQUFFLGlCQUFpQixFQUFFLGtCQUFrQixFQUFFLE1BQU0saUJBQWlCLENBQUE7QUFDdkYsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFBO0FBQzFDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG1CQUFtQixDQUFBO0FBQ3JELE9BQU8sRUFBRSxNQUFNLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUE7QUFDaEUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sMkNBQTJDLENBQUE7QUFDbkYsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sb0JBQW9CLENBQUE7QUFFaEUsTUFBTSxDQUFDLE1BQU0sd0JBQXdCLEdBQUcsQ0FBQyxnQkFBd0IsSUFBSSxFQUFFLEVBQUUsQ0FDdkUsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQzFCLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDO0lBQ2xCLE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDLGlCQUFpQixDQUFDLGlCQUFpQixDQUFBO0lBRXRELE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUE7SUFDN0MsTUFBTSxNQUFNLEdBQUcsV0FBVyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQTtJQUN6RSxNQUFNLEtBQUssR0FBRyxJQUFJLElBQUksRUFBRSxDQUFBO0lBQ3hC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
|
|
@@ -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=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../../src/api/internal/health.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,UAAU,EAAsB,MAAM,iBAAiB,CAAA;AAEhF,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,4EAK3C"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { HttpMiddleware, HttpRouter, HttpServerResponse } from "effect-app/http";
|
|
2
|
+
export function serverHealth(version) {
|
|
3
|
+
return HttpRouter.get("/.well-known/local/server-health", HttpServerResponse.unsafeJson({ version }).pipe(HttpMiddleware.withLoggerDisabled));
|
|
4
|
+
}
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVhbHRoLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwaS9pbnRlcm5hbC9oZWFsdGgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxVQUFVLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQTtBQUVoRixNQUFNLFVBQVUsWUFBWSxDQUFDLE9BQWU7SUFDMUMsT0FBTyxVQUFVLENBQUMsR0FBRyxDQUNuQixrQ0FBa0MsRUFDbEMsa0JBQWtCLENBQUMsVUFBVSxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLGtCQUFrQixDQUFDLENBQ25GLENBQUE7QUFDSCxDQUFDIn0=
|
|
@@ -7,6 +7,8 @@ import type * as App from "@effect/platform/HttpApp";
|
|
|
7
7
|
import type { Effect } from "effect-app";
|
|
8
8
|
import type { NotLoggedInError } from "../errors.js";
|
|
9
9
|
export * from "./internal/events.js";
|
|
10
|
+
export * from "./internal/health.js";
|
|
11
|
+
export * from "./internal/RequestContextMiddleware.js";
|
|
10
12
|
/**
|
|
11
13
|
* Add access logs for handled requests. The log runs before each request.
|
|
12
14
|
* Optionally configure log level using the first argument. The default log level
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"middlewares.d.ts","sourceRoot":"","sources":["../../src/api/middlewares.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,KAAK,GAAG,MAAM,0BAA0B,CAAA;AACpD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AACxC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAGpD,cAAc,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"middlewares.d.ts","sourceRoot":"","sources":["../../src/api/middlewares.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,KAAK,GAAG,MAAM,0BAA0B,CAAA;AACpD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AACxC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAGpD,cAAc,sBAAsB,CAAA;AACpC,cAAc,sBAAsB,CAAA;AACpC,cAAc,wCAAwC,CAAA;AAEtD;;;;;;;GAOG;AACH,eAAO,MAAM,SAAS,EAAE,CACtB,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,KACjC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAsB,CAAA;AAE7E;;;;;;;;;GASG;AACH,eAAO,MAAM,iBAAiB,EAAE,CAC9B,gBAAgB,CAAC,EAAE,MAAM,KACtB,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAA8B,CAAA;AAErF;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,EAC3C,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,KACnB,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAgC,CAAA;AAErD;;;;;GAKG;AACH,eAAO,MAAM,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAqB,CAAA;AAE9F;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED;;;;;GAKG;AACH,eAAO,MAAM,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC,EAC5B,gBAAgB,EAAE,CAChB,WAAW,EAAE,oBAAoB,KAC9B,MAAM,CAAC,CAAC,EAAE,gBAAgB,EAAE,EAAE,CAAC,EACpC,OAAO,CAAC,EAAE,OAAO,CAAC;IAChB,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,SAAS,MAAM,EAAE,CAAA;CAC7B,CAAC,KACC,CAAC,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,CAAsB,CAAA;AAErF;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B,cAAc,EAAE,SAAS,MAAM,EAAE,CAAA;IACjC,cAAc,EAAE,SAAS,MAAM,EAAE,CAAA;IACjC,cAAc,EAAE,SAAS,MAAM,EAAE,CAAA;IACjC,cAAc,EAAE,SAAS,MAAM,EAAE,CAAA;IACjC,MAAM,EAAE,MAAM,CAAA;IACd,WAAW,EAAE,OAAO,CAAA;CACrB;AAED;;;;;GAKG;AACH,eAAO,MAAM,IAAI,EAAE,CACjB,OAAO,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,KAC3B,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAiB,CAAA"}
|
package/dist/api/middlewares.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import * as internal from "./internal/middlewares.js";
|
|
2
2
|
export * from "./internal/events.js";
|
|
3
|
+
export * from "./internal/health.js";
|
|
4
|
+
export * from "./internal/RequestContextMiddleware.js";
|
|
3
5
|
/**
|
|
4
6
|
* Add access logs for handled requests. The log runs before each request.
|
|
5
7
|
* Optionally configure log level using the first argument. The default log level
|
|
@@ -49,4 +51,4 @@ export const basicAuth = internal.basicAuth;
|
|
|
49
51
|
* @since 1.0.0
|
|
50
52
|
*/
|
|
51
53
|
export const cors = internal.cors;
|
|
52
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
54
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlkZGxld2FyZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXBpL21pZGRsZXdhcmVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQVFBLE9BQU8sS0FBSyxRQUFRLE1BQU0sMkJBQTJCLENBQUE7QUFFckQsY0FBYyxzQkFBc0IsQ0FBQTtBQUNwQyxjQUFjLHNCQUFzQixDQUFBO0FBQ3BDLGNBQWMsd0NBQXdDLENBQUE7QUFFdEQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FFcUMsUUFBUSxDQUFDLFNBQVMsQ0FBQTtBQUU3RTs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FFNkIsUUFBUSxDQUFDLGlCQUFpQixDQUFBO0FBRXJGOzs7Ozs7R0FNRztBQUNILE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUVQLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQTtBQUVyRDs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBd0QsUUFBUSxDQUFDLFFBQVEsQ0FBQTtBQVc5Rjs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FRNkMsUUFBUSxDQUFDLFNBQVMsQ0FBQTtBQWVyRjs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBQyxNQUFNLElBQUksR0FFMEMsUUFBUSxDQUFDLElBQUksQ0FBQSJ9
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@effect-app/infra",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.21.0",
|
|
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/core": "1.10.1",
|
|
21
22
|
"@effect-app/infra-adapters": "1.11.3",
|
|
22
|
-
"@effect-app/schema": "1.12.1",
|
|
23
23
|
"effect-app": "1.17.1",
|
|
24
|
-
"@effect-app/
|
|
24
|
+
"@effect-app/schema": "1.12.1"
|
|
25
25
|
},
|
|
26
26
|
"devDependencies": {
|
|
27
27
|
"@babel/cli": "^7.25.6",
|
package/src/RequestContext.ts
CHANGED
|
@@ -2,6 +2,10 @@ import { ExtendedTaggedClass, NonEmptyString255 } from "@effect-app/schema"
|
|
|
2
2
|
import { S } from "effect-app"
|
|
3
3
|
import { RequestId, UserProfileId } from "effect-app/ids"
|
|
4
4
|
|
|
5
|
+
export const Locale = S.Literal("en", "de")
|
|
6
|
+
export type Locale = typeof Locale.Type
|
|
7
|
+
|
|
8
|
+
// TPDP: kind of obsolete now that we use actual spans
|
|
5
9
|
export class RequestContextParent extends ExtendedTaggedClass<
|
|
6
10
|
RequestContextParent,
|
|
7
11
|
RequestContextParent.From
|
|
@@ -9,7 +13,7 @@ export class RequestContextParent extends ExtendedTaggedClass<
|
|
|
9
13
|
id: RequestId,
|
|
10
14
|
name: NonEmptyString255,
|
|
11
15
|
userProfile: S.optional(S.Struct({ sub: UserProfileId })),
|
|
12
|
-
locale:
|
|
16
|
+
locale: Locale,
|
|
13
17
|
createdAt: S.Date.withDefault
|
|
14
18
|
}) {}
|
|
15
19
|
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { Effect } from "effect-app"
|
|
2
|
+
import { HttpMiddleware, HttpServerRequest, HttpServerResponse } from "effect-app/http"
|
|
3
|
+
import { RequestId } from "effect-app/ids"
|
|
4
|
+
import { NonEmptyString255 } from "effect-app/schema"
|
|
5
|
+
import { Locale, RequestContext } from "../../RequestContext.js"
|
|
6
|
+
import { RequestContextContainer } from "../../services/RequestContextContainer.js"
|
|
7
|
+
import { setupExistingRequestContext } from "../setupRequest.js"
|
|
8
|
+
|
|
9
|
+
export const RequestContextMiddleware = (defaultLocale: Locale = "en") =>
|
|
10
|
+
HttpMiddleware.make((app) =>
|
|
11
|
+
Effect.gen(function*() {
|
|
12
|
+
const req = yield* HttpServerRequest.HttpServerRequest
|
|
13
|
+
|
|
14
|
+
const currentSpan = yield* Effect.currentSpan
|
|
15
|
+
const parent = currentSpan?.parent ? currentSpan.parent.value : undefined
|
|
16
|
+
const start = new Date()
|
|
17
|
+
const supported = Locale.literals
|
|
18
|
+
const desiredLocale = req.headers["x-locale"]
|
|
19
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-explicit-any
|
|
20
|
+
const locale = desiredLocale && supported.includes(desiredLocale as any)
|
|
21
|
+
? (desiredLocale as typeof supported[number])
|
|
22
|
+
: defaultLocale
|
|
23
|
+
|
|
24
|
+
const requestId = req.headers["request-id"]
|
|
25
|
+
const rootId = parent?.spanId
|
|
26
|
+
? RequestId(parent.spanId)
|
|
27
|
+
: requestId
|
|
28
|
+
? RequestId(requestId)
|
|
29
|
+
: RequestId.make()
|
|
30
|
+
|
|
31
|
+
const storeId = req.headers["x-store-id"]
|
|
32
|
+
const namespace = NonEmptyString255((storeId && (Array.isArray(storeId) ? storeId[0] : storeId)) || "primary")
|
|
33
|
+
|
|
34
|
+
const deviceId = req.headers["x-fe-device-id"]
|
|
35
|
+
|
|
36
|
+
const requestContext = new RequestContext({
|
|
37
|
+
id: currentSpan?.spanId ? RequestId(currentSpan.spanId) : RequestId.make(),
|
|
38
|
+
rootId,
|
|
39
|
+
name: NonEmptyString255(req.originalUrl), // set more detailed elsewhere
|
|
40
|
+
locale,
|
|
41
|
+
createdAt: start,
|
|
42
|
+
namespace,
|
|
43
|
+
sourceId: deviceId ? NonEmptyString255(deviceId) : undefined
|
|
44
|
+
// ...(context.operation.parentId
|
|
45
|
+
// ? {
|
|
46
|
+
// parent: new RequestContextParent({
|
|
47
|
+
// id: RequestId(context.operation.parentId),
|
|
48
|
+
// locale,
|
|
49
|
+
// name: NonEmptyString255("API Request")
|
|
50
|
+
// })
|
|
51
|
+
// }
|
|
52
|
+
// : {})
|
|
53
|
+
})
|
|
54
|
+
const rcc = yield* RequestContextContainer
|
|
55
|
+
yield* rcc.update((_) => requestContext)
|
|
56
|
+
const res = yield* setupExistingRequestContext(app, requestContext)
|
|
57
|
+
|
|
58
|
+
// TODO: how to set also on errors?
|
|
59
|
+
return HttpServerResponse.setHeaders(res, {
|
|
60
|
+
"request-id": requestContext.rootId,
|
|
61
|
+
"Content-Language": requestContext.locale
|
|
62
|
+
})
|
|
63
|
+
})
|
|
64
|
+
)
|
|
@@ -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"))
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { HttpMiddleware, HttpRouter, HttpServerResponse } from "effect-app/http"
|
|
2
|
+
|
|
3
|
+
export function serverHealth(version: string) {
|
|
4
|
+
return HttpRouter.get(
|
|
5
|
+
"/.well-known/local/server-health",
|
|
6
|
+
HttpServerResponse.unsafeJson({ version }).pipe(HttpMiddleware.withLoggerDisabled)
|
|
7
|
+
)
|
|
8
|
+
}
|
package/src/api/middlewares.ts
CHANGED
|
@@ -9,6 +9,8 @@ import type { NotLoggedInError } from "../errors.js"
|
|
|
9
9
|
import * as internal from "./internal/middlewares.js"
|
|
10
10
|
|
|
11
11
|
export * from "./internal/events.js"
|
|
12
|
+
export * from "./internal/health.js"
|
|
13
|
+
export * from "./internal/RequestContextMiddleware.js"
|
|
12
14
|
|
|
13
15
|
/**
|
|
14
16
|
* Add access logs for handled requests. The log runs before each request.
|