@geekmidas/constructs 3.1.0 → 4.0.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 +19 -0
- package/dist/{AWSScheduledFunction-BnYDnzsF.d.mts → AWSScheduledFunction-COv8bB1v.d.mts} +2 -2
- package/dist/{AWSScheduledFunction-BnYDnzsF.d.mts.map → AWSScheduledFunction-COv8bB1v.d.mts.map} +1 -1
- package/dist/{AWSScheduledFunction-BRGjgD-i.mjs → AWSScheduledFunction-D-55GfwL.mjs} +3 -3
- package/dist/{AWSScheduledFunction-BRGjgD-i.mjs.map → AWSScheduledFunction-D-55GfwL.mjs.map} +1 -1
- package/dist/{AWSScheduledFunction-vjanLO3-.d.cts → AWSScheduledFunction-D9uCAd76.d.cts} +2 -2
- package/dist/{AWSScheduledFunction-vjanLO3-.d.cts.map → AWSScheduledFunction-D9uCAd76.d.cts.map} +1 -1
- package/dist/{AWSScheduledFunction-B3cHQSdp.cjs → AWSScheduledFunction-sWwZC9hg.cjs} +9 -9
- package/dist/{AWSScheduledFunction-B3cHQSdp.cjs.map → AWSScheduledFunction-sWwZC9hg.cjs.map} +1 -1
- package/dist/{Construct-DXfLPGwg.cjs → Construct-B14miJ6P.cjs} +42 -5
- package/dist/{Construct-DXfLPGwg.cjs.map → Construct-B14miJ6P.cjs.map} +1 -1
- package/dist/{Construct-CLIPPqUP.mjs → Construct-CdJY2DJS.mjs} +28 -3
- package/dist/{Construct-CLIPPqUP.mjs.map → Construct-CdJY2DJS.mjs.map} +1 -1
- package/dist/{Construct-BY0NBQLj.d.mts → Construct-D0n7QTaI.d.mts} +1 -1
- package/dist/{Construct-BY0NBQLj.d.mts.map → Construct-D0n7QTaI.d.mts.map} +1 -1
- package/dist/{Endpoint-4gVYt12g.d.mts → Endpoint-C_qxza6z.d.mts} +3 -3
- package/dist/{Endpoint-4gVYt12g.d.mts.map → Endpoint-C_qxza6z.d.mts.map} +1 -1
- package/dist/{Endpoint-BlMZIwBY.d.cts → Endpoint-D5SChIsU.d.cts} +2 -2
- package/dist/{Endpoint-BlMZIwBY.d.cts.map → Endpoint-D5SChIsU.d.cts.map} +1 -1
- package/dist/{HonoEndpointAdaptor-6k-rI44C.mjs → HonoEndpointAdaptor-CWYBGVFQ.mjs} +4 -4
- package/dist/{HonoEndpointAdaptor-6k-rI44C.mjs.map → HonoEndpointAdaptor-CWYBGVFQ.mjs.map} +1 -1
- package/dist/{HonoEndpointAdaptor-CNIsjEw-.cjs → HonoEndpointAdaptor-C_2jaZ4k.cjs} +17 -17
- package/dist/{HonoEndpointAdaptor-CNIsjEw-.cjs.map → HonoEndpointAdaptor-C_2jaZ4k.cjs.map} +1 -1
- package/dist/{Subscriber-CjOHxO0l.d.mts → Subscriber-C0v9iOrI.d.mts} +2 -2
- package/dist/{Subscriber-CjOHxO0l.d.mts.map → Subscriber-C0v9iOrI.d.mts.map} +1 -1
- package/dist/adaptors/aws.cjs +12 -14
- package/dist/adaptors/aws.cjs.map +1 -1
- package/dist/adaptors/aws.d.cts +3 -3
- package/dist/adaptors/aws.d.mts +7 -7
- package/dist/adaptors/aws.mjs +6 -8
- package/dist/adaptors/aws.mjs.map +1 -1
- package/dist/adaptors/hono.cjs +6 -7
- package/dist/adaptors/hono.d.cts +2 -2
- package/dist/adaptors/hono.d.cts.map +1 -1
- package/dist/adaptors/hono.d.mts +4 -4
- package/dist/adaptors/hono.d.mts.map +1 -1
- package/dist/adaptors/hono.mjs +6 -7
- package/dist/adaptors/testing.cjs +12 -14
- package/dist/adaptors/testing.cjs.map +1 -1
- package/dist/adaptors/testing.d.cts +2 -2
- package/dist/adaptors/testing.d.mts +5 -5
- package/dist/adaptors/testing.mjs +6 -7
- package/dist/adaptors/testing.mjs.map +1 -1
- package/dist/crons/index.cjs +6 -7
- package/dist/crons/index.cjs.map +1 -1
- package/dist/crons/index.d.cts +2 -2
- package/dist/crons/index.d.mts +3 -3
- package/dist/crons/index.mjs +4 -5
- package/dist/crons/index.mjs.map +1 -1
- package/dist/endpoints/index.cjs +7 -9
- package/dist/endpoints/index.cjs.map +1 -1
- package/dist/endpoints/index.d.cts +4 -4
- package/dist/endpoints/index.d.mts +4 -4
- package/dist/endpoints/index.mjs +4 -6
- package/dist/endpoints/index.mjs.map +1 -1
- package/dist/functions/index.cjs +2 -2
- package/dist/functions/index.d.cts +1 -1
- package/dist/functions/index.d.mts +2 -2
- package/dist/functions/index.mjs +2 -2
- package/dist/{functions-BMR-1CIQ.mjs → functions-C9QhxXoP.mjs} +2 -3
- package/dist/{functions-BMR-1CIQ.mjs.map → functions-C9QhxXoP.mjs.map} +1 -1
- package/dist/{functions-_OAiwGYh.cjs → functions-cL1XwEHW.cjs} +10 -11
- package/dist/{functions-_OAiwGYh.cjs.map → functions-cL1XwEHW.cjs.map} +1 -1
- package/dist/{index-DoiHTgUQ.d.mts → index-C0XoazSK.d.mts} +2 -2
- package/dist/{index-DoiHTgUQ.d.mts.map → index-C0XoazSK.d.mts.map} +1 -1
- package/dist/{index-Dj3uvqCO.d.cts → index-Cg0m0uBN.d.cts} +5 -5
- package/dist/{index-Dj3uvqCO.d.cts.map → index-Cg0m0uBN.d.cts.map} +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.d.mts +3 -3
- package/dist/index.mjs +1 -1
- package/dist/{lazyAccessors-D-UHg0YJ.mjs → lazyAccessors-Bnq67EHR.mjs} +834 -9
- package/dist/lazyAccessors-Bnq67EHR.mjs.map +1 -0
- package/dist/{lazyAccessors-B4rtX68K.cjs → lazyAccessors-DGqzwC-j.cjs} +842 -11
- package/dist/lazyAccessors-DGqzwC-j.cjs.map +1 -0
- package/dist/{processAudits-CPcACKCA.cjs → processAudits-BmjKsnF7.cjs} +3 -3
- package/dist/{processAudits-CPcACKCA.cjs.map → processAudits-BmjKsnF7.cjs.map} +1 -1
- package/dist/{processAudits-BEiSkgH3.mjs → processAudits-ySnizdMG.mjs} +1 -1
- package/dist/{processAudits-BEiSkgH3.mjs.map → processAudits-ySnizdMG.mjs.map} +1 -1
- package/dist/{publisher-CnpeMv-r.mjs → publisher-BrFOF847.mjs} +1 -1
- package/dist/{publisher-CnpeMv-r.mjs.map → publisher-BrFOF847.mjs.map} +1 -1
- package/dist/{publisher-BZgcrVPy.cjs → publisher-lFQleddL.cjs} +1 -1
- package/dist/{publisher-BZgcrVPy.cjs.map → publisher-lFQleddL.cjs.map} +1 -1
- package/dist/subscribers/index.cjs +2 -3
- package/dist/subscribers/index.cjs.map +1 -1
- package/dist/subscribers/index.d.mts +2 -2
- package/dist/subscribers/index.mjs +1 -1
- package/dist/{telemetry-Bp4DLvdQ.d.mts → telemetry-3vdxGn4q.d.mts} +1 -1
- package/dist/{telemetry-Bp4DLvdQ.d.mts.map → telemetry-3vdxGn4q.d.mts.map} +1 -1
- package/dist/{types-j0ti0JTY.d.mts → types-BDNGr7pv.d.mts} +1 -1
- package/dist/{types-j0ti0JTY.d.mts.map → types-BDNGr7pv.d.mts.map} +1 -1
- package/dist/types.d.mts +1 -1
- package/package.json +11 -36
- package/src/crons/AWSScheduledFunction.ts +1 -0
- package/src/endpoints/HonoEndpointAdaptor.ts +0 -1
- package/tsdown.config.ts +0 -2
- package/dist/adaptors/middy.cjs +0 -120
- package/dist/adaptors/middy.cjs.map +0 -1
- package/dist/adaptors/middy.d.cts +0 -139
- package/dist/adaptors/middy.d.cts.map +0 -1
- package/dist/adaptors/middy.d.mts +0 -139
- package/dist/adaptors/middy.d.mts.map +0 -1
- package/dist/adaptors/middy.mjs +0 -118
- package/dist/adaptors/middy.mjs.map +0 -1
- package/dist/adaptors/trpc.cjs +0 -65
- package/dist/adaptors/trpc.cjs.map +0 -1
- package/dist/adaptors/trpc.d.cts +0 -85
- package/dist/adaptors/trpc.d.cts.map +0 -1
- package/dist/adaptors/trpc.d.mts +0 -85
- package/dist/adaptors/trpc.d.mts.map +0 -1
- package/dist/adaptors/trpc.mjs +0 -63
- package/dist/adaptors/trpc.mjs.map +0 -1
- package/dist/chunk-B4qE4VCv.mjs +0 -27
- package/dist/chunk-DWy1uDak.cjs +0 -39
- package/dist/lazyAccessors-B4rtX68K.cjs.map +0 -1
- package/dist/lazyAccessors-D-UHg0YJ.mjs.map +0 -1
- package/dist/lodash-CM4k4sZD.cjs +0 -836
- package/dist/lodash-CM4k4sZD.cjs.map +0 -1
- package/dist/lodash-DiUeLbQy.mjs +0 -831
- package/dist/lodash-DiUeLbQy.mjs.map +0 -1
- package/src/adaptors/__tests__/middy.spec.ts +0 -212
- package/src/adaptors/__tests__/trpc.spec.ts +0 -220
- package/src/adaptors/middy.ts +0 -225
- package/src/adaptors/trpc.ts +0 -192
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types-
|
|
1
|
+
{"version":3,"file":"types-BDNGr7pv.d.mts","names":[],"sources":["../src/types.ts"],"sourcesContent":[],"mappings":";KAAY,6BAAA,MACC,CADD,IACM,CADS,CACP,CADO,CAAA,SAAA,SAAA,GAAA,KAAA,GACwB,CADxB,GAC4B,CAD5B,CAC8B,CAD9B,CAAA,EAAA;AACd,KAGD,UAAA,GAHC,KAAA,GAAA,MAAA,GAAA,KAAA,GAAA,OAAA,GAAA,QAAA,GAAA,SAAA;AAAK,KAWN,eAXM,CAAA,UAWoB,UAXpB,CAAA,GAWkC,SAXlC,CAW4C,CAX5C,CAAA"}
|
package/dist/types.d.mts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { HttpMethod, LowerHttpMethod, RemoveUndefined } from "./types-
|
|
1
|
+
import { HttpMethod, LowerHttpMethod, RemoveUndefined } from "./types-BDNGr7pv.mjs";
|
|
2
2
|
export { HttpMethod, LowerHttpMethod, RemoveUndefined };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@geekmidas/constructs",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "4.0.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
@@ -74,16 +74,6 @@
|
|
|
74
74
|
"default": "./dist/adaptors/hono.cjs"
|
|
75
75
|
}
|
|
76
76
|
},
|
|
77
|
-
"./trpc": {
|
|
78
|
-
"import": {
|
|
79
|
-
"types": "./dist/adaptors/trpc.d.mts",
|
|
80
|
-
"default": "./dist/adaptors/trpc.mjs"
|
|
81
|
-
},
|
|
82
|
-
"require": {
|
|
83
|
-
"types": "./dist/adaptors/trpc.d.cts",
|
|
84
|
-
"default": "./dist/adaptors/trpc.cjs"
|
|
85
|
-
}
|
|
86
|
-
},
|
|
87
77
|
"./aws": {
|
|
88
78
|
"import": {
|
|
89
79
|
"types": "./dist/adaptors/aws.d.mts",
|
|
@@ -103,16 +93,6 @@
|
|
|
103
93
|
"types": "./dist/adaptors/testing.d.cts",
|
|
104
94
|
"default": "./dist/adaptors/testing.cjs"
|
|
105
95
|
}
|
|
106
|
-
},
|
|
107
|
-
"./middy": {
|
|
108
|
-
"import": {
|
|
109
|
-
"types": "./dist/adaptors/middy.d.mts",
|
|
110
|
-
"default": "./dist/adaptors/middy.mjs"
|
|
111
|
-
},
|
|
112
|
-
"require": {
|
|
113
|
-
"types": "./dist/adaptors/middy.d.cts",
|
|
114
|
-
"default": "./dist/adaptors/middy.cjs"
|
|
115
|
-
}
|
|
116
96
|
}
|
|
117
97
|
},
|
|
118
98
|
"repository": {
|
|
@@ -141,7 +121,6 @@
|
|
|
141
121
|
"@types/lodash.uniqby": "~4.7.9",
|
|
142
122
|
"@types/pg": "~8.15.6",
|
|
143
123
|
"@types/qs": "~6.15.0",
|
|
144
|
-
"@trpc/server": "~11.16.0",
|
|
145
124
|
"better-auth": "~1.4.18",
|
|
146
125
|
"kysely": "~0.28.8",
|
|
147
126
|
"pg": "~8.16.3",
|
|
@@ -149,32 +128,31 @@
|
|
|
149
128
|
"zod": "~4.1.13",
|
|
150
129
|
"@geekmidas/audit": "^2.0.1",
|
|
151
130
|
"@geekmidas/db": "^1.0.2",
|
|
152
|
-
"@geekmidas/events": "^1.1.4",
|
|
153
131
|
"@geekmidas/cache": "^1.1.1",
|
|
154
|
-
"@geekmidas/logger": "^1.0.2",
|
|
155
|
-
"@geekmidas/schema": "^1.0.2",
|
|
156
|
-
"@geekmidas/rate-limit": "^2.0.1",
|
|
157
132
|
"@geekmidas/envkit": "^1.0.7",
|
|
158
133
|
"@geekmidas/errors": "^1.0.1",
|
|
159
|
-
"@geekmidas/
|
|
160
|
-
"@geekmidas/
|
|
134
|
+
"@geekmidas/events": "^1.1.4",
|
|
135
|
+
"@geekmidas/logger": "^1.0.2",
|
|
136
|
+
"@geekmidas/rate-limit": "^3.0.0",
|
|
137
|
+
"@geekmidas/schema": "^1.0.2",
|
|
138
|
+
"@geekmidas/services": "^1.1.0",
|
|
139
|
+
"@geekmidas/testkit": "^2.0.0"
|
|
161
140
|
},
|
|
162
141
|
"peerDependencies": {
|
|
163
142
|
"@middy/core": ">=6.3.1",
|
|
164
|
-
"@trpc/server": ">=11.0.0",
|
|
165
143
|
"@types/aws-lambda": ">=8.10.92",
|
|
166
144
|
"hono": ">=4.8.2",
|
|
167
145
|
"msw": ">=2.0.0",
|
|
168
|
-
"@geekmidas/db": "^1.0.2",
|
|
169
146
|
"@geekmidas/audit": "^2.0.1",
|
|
170
147
|
"@geekmidas/cache": "^1.1.1",
|
|
148
|
+
"@geekmidas/db": "^1.0.2",
|
|
171
149
|
"@geekmidas/envkit": "^1.0.7",
|
|
172
|
-
"@geekmidas/events": "^1.1.4",
|
|
173
150
|
"@geekmidas/errors": "^1.0.1",
|
|
151
|
+
"@geekmidas/events": "^1.1.4",
|
|
174
152
|
"@geekmidas/logger": "^1.0.2",
|
|
153
|
+
"@geekmidas/rate-limit": "^3.0.0",
|
|
175
154
|
"@geekmidas/schema": "^1.0.2",
|
|
176
|
-
"@geekmidas/
|
|
177
|
-
"@geekmidas/services": "^1.0.4"
|
|
155
|
+
"@geekmidas/services": "^1.1.0"
|
|
178
156
|
},
|
|
179
157
|
"peerDependenciesMeta": {
|
|
180
158
|
"@geekmidas/audit": {
|
|
@@ -210,9 +188,6 @@
|
|
|
210
188
|
"@middy/core": {
|
|
211
189
|
"optional": true
|
|
212
190
|
},
|
|
213
|
-
"@trpc/server": {
|
|
214
|
-
"optional": true
|
|
215
|
-
},
|
|
216
191
|
"@types/aws-lambda": {
|
|
217
192
|
"optional": true
|
|
218
193
|
},
|
|
@@ -54,6 +54,7 @@ export class AWSScheduledFunction<
|
|
|
54
54
|
TDatabase,
|
|
55
55
|
TDatabaseServiceName
|
|
56
56
|
> {
|
|
57
|
+
// biome-ignore lint/complexity/noUselessConstructor: narrows the inherited `Function` parameter to `Cron` for a clearer public API
|
|
57
58
|
constructor(
|
|
58
59
|
envParser: EnvironmentParser<{}>,
|
|
59
60
|
cron: Cron<
|
|
@@ -614,7 +614,6 @@ export class HonoEndpoint<
|
|
|
614
614
|
) {
|
|
615
615
|
c.header('content-type', endpoint.responseType);
|
|
616
616
|
}
|
|
617
|
-
// @ts-expect-error
|
|
618
617
|
return c.body(output as any, status);
|
|
619
618
|
} catch (validationError: any) {
|
|
620
619
|
logger.error(validationError, 'Output validation failed');
|
package/tsdown.config.ts
CHANGED
package/dist/adaptors/middy.cjs
DELETED
|
@@ -1,120 +0,0 @@
|
|
|
1
|
-
const require_chunk = require('../chunk-DWy1uDak.cjs');
|
|
2
|
-
const require_lodash$1 = require('../lodash-CM4k4sZD.cjs');
|
|
3
|
-
const __geekmidas_services = require_chunk.__toESM(require("@geekmidas/services"));
|
|
4
|
-
const __geekmidas_logger_console = require_chunk.__toESM(require("@geekmidas/logger/console"));
|
|
5
|
-
const __geekmidas_envkit = require_chunk.__toESM(require("@geekmidas/envkit"));
|
|
6
|
-
|
|
7
|
-
//#region src/adaptors/middy.ts
|
|
8
|
-
var import_lodash = require_chunk.__toESM(require_lodash$1.require_lodash(), 1);
|
|
9
|
-
function deriveRequestId(options, event, context) {
|
|
10
|
-
return options.getRequestId?.(event, context) ?? context?.awsRequestId ?? crypto.randomUUID();
|
|
11
|
-
}
|
|
12
|
-
function buildLogger(baseLogger, options, requestId, event, context) {
|
|
13
|
-
return baseLogger.child({
|
|
14
|
-
requestId,
|
|
15
|
-
...options.bindings?.(event, context) ?? {}
|
|
16
|
-
});
|
|
17
|
-
}
|
|
18
|
-
/**
|
|
19
|
-
* Middy middleware that establishes a request context for the handler so any
|
|
20
|
-
* code it reaches — including `@geekmidas/services` service methods — can call
|
|
21
|
-
* `serviceContext.getLogger()` / `getRequestId()` / `getRequestStartTime()`.
|
|
22
|
-
*
|
|
23
|
-
* Use this on standalone functions that need request-scoped logging. To also
|
|
24
|
-
* resolve services, pair it with {@link addServices}, or use
|
|
25
|
-
* {@link withServices} which bundles both.
|
|
26
|
-
*
|
|
27
|
-
* @example
|
|
28
|
-
* ```ts
|
|
29
|
-
* import middy from '@middy/core';
|
|
30
|
-
* import { serviceContext } from '@geekmidas/services';
|
|
31
|
-
* import { requestContext } from '@geekmidas/constructs/middy';
|
|
32
|
-
*
|
|
33
|
-
* export const handler = middy(async () => {
|
|
34
|
-
* serviceContext.getLogger().info('tick');
|
|
35
|
-
* }).use(requestContext());
|
|
36
|
-
* ```
|
|
37
|
-
*/
|
|
38
|
-
function requestContext(options = {}) {
|
|
39
|
-
const baseLogger = options.logger ?? new __geekmidas_logger_console.ConsoleLogger();
|
|
40
|
-
return {
|
|
41
|
-
before: (request) => {
|
|
42
|
-
const { event, context } = request;
|
|
43
|
-
const requestId = deriveRequestId(options, event, context);
|
|
44
|
-
const logger = buildLogger(baseLogger, options, requestId, event, context);
|
|
45
|
-
(0, __geekmidas_services.enterRequestContext)({
|
|
46
|
-
logger,
|
|
47
|
-
requestId,
|
|
48
|
-
startTime: Date.now()
|
|
49
|
-
});
|
|
50
|
-
},
|
|
51
|
-
after: () => {
|
|
52
|
-
(0, __geekmidas_services.exitRequestContext)();
|
|
53
|
-
},
|
|
54
|
-
onError: () => {
|
|
55
|
-
(0, __geekmidas_services.exitRequestContext)();
|
|
56
|
-
}
|
|
57
|
-
};
|
|
58
|
-
}
|
|
59
|
-
function resolveDiscovery(options) {
|
|
60
|
-
return options.serviceDiscovery ?? __geekmidas_services.ServiceDiscovery.getInstance(options.envParser ?? new __geekmidas_envkit.EnvironmentParser({ ...process.env }));
|
|
61
|
-
}
|
|
62
|
-
/**
|
|
63
|
-
* Middy middleware that resolves an array of {@link Service}s via
|
|
64
|
-
* {@link ServiceDiscovery} and attaches the resolved record to `event.services`
|
|
65
|
-
* (keyed by each service's `serviceName`), matching how the `Function`/`Cron`
|
|
66
|
-
* constructs expose services on the event.
|
|
67
|
-
*
|
|
68
|
-
* This middleware only resolves services; it does **not** establish a request
|
|
69
|
-
* context. If your services read `serviceContext` (e.g. `getLogger()`), pair it
|
|
70
|
-
* with {@link requestContext}, or use {@link withServices} which bundles both.
|
|
71
|
-
*
|
|
72
|
-
* Chainable — `.use(addServices([a])).use(addServices([b]))` accumulates onto
|
|
73
|
-
* `event.services`.
|
|
74
|
-
*
|
|
75
|
-
* @example
|
|
76
|
-
* ```ts
|
|
77
|
-
* import middy from '@middy/core';
|
|
78
|
-
* import { addServices, requestContext } from '@geekmidas/constructs/middy';
|
|
79
|
-
*
|
|
80
|
-
* export const handler = middy(async (event) => {
|
|
81
|
-
* await event.services.database.users.deletePast();
|
|
82
|
-
* event.services.cache.clear();
|
|
83
|
-
* })
|
|
84
|
-
* .use(requestContext())
|
|
85
|
-
* .use(addServices([databaseService, cacheService], { envParser }));
|
|
86
|
-
* ```
|
|
87
|
-
*/
|
|
88
|
-
function addServices(services, options = {}) {
|
|
89
|
-
const discovery = resolveDiscovery(options);
|
|
90
|
-
return { before: async (request) => {
|
|
91
|
-
const resolved = await discovery.register(services);
|
|
92
|
-
(0, import_lodash.default)(request, "event.services", resolved);
|
|
93
|
-
} };
|
|
94
|
-
}
|
|
95
|
-
/**
|
|
96
|
-
* Batteries-included Middy setup for service-backed handlers: returns a pair of
|
|
97
|
-
* middlewares — {@link requestContext} followed by {@link addServices} — so a
|
|
98
|
-
* single `.use(withServices([...]))` gives the handler both a request context
|
|
99
|
-
* and the resolved services on `event.services`.
|
|
100
|
-
*
|
|
101
|
-
* @example
|
|
102
|
-
* ```ts
|
|
103
|
-
* import middy from '@middy/core';
|
|
104
|
-
* import { withServices } from '@geekmidas/constructs/middy';
|
|
105
|
-
*
|
|
106
|
-
* export const handler = middy(async (event) => {
|
|
107
|
-
* await event.services.database.users.deletePast();
|
|
108
|
-
* event.services.cache.clear();
|
|
109
|
-
* }).use(withServices([databaseService, cacheService], { envParser }));
|
|
110
|
-
* ```
|
|
111
|
-
*/
|
|
112
|
-
function withServices(services, options = {}) {
|
|
113
|
-
return [requestContext(options), addServices(services, options)];
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
//#endregion
|
|
117
|
-
exports.addServices = addServices;
|
|
118
|
-
exports.requestContext = requestContext;
|
|
119
|
-
exports.withServices = withServices;
|
|
120
|
-
//# sourceMappingURL=middy.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"middy.cjs","names":["options: RequestContextOptions","event: unknown","context: Context | undefined","baseLogger: Logger","requestId: string","ConsoleLogger","options: ServiceMiddlewareOptions","EnvironmentParser","services: [...T]"],"sources":["../../src/adaptors/middy.ts"],"sourcesContent":["import { EnvironmentParser } from '@geekmidas/envkit';\nimport type { Logger } from '@geekmidas/logger';\nimport { ConsoleLogger } from '@geekmidas/logger/console';\nimport {\n\tenterRequestContext,\n\texitRequestContext,\n\ttype Service,\n\tServiceDiscovery,\n\ttype ServiceRecord,\n} from '@geekmidas/services';\nimport type { MiddlewareObj } from '@middy/core';\nimport type { Context } from 'aws-lambda';\nimport set from 'lodash.set';\n\n/**\n * Middy middleware helpers that bring `@geekmidas/services` request context and\n * service discovery to **standalone** Middy Lambda handlers — i.e. functions\n * that aren't built with the `@geekmidas/constructs` Function/Cron constructs\n * but still want `serviceContext.getLogger()` and resolved services.\n *\n * Why middleware (and not `runWithRequestContext`)? Middy runs `before → handler\n * → after` as sequential awaits in a single async context, so establishing the\n * context with `AsyncLocalStorage.enterWith` (via `enterRequestContext`) in a\n * `before` hook propagates to the handler. `after`/`onError` reset it.\n *\n * Teardown is best-effort: like `enterRequestContext`, the reset is observable\n * to code the handler reaches but not necessarily to the frame that invoked the\n * Middy handler. This is fine for Lambda, where each invocation runs in its own\n * fresh async context — `requestContext` always establishes a brand-new context\n * per invocation, so requests never inherit a previous invocation's logger.\n *\n * @module\n */\n\n/**\n * Options shared by the request-context-aware middlewares.\n */\nexport interface RequestContextOptions {\n\t/**\n\t * Base logger to derive the per-request child logger from.\n\t * Defaults to a new {@link ConsoleLogger}.\n\t */\n\tlogger?: Logger;\n\t/**\n\t * Derive the request id from the event/context.\n\t * Defaults to `context.awsRequestId`, falling back to `crypto.randomUUID()`.\n\t */\n\tgetRequestId?: (event: unknown, context: Context) => string;\n\t/**\n\t * Extra bindings to attach to the per-request child logger.\n\t */\n\tbindings?: (event: unknown, context: Context) => Record<string, unknown>;\n}\n\n/**\n * Options for the service-resolving middlewares.\n */\nexport interface ServiceMiddlewareOptions extends RequestContextOptions {\n\t/**\n\t * Environment parser used to build the default {@link ServiceDiscovery}.\n\t * Defaults to `new EnvironmentParser({ ...process.env })`.\n\t */\n\tenvParser?: EnvironmentParser<{}>;\n\t/**\n\t * Explicit {@link ServiceDiscovery} to resolve services from. Takes\n\t * precedence over `envParser`.\n\t */\n\tserviceDiscovery?: ServiceDiscovery;\n}\n\nfunction deriveRequestId(\n\toptions: RequestContextOptions,\n\tevent: unknown,\n\tcontext: Context | undefined,\n): string {\n\treturn (\n\t\toptions.getRequestId?.(event, context as Context) ??\n\t\tcontext?.awsRequestId ??\n\t\tcrypto.randomUUID()\n\t);\n}\n\nfunction buildLogger(\n\tbaseLogger: Logger,\n\toptions: RequestContextOptions,\n\trequestId: string,\n\tevent: unknown,\n\tcontext: Context | undefined,\n): Logger {\n\treturn baseLogger.child({\n\t\trequestId,\n\t\t...(options.bindings?.(event, context as Context) ?? {}),\n\t});\n}\n\n/**\n * Middy middleware that establishes a request context for the handler so any\n * code it reaches — including `@geekmidas/services` service methods — can call\n * `serviceContext.getLogger()` / `getRequestId()` / `getRequestStartTime()`.\n *\n * Use this on standalone functions that need request-scoped logging. To also\n * resolve services, pair it with {@link addServices}, or use\n * {@link withServices} which bundles both.\n *\n * @example\n * ```ts\n * import middy from '@middy/core';\n * import { serviceContext } from '@geekmidas/services';\n * import { requestContext } from '@geekmidas/constructs/middy';\n *\n * export const handler = middy(async () => {\n * serviceContext.getLogger().info('tick');\n * }).use(requestContext());\n * ```\n */\nexport function requestContext(\n\toptions: RequestContextOptions = {},\n): MiddlewareObj<unknown, unknown, Error, Context> {\n\tconst baseLogger = options.logger ?? new ConsoleLogger();\n\treturn {\n\t\tbefore: (request) => {\n\t\t\tconst { event, context } = request;\n\t\t\tconst requestId = deriveRequestId(options, event, context);\n\t\t\tconst logger = buildLogger(\n\t\t\t\tbaseLogger,\n\t\t\t\toptions,\n\t\t\t\trequestId,\n\t\t\t\tevent,\n\t\t\t\tcontext,\n\t\t\t);\n\t\t\tenterRequestContext({ logger, requestId, startTime: Date.now() });\n\t\t},\n\t\tafter: () => {\n\t\t\texitRequestContext();\n\t\t},\n\t\tonError: () => {\n\t\t\texitRequestContext();\n\t\t},\n\t};\n}\n\nfunction resolveDiscovery(options: ServiceMiddlewareOptions): ServiceDiscovery {\n\treturn (\n\t\toptions.serviceDiscovery ??\n\t\tServiceDiscovery.getInstance(\n\t\t\toptions.envParser ?? new EnvironmentParser({ ...process.env }),\n\t\t)\n\t);\n}\n\n/**\n * Event augmentation applied by {@link addServices} / {@link withServices}:\n * resolved services keyed by `serviceName`. Intersect it with your own event\n * type to type the handler, e.g. `(event: EventServices<T> & APIGatewayEvent)`.\n */\nexport type EventServices<T extends Service[]> = {\n\tservices: ServiceRecord<T>;\n};\n\n/**\n * Middy middleware that resolves an array of {@link Service}s via\n * {@link ServiceDiscovery} and attaches the resolved record to `event.services`\n * (keyed by each service's `serviceName`), matching how the `Function`/`Cron`\n * constructs expose services on the event.\n *\n * This middleware only resolves services; it does **not** establish a request\n * context. If your services read `serviceContext` (e.g. `getLogger()`), pair it\n * with {@link requestContext}, or use {@link withServices} which bundles both.\n *\n * Chainable — `.use(addServices([a])).use(addServices([b]))` accumulates onto\n * `event.services`.\n *\n * @example\n * ```ts\n * import middy from '@middy/core';\n * import { addServices, requestContext } from '@geekmidas/constructs/middy';\n *\n * export const handler = middy(async (event) => {\n * await event.services.database.users.deletePast();\n * event.services.cache.clear();\n * })\n * .use(requestContext())\n * .use(addServices([databaseService, cacheService], { envParser }));\n * ```\n */\nexport function addServices<const T extends Service[]>(\n\tservices: [...T],\n\toptions: ServiceMiddlewareOptions = {},\n): MiddlewareObj<EventServices<T>, unknown, Error, Context> {\n\tconst discovery = resolveDiscovery(options);\n\n\treturn {\n\t\tbefore: async (request) => {\n\t\t\tconst resolved = await discovery.register(services);\n\t\t\tset(request, 'event.services', resolved);\n\t\t},\n\t};\n}\n\n/**\n * Batteries-included Middy setup for service-backed handlers: returns a pair of\n * middlewares — {@link requestContext} followed by {@link addServices} — so a\n * single `.use(withServices([...]))` gives the handler both a request context\n * and the resolved services on `event.services`.\n *\n * @example\n * ```ts\n * import middy from '@middy/core';\n * import { withServices } from '@geekmidas/constructs/middy';\n *\n * export const handler = middy(async (event) => {\n * await event.services.database.users.deletePast();\n * event.services.cache.clear();\n * }).use(withServices([databaseService, cacheService], { envParser }));\n * ```\n */\nexport function withServices<const T extends Service[]>(\n\tservices: [...T],\n\toptions: ServiceMiddlewareOptions = {},\n): [\n\tMiddlewareObj<unknown, unknown, Error, Context>,\n\tMiddlewareObj<EventServices<T>, unknown, Error, Context>,\n] {\n\treturn [requestContext(options), addServices(services, options)];\n}\n"],"mappings":";;;;;;;;AAsEA,SAAS,gBACRA,SACAC,OACAC,SACS;AACT,QACC,QAAQ,eAAe,OAAO,QAAmB,IACjD,SAAS,gBACT,OAAO,YAAY;AAEpB;AAED,SAAS,YACRC,YACAH,SACAI,WACAH,OACAC,SACS;AACT,QAAO,WAAW,MAAM;EACvB;EACA,GAAI,QAAQ,WAAW,OAAO,QAAmB,IAAI,CAAE;CACvD,EAAC;AACF;;;;;;;;;;;;;;;;;;;;;AAsBD,SAAgB,eACfF,UAAiC,CAAE,GACe;CAClD,MAAM,aAAa,QAAQ,UAAU,IAAIK;AACzC,QAAO;EACN,QAAQ,CAAC,YAAY;GACpB,MAAM,EAAE,OAAO,SAAS,GAAG;GAC3B,MAAM,YAAY,gBAAgB,SAAS,OAAO,QAAQ;GAC1D,MAAM,SAAS,YACd,YACA,SACA,WACA,OACA,QACA;AACD,iDAAoB;IAAE;IAAQ;IAAW,WAAW,KAAK,KAAK;GAAE,EAAC;EACjE;EACD,OAAO,MAAM;AACZ,iDAAoB;EACpB;EACD,SAAS,MAAM;AACd,iDAAoB;EACpB;CACD;AACD;AAED,SAAS,iBAAiBC,SAAqD;AAC9E,QACC,QAAQ,oBACR,sCAAiB,YAChB,QAAQ,aAAa,IAAIC,qCAAkB,EAAE,GAAG,QAAQ,IAAK,GAC7D;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqCD,SAAgB,YACfC,UACAF,UAAoC,CAAE,GACqB;CAC3D,MAAM,YAAY,iBAAiB,QAAQ;AAE3C,QAAO,EACN,QAAQ,OAAO,YAAY;EAC1B,MAAM,WAAW,MAAM,UAAU,SAAS,SAAS;AACnD,6BAAI,SAAS,kBAAkB,SAAS;CACxC,EACD;AACD;;;;;;;;;;;;;;;;;;AAmBD,SAAgB,aACfE,UACAF,UAAoC,CAAE,GAIrC;AACD,QAAO,CAAC,eAAe,QAAQ,EAAE,YAAY,UAAU,QAAQ,AAAC;AAChE"}
|
|
@@ -1,139 +0,0 @@
|
|
|
1
|
-
import { EnvironmentParser } from "@geekmidas/envkit";
|
|
2
|
-
import { Logger } from "@geekmidas/logger";
|
|
3
|
-
import { Service, ServiceDiscovery, ServiceRecord } from "@geekmidas/services";
|
|
4
|
-
import { Context } from "aws-lambda";
|
|
5
|
-
import { MiddlewareObj } from "@middy/core";
|
|
6
|
-
|
|
7
|
-
//#region src/adaptors/middy.d.ts
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* Middy middleware helpers that bring `@geekmidas/services` request context and
|
|
11
|
-
* service discovery to **standalone** Middy Lambda handlers — i.e. functions
|
|
12
|
-
* that aren't built with the `@geekmidas/constructs` Function/Cron constructs
|
|
13
|
-
* but still want `serviceContext.getLogger()` and resolved services.
|
|
14
|
-
*
|
|
15
|
-
* Why middleware (and not `runWithRequestContext`)? Middy runs `before → handler
|
|
16
|
-
* → after` as sequential awaits in a single async context, so establishing the
|
|
17
|
-
* context with `AsyncLocalStorage.enterWith` (via `enterRequestContext`) in a
|
|
18
|
-
* `before` hook propagates to the handler. `after`/`onError` reset it.
|
|
19
|
-
*
|
|
20
|
-
* Teardown is best-effort: like `enterRequestContext`, the reset is observable
|
|
21
|
-
* to code the handler reaches but not necessarily to the frame that invoked the
|
|
22
|
-
* Middy handler. This is fine for Lambda, where each invocation runs in its own
|
|
23
|
-
* fresh async context — `requestContext` always establishes a brand-new context
|
|
24
|
-
* per invocation, so requests never inherit a previous invocation's logger.
|
|
25
|
-
*
|
|
26
|
-
* @module
|
|
27
|
-
*/
|
|
28
|
-
/**
|
|
29
|
-
* Options shared by the request-context-aware middlewares.
|
|
30
|
-
*/
|
|
31
|
-
interface RequestContextOptions {
|
|
32
|
-
/**
|
|
33
|
-
* Base logger to derive the per-request child logger from.
|
|
34
|
-
* Defaults to a new {@link ConsoleLogger}.
|
|
35
|
-
*/
|
|
36
|
-
logger?: Logger;
|
|
37
|
-
/**
|
|
38
|
-
* Derive the request id from the event/context.
|
|
39
|
-
* Defaults to `context.awsRequestId`, falling back to `crypto.randomUUID()`.
|
|
40
|
-
*/
|
|
41
|
-
getRequestId?: (event: unknown, context: Context) => string;
|
|
42
|
-
/**
|
|
43
|
-
* Extra bindings to attach to the per-request child logger.
|
|
44
|
-
*/
|
|
45
|
-
bindings?: (event: unknown, context: Context) => Record<string, unknown>;
|
|
46
|
-
}
|
|
47
|
-
/**
|
|
48
|
-
* Options for the service-resolving middlewares.
|
|
49
|
-
*/
|
|
50
|
-
interface ServiceMiddlewareOptions extends RequestContextOptions {
|
|
51
|
-
/**
|
|
52
|
-
* Environment parser used to build the default {@link ServiceDiscovery}.
|
|
53
|
-
* Defaults to `new EnvironmentParser({ ...process.env })`.
|
|
54
|
-
*/
|
|
55
|
-
envParser?: EnvironmentParser<{}>;
|
|
56
|
-
/**
|
|
57
|
-
* Explicit {@link ServiceDiscovery} to resolve services from. Takes
|
|
58
|
-
* precedence over `envParser`.
|
|
59
|
-
*/
|
|
60
|
-
serviceDiscovery?: ServiceDiscovery;
|
|
61
|
-
}
|
|
62
|
-
/**
|
|
63
|
-
* Middy middleware that establishes a request context for the handler so any
|
|
64
|
-
* code it reaches — including `@geekmidas/services` service methods — can call
|
|
65
|
-
* `serviceContext.getLogger()` / `getRequestId()` / `getRequestStartTime()`.
|
|
66
|
-
*
|
|
67
|
-
* Use this on standalone functions that need request-scoped logging. To also
|
|
68
|
-
* resolve services, pair it with {@link addServices}, or use
|
|
69
|
-
* {@link withServices} which bundles both.
|
|
70
|
-
*
|
|
71
|
-
* @example
|
|
72
|
-
* ```ts
|
|
73
|
-
* import middy from '@middy/core';
|
|
74
|
-
* import { serviceContext } from '@geekmidas/services';
|
|
75
|
-
* import { requestContext } from '@geekmidas/constructs/middy';
|
|
76
|
-
*
|
|
77
|
-
* export const handler = middy(async () => {
|
|
78
|
-
* serviceContext.getLogger().info('tick');
|
|
79
|
-
* }).use(requestContext());
|
|
80
|
-
* ```
|
|
81
|
-
*/
|
|
82
|
-
declare function requestContext(options?: RequestContextOptions): MiddlewareObj<unknown, unknown, Error, Context>;
|
|
83
|
-
/**
|
|
84
|
-
* Event augmentation applied by {@link addServices} / {@link withServices}:
|
|
85
|
-
* resolved services keyed by `serviceName`. Intersect it with your own event
|
|
86
|
-
* type to type the handler, e.g. `(event: EventServices<T> & APIGatewayEvent)`.
|
|
87
|
-
*/
|
|
88
|
-
type EventServices<T extends Service[]> = {
|
|
89
|
-
services: ServiceRecord<T>;
|
|
90
|
-
};
|
|
91
|
-
/**
|
|
92
|
-
* Middy middleware that resolves an array of {@link Service}s via
|
|
93
|
-
* {@link ServiceDiscovery} and attaches the resolved record to `event.services`
|
|
94
|
-
* (keyed by each service's `serviceName`), matching how the `Function`/`Cron`
|
|
95
|
-
* constructs expose services on the event.
|
|
96
|
-
*
|
|
97
|
-
* This middleware only resolves services; it does **not** establish a request
|
|
98
|
-
* context. If your services read `serviceContext` (e.g. `getLogger()`), pair it
|
|
99
|
-
* with {@link requestContext}, or use {@link withServices} which bundles both.
|
|
100
|
-
*
|
|
101
|
-
* Chainable — `.use(addServices([a])).use(addServices([b]))` accumulates onto
|
|
102
|
-
* `event.services`.
|
|
103
|
-
*
|
|
104
|
-
* @example
|
|
105
|
-
* ```ts
|
|
106
|
-
* import middy from '@middy/core';
|
|
107
|
-
* import { addServices, requestContext } from '@geekmidas/constructs/middy';
|
|
108
|
-
*
|
|
109
|
-
* export const handler = middy(async (event) => {
|
|
110
|
-
* await event.services.database.users.deletePast();
|
|
111
|
-
* event.services.cache.clear();
|
|
112
|
-
* })
|
|
113
|
-
* .use(requestContext())
|
|
114
|
-
* .use(addServices([databaseService, cacheService], { envParser }));
|
|
115
|
-
* ```
|
|
116
|
-
*/
|
|
117
|
-
declare function addServices<const T extends Service[]>(services: [...T], options?: ServiceMiddlewareOptions): MiddlewareObj<EventServices<T>, unknown, Error, Context>;
|
|
118
|
-
/**
|
|
119
|
-
* Batteries-included Middy setup for service-backed handlers: returns a pair of
|
|
120
|
-
* middlewares — {@link requestContext} followed by {@link addServices} — so a
|
|
121
|
-
* single `.use(withServices([...]))` gives the handler both a request context
|
|
122
|
-
* and the resolved services on `event.services`.
|
|
123
|
-
*
|
|
124
|
-
* @example
|
|
125
|
-
* ```ts
|
|
126
|
-
* import middy from '@middy/core';
|
|
127
|
-
* import { withServices } from '@geekmidas/constructs/middy';
|
|
128
|
-
*
|
|
129
|
-
* export const handler = middy(async (event) => {
|
|
130
|
-
* await event.services.database.users.deletePast();
|
|
131
|
-
* event.services.cache.clear();
|
|
132
|
-
* }).use(withServices([databaseService, cacheService], { envParser }));
|
|
133
|
-
* ```
|
|
134
|
-
*/
|
|
135
|
-
declare function withServices<const T extends Service[]>(services: [...T], options?: ServiceMiddlewareOptions): [MiddlewareObj<unknown, unknown, Error, Context>, MiddlewareObj<EventServices<T>, unknown, Error, Context>];
|
|
136
|
-
//# sourceMappingURL=middy.d.ts.map
|
|
137
|
-
//#endregion
|
|
138
|
-
export { EventServices, RequestContextOptions, ServiceMiddlewareOptions, addServices, requestContext, withServices };
|
|
139
|
-
//# sourceMappingURL=middy.d.cts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"middy.d.cts","names":[],"sources":["../../src/adaptors/middy.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;AAqCA;;;;;;AAcwD;AAMxD;;;;;AAAuE;AA0DvE;;;;;;AAEgB;AAsCJ,UAtHK,qBAAA,CAsHQ;EAAA;;;;EACD,MAAA,CAAA,EAlHd,MAkHc;EA6BR;;;;EACA,YACN,CAAA,EAAA,CAAA,KAAA,EAAA,OAAA,EAAA,OAAA,EA5IgC,OA4IhC,EAAA,GAAA,MAAA;EAA6B;;;EACU,QAAE,CAAA,EAAA,CAAA,KAAA,EAAA,OAAA,EAAA,OAAA,EAzIb,OAyIa,EAAA,GAzID,MAyIC,CAAA,MAAA,EAAA,OAAA,CAAA;;AAAnC;AA4BhB;;AAA6C,UA/J5B,wBAAA,SAAiC,qBA+JL,CAAA;EAAO;;;;EAIL,SAA9C,CAAA,EA9JY,iBA8JZ,CAAA,CAAA,CAAA,CAAA;EAAa;;;;EAC0C,gBAAvD,CAAA,EA1JmB,gBA0JnB;AAAa;;;;;;;;;;;;;;;;;;;;;iBA1GE,cAAA,WACN,wBACP,gCAAgC,OAAO;;;;;;KAsC9B,wBAAwB;YACzB,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA6BT,4BAA4B,yBAC7B,cACL,2BACP,cAAc,cAAc,aAAa,OAAO;;;;;;;;;;;;;;;;;;iBA4BnC,6BAA6B,yBAC9B,cACL,4BAET,gCAAgC,OAAO,UACvC,cAAc,cAAc,aAAa,OAAO"}
|
|
@@ -1,139 +0,0 @@
|
|
|
1
|
-
import { Service, ServiceDiscovery, ServiceRecord } from "@geekmidas/services";
|
|
2
|
-
import { MiddlewareObj } from "@middy/core";
|
|
3
|
-
import { EnvironmentParser } from "@geekmidas/envkit";
|
|
4
|
-
import { Logger } from "@geekmidas/logger";
|
|
5
|
-
import { Context } from "aws-lambda";
|
|
6
|
-
|
|
7
|
-
//#region src/adaptors/middy.d.ts
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* Middy middleware helpers that bring `@geekmidas/services` request context and
|
|
11
|
-
* service discovery to **standalone** Middy Lambda handlers — i.e. functions
|
|
12
|
-
* that aren't built with the `@geekmidas/constructs` Function/Cron constructs
|
|
13
|
-
* but still want `serviceContext.getLogger()` and resolved services.
|
|
14
|
-
*
|
|
15
|
-
* Why middleware (and not `runWithRequestContext`)? Middy runs `before → handler
|
|
16
|
-
* → after` as sequential awaits in a single async context, so establishing the
|
|
17
|
-
* context with `AsyncLocalStorage.enterWith` (via `enterRequestContext`) in a
|
|
18
|
-
* `before` hook propagates to the handler. `after`/`onError` reset it.
|
|
19
|
-
*
|
|
20
|
-
* Teardown is best-effort: like `enterRequestContext`, the reset is observable
|
|
21
|
-
* to code the handler reaches but not necessarily to the frame that invoked the
|
|
22
|
-
* Middy handler. This is fine for Lambda, where each invocation runs in its own
|
|
23
|
-
* fresh async context — `requestContext` always establishes a brand-new context
|
|
24
|
-
* per invocation, so requests never inherit a previous invocation's logger.
|
|
25
|
-
*
|
|
26
|
-
* @module
|
|
27
|
-
*/
|
|
28
|
-
/**
|
|
29
|
-
* Options shared by the request-context-aware middlewares.
|
|
30
|
-
*/
|
|
31
|
-
interface RequestContextOptions {
|
|
32
|
-
/**
|
|
33
|
-
* Base logger to derive the per-request child logger from.
|
|
34
|
-
* Defaults to a new {@link ConsoleLogger}.
|
|
35
|
-
*/
|
|
36
|
-
logger?: Logger;
|
|
37
|
-
/**
|
|
38
|
-
* Derive the request id from the event/context.
|
|
39
|
-
* Defaults to `context.awsRequestId`, falling back to `crypto.randomUUID()`.
|
|
40
|
-
*/
|
|
41
|
-
getRequestId?: (event: unknown, context: Context) => string;
|
|
42
|
-
/**
|
|
43
|
-
* Extra bindings to attach to the per-request child logger.
|
|
44
|
-
*/
|
|
45
|
-
bindings?: (event: unknown, context: Context) => Record<string, unknown>;
|
|
46
|
-
}
|
|
47
|
-
/**
|
|
48
|
-
* Options for the service-resolving middlewares.
|
|
49
|
-
*/
|
|
50
|
-
interface ServiceMiddlewareOptions extends RequestContextOptions {
|
|
51
|
-
/**
|
|
52
|
-
* Environment parser used to build the default {@link ServiceDiscovery}.
|
|
53
|
-
* Defaults to `new EnvironmentParser({ ...process.env })`.
|
|
54
|
-
*/
|
|
55
|
-
envParser?: EnvironmentParser<{}>;
|
|
56
|
-
/**
|
|
57
|
-
* Explicit {@link ServiceDiscovery} to resolve services from. Takes
|
|
58
|
-
* precedence over `envParser`.
|
|
59
|
-
*/
|
|
60
|
-
serviceDiscovery?: ServiceDiscovery;
|
|
61
|
-
}
|
|
62
|
-
/**
|
|
63
|
-
* Middy middleware that establishes a request context for the handler so any
|
|
64
|
-
* code it reaches — including `@geekmidas/services` service methods — can call
|
|
65
|
-
* `serviceContext.getLogger()` / `getRequestId()` / `getRequestStartTime()`.
|
|
66
|
-
*
|
|
67
|
-
* Use this on standalone functions that need request-scoped logging. To also
|
|
68
|
-
* resolve services, pair it with {@link addServices}, or use
|
|
69
|
-
* {@link withServices} which bundles both.
|
|
70
|
-
*
|
|
71
|
-
* @example
|
|
72
|
-
* ```ts
|
|
73
|
-
* import middy from '@middy/core';
|
|
74
|
-
* import { serviceContext } from '@geekmidas/services';
|
|
75
|
-
* import { requestContext } from '@geekmidas/constructs/middy';
|
|
76
|
-
*
|
|
77
|
-
* export const handler = middy(async () => {
|
|
78
|
-
* serviceContext.getLogger().info('tick');
|
|
79
|
-
* }).use(requestContext());
|
|
80
|
-
* ```
|
|
81
|
-
*/
|
|
82
|
-
declare function requestContext(options?: RequestContextOptions): MiddlewareObj<unknown, unknown, Error, Context>;
|
|
83
|
-
/**
|
|
84
|
-
* Event augmentation applied by {@link addServices} / {@link withServices}:
|
|
85
|
-
* resolved services keyed by `serviceName`. Intersect it with your own event
|
|
86
|
-
* type to type the handler, e.g. `(event: EventServices<T> & APIGatewayEvent)`.
|
|
87
|
-
*/
|
|
88
|
-
type EventServices<T extends Service[]> = {
|
|
89
|
-
services: ServiceRecord<T>;
|
|
90
|
-
};
|
|
91
|
-
/**
|
|
92
|
-
* Middy middleware that resolves an array of {@link Service}s via
|
|
93
|
-
* {@link ServiceDiscovery} and attaches the resolved record to `event.services`
|
|
94
|
-
* (keyed by each service's `serviceName`), matching how the `Function`/`Cron`
|
|
95
|
-
* constructs expose services on the event.
|
|
96
|
-
*
|
|
97
|
-
* This middleware only resolves services; it does **not** establish a request
|
|
98
|
-
* context. If your services read `serviceContext` (e.g. `getLogger()`), pair it
|
|
99
|
-
* with {@link requestContext}, or use {@link withServices} which bundles both.
|
|
100
|
-
*
|
|
101
|
-
* Chainable — `.use(addServices([a])).use(addServices([b]))` accumulates onto
|
|
102
|
-
* `event.services`.
|
|
103
|
-
*
|
|
104
|
-
* @example
|
|
105
|
-
* ```ts
|
|
106
|
-
* import middy from '@middy/core';
|
|
107
|
-
* import { addServices, requestContext } from '@geekmidas/constructs/middy';
|
|
108
|
-
*
|
|
109
|
-
* export const handler = middy(async (event) => {
|
|
110
|
-
* await event.services.database.users.deletePast();
|
|
111
|
-
* event.services.cache.clear();
|
|
112
|
-
* })
|
|
113
|
-
* .use(requestContext())
|
|
114
|
-
* .use(addServices([databaseService, cacheService], { envParser }));
|
|
115
|
-
* ```
|
|
116
|
-
*/
|
|
117
|
-
declare function addServices<const T extends Service[]>(services: [...T], options?: ServiceMiddlewareOptions): MiddlewareObj<EventServices<T>, unknown, Error, Context>;
|
|
118
|
-
/**
|
|
119
|
-
* Batteries-included Middy setup for service-backed handlers: returns a pair of
|
|
120
|
-
* middlewares — {@link requestContext} followed by {@link addServices} — so a
|
|
121
|
-
* single `.use(withServices([...]))` gives the handler both a request context
|
|
122
|
-
* and the resolved services on `event.services`.
|
|
123
|
-
*
|
|
124
|
-
* @example
|
|
125
|
-
* ```ts
|
|
126
|
-
* import middy from '@middy/core';
|
|
127
|
-
* import { withServices } from '@geekmidas/constructs/middy';
|
|
128
|
-
*
|
|
129
|
-
* export const handler = middy(async (event) => {
|
|
130
|
-
* await event.services.database.users.deletePast();
|
|
131
|
-
* event.services.cache.clear();
|
|
132
|
-
* }).use(withServices([databaseService, cacheService], { envParser }));
|
|
133
|
-
* ```
|
|
134
|
-
*/
|
|
135
|
-
declare function withServices<const T extends Service[]>(services: [...T], options?: ServiceMiddlewareOptions): [MiddlewareObj<unknown, unknown, Error, Context>, MiddlewareObj<EventServices<T>, unknown, Error, Context>];
|
|
136
|
-
//# sourceMappingURL=middy.d.ts.map
|
|
137
|
-
//#endregion
|
|
138
|
-
export { EventServices, RequestContextOptions, ServiceMiddlewareOptions, addServices, requestContext, withServices };
|
|
139
|
-
//# sourceMappingURL=middy.d.mts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"middy.d.mts","names":[],"sources":["../../src/adaptors/middy.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;AAqCA;;;;;;AAcwD;AAMxD;;;;;AAAuE;AA0DvE;;;;;;AAEgB;AAsCJ,UAtHK,qBAAA,CAsHQ;EAAA;;;;EACD,MAAA,CAAA,EAlHd,MAkHc;EA6BR;;;;EACA,YACN,CAAA,EAAA,CAAA,KAAA,EAAA,OAAA,EAAA,OAAA,EA5IgC,OA4IhC,EAAA,GAAA,MAAA;EAA6B;;;EACU,QAAE,CAAA,EAAA,CAAA,KAAA,EAAA,OAAA,EAAA,OAAA,EAzIb,OAyIa,EAAA,GAzID,MAyIC,CAAA,MAAA,EAAA,OAAA,CAAA;;AAAnC;AA4BhB;;AAA6C,UA/J5B,wBAAA,SAAiC,qBA+JL,CAAA;EAAO;;;;EAIL,SAA9C,CAAA,EA9JY,iBA8JZ,CAAA,CAAA,CAAA,CAAA;EAAa;;;;EAC0C,gBAAvD,CAAA,EA1JmB,gBA0JnB;AAAa;;;;;;;;;;;;;;;;;;;;;iBA1GE,cAAA,WACN,wBACP,gCAAgC,OAAO;;;;;;KAsC9B,wBAAwB;YACzB,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA6BT,4BAA4B,yBAC7B,cACL,2BACP,cAAc,cAAc,aAAa,OAAO;;;;;;;;;;;;;;;;;;iBA4BnC,6BAA6B,yBAC9B,cACL,4BAET,gCAAgC,OAAO,UACvC,cAAc,cAAc,aAAa,OAAO"}
|