@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 CHANGED
@@ -1,5 +1,17 @@
1
1
  # @effect-app/infra
2
2
 
3
+ ## 1.21.0
4
+
5
+ ### Minor Changes
6
+
7
+ - f15d26f: port more middleware
8
+
9
+ ## 1.20.1
10
+
11
+ ### Patch Changes
12
+
13
+ - 4ea1323: support schema R
14
+
3
15
  ## 1.20.0
4
16
 
5
17
  ### Minor Changes
@@ -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: _effectApp.S.Literal("en", "de"),
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","S","optional","Struct","sub","UserProfileId","locale","Literal","createdAt","Date","withDefault","exports","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;AAEM,MAAOG,oBAAqB,SAAQ,IAAAC,2BAAmB,GAG1D,CAAC,gBAAgB,EAAE;EACpBC,EAAE,EAAEC,cAAS;EACbC,IAAI,EAAEC,yBAAiB;EACvBC,WAAW,EAAEC,YAAC,CAACC,QAAQ,CAACD,YAAC,CAACE,MAAM,CAAC;IAAEC,GAAG,EAAEC;EAAa,CAAE,CAAC,CAAC;EACzDC,MAAM,EAAEL,YAAC,CAACM,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC;EAC7BC,SAAS,EAAEP,YAAC,CAACQ,IAAI,CAACC;CACnB,CAAC;AAEF;;;;AAAAC,OAAA,CAAAjB,oBAAA,GAAAA,oBAAA;AAIM,MAAOkB,cAAe,SAAQ,IAAAjB,2BAAmB,GAGpD,CAAC,gBAAgB,EAAE;EACpB,GAAGD,oBAAoB,CAACmB,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;EAC1CjB,EAAE,EAAEC,cAAS,CAACa,WAAW;EACzBI,MAAM,EAAEjB,cAAS;EACjBkB,QAAQ,EAAEd,YAAC,CAACC,QAAQ,CAACH,yBAAiB,CAAC;EACvCiB,MAAM,EAAEf,YAAC,CAACC,QAAQ,CAACR,oBAAoB,CAAC;EACxCuB,SAAS,EAAEhB,YAAC,CAACC,QAAQ,CAACH,yBAAiB;EACvC;EACA;EACA;EACA;EACA;EACA;CACD,CAAC;EACA;EACA,OAAOmB,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,CAACvB,IAAI;MACxBQ,MAAM,EAAEe,IAAI,CAACf,MAAM;MACnB,IAAIe,IAAI,CAACL,MAAM,GACX;QAAEO,mBAAmB,EAAEF,IAAI,CAACL,MAAM,CAAClB,IAAI;QAAE0B,YAAY,EAAEH,IAAI,CAACL,MAAM,CAACV;MAAM,CAAE,GAC3E,EAAE;KACP;EACH;;AACDK,OAAA,CAAAC,cAAA,GAAAA,cAAA;AAEM,MAAMa,cAAc,GAAIC,GAAmB,KAAM;EACtD,YAAY,EAAEA,GAAG,CAAC9B,EAAE;EACpB,iBAAiB,EAAE8B,GAAG,CAACZ,MAAM;EAC7B,cAAc,EAAEY,GAAG,CAAC5B,IAAI;EACxB,gBAAgB,EAAE4B,GAAG,CAACpB,MAAM;EAC5B,mBAAmB,EAAEoB,GAAG,CAACT,SAAS;EAClC,IAAGS,GAAG,CAACX,QAAQ,GAAG;IAAE,mBAAmB,EAAEW,GAAG,CAACX;EAAQ,CAAE,GAAG,EAAE;EAC5D,IAAIW,GAAG,CAAC1B,WAAW,EAAEI,GAAG,GACpB;IACA,kBAAkB,EAAEsB,GAAG,CACpB1B,WAAW,CACXI,GAAG;IACN,oBAAoB,EAAE,OAAO,IAAIsB,GAAG,CAC/B1B,WAAW,GACZ0B,GAAG,CAAC1B,WAAW,CAAC2B,KAAK,GACrBC;GACL,GACC,EAAE;CACP,CAAC;AAWF;AACA;AACA;AACA;AAAAjB,OAAA,CAAAc,cAAA,GAAAA,cAAA","ignoreList":[]}
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 eventStream = _effectApp.Stream.map(events, _ => `id: ${_.evt.id}\ndata: ${JSON.stringify(_effectApp.S.encodeSync(schema)(_.evt))}`);
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","map","_","evt","id","JSON","stringify","S","encodeSync","stream","pipe","merge","encode","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,CAAiCC,MAAyD,EAAEC,MAAuB,KAAKP,iBAAM,CAClJQ,GAAG,CAAC,aAAS;EACZ,OAAOR,iBAAM,CAACS,OAAO,CAAC,6BAA6B,CAAC;EAEpD,MAAMC,GAAG,GAAG,IAAIC,WAAW,EAAE;EAE7B,MAAMC,WAAW,GAAGhB,iBAAM,CAACiB,GAAG,CAC5BP,MAAM,EACLQ,CAAC,IAAK,OAAOA,CAAC,CAACC,GAAG,CAACC,EAAE,WAAWC,IAAI,CAACC,SAAS,CAACC,YAAC,CAACC,UAAU,CAACb,MAAM,CAAC,CAACO,CAAC,CAACC,GAAG,CAAC,CAAC,EAAE,CAC/E;EAED,MAAMM,MAAM,GAAG,IAAAC,eAAI,EACjB3B,QAAQ,EACRC,iBAAM,CAAC2B,KAAK,CAACzB,SAAS,CAAC,EACvBF,iBAAM,CAAC2B,KAAK,CAACX,WAAW,CAAC,EACzBhB,iBAAM,CAACiB,GAAG,CAAEC,CAAC,IAAKJ,GAAG,CAACc,MAAM,CAACV,CAAC,GAAG,MAAM,CAAC,CAAC,CAC1C;EAED,MAAMW,GAAG,GAAG,OAAOzB,iBAAM,CAAC0B,OAAO,EAAK;EACtC,MAAMC,GAAG,GAAGC,wBAAkB,CAACP,MAAM,CACnCA,MAAM,CACHC,IAAI,CACH1B,iBAAM,CAACiC,aAAa,CAAC,IAAAC,0BAAW,EAAC,SAAS,CAAC,CAAC,EAC5ClC,iBAAM,CAACmC,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,CACDL,IAAI,CAACtB,iBAAM,CAAC6B,aAAa,CAAC,IAAAC,0BAAW,EAAC,SAAS,CAAC,CAAC,EAAGhB,CAAC,IAAK,IAAAsB,iCAAmB,EAACtB,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAAuB,OAAA,CAAAhC,OAAA,GAAAA,OAAA","ignoreList":[]}
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":[]}
@@ -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;AAAoC,SAAAS,yBAAAC,CAAA,6BAAAC,OAAA,mBAAAC,CAAA,OAAAD,OAAA,IAAAE,CAAA,OAAAF,OAAA,YAAAF,wBAAA,YAAAA,CAAAC,CAAA,WAAAA,CAAA,GAAAG,CAAA,GAAAD,CAAA,KAAAF,CAAA;AAAA,SAAAhB,wBAAAgB,CAAA,EAAAE,CAAA,SAAAA,CAAA,IAAAF,CAAA,IAAAA,CAAA,CAAAI,UAAA,SAAAJ,CAAA,eAAAA,CAAA,uBAAAA,CAAA,yBAAAA,CAAA,WAAAK,OAAA,EAAAL,CAAA,QAAAG,CAAA,GAAAJ,wBAAA,CAAAG,CAAA,OAAAC,CAAA,IAAAA,CAAA,CAAAG,GAAA,CAAAN,CAAA,UAAAG,CAAA,CAAAL,GAAA,CAAAE,CAAA,OAAAO,CAAA,KAAAC,SAAA,UAAAC,CAAA,GAAAtB,MAAA,CAAAS,cAAA,IAAAT,MAAA,CAAAuB,wBAAA,WAAAC,CAAA,IAAAX,CAAA,oBAAAW,CAAA,OAAAnB,cAAA,CAAAC,IAAA,CAAAO,CAAA,EAAAW,CAAA,SAAAC,CAAA,GAAAH,CAAA,GAAAtB,MAAA,CAAAuB,wBAAA,CAAAV,CAAA,EAAAW,CAAA,UAAAC,CAAA,KAAAA,CAAA,CAAAd,GAAA,IAAAc,CAAA,CAAAC,GAAA,IAAA1B,MAAA,CAAAS,cAAA,CAAAW,CAAA,EAAAI,CAAA,EAAAC,CAAA,IAAAL,CAAA,CAAAI,CAAA,IAAAX,CAAA,CAAAW,CAAA,YAAAJ,CAAA,CAAAF,OAAA,GAAAL,CAAA,EAAAG,CAAA,IAAAA,CAAA,CAAAU,GAAA,CAAAb,CAAA,EAAAO,CAAA,GAAAA,CAAA;AAEpC;;;;;;;;AAQO,MAAMO,SAAS,GAAAnB,OAAA,CAAAmB,SAAA,GAEqC/B,QAAQ,CAAC+B,SAAS;AAE7E;;;;;;;;;;AAUO,MAAMC,iBAAiB,GAAApB,OAAA,CAAAoB,iBAAA,GAE6BhC,QAAQ,CAACgC,iBAAiB;AAErF;;;;;;;AAOO,MAAMC,mBAAmB,GAAArB,OAAA,CAAAqB,mBAAA,GAEPjC,QAAQ,CAACiC,mBAAmB;AAErD;;;;;;AAMO,MAAMC,QAAQ,GAAAtB,OAAA,CAAAsB,QAAA,GAAwDlC,QAAQ,CAACkC,QAAQ;AAW9F;;;;;;AAMO,MAAMC,SAAS,GAAAvB,OAAA,CAAAuB,SAAA,GAQ6CnC,QAAQ,CAACmC,SAAS;AAerF;;;;;;AAMO,MAAMC,IAAI,GAAAxB,OAAA,CAAAwB,IAAA,GAE0CpC,QAAQ,CAACoC,IAAI","ignoreList":[]}
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":[]}
@@ -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;;;;;;qBAkBf,EAAG,iBAAiB,eAAc,EAAG,sBACnC;;;qBAKF,EAAG,iBACJ,eAAc,EAAG,sBACrB;;;;;;yBAaoB,EAAG,iBAAiB;;;yBAe1C,EAAI,iBAAgB;;;;;;;;;;;;;;AAnD5B,qBAAa,oBAAqB,SAAQ,yBASxC;CAAG;;;;;;;qBAMU,EAAG,iBAAiB,eAAc,EAAG,sBACnC;;;qBAKF,EAAG,iBACJ,eAAc,EAAG,sBACrB;;;;;;;;;;yBAaoB,EAAG,iBAAiB;;;yBAe1C,EAAI,iBAAgB;;;;;;;;;;;;;;;;;AAxC5B;;;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"}
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"}
@@ -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: S.Literal("en", "de"),
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVxdWVzdENvbnRleHQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvUmVxdWVzdENvbnRleHQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLG1CQUFtQixFQUFFLGlCQUFpQixFQUFFLE1BQU0sb0JBQW9CLENBQUE7QUFDM0UsT0FBTyxFQUFFLENBQUMsRUFBRSxNQUFNLFlBQVksQ0FBQTtBQUM5QixPQUFPLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBRSxNQUFNLGdCQUFnQixDQUFBO0FBRXpELE1BQU0sT0FBTyxvQkFBcUIsU0FBUSxtQkFBbUIsRUFHMUQsQ0FBQyxnQkFBZ0IsRUFBRTtJQUNwQixFQUFFLEVBQUUsU0FBUztJQUNiLElBQUksRUFBRSxpQkFBaUI7SUFDdkIsV0FBVyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEdBQUcsRUFBRSxhQUFhLEVBQUUsQ0FBQyxDQUFDO0lBQ3pELE1BQU0sRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUM7SUFDN0IsU0FBUyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVztDQUM5QixDQUFDO0NBQUc7QUFFTDs7O0dBR0c7QUFDSCxNQUFNLE9BQU8sY0FBZSxTQUFRLG1CQUFtQixFQUdwRCxDQUFDLGdCQUFnQixFQUFFO0lBQ3BCLEdBQUcsb0JBQW9CLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUM7SUFDMUMsRUFBRSxFQUFFLFNBQVMsQ0FBQyxXQUFXO0lBQ3pCLE1BQU0sRUFBRSxTQUFTO0lBQ2pCLFFBQVEsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDO0lBQ3ZDLE1BQU0sRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLG9CQUFvQixDQUFDO0lBQ3hDLFNBQVMsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDO0lBQ3hDLDhDQUE4QztJQUM5QywrQkFBK0I7SUFDL0IsdUJBQXVCO0lBQ3ZCLDZDQUE2QztJQUM3Qyw0Q0FBNEM7SUFDNUMsS0FBSztDQUNOLENBQUM7SUFDQSw2Q0FBNkM7SUFDN0MsTUFBTSxDQUFDLE9BQU8sQ0FFWixNQUFzQixFQUN0QixPQUE4RDtRQUU5RCxPQUFPLElBQUksY0FBYyxDQUFDO1lBQ3hCLFNBQVMsRUFBRSxNQUFNLEVBQUUsU0FBUztZQUM1QixHQUFHLE9BQU87WUFDVixNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU07WUFDckIsTUFBTTtTQUNQLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFRCxNQUFNLENBQUMsWUFBWSxDQUFhLElBQW9CO1FBQ2xELE9BQU87WUFDTCxhQUFhLEVBQUUsSUFBSSxDQUFDLElBQUk7WUFDeEIsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNO1lBQ25CLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTTtnQkFDYixDQUFDLENBQUMsRUFBRSxtQkFBbUIsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxZQUFZLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUU7Z0JBQzdFLENBQUMsQ0FBQyxFQUFFLENBQUM7U0FDUixDQUFBO0lBQ0gsQ0FBQztDQUNGO0FBRUQsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLENBQUMsR0FBbUIsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUN0RCxZQUFZLEVBQUUsR0FBRyxDQUFDLEVBQUU7SUFDcEIsaUJBQWlCLEVBQUUsR0FBRyxDQUFDLE1BQU07SUFDN0IsY0FBYyxFQUFFLEdBQUcsQ0FBQyxJQUFJO0lBQ3hCLGdCQUFnQixFQUFFLEdBQUcsQ0FBQyxNQUFNO0lBQzVCLG1CQUFtQixFQUFFLEdBQUcsQ0FBQyxTQUFTO0lBQ2xDLEdBQUcsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxtQkFBbUIsRUFBRSxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUU7SUFDNUQsR0FBRyxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsR0FBRztRQUN0QixDQUFDLENBQUM7WUFDQSxrQkFBa0IsRUFBRSxHQUFHO2lCQUNwQixXQUFXO2lCQUNYLEdBQUc7WUFDTixvQkFBb0IsRUFBRSxPQUFPLElBQUksR0FBRztpQkFDL0IsV0FBVztnQkFDZCxDQUFDLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxLQUFLO2dCQUN2QixDQUFDLENBQUMsU0FBUztTQUNkO1FBQ0QsQ0FBQyxDQUFDLEVBQUUsQ0FBQztDQUNSLENBQUMsQ0FBQTtBQVdGLG1CQUFtQjtBQUNuQixFQUFFO0FBQ0YsY0FBYztBQUNkLEVBQUUifQ==
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVxdWVzdENvbnRleHRNaWRkbGV3YXJlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwaS9pbnRlcm5hbC9SZXF1ZXN0Q29udGV4dE1pZGRsZXdhcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFlBQVksQ0FBQTtBQUNuQyxPQUFPLEVBQUUsY0FBYyxFQUFFLGlCQUFpQixFQUFFLGtCQUFrQixFQUFFLE1BQU0saUJBQWlCLENBQUE7QUFDdkYsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFBO0FBQzFDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG1CQUFtQixDQUFBO0FBQ3JELE9BQU8sRUFBRSxNQUFNLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUE7QUFDaEUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sMkNBQTJDLENBQUE7QUFDbkYsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sb0JBQW9CLENBQUE7QUFFaEUsTUFBTSxDQUFDLE1BQU0sd0JBQXdCLEdBQUcsQ0FBQyxnQkFBd0IsSUFBSSxFQUFFLEVBQUUsQ0FDdkUsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQzFCLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDO0lBQ2xCLE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDLGlCQUFpQixDQUFDLGlCQUFpQixDQUFBO0lBRXRELE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUE7SUFDN0MsTUFBTSxNQUFNLEdBQUcsV0FBVyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQTtJQUN6RSxNQUFNLEtBQUssR0FBRyxJQUFJLElBQUksRUFBRSxDQUFBO0lBQ3hCLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUE7SUFDakMsTUFBTSxhQUFhLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQTtJQUM3QyxxR0FBcUc7SUFDckcsTUFBTSxNQUFNLEdBQUcsYUFBYSxJQUFJLFNBQVMsQ0FBQyxRQUFRLENBQUMsYUFBb0IsQ0FBQztRQUN0RSxDQUFDLENBQUUsYUFBMEM7UUFDN0MsQ0FBQyxDQUFDLGFBQWEsQ0FBQTtJQUVqQixNQUFNLFNBQVMsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFBO0lBQzNDLE1BQU0sTUFBTSxHQUFHLE1BQU0sRUFBRSxNQUFNO1FBQzNCLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQztRQUMxQixDQUFDLENBQUMsU0FBUztZQUNYLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDO1lBQ3RCLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUE7SUFFcEIsTUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQTtJQUN6QyxNQUFNLFNBQVMsR0FBRyxpQkFBaUIsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxTQUFTLENBQUMsQ0FBQTtJQUU5RyxNQUFNLFFBQVEsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUE7SUFFOUMsTUFBTSxjQUFjLEdBQUcsSUFBSSxjQUFjLENBQUM7UUFDeEMsRUFBRSxFQUFFLFdBQVcsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUU7UUFDMUUsTUFBTTtRQUNOLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLEVBQUUsOEJBQThCO1FBQ3hFLE1BQU07UUFDTixTQUFTLEVBQUUsS0FBSztRQUNoQixTQUFTO1FBQ1QsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVM7UUFDNUQsaUNBQWlDO1FBQ2pDLFFBQVE7UUFDUix5Q0FBeUM7UUFDekMsbURBQW1EO1FBQ25ELGdCQUFnQjtRQUNoQiwrQ0FBK0M7UUFDL0MsU0FBUztRQUNULE1BQU07UUFDTixVQUFVO0tBQ1gsQ0FBQyxDQUFBO0lBQ0YsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUMsdUJBQXVCLENBQUE7SUFDMUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsY0FBYyxDQUFDLENBQUE7SUFDeEMsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUMsMkJBQTJCLENBQUMsR0FBRyxFQUFFLGNBQWMsQ0FBQyxDQUFBO0lBRW5FLG1DQUFtQztJQUNuQyxPQUFPLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUU7UUFDeEMsWUFBWSxFQUFFLGNBQWMsQ0FBQyxNQUFNO1FBQ25DLGtCQUFrQixFQUFFLGNBQWMsQ0FBQyxNQUFNO0tBQzFDLENBQUMsQ0FBQTtBQUNKLENBQUMsQ0FBQyxDQUNILENBQUEifQ==
@@ -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,EAAC,CAAC,EAAE,EAAE,UAAU,MAAM,CAAC,MAAM,CAAC;IAAE,GAAG,EAAE,CAAC,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC,0RAqC5C,CAAA"}
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 eventStream = Stream.map(events, (_) => `id: ${_.evt.id}\ndata: ${JSON.stringify(S.encodeSync(schema)(_.evt))}`);
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwaS9pbnRlcm5hbC9ldmVudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sb0NBQW9DLENBQUE7QUFDeEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGlDQUFpQyxDQUFBO0FBQzdELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLFlBQVksQ0FBQTtBQUN4RSxPQUFPLEVBQUUsV0FBVyxFQUFFLGtCQUFrQixFQUFFLE1BQU0saUJBQWlCLENBQUE7QUFFakUsb0VBQW9FO0FBQ3BFLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUE7QUFDL0MsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUE7QUFFdEcsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLENBQWlDLE1BQXlELEVBQUUsTUFBdUIsRUFBRSxFQUFFLENBQUMsTUFBTTtLQUNsSixHQUFHLENBQUMsUUFBUSxDQUFDO0lBQ1osS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxDQUFBO0lBRXBELE1BQU0sR0FBRyxHQUFHLElBQUksV0FBVyxFQUFFLENBQUE7SUFFN0IsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FDNUIsTUFBTSxFQUNOLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxXQUFXLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUMvRSxDQUFBO0lBRUQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUNqQixRQUFRLEVBQ1IsTUFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsRUFDdkIsTUFBTSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsRUFDekIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FDMUMsQ0FBQTtJQUVELE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUssQ0FBQTtJQUN0QyxNQUFNLEdBQUcsR0FBRyxrQkFBa0IsQ0FBQyxNQUFNLENBQ25DLE1BQU07U0FDSCxJQUFJLENBQ0gsTUFBTSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsRUFDNUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FDM0IsRUFDSDtRQUNFLFdBQVcsRUFBRSxtQkFBbUI7UUFDaEMsT0FBTyxFQUFFLFdBQVcsQ0FBQyxTQUFTLENBQUM7WUFDN0IsY0FBYyxFQUFFLG1CQUFtQjtZQUNuQyxlQUFlLEVBQUUsVUFBVTtZQUMzQixtQkFBbUIsRUFBRSxJQUFJO1lBQ3pCLFlBQVksRUFBRSxZQUFZLENBQUMsaUNBQWlDO1NBQzdELENBQUM7S0FDSCxDQUNGLENBQUE7SUFDRCxPQUFPLEdBQUcsQ0FBQTtBQUNaLENBQUMsQ0FBQztLQUNELElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQSJ9
30
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwaS9pbnRlcm5hbC9ldmVudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sb0NBQW9DLENBQUE7QUFDeEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGlDQUFpQyxDQUFBO0FBQzdELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLFlBQVksQ0FBQTtBQUN4RSxPQUFPLEVBQUUsV0FBVyxFQUFFLGtCQUFrQixFQUFFLE1BQU0saUJBQWlCLENBQUE7QUFFakUsb0VBQW9FO0FBQ3BFLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUE7QUFDL0MsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUE7QUFFdEcsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLENBQ3JCLE1BQTBELEVBQzFELE1BQTJCLEVBQzNCLEVBQUUsQ0FDRixNQUFNO0tBQ0gsR0FBRyxDQUFDLFFBQVEsQ0FBQztJQUNaLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsNkJBQTZCLENBQUMsQ0FBQTtJQUVwRCxNQUFNLEdBQUcsR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFBO0lBRTdCLE1BQU0sTUFBTSxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUE7SUFFL0IsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FDaEMsTUFBTSxFQUNOLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FDSixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztTQUNWLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxXQUFXLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQ3BGLENBQUE7SUFFRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQ2pCLFFBQVEsRUFDUixNQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxFQUN2QixNQUFNLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxFQUN6QixNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUMxQyxDQUFBO0lBRUQsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBVSxDQUFBO0lBQzNDLE1BQU0sR0FBRyxHQUFHLGtCQUFrQixDQUFDLE1BQU0sQ0FDbkMsTUFBTTtTQUNILElBQUksQ0FDSCxNQUFNLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUM1QyxNQUFNLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUMzQixFQUNIO1FBQ0UsV0FBVyxFQUFFLG1CQUFtQjtRQUNoQyxPQUFPLEVBQUUsV0FBVyxDQUFDLFNBQVMsQ0FBQztZQUM3QixjQUFjLEVBQUUsbUJBQW1CO1lBQ25DLGVBQWUsRUFBRSxVQUFVO1lBQzNCLG1CQUFtQixFQUFFLElBQUk7WUFDekIsWUFBWSxFQUFFLFlBQVksQ0FBQyxpQ0FBaUM7U0FDN0QsQ0FBQztLQUNILENBQ0YsQ0FBQTtJQUNELE9BQU8sR0FBRyxDQUFBO0FBQ1osQ0FBQyxDQUFDO0tBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLG1CQUFtQixDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFBIn0=
@@ -0,0 +1,3 @@
1
+ import { HttpRouter } from "effect-app/http";
2
+ export declare function serverHealth(version: string): <E, R>(self: HttpRouter.HttpRouter<E, R>) => HttpRouter.HttpRouter<E, R>;
3
+ //# sourceMappingURL=health.d.ts.map
@@ -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;AAEpC;;;;;;;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"}
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"}
@@ -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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlkZGxld2FyZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXBpL21pZGRsZXdhcmVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQVFBLE9BQU8sS0FBSyxRQUFRLE1BQU0sMkJBQTJCLENBQUE7QUFFckQsY0FBYyxzQkFBc0IsQ0FBQTtBQUVwQzs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUVxQyxRQUFRLENBQUMsU0FBUyxDQUFBO0FBRTdFOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUU2QixRQUFRLENBQUMsaUJBQWlCLENBQUE7QUFFckY7Ozs7OztHQU1HO0FBQ0gsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBRVAsUUFBUSxDQUFDLG1CQUFtQixDQUFBO0FBRXJEOzs7OztHQUtHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUF3RCxRQUFRLENBQUMsUUFBUSxDQUFBO0FBVzlGOzs7OztHQUtHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQVE2QyxRQUFRLENBQUMsU0FBUyxDQUFBO0FBZXJGOzs7OztHQUtHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sSUFBSSxHQUUwQyxRQUFRLENBQUMsSUFBSSxDQUFBIn0=
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.20.0",
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/core": "1.10.1"
24
+ "@effect-app/schema": "1.12.1"
25
25
  },
26
26
  "devDependencies": {
27
27
  "@babel/cli": "^7.25.6",
@@ -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: S.Literal("en", "de"),
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>(events: Stream.Stream<{ evt: A, namespace: string}, E, R>, schema: S.Schema<A, SI>) => Effect
11
- .gen(function*() {
12
- yield* Effect.logInfo("$ start listening to events")
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
- const enc = new TextEncoder()
18
+ const enc = new TextEncoder()
15
19
 
16
- const eventStream = Stream.map(
17
- events,
18
- (_) => `id: ${_.evt.id}\ndata: ${JSON.stringify(S.encodeSync(schema)(_.evt))}`
19
- )
20
+ const encode = S.encode(schema)
20
21
 
21
- const stream = pipe(
22
- setRetry,
23
- Stream.merge(keepAlive),
24
- Stream.merge(eventStream),
25
- Stream.map((_) => enc.encode(_ + "\n\n"))
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
- const ctx = yield* Effect.context<R>()
29
- const res = HttpServerResponse.stream(
30
- stream
31
- .pipe(
32
- Stream.tapErrorCause(reportError("Request")),
33
- Stream.provideContext(ctx)
34
- ),
35
- {
36
- contentType: "text/event-stream",
37
- headers: HttpHeaders.fromInput({
38
- "content-type": "text/event-stream",
39
- "cache-control": "no-cache",
40
- "x-accel-buffering": "no",
41
- "connection": "keep-alive" // if (req.httpVersion !== "2.0")
42
- })
43
- }
44
- )
45
- return res
46
- })
47
- .pipe(Effect.tapErrorCause(reportError("Request")), (_) => setupRequestContext(_, "events"))
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
+ }
@@ -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.