@effect-app/infra 1.20.1 → 1.22.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.22.0
4
+
5
+ ### Minor Changes
6
+
7
+ - be4ff0e: port auth
8
+
9
+ ## 1.21.0
10
+
11
+ ### Minor Changes
12
+
13
+ - f15d26f: port more middleware
14
+
3
15
  ## 1.20.1
4
16
 
5
17
  ### Patch 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":[]}
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.checkJwt = exports.checkJWTI = void 0;
7
+ var _effectApp = require("effect-app");
8
+ var _http = require("effect-app/http");
9
+ var _expressOauth2JwtBearer = require("express-oauth2-jwt-bearer");
10
+ /* eslint-disable @typescript-eslint/no-explicit-any */
11
+ /* eslint-disable unused-imports/no-unused-vars */
12
+
13
+ const checkJWTI = config => {
14
+ const mw = (0, _expressOauth2JwtBearer.auth)(config);
15
+ return _effectApp.Effect.gen(function* () {
16
+ const req = yield* _http.HttpServerRequest.HttpServerRequest;
17
+ return yield* _effectApp.Effect.async(cb => {
18
+ const next = err => {
19
+ if (!err) return cb(_effectApp.Effect.void);
20
+ if (err instanceof _expressOauth2JwtBearer.InsufficientScopeError || err instanceof _expressOauth2JwtBearer.InvalidRequestError || err instanceof _expressOauth2JwtBearer.InvalidTokenError || err instanceof _expressOauth2JwtBearer.UnauthorizedError) {
21
+ return cb(_effectApp.Effect.fail(err));
22
+ }
23
+ return _effectApp.Effect.die(err);
24
+ };
25
+ const r = {
26
+ headers: req.headers,
27
+ query: {},
28
+ body: {},
29
+ is: () => false
30
+ }; // is("urlencoded")
31
+ try {
32
+ mw(r, {}, next);
33
+ } catch (e) {
34
+ return cb(_effectApp.Effect.die(e));
35
+ }
36
+ });
37
+ });
38
+ };
39
+ exports.checkJWTI = checkJWTI;
40
+ const checkJwt = config => {
41
+ const check = checkJWTI(config);
42
+ return _http.HttpMiddleware.make(app => _effectApp.Effect.gen(function* () {
43
+ const response = yield* check.pipe(_effectApp.Effect.catchAll(e => _effectApp.Effect.succeed(_http.HttpServerResponse.unsafeJson({
44
+ message: e.message
45
+ }, {
46
+ status: e.status,
47
+ headers: _http.HttpHeaders.fromInput(e.headers)
48
+ }))));
49
+ if (response) {
50
+ return response;
51
+ }
52
+ return yield* app;
53
+ }));
54
+ };
55
+ exports.checkJwt = checkJwt;
56
+ //# sourceMappingURL=auth.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.cjs","names":["_effectApp","require","_http","_expressOauth2JwtBearer","checkJWTI","config","mw","auth","Effect","gen","req","HttpServerRequest","async","cb","next","err","void","InsufficientScopeError","InvalidRequestError","InvalidTokenError","UnauthorizedError","fail","die","r","headers","query","body","is","e","exports","checkJwt","check","HttpMiddleware","make","app","response","pipe","catchAll","succeed","HttpServerResponse","unsafeJson","message","status","HttpHeaders","fromInput"],"sources":["../../../src/api/internal/auth.ts"],"sourcesContent":[null],"mappings":";;;;;;AAEA,IAAAA,UAAA,GAAAC,OAAA;AACA,IAAAC,KAAA,GAAAD,OAAA;AACA,IAAAE,uBAAA,GAAAF,OAAA;AAJA;AACA;;AAgBO,MAAMG,SAAS,GAAIC,MAAc,IAAI;EAC1C,MAAMC,EAAE,GAAG,IAAAC,4BAAI,EAACF,MAAM,CAAC;EACvB,OAAOG,iBAAM,CAACC,GAAG,CAAC,aAAS;IACzB,MAAMC,GAAG,GAAG,OAAOC,uBAAiB,CAACA,iBAAiB;IAEtD,OAAO,OAAOH,iBAAM,CAACI,KAAK,CAIvBC,EAAE,IAAI;MACL,MAAMC,IAAI,GAAIC,GAAa,IAAI;QAC7B,IAAI,CAACA,GAAG,EAAE,OAAOF,EAAE,CAACL,iBAAM,CAACQ,IAAI,CAAC;QAChC,IACED,GAAG,YAAYE,8CAAsB,IAClCF,GAAG,YAAYG,2CAAmB,IAClCH,GAAG,YAAYI,yCAAiB,IAChCJ,GAAG,YAAYK,yCAAiB,EACnC;UACA,OAAOP,EAAE,CAACL,iBAAM,CAACa,IAAI,CAACN,GAAG,CAAC,CAAC;QAC7B;QACA,OAAOP,iBAAM,CAACc,GAAG,CAACP,GAAG,CAAC;MACxB,CAAC;MACD,MAAMQ,CAAC,GAAG;QAAEC,OAAO,EAAEd,GAAG,CAACc,OAAO;QAAEC,KAAK,EAAE,EAAE;QAAEC,IAAI,EAAE,EAAE;QAAEC,EAAE,EAAEA,CAAA,KAAM;MAAK,CAAE,EAAC;MACzE,IAAI;QACFrB,EAAE,CAACiB,CAAQ,EAAE,EAAS,EAAET,IAAI,CAAC;MAC/B,CAAC,CAAC,OAAOc,CAAC,EAAE;QACV,OAAOf,EAAE,CAACL,iBAAM,CAACc,GAAG,CAACM,CAAC,CAAC,CAAC;MAC1B;IACF,CAAC,CACF;EACH,CAAC,CAAC;AACJ,CAAC;AAAAC,OAAA,CAAAzB,SAAA,GAAAA,SAAA;AAEM,MAAM0B,QAAQ,GAAIzB,MAAc,IAAI;EACzC,MAAM0B,KAAK,GAAG3B,SAAS,CAACC,MAAM,CAAC;EAC/B,OAAO2B,oBAAc,CAACC,IAAI,CAAEC,GAAG,IAC7B1B,iBAAM,CAACC,GAAG,CAAC,aAAS;IAClB,MAAM0B,QAAQ,GAAG,OAAOJ,KAAK,CAACK,IAAI,CAAC5B,iBAAM,CAAC6B,QAAQ,CAAET,CAAC,IACnDpB,iBAAM,CAAC8B,OAAO,CACZC,wBAAkB,CAACC,UAAU,CAAC;MAAEC,OAAO,EAAEb,CAAC,CAACa;IAAO,CAAE,EAAE;MACpDC,MAAM,EAAEd,CAAC,CAACc,MAAM;MAChBlB,OAAO,EAAEmB,iBAAW,CAACC,SAAS,CAAChB,CAAC,CAACJ,OAAO;KACzC,CAAC,CACH,CACF,CAAC;IACF,IAAIW,QAAQ,EAAE;MACZ,OAAOA,QAAQ;IACjB;IACA,OAAO,OAAOD,GAAG;EACnB,CAAC,CAAC,CACH;AACH,CAAC;AAAAL,OAAA,CAAAC,QAAA,GAAAA,QAAA","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":[]}
@@ -13,6 +13,18 @@ var _exportNames = {
13
13
  };
14
14
  exports.uuidLogAnnotation = exports.errorLog = exports.endpointCallsMetric = exports.cors = exports.basicAuth = exports.accessLog = void 0;
15
15
  var internal = _interopRequireWildcard(require("./internal/middlewares.cjs"));
16
+ var _auth = require("./internal/auth.cjs");
17
+ Object.keys(_auth).forEach(function (key) {
18
+ if (key === "default" || key === "__esModule") return;
19
+ if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
20
+ if (key in exports && exports[key] === _auth[key]) return;
21
+ Object.defineProperty(exports, key, {
22
+ enumerable: true,
23
+ get: function () {
24
+ return _auth[key];
25
+ }
26
+ });
27
+ });
16
28
  var _events = require("./internal/events.cjs");
17
29
  Object.keys(_events).forEach(function (key) {
18
30
  if (key === "default" || key === "__esModule") return;
@@ -25,6 +37,30 @@ Object.keys(_events).forEach(function (key) {
25
37
  }
26
38
  });
27
39
  });
40
+ var _health = require("./internal/health.cjs");
41
+ Object.keys(_health).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] === _health[key]) return;
45
+ Object.defineProperty(exports, key, {
46
+ enumerable: true,
47
+ get: function () {
48
+ return _health[key];
49
+ }
50
+ });
51
+ });
52
+ var _RequestContextMiddleware = require("./internal/RequestContextMiddleware.cjs");
53
+ Object.keys(_RequestContextMiddleware).forEach(function (key) {
54
+ if (key === "default" || key === "__esModule") return;
55
+ if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
56
+ if (key in exports && exports[key] === _RequestContextMiddleware[key]) return;
57
+ Object.defineProperty(exports, key, {
58
+ enumerable: true,
59
+ get: function () {
60
+ return _RequestContextMiddleware[key];
61
+ }
62
+ });
63
+ });
28
64
  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
65
  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
66
  /**
@@ -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","_auth","Object","keys","forEach","key","prototype","hasOwnProperty","call","_exportNames","exports","defineProperty","enumerable","get","_events","_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==
@@ -0,0 +1,8 @@
1
+ import { Effect } from "effect-app";
2
+ import { HttpServerRequest, HttpServerResponse } from "effect-app/http";
3
+ import { auth, UnauthorizedError } from "express-oauth2-jwt-bearer";
4
+ type Config = Parameters<typeof auth>[0];
5
+ export declare const checkJWTI: (config: Config) => Effect.Effect<void, UnauthorizedError, HttpServerRequest.HttpServerRequest>;
6
+ export declare const checkJwt: (config: Config) => <E, R>(app: import("@effect/platform/HttpApp").Default<E, R>) => Effect.Effect<HttpServerResponse.HttpServerResponse, E, HttpServerRequest.HttpServerRequest | R>;
7
+ export {};
8
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/api/internal/auth.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AACnC,OAAO,EAA+B,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AACpG,OAAO,EACL,IAAI,EAIJ,iBAAiB,EAClB,MAAM,2BAA2B,CAAA;AAMlC,KAAK,MAAM,GAAG,UAAU,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;AACxC,eAAO,MAAM,SAAS,WAAY,MAAM,gFA+BvC,CAAA;AAED,eAAO,MAAM,QAAQ,WAAY,MAAM,sKAkBtC,CAAA"}
@@ -0,0 +1,45 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ /* eslint-disable unused-imports/no-unused-vars */
3
+ import { Effect } from "effect-app";
4
+ import { HttpHeaders, HttpMiddleware, HttpServerRequest, HttpServerResponse } from "effect-app/http";
5
+ import { auth, InsufficientScopeError, InvalidRequestError, InvalidTokenError, UnauthorizedError } from "express-oauth2-jwt-bearer";
6
+ export const checkJWTI = (config) => {
7
+ const mw = auth(config);
8
+ return Effect.gen(function* () {
9
+ const req = yield* HttpServerRequest.HttpServerRequest;
10
+ return yield* Effect.async((cb) => {
11
+ const next = (err) => {
12
+ if (!err)
13
+ return cb(Effect.void);
14
+ if (err instanceof InsufficientScopeError
15
+ || err instanceof InvalidRequestError
16
+ || err instanceof InvalidTokenError
17
+ || err instanceof UnauthorizedError) {
18
+ return cb(Effect.fail(err));
19
+ }
20
+ return Effect.die(err);
21
+ };
22
+ const r = { headers: req.headers, query: {}, body: {}, is: () => false }; // is("urlencoded")
23
+ try {
24
+ mw(r, {}, next);
25
+ }
26
+ catch (e) {
27
+ return cb(Effect.die(e));
28
+ }
29
+ });
30
+ });
31
+ };
32
+ export const checkJwt = (config) => {
33
+ const check = checkJWTI(config);
34
+ return HttpMiddleware.make((app) => Effect.gen(function* () {
35
+ const response = yield* check.pipe(Effect.catchAll((e) => Effect.succeed(HttpServerResponse.unsafeJson({ message: e.message }, {
36
+ status: e.status,
37
+ headers: HttpHeaders.fromInput(e.headers)
38
+ }))));
39
+ if (response) {
40
+ return response;
41
+ }
42
+ return yield* app;
43
+ }));
44
+ };
45
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hcGkvaW50ZXJuYWwvYXV0aC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx1REFBdUQ7QUFDdkQsa0RBQWtEO0FBQ2xELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxZQUFZLENBQUE7QUFDbkMsT0FBTyxFQUFFLFdBQVcsRUFBRSxjQUFjLEVBQUUsaUJBQWlCLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQTtBQUNwRyxPQUFPLEVBQ0wsSUFBSSxFQUNKLHNCQUFzQixFQUN0QixtQkFBbUIsRUFDbkIsaUJBQWlCLEVBQ2pCLGlCQUFpQixFQUNsQixNQUFNLDJCQUEyQixDQUFBO0FBT2xDLE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBRyxDQUFDLE1BQWMsRUFBRSxFQUFFO0lBQzFDLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUN2QixPQUFPLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDO1FBQ3pCLE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDLGlCQUFpQixDQUFDLGlCQUFpQixDQUFBO1FBRXRELE9BQU8sS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FJeEIsQ0FBQyxFQUFFLEVBQUUsRUFBRTtZQUNMLE1BQU0sSUFBSSxHQUFHLENBQUMsR0FBYSxFQUFFLEVBQUU7Z0JBQzdCLElBQUksQ0FBQyxHQUFHO29CQUFFLE9BQU8sRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQTtnQkFDaEMsSUFDRSxHQUFHLFlBQVksc0JBQXNCO3VCQUNsQyxHQUFHLFlBQVksbUJBQW1CO3VCQUNsQyxHQUFHLFlBQVksaUJBQWlCO3VCQUNoQyxHQUFHLFlBQVksaUJBQWlCLEVBQ25DLENBQUM7b0JBQ0QsT0FBTyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFBO2dCQUM3QixDQUFDO2dCQUNELE9BQU8sTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUN4QixDQUFDLENBQUE7WUFDRCxNQUFNLENBQUMsR0FBRyxFQUFFLE9BQU8sRUFBRSxHQUFHLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUEsQ0FBQyxtQkFBbUI7WUFDNUYsSUFBSSxDQUFDO2dCQUNILEVBQUUsQ0FBQyxDQUFRLEVBQUUsRUFBUyxFQUFFLElBQUksQ0FBQyxDQUFBO1lBQy9CLENBQUM7WUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO2dCQUNYLE9BQU8sRUFBRSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtZQUMxQixDQUFDO1FBQ0gsQ0FBQyxDQUNGLENBQUE7SUFDSCxDQUFDLENBQUMsQ0FBQTtBQUNKLENBQUMsQ0FBQTtBQUVELE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxDQUFDLE1BQWMsRUFBRSxFQUFFO0lBQ3pDLE1BQU0sS0FBSyxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUMvQixPQUFPLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUNqQyxNQUFNLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQztRQUNsQixNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUN2RCxNQUFNLENBQUMsT0FBTyxDQUNaLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDcEQsTUFBTSxFQUFFLENBQUMsQ0FBQyxNQUFNO1lBQ2hCLE9BQU8sRUFBRSxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7U0FDMUMsQ0FBQyxDQUNILENBQ0YsQ0FBQyxDQUFBO1FBQ0YsSUFBSSxRQUFRLEVBQUUsQ0FBQztZQUNiLE9BQU8sUUFBUSxDQUFBO1FBQ2pCLENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQTtJQUNuQixDQUFDLENBQUMsQ0FDSCxDQUFBO0FBQ0gsQ0FBQyxDQUFBIn0=
@@ -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=
@@ -6,7 +6,10 @@
6
6
  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
+ export * from "./internal/auth.js";
9
10
  export * from "./internal/events.js";
11
+ export * from "./internal/health.js";
12
+ export * from "./internal/RequestContextMiddleware.js";
10
13
  /**
11
14
  * Add access logs for handled requests. The log runs before each request.
12
15
  * 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,oBAAoB,CAAA;AAClC,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,8 @@
1
1
  import * as internal from "./internal/middlewares.js";
2
+ export * from "./internal/auth.js";
2
3
  export * from "./internal/events.js";
4
+ export * from "./internal/health.js";
5
+ export * from "./internal/RequestContextMiddleware.js";
3
6
  /**
4
7
  * Add access logs for handled requests. The log runs before each request.
5
8
  * Optionally configure log level using the first argument. The default log level
@@ -49,4 +52,4 @@ export const basicAuth = internal.basicAuth;
49
52
  * @since 1.0.0
50
53
  */
51
54
  export const cors = internal.cors;
52
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlkZGxld2FyZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXBpL21pZGRsZXdhcmVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQVFBLE9BQU8sS0FBSyxRQUFRLE1BQU0sMkJBQTJCLENBQUE7QUFFckQsY0FBYyxzQkFBc0IsQ0FBQTtBQUVwQzs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUVxQyxRQUFRLENBQUMsU0FBUyxDQUFBO0FBRTdFOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUU2QixRQUFRLENBQUMsaUJBQWlCLENBQUE7QUFFckY7Ozs7OztHQU1HO0FBQ0gsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBRVAsUUFBUSxDQUFDLG1CQUFtQixDQUFBO0FBRXJEOzs7OztHQUtHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUF3RCxRQUFRLENBQUMsUUFBUSxDQUFBO0FBVzlGOzs7OztHQUtHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQVE2QyxRQUFRLENBQUMsU0FBUyxDQUFBO0FBZXJGOzs7OztHQUtHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sSUFBSSxHQUUwQyxRQUFRLENBQUMsSUFBSSxDQUFBIn0=
55
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlkZGxld2FyZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXBpL21pZGRsZXdhcmVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQVFBLE9BQU8sS0FBSyxRQUFRLE1BQU0sMkJBQTJCLENBQUE7QUFFckQsY0FBYyxvQkFBb0IsQ0FBQTtBQUNsQyxjQUFjLHNCQUFzQixDQUFBO0FBQ3BDLGNBQWMsc0JBQXNCLENBQUE7QUFDcEMsY0FBYyx3Q0FBd0MsQ0FBQTtBQUV0RDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUVxQyxRQUFRLENBQUMsU0FBUyxDQUFBO0FBRTdFOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUU2QixRQUFRLENBQUMsaUJBQWlCLENBQUE7QUFFckY7Ozs7OztHQU1HO0FBQ0gsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBRVAsUUFBUSxDQUFDLG1CQUFtQixDQUFBO0FBRXJEOzs7OztHQUtHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUF3RCxRQUFRLENBQUMsUUFBUSxDQUFBO0FBVzlGOzs7OztHQUtHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQVE2QyxRQUFRLENBQUMsU0FBUyxDQUFBO0FBZXJGOzs7OztHQUtHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sSUFBSSxHQUUwQyxRQUFRLENBQUMsSUFBSSxDQUFBIn0=
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@effect-app/infra",
3
- "version": "1.20.1",
3
+ "version": "1.22.0",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "dependencies": {
@@ -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
+ )
@@ -0,0 +1,69 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ /* eslint-disable unused-imports/no-unused-vars */
3
+ import { Effect } from "effect-app"
4
+ import { HttpHeaders, HttpMiddleware, HttpServerRequest, HttpServerResponse } from "effect-app/http"
5
+ import {
6
+ auth,
7
+ InsufficientScopeError,
8
+ InvalidRequestError,
9
+ InvalidTokenError,
10
+ UnauthorizedError
11
+ } from "express-oauth2-jwt-bearer"
12
+
13
+ // // Authorization middleware. When used, the Access Token must
14
+ // // exist and be verified against the Auth0 JSON Web Key Set.
15
+
16
+ // type Errors = InsufficientScopeError | InvalidRequestError | InvalidTokenError | UnauthorizedError
17
+ type Config = Parameters<typeof auth>[0]
18
+ export const checkJWTI = (config: Config) => {
19
+ const mw = auth(config)
20
+ return Effect.gen(function*() {
21
+ const req = yield* HttpServerRequest.HttpServerRequest
22
+
23
+ return yield* Effect.async<
24
+ void,
25
+ InsufficientScopeError | InvalidRequestError | InvalidTokenError | UnauthorizedError
26
+ >(
27
+ (cb) => {
28
+ const next = (err?: unknown) => {
29
+ if (!err) return cb(Effect.void)
30
+ if (
31
+ err instanceof InsufficientScopeError
32
+ || err instanceof InvalidRequestError
33
+ || err instanceof InvalidTokenError
34
+ || err instanceof UnauthorizedError
35
+ ) {
36
+ return cb(Effect.fail(err))
37
+ }
38
+ return Effect.die(err)
39
+ }
40
+ const r = { headers: req.headers, query: {}, body: {}, is: () => false } // is("urlencoded")
41
+ try {
42
+ mw(r as any, {} as any, next)
43
+ } catch (e) {
44
+ return cb(Effect.die(e))
45
+ }
46
+ }
47
+ )
48
+ })
49
+ }
50
+
51
+ export const checkJwt = (config: Config) => {
52
+ const check = checkJWTI(config)
53
+ return HttpMiddleware.make((app) =>
54
+ Effect.gen(function*() {
55
+ const response = yield* check.pipe(Effect.catchAll((e) =>
56
+ Effect.succeed(
57
+ HttpServerResponse.unsafeJson({ message: e.message }, {
58
+ status: e.status,
59
+ headers: HttpHeaders.fromInput(e.headers)
60
+ })
61
+ )
62
+ ))
63
+ if (response) {
64
+ return response
65
+ }
66
+ return yield* app
67
+ })
68
+ )
69
+ }
@@ -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
+ }
@@ -8,7 +8,10 @@ import type { Effect } from "effect-app"
8
8
  import type { NotLoggedInError } from "../errors.js"
9
9
  import * as internal from "./internal/middlewares.js"
10
10
 
11
+ export * from "./internal/auth.js"
11
12
  export * from "./internal/events.js"
13
+ export * from "./internal/health.js"
14
+ export * from "./internal/RequestContextMiddleware.js"
12
15
 
13
16
  /**
14
17
  * Add access logs for handled requests. The log runs before each request.