@geekmidas/constructs 3.0.13 → 3.1.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.
Files changed (127) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/dist/AWSScheduledFunction-B3cHQSdp.cjs +255 -0
  3. package/dist/AWSScheduledFunction-B3cHQSdp.cjs.map +1 -0
  4. package/dist/AWSScheduledFunction-BRGjgD-i.mjs +243 -0
  5. package/dist/AWSScheduledFunction-BRGjgD-i.mjs.map +1 -0
  6. package/dist/AWSScheduledFunction-BnYDnzsF.d.mts +117 -0
  7. package/dist/AWSScheduledFunction-BnYDnzsF.d.mts.map +1 -0
  8. package/dist/AWSScheduledFunction-vjanLO3-.d.cts +117 -0
  9. package/dist/AWSScheduledFunction-vjanLO3-.d.cts.map +1 -0
  10. package/dist/{Construct-D0n7QTaI.d.mts → Construct-BY0NBQLj.d.mts} +1 -1
  11. package/dist/{Construct-D0n7QTaI.d.mts.map → Construct-BY0NBQLj.d.mts.map} +1 -1
  12. package/dist/{Construct-CdJY2DJS.mjs → Construct-CLIPPqUP.mjs} +3 -28
  13. package/dist/{Construct-CdJY2DJS.mjs.map → Construct-CLIPPqUP.mjs.map} +1 -1
  14. package/dist/{Construct-CXqvzglu.d.cts → Construct-cjIs74Gb.d.cts} +1 -1
  15. package/dist/{Construct-CXqvzglu.d.cts.map → Construct-cjIs74Gb.d.cts.map} +1 -1
  16. package/dist/{Endpoint-NvjIednd.d.mts → Endpoint-4gVYt12g.d.mts} +5 -5
  17. package/dist/{Endpoint-NvjIednd.d.mts.map → Endpoint-4gVYt12g.d.mts.map} +1 -1
  18. package/dist/{Endpoint-CE7qHX5S.d.cts → Endpoint-BlMZIwBY.d.cts} +4 -4
  19. package/dist/{Endpoint-CE7qHX5S.d.cts.map → Endpoint-BlMZIwBY.d.cts.map} +1 -1
  20. package/dist/{HonoEndpointAdaptor-DyYv0IoU.mjs → HonoEndpointAdaptor-6k-rI44C.mjs} +5 -4
  21. package/dist/{HonoEndpointAdaptor-DyYv0IoU.mjs.map → HonoEndpointAdaptor-6k-rI44C.mjs.map} +1 -1
  22. package/dist/{HonoEndpointAdaptor-DFdgCwYU.cjs → HonoEndpointAdaptor-CNIsjEw-.cjs} +6 -5
  23. package/dist/{HonoEndpointAdaptor-DFdgCwYU.cjs.map → HonoEndpointAdaptor-CNIsjEw-.cjs.map} +1 -1
  24. package/dist/{Subscriber-D8WkA8np.d.cts → Subscriber-C6YXAmTp.d.cts} +3 -3
  25. package/dist/{Subscriber-D8WkA8np.d.cts.map → Subscriber-C6YXAmTp.d.cts.map} +1 -1
  26. package/dist/{Subscriber-Tft61-YG.d.mts → Subscriber-CjOHxO0l.d.mts} +3 -3
  27. package/dist/{Subscriber-Tft61-YG.d.mts.map → Subscriber-CjOHxO0l.d.mts.map} +1 -1
  28. package/dist/adaptors/aws.cjs +12 -209
  29. package/dist/adaptors/aws.cjs.map +1 -1
  30. package/dist/adaptors/aws.d.cts +11 -66
  31. package/dist/adaptors/aws.d.cts.map +1 -1
  32. package/dist/adaptors/aws.d.mts +11 -66
  33. package/dist/adaptors/aws.d.mts.map +1 -1
  34. package/dist/adaptors/aws.mjs +11 -208
  35. package/dist/adaptors/aws.mjs.map +1 -1
  36. package/dist/adaptors/hono.cjs +6 -4
  37. package/dist/adaptors/hono.d.cts +4 -4
  38. package/dist/adaptors/hono.d.mts +4 -4
  39. package/dist/adaptors/hono.mjs +7 -5
  40. package/dist/adaptors/middy.cjs +120 -0
  41. package/dist/adaptors/middy.cjs.map +1 -0
  42. package/dist/adaptors/middy.d.cts +139 -0
  43. package/dist/adaptors/middy.d.cts.map +1 -0
  44. package/dist/adaptors/middy.d.mts +139 -0
  45. package/dist/adaptors/middy.d.mts.map +1 -0
  46. package/dist/adaptors/middy.mjs +118 -0
  47. package/dist/adaptors/middy.mjs.map +1 -0
  48. package/dist/adaptors/testing.cjs +9 -7
  49. package/dist/adaptors/testing.cjs.map +1 -1
  50. package/dist/adaptors/testing.d.cts +6 -6
  51. package/dist/adaptors/testing.d.mts +6 -6
  52. package/dist/adaptors/testing.mjs +7 -5
  53. package/dist/adaptors/testing.mjs.map +1 -1
  54. package/dist/chunk-B4qE4VCv.mjs +27 -0
  55. package/dist/crons/index.cjs +4 -1
  56. package/dist/crons/index.cjs.map +1 -1
  57. package/dist/crons/index.d.cts +6 -22
  58. package/dist/crons/index.d.cts.map +1 -1
  59. package/dist/crons/index.d.mts +5 -21
  60. package/dist/crons/index.d.mts.map +1 -1
  61. package/dist/crons/index.mjs +6 -3
  62. package/dist/crons/index.mjs.map +1 -1
  63. package/dist/endpoints/index.cjs +5 -3
  64. package/dist/endpoints/index.cjs.map +1 -1
  65. package/dist/endpoints/index.d.cts +7 -7
  66. package/dist/endpoints/index.d.mts +5 -5
  67. package/dist/endpoints/index.mjs +6 -3
  68. package/dist/endpoints/index.mjs.map +1 -1
  69. package/dist/functions/index.cjs +1 -1
  70. package/dist/functions/index.d.cts +2 -2
  71. package/dist/functions/index.d.mts +2 -2
  72. package/dist/functions/index.mjs +2 -2
  73. package/dist/{functions-GmSHFbpr.mjs → functions-BMR-1CIQ.mjs} +1639 -1638
  74. package/dist/functions-BMR-1CIQ.mjs.map +1 -0
  75. package/dist/{functions-CX21wstW.cjs → functions-_OAiwGYh.cjs} +1637 -1637
  76. package/dist/functions-_OAiwGYh.cjs.map +1 -0
  77. package/dist/{index-CzIMpK-e.d.cts → index-Dj3uvqCO.d.cts} +39 -38
  78. package/dist/index-Dj3uvqCO.d.cts.map +1 -0
  79. package/dist/{index-Cq4fz8uM.d.mts → index-DoiHTgUQ.d.mts} +35 -34
  80. package/dist/index-DoiHTgUQ.d.mts.map +1 -0
  81. package/dist/index.d.cts +3 -3
  82. package/dist/index.d.mts +3 -3
  83. package/dist/index.mjs +1 -1
  84. package/dist/{lazyAccessors-zNy6P6Cg.cjs → lazyAccessors-B4rtX68K.cjs} +6 -889
  85. package/dist/lazyAccessors-B4rtX68K.cjs.map +1 -0
  86. package/dist/{lazyAccessors-5h-aWohM.mjs → lazyAccessors-D-UHg0YJ.mjs} +9 -873
  87. package/dist/lazyAccessors-D-UHg0YJ.mjs.map +1 -0
  88. package/dist/lodash-CM4k4sZD.cjs +836 -0
  89. package/dist/lodash-CM4k4sZD.cjs.map +1 -0
  90. package/dist/lodash-DiUeLbQy.mjs +831 -0
  91. package/dist/lodash-DiUeLbQy.mjs.map +1 -0
  92. package/dist/{processAudits-B0PbJf1Z.mjs → processAudits-BEiSkgH3.mjs} +1 -1
  93. package/dist/{processAudits-B0PbJf1Z.mjs.map → processAudits-BEiSkgH3.mjs.map} +1 -1
  94. package/dist/{processAudits-B_a9bDPs.cjs → processAudits-CPcACKCA.cjs} +1 -1
  95. package/dist/{processAudits-B_a9bDPs.cjs.map → processAudits-CPcACKCA.cjs.map} +1 -1
  96. package/dist/publisher-BZgcrVPy.cjs +53 -0
  97. package/dist/publisher-BZgcrVPy.cjs.map +1 -0
  98. package/dist/publisher-CnpeMv-r.mjs +41 -0
  99. package/dist/publisher-CnpeMv-r.mjs.map +1 -0
  100. package/dist/subscribers/index.d.cts +2 -2
  101. package/dist/subscribers/index.d.mts +2 -2
  102. package/dist/subscribers/index.mjs +1 -1
  103. package/dist/{telemetry-COvVBKBM.d.mts → telemetry-Bp4DLvdQ.d.mts} +1 -1
  104. package/dist/{telemetry-Bt0vK4ma.d.cts.map → telemetry-Bp4DLvdQ.d.mts.map} +1 -1
  105. package/dist/{telemetry-Bt0vK4ma.d.cts → telemetry-Dqx-D3F7.d.cts} +1 -1
  106. package/dist/{telemetry-COvVBKBM.d.mts.map → telemetry-Dqx-D3F7.d.cts.map} +1 -1
  107. package/dist/{types-B8YlI4cx.d.cts → types-BdAaYDvd.d.cts} +1 -1
  108. package/dist/{types-B8YlI4cx.d.cts.map → types-BdAaYDvd.d.cts.map} +1 -1
  109. package/dist/{types-BA3eK4xj.d.mts → types-j0ti0JTY.d.mts} +1 -1
  110. package/dist/{types-BA3eK4xj.d.mts.map → types-j0ti0JTY.d.mts.map} +1 -1
  111. package/dist/types.d.cts +1 -1
  112. package/dist/types.d.mts +1 -1
  113. package/package.json +24 -14
  114. package/src/adaptors/__tests__/middy.spec.ts +212 -0
  115. package/src/adaptors/__tests__/trpc.spec.ts +9 -2
  116. package/src/adaptors/aws.ts +1 -0
  117. package/src/adaptors/middy.ts +225 -0
  118. package/src/crons/AWSScheduledFunction.ts +72 -0
  119. package/src/crons/__tests__/AWSScheduledFunction.spec.ts +152 -0
  120. package/src/crons/index.ts +1 -0
  121. package/tsdown.config.ts +1 -0
  122. package/dist/functions-CX21wstW.cjs.map +0 -1
  123. package/dist/functions-GmSHFbpr.mjs.map +0 -1
  124. package/dist/index-Cq4fz8uM.d.mts.map +0 -1
  125. package/dist/index-CzIMpK-e.d.cts.map +0 -1
  126. package/dist/lazyAccessors-5h-aWohM.mjs.map +0 -1
  127. package/dist/lazyAccessors-zNy6P6Cg.cjs.map +0 -1
@@ -0,0 +1,139 @@
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
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,139 @@
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
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,118 @@
1
+ import { __toESM } from "../chunk-B4qE4VCv.mjs";
2
+ import { require_lodash } from "../lodash-DiUeLbQy.mjs";
3
+ import { ServiceDiscovery, enterRequestContext, exitRequestContext } from "@geekmidas/services";
4
+ import { ConsoleLogger } from "@geekmidas/logger/console";
5
+ import { EnvironmentParser } from "@geekmidas/envkit";
6
+
7
+ //#region src/adaptors/middy.ts
8
+ var import_lodash = __toESM(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 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
+ enterRequestContext({
46
+ logger,
47
+ requestId,
48
+ startTime: Date.now()
49
+ });
50
+ },
51
+ after: () => {
52
+ exitRequestContext();
53
+ },
54
+ onError: () => {
55
+ exitRequestContext();
56
+ }
57
+ };
58
+ }
59
+ function resolveDiscovery(options) {
60
+ return options.serviceDiscovery ?? ServiceDiscovery.getInstance(options.envParser ?? new 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
+ export { addServices, requestContext, withServices };
118
+ //# sourceMappingURL=middy.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middy.mjs","names":["options: RequestContextOptions","event: unknown","context: Context | undefined","baseLogger: Logger","requestId: string","options: ServiceMiddlewareOptions","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,IAAI;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,uBAAoB;IAAE;IAAQ;IAAW,WAAW,KAAK,KAAK;GAAE,EAAC;EACjE;EACD,OAAO,MAAM;AACZ,uBAAoB;EACpB;EACD,SAAS,MAAM;AACd,uBAAoB;EACpB;CACD;AACD;AAED,SAAS,iBAAiBK,SAAqD;AAC9E,QACC,QAAQ,oBACR,iBAAiB,YAChB,QAAQ,aAAa,IAAI,kBAAkB,EAAE,GAAG,QAAQ,IAAK,GAC7D;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqCD,SAAgB,YACfC,UACAD,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,aACfC,UACAD,UAAoC,CAAE,GAIrC;AACD,QAAO,CAAC,eAAe,QAAQ,EAAE,YAAY,UAAU,QAAQ,AAAC;AAChE"}
@@ -1,9 +1,11 @@
1
1
  const require_chunk = require('../chunk-DWy1uDak.cjs');
2
2
  require('../Construct-DXfLPGwg.cjs');
3
- const require_lazyAccessors = require('../lazyAccessors-zNy6P6Cg.cjs');
4
- const require_functions = require('../functions-CX21wstW.cjs');
5
- const require_processAudits = require('../processAudits-B_a9bDPs.cjs');
6
- const require_HonoEndpointAdaptor = require('../HonoEndpointAdaptor-DFdgCwYU.cjs');
3
+ const require_functions = require('../functions-_OAiwGYh.cjs');
4
+ const require_publisher = require('../publisher-BZgcrVPy.cjs');
5
+ require('../lodash-CM4k4sZD.cjs');
6
+ const require_lazyAccessors = require('../lazyAccessors-B4rtX68K.cjs');
7
+ const require_processAudits = require('../processAudits-CPcACKCA.cjs');
8
+ const require_HonoEndpointAdaptor = require('../HonoEndpointAdaptor-CNIsjEw-.cjs');
7
9
  const __geekmidas_errors = require_chunk.__toESM(require("@geekmidas/errors"));
8
10
  const __geekmidas_services = require_chunk.__toESM(require("@geekmidas/services"));
9
11
  const __geekmidas_audit = require_chunk.__toESM(require("@geekmidas/audit"));
@@ -253,7 +255,7 @@ var TestEndpointAdaptor = class TestEndpointAdaptor {
253
255
  }, { db: rawDb });
254
256
  const { output, metadata } = result;
255
257
  ctx.publisher && await this.serviceDiscovery.register([ctx.publisher]);
256
- await require_lazyAccessors.publishConstructEvents(this.endpoint, output, this.serviceDiscovery);
258
+ await require_publisher.publishConstructEvents(this.endpoint, output, this.serviceDiscovery);
257
259
  const headers = { ...metadata.headers || {} };
258
260
  if (metadata.cookies && metadata.cookies.size > 0) {
259
261
  const setCookieValues = [];
@@ -334,7 +336,7 @@ var TestFunctionAdaptor = class TestFunctionAdaptor {
334
336
  await auditor.flush();
335
337
  }
336
338
  }
337
- await require_lazyAccessors.publishEvents(logger, this.serviceDiscovery, this.fn.events, output, this.fn.publisherService);
339
+ await require_publisher.publishEvents(logger, this.serviceDiscovery, this.fn.events, output, this.fn.publisherService);
338
340
  return output;
339
341
  });
340
342
  }
@@ -375,7 +377,7 @@ var TestSubscriberAdaptor = class TestSubscriberAdaptor {
375
377
  if (validationResult.issues) throw new Error("Subscriber output validation failed");
376
378
  output = validationResult.value;
377
379
  }
378
- await require_lazyAccessors.publishEvents(logger, this.serviceDiscovery, this.subscriber.events, output, this.subscriber.publisherService);
380
+ await require_publisher.publishEvents(logger, this.serviceDiscovery, this.subscriber.events, output, this.subscriber.publisherService);
379
381
  return output;
380
382
  });
381
383
  }