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