@geekmidas/constructs 3.0.14 → 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 +34 -0
- package/dist/AWSScheduledFunction-COv8bB1v.d.mts +117 -0
- package/dist/AWSScheduledFunction-COv8bB1v.d.mts.map +1 -0
- package/dist/AWSScheduledFunction-D-55GfwL.mjs +243 -0
- package/dist/AWSScheduledFunction-D-55GfwL.mjs.map +1 -0
- package/dist/AWSScheduledFunction-D9uCAd76.d.cts +117 -0
- package/dist/AWSScheduledFunction-D9uCAd76.d.cts.map +1 -0
- package/dist/AWSScheduledFunction-sWwZC9hg.cjs +255 -0
- package/dist/AWSScheduledFunction-sWwZC9hg.cjs.map +1 -0
- 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-CXqvzglu.d.cts → Construct-cjIs74Gb.d.cts} +1 -1
- package/dist/{Construct-CXqvzglu.d.cts.map → Construct-cjIs74Gb.d.cts.map} +1 -1
- package/dist/{Endpoint-NvjIednd.d.mts → Endpoint-C_qxza6z.d.mts} +5 -5
- package/dist/{Endpoint-NvjIednd.d.mts.map → Endpoint-C_qxza6z.d.mts.map} +1 -1
- package/dist/{Endpoint-CE7qHX5S.d.cts → Endpoint-D5SChIsU.d.cts} +4 -4
- package/dist/{Endpoint-CE7qHX5S.d.cts.map → Endpoint-D5SChIsU.d.cts.map} +1 -1
- package/dist/{HonoEndpointAdaptor-DyYv0IoU.mjs → HonoEndpointAdaptor-CWYBGVFQ.mjs} +5 -4
- package/dist/{HonoEndpointAdaptor-DyYv0IoU.mjs.map → HonoEndpointAdaptor-CWYBGVFQ.mjs.map} +1 -1
- package/dist/{HonoEndpointAdaptor-DFdgCwYU.cjs → HonoEndpointAdaptor-C_2jaZ4k.cjs} +18 -17
- package/dist/{HonoEndpointAdaptor-DFdgCwYU.cjs.map → HonoEndpointAdaptor-C_2jaZ4k.cjs.map} +1 -1
- package/dist/{Subscriber-Tft61-YG.d.mts → Subscriber-C0v9iOrI.d.mts} +2 -2
- package/dist/{Subscriber-Tft61-YG.d.mts.map → Subscriber-C0v9iOrI.d.mts.map} +1 -1
- package/dist/{Subscriber-D8WkA8np.d.cts → Subscriber-C6YXAmTp.d.cts} +3 -3
- package/dist/{Subscriber-D8WkA8np.d.cts.map → Subscriber-C6YXAmTp.d.cts.map} +1 -1
- package/dist/adaptors/aws.cjs +15 -214
- package/dist/adaptors/aws.cjs.map +1 -1
- package/dist/adaptors/aws.d.cts +11 -66
- package/dist/adaptors/aws.d.cts.map +1 -1
- package/dist/adaptors/aws.d.mts +10 -65
- package/dist/adaptors/aws.d.mts.map +1 -1
- package/dist/adaptors/aws.mjs +8 -207
- package/dist/adaptors/aws.mjs.map +1 -1
- package/dist/adaptors/hono.cjs +6 -5
- package/dist/adaptors/hono.d.cts +4 -4
- package/dist/adaptors/hono.d.cts.map +1 -1
- package/dist/adaptors/hono.d.mts +3 -3
- package/dist/adaptors/hono.d.mts.map +1 -1
- package/dist/adaptors/hono.mjs +5 -4
- package/dist/adaptors/testing.cjs +15 -15
- package/dist/adaptors/testing.cjs.map +1 -1
- package/dist/adaptors/testing.d.cts +6 -6
- package/dist/adaptors/testing.d.mts +5 -5
- package/dist/adaptors/testing.mjs +5 -4
- package/dist/adaptors/testing.mjs.map +1 -1
- package/dist/crons/index.cjs +7 -5
- package/dist/crons/index.cjs.map +1 -1
- package/dist/crons/index.d.cts +6 -22
- package/dist/crons/index.d.cts.map +1 -1
- package/dist/crons/index.d.mts +4 -20
- package/dist/crons/index.d.mts.map +1 -1
- package/dist/crons/index.mjs +4 -2
- package/dist/crons/index.mjs.map +1 -1
- package/dist/endpoints/index.cjs +8 -8
- package/dist/endpoints/index.d.cts +5 -5
- package/dist/endpoints/index.d.mts +4 -4
- package/dist/endpoints/index.mjs +3 -2
- package/dist/endpoints/index.mjs.map +1 -1
- package/dist/functions/index.cjs +2 -2
- package/dist/functions/index.d.cts +2 -2
- package/dist/functions/index.d.mts +1 -1
- package/dist/functions/index.mjs +1 -1
- package/dist/{functions-GmSHFbpr.mjs → functions-C9QhxXoP.mjs} +1637 -1637
- package/dist/functions-C9QhxXoP.mjs.map +1 -0
- package/dist/{functions-CX21wstW.cjs → functions-cL1XwEHW.cjs} +1641 -1642
- package/dist/functions-cL1XwEHW.cjs.map +1 -0
- package/dist/{index-Cq4fz8uM.d.mts → index-C0XoazSK.d.mts} +34 -33
- package/dist/index-C0XoazSK.d.mts.map +1 -0
- package/dist/{index-CzIMpK-e.d.cts → index-Cg0m0uBN.d.cts} +36 -35
- package/dist/index-Cg0m0uBN.d.cts.map +1 -0
- package/dist/index.cjs +1 -1
- package/dist/index.d.cts +3 -3
- package/dist/index.d.mts +2 -2
- package/dist/{lazyAccessors-5h-aWohM.mjs → lazyAccessors-Bnq67EHR.mjs} +3 -42
- package/dist/lazyAccessors-Bnq67EHR.mjs.map +1 -0
- package/dist/{lazyAccessors-zNy6P6Cg.cjs → lazyAccessors-DGqzwC-j.cjs} +10 -62
- package/dist/lazyAccessors-DGqzwC-j.cjs.map +1 -0
- package/dist/{processAudits-B_a9bDPs.cjs → processAudits-BmjKsnF7.cjs} +3 -3
- package/dist/{processAudits-B_a9bDPs.cjs.map → processAudits-BmjKsnF7.cjs.map} +1 -1
- package/dist/{processAudits-B0PbJf1Z.mjs → processAudits-ySnizdMG.mjs} +1 -1
- package/dist/{processAudits-B0PbJf1Z.mjs.map → processAudits-ySnizdMG.mjs.map} +1 -1
- package/dist/publisher-BrFOF847.mjs +41 -0
- package/dist/publisher-BrFOF847.mjs.map +1 -0
- package/dist/publisher-lFQleddL.cjs +53 -0
- package/dist/publisher-lFQleddL.cjs.map +1 -0
- package/dist/subscribers/index.cjs +2 -3
- package/dist/subscribers/index.cjs.map +1 -1
- package/dist/subscribers/index.d.cts +2 -2
- package/dist/subscribers/index.d.mts +1 -1
- package/dist/{telemetry-COvVBKBM.d.mts → telemetry-3vdxGn4q.d.mts} +1 -1
- package/dist/{telemetry-Bt0vK4ma.d.cts.map → telemetry-3vdxGn4q.d.mts.map} +1 -1
- package/dist/{telemetry-Bt0vK4ma.d.cts → telemetry-Dqx-D3F7.d.cts} +1 -1
- package/dist/{telemetry-COvVBKBM.d.mts.map → telemetry-Dqx-D3F7.d.cts.map} +1 -1
- package/dist/{types-B8YlI4cx.d.cts → types-BDNGr7pv.d.mts} +1 -1
- package/dist/{types-B8YlI4cx.d.cts.map → types-BDNGr7pv.d.mts.map} +1 -1
- package/dist/{types-BA3eK4xj.d.mts → types-BdAaYDvd.d.cts} +1 -1
- package/dist/{types-BA3eK4xj.d.mts.map → types-BdAaYDvd.d.cts.map} +1 -1
- package/dist/types.d.cts +1 -1
- package/dist/types.d.mts +1 -1
- package/package.json +9 -24
- package/src/adaptors/aws.ts +1 -0
- package/src/crons/AWSScheduledFunction.ts +73 -0
- package/src/crons/__tests__/AWSScheduledFunction.spec.ts +152 -0
- package/src/crons/index.ts +1 -0
- package/src/endpoints/HonoEndpointAdaptor.ts +0 -1
- package/tsdown.config.ts +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-DWy1uDak.cjs +0 -39
- package/dist/functions-CX21wstW.cjs.map +0 -1
- package/dist/functions-GmSHFbpr.mjs.map +0 -1
- package/dist/index-Cq4fz8uM.d.mts.map +0 -1
- package/dist/index-CzIMpK-e.d.cts.map +0 -1
- package/dist/lazyAccessors-5h-aWohM.mjs.map +0 -1
- package/dist/lazyAccessors-zNy6P6Cg.cjs.map +0 -1
- package/src/adaptors/__tests__/trpc.spec.ts +0 -220
- package/src/adaptors/trpc.ts +0 -192
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["DEFAULT_LOGGER","ConsoleLogger","Construct","obj: any","ConstructType","handler: SubscriberHandler<\n\t\t\tTEventPublisher,\n\t\t\tTSubscribedEvents,\n\t\t\tTServices,\n\t\t\tTLogger,\n\t\t\tOutSchema\n\t\t>","timeout: number","_subscribedEvents?: TSubscribedEvents","outputSchema?: OutSchema","services: TServices","logger: TLogger","publisherService?: Service<\n\t\t\tTEventPublisherServiceName,\n\t\t\tTEventPublisher\n\t\t>","DEFAULT_LOGGER","timeout: number","schema: T","services: T","logger: T","publisher: Service<TName, T>","event: TEvent","fn: SubscriberHandler<\n\t\t\tTEventPublisher,\n\t\t\tTSubscribedEvents,\n\t\t\tTServices,\n\t\t\tTLogger,\n\t\t\tOutSchema\n\t\t>"],"sources":["../../src/subscribers/Subscriber.ts","../../src/subscribers/SubscriberBuilder.ts","../../src/subscribers/index.ts"],"sourcesContent":["import type {\n\tEventPublisher,\n\tExtractPublisherMessage,\n} from '@geekmidas/events';\nimport type { Logger } from '@geekmidas/logger';\nimport { ConsoleLogger } from '@geekmidas/logger/console';\nimport type { InferStandardSchema } from '@geekmidas/schema';\nimport type { Service, ServiceRecord } from '@geekmidas/services';\nimport type { StandardSchemaV1 } from '@standard-schema/spec';\nimport { Construct, ConstructType } from '../Construct';\n\nconst DEFAULT_LOGGER = new ConsoleLogger() as any;\n\n// Helper type to extract payload types for subscribed events\ntype ExtractEventPayloads<\n\tTPublisher extends EventPublisher<any> | undefined,\n\tTEventTypes extends any[],\n> = TPublisher extends EventPublisher<any>\n\t? Extract<ExtractPublisherMessage<TPublisher>, { type: TEventTypes[number] }>\n\t: never;\n\nexport class Subscriber<\n\tTServices extends Service[] = [],\n\tTLogger extends Logger = Logger,\n\tOutSchema extends StandardSchemaV1 | undefined = undefined,\n\tTEventPublisher extends EventPublisher<any> | undefined = undefined,\n\tTEventPublisherServiceName extends string = string,\n\tTSubscribedEvents extends\n\t\tExtractPublisherMessage<TEventPublisher>['type'][] = ExtractPublisherMessage<TEventPublisher>['type'][],\n> extends Construct<\n\tTLogger,\n\tTEventPublisherServiceName,\n\tTEventPublisher,\n\tOutSchema,\n\tTServices\n> {\n\t__IS_SUBSCRIBER__ = true;\n\n\tstatic isSubscriber(\n\t\tobj: any,\n\t): obj is Subscriber<any, any, any, any, any, any> {\n\t\treturn Boolean(\n\t\t\tobj &&\n\t\t\t\tobj.__IS_SUBSCRIBER__ === true &&\n\t\t\t\tobj.type === ConstructType.Subscriber,\n\t\t);\n\t}\n\n\tconstructor(\n\t\tpublic readonly handler: SubscriberHandler<\n\t\t\tTEventPublisher,\n\t\t\tTSubscribedEvents,\n\t\t\tTServices,\n\t\t\tTLogger,\n\t\t\tOutSchema\n\t\t>,\n\t\tpublic override readonly timeout: number = 30000,\n\t\tprotected _subscribedEvents?: TSubscribedEvents,\n\t\tpublic override readonly outputSchema?: OutSchema,\n\t\tpublic override readonly services: TServices = [] as unknown as TServices,\n\t\tpublic override readonly logger: TLogger = DEFAULT_LOGGER as TLogger,\n\t\tpublic override readonly publisherService?: Service<\n\t\t\tTEventPublisherServiceName,\n\t\t\tTEventPublisher\n\t\t>,\n\t) {\n\t\tsuper(\n\t\t\tConstructType.Subscriber,\n\t\t\tlogger,\n\t\t\tservices,\n\t\t\t[],\n\t\t\tpublisherService,\n\t\t\toutputSchema,\n\t\t);\n\t}\n\n\tget subscribedEvents(): TSubscribedEvents | undefined {\n\t\treturn this._subscribedEvents;\n\t}\n}\n\n// Handler type for subscribers that receives an array of events\nexport type SubscriberHandler<\n\tTEventPublisher extends EventPublisher<any> | undefined,\n\tTSubscribedEvents extends ExtractPublisherMessage<TEventPublisher>['type'][],\n\tTServices extends Service[] = [],\n\tTLogger extends Logger = Logger,\n\tOutSchema extends StandardSchemaV1 | undefined = undefined,\n> = (\n\tctx: SubscriberContext<\n\t\tTEventPublisher,\n\t\tTSubscribedEvents,\n\t\tTServices,\n\t\tTLogger\n\t>,\n) => OutSchema extends StandardSchemaV1\n\t? InferStandardSchema<OutSchema> | Promise<InferStandardSchema<OutSchema>>\n\t: any | Promise<any>;\n\n// Context type for subscriber handlers\nexport type SubscriberContext<\n\tTEventPublisher extends EventPublisher<any> | undefined,\n\tTSubscribedEvents extends ExtractPublisherMessage<TEventPublisher>['type'][],\n\tTServices extends Service[] = [],\n\tTLogger extends Logger = Logger,\n> = {\n\tevents: ExtractEventPayloads<TEventPublisher, TSubscribedEvents>[];\n\tservices: ServiceRecord<TServices>;\n\tlogger: TLogger;\n};\n","import type {\n\tEventPublisher,\n\tExtractPublisherMessage,\n} from '@geekmidas/events';\nimport type { Logger } from '@geekmidas/logger';\nimport { DEFAULT_LOGGER } from '@geekmidas/logger/console';\nimport type { Service } from '@geekmidas/services';\nimport type { StandardSchemaV1 } from '@standard-schema/spec';\nimport { Subscriber, type SubscriberHandler } from './Subscriber';\n\nexport class SubscriberBuilder<\n\tTServices extends Service[] = [],\n\tTLogger extends Logger = Logger,\n\tOutSchema extends StandardSchemaV1 | undefined = undefined,\n\tTEventPublisher extends EventPublisher<any> | undefined = undefined,\n\tTEventPublisherServiceName extends string = string,\n\tTSubscribedEvents extends any[] = [],\n> {\n\tprivate _subscribedEvents: TSubscribedEvents = [] as any;\n\tprivate _timeout?: number;\n\tprivate outputSchema?: OutSchema;\n\tprivate _services: TServices = [] as Service[] as TServices;\n\tprivate _logger: TLogger = DEFAULT_LOGGER;\n\tprivate _publisher?: Service<TEventPublisherServiceName, TEventPublisher>;\n\n\tconstructor() {\n\t\tthis._timeout = 30000; // Default timeout\n\t}\n\n\ttimeout(timeout: number): this {\n\t\tthis._timeout = timeout;\n\t\treturn this;\n\t}\n\n\toutput<T extends StandardSchemaV1>(\n\t\tschema: T,\n\t): SubscriberBuilder<\n\t\tTServices,\n\t\tTLogger,\n\t\tT,\n\t\tTEventPublisher,\n\t\tTEventPublisherServiceName,\n\t\tTSubscribedEvents\n\t> {\n\t\tthis.outputSchema = schema as unknown as OutSchema;\n\t\treturn this as any;\n\t}\n\n\tservices<T extends Service[]>(\n\t\tservices: T,\n\t): SubscriberBuilder<\n\t\t[...TServices, ...T],\n\t\tTLogger,\n\t\tOutSchema,\n\t\tTEventPublisher,\n\t\tTEventPublisherServiceName,\n\t\tTSubscribedEvents\n\t> {\n\t\tthis._services = [...this._services, ...services] as any;\n\t\treturn this as any;\n\t}\n\n\tlogger<T extends Logger>(\n\t\tlogger: T,\n\t): SubscriberBuilder<\n\t\tTServices,\n\t\tT,\n\t\tOutSchema,\n\t\tTEventPublisher,\n\t\tTEventPublisherServiceName,\n\t\tTSubscribedEvents\n\t> {\n\t\tthis._logger = logger as unknown as TLogger;\n\t\treturn this as any;\n\t}\n\n\tpublisher<T extends EventPublisher<any>, TName extends string>(\n\t\tpublisher: Service<TName, T>,\n\t): SubscriberBuilder<\n\t\tTServices,\n\t\tTLogger,\n\t\tOutSchema,\n\t\tT,\n\t\tTName,\n\t\tTSubscribedEvents\n\t> {\n\t\tthis._publisher = publisher as any;\n\t\treturn this as any;\n\t}\n\n\tsubscribe<\n\t\tTEvent extends TEventPublisher extends EventPublisher<any>\n\t\t\t?\n\t\t\t\t\t| ExtractPublisherMessage<TEventPublisher>['type']\n\t\t\t\t\t| ExtractPublisherMessage<TEventPublisher>['type'][]\n\t\t\t: never,\n\t>(\n\t\tevent: TEvent,\n\t): SubscriberBuilder<\n\t\tTServices,\n\t\tTLogger,\n\t\tOutSchema,\n\t\tTEventPublisher,\n\t\tTEventPublisherServiceName,\n\t\tTEvent extends any[]\n\t\t\t? [...TSubscribedEvents, ...TEvent]\n\t\t\t: [...TSubscribedEvents, TEvent]\n\t> {\n\t\tconst eventsToAdd = Array.isArray(event) ? event : [event];\n\t\tthis._subscribedEvents = [...this._subscribedEvents, ...eventsToAdd] as any;\n\t\treturn this as any;\n\t}\n\n\thandle(\n\t\tfn: SubscriberHandler<\n\t\t\tTEventPublisher,\n\t\t\tTSubscribedEvents,\n\t\t\tTServices,\n\t\t\tTLogger,\n\t\t\tOutSchema\n\t\t>,\n\t): Subscriber<\n\t\tTServices,\n\t\tTLogger,\n\t\tOutSchema,\n\t\tTEventPublisher,\n\t\tTEventPublisherServiceName,\n\t\tTSubscribedEvents\n\t> {\n\t\tconst subscriber = new Subscriber(\n\t\t\tfn,\n\t\t\tthis._timeout,\n\t\t\tthis._subscribedEvents,\n\t\t\tthis.outputSchema,\n\t\t\tthis._services,\n\t\t\tthis._logger,\n\t\t\tthis._publisher,\n\t\t);\n\n\t\t// Reset builder state after creating the subscriber to prevent pollution\n\t\tthis._services = [] as Service[] as TServices;\n\t\tthis._logger = DEFAULT_LOGGER;\n\t\tthis._publisher = undefined;\n\t\tthis._subscribedEvents = [] as any;\n\t\tthis._timeout = 30000; // Reset to default\n\t\tthis.outputSchema = undefined;\n\n\t\treturn subscriber;\n\t}\n}\n","import { SubscriberBuilder } from './SubscriberBuilder';\n\nexport { Subscriber } from './Subscriber';\nexport { SubscriberBuilder };\n\nexport const s = new SubscriberBuilder();\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["DEFAULT_LOGGER","ConsoleLogger","Construct","obj: any","ConstructType","handler: SubscriberHandler<\n\t\t\tTEventPublisher,\n\t\t\tTSubscribedEvents,\n\t\t\tTServices,\n\t\t\tTLogger,\n\t\t\tOutSchema\n\t\t>","timeout: number","_subscribedEvents?: TSubscribedEvents","outputSchema?: OutSchema","services: TServices","logger: TLogger","publisherService?: Service<\n\t\t\tTEventPublisherServiceName,\n\t\t\tTEventPublisher\n\t\t>","DEFAULT_LOGGER","timeout: number","schema: T","services: T","logger: T","publisher: Service<TName, T>","event: TEvent","fn: SubscriberHandler<\n\t\t\tTEventPublisher,\n\t\t\tTSubscribedEvents,\n\t\t\tTServices,\n\t\t\tTLogger,\n\t\t\tOutSchema\n\t\t>"],"sources":["../../src/subscribers/Subscriber.ts","../../src/subscribers/SubscriberBuilder.ts","../../src/subscribers/index.ts"],"sourcesContent":["import type {\n\tEventPublisher,\n\tExtractPublisherMessage,\n} from '@geekmidas/events';\nimport type { Logger } from '@geekmidas/logger';\nimport { ConsoleLogger } from '@geekmidas/logger/console';\nimport type { InferStandardSchema } from '@geekmidas/schema';\nimport type { Service, ServiceRecord } from '@geekmidas/services';\nimport type { StandardSchemaV1 } from '@standard-schema/spec';\nimport { Construct, ConstructType } from '../Construct';\n\nconst DEFAULT_LOGGER = new ConsoleLogger() as any;\n\n// Helper type to extract payload types for subscribed events\ntype ExtractEventPayloads<\n\tTPublisher extends EventPublisher<any> | undefined,\n\tTEventTypes extends any[],\n> = TPublisher extends EventPublisher<any>\n\t? Extract<ExtractPublisherMessage<TPublisher>, { type: TEventTypes[number] }>\n\t: never;\n\nexport class Subscriber<\n\tTServices extends Service[] = [],\n\tTLogger extends Logger = Logger,\n\tOutSchema extends StandardSchemaV1 | undefined = undefined,\n\tTEventPublisher extends EventPublisher<any> | undefined = undefined,\n\tTEventPublisherServiceName extends string = string,\n\tTSubscribedEvents extends\n\t\tExtractPublisherMessage<TEventPublisher>['type'][] = ExtractPublisherMessage<TEventPublisher>['type'][],\n> extends Construct<\n\tTLogger,\n\tTEventPublisherServiceName,\n\tTEventPublisher,\n\tOutSchema,\n\tTServices\n> {\n\t__IS_SUBSCRIBER__ = true;\n\n\tstatic isSubscriber(\n\t\tobj: any,\n\t): obj is Subscriber<any, any, any, any, any, any> {\n\t\treturn Boolean(\n\t\t\tobj &&\n\t\t\t\tobj.__IS_SUBSCRIBER__ === true &&\n\t\t\t\tobj.type === ConstructType.Subscriber,\n\t\t);\n\t}\n\n\tconstructor(\n\t\tpublic readonly handler: SubscriberHandler<\n\t\t\tTEventPublisher,\n\t\t\tTSubscribedEvents,\n\t\t\tTServices,\n\t\t\tTLogger,\n\t\t\tOutSchema\n\t\t>,\n\t\tpublic override readonly timeout: number = 30000,\n\t\tprotected _subscribedEvents?: TSubscribedEvents,\n\t\tpublic override readonly outputSchema?: OutSchema,\n\t\tpublic override readonly services: TServices = [] as unknown as TServices,\n\t\tpublic override readonly logger: TLogger = DEFAULT_LOGGER as TLogger,\n\t\tpublic override readonly publisherService?: Service<\n\t\t\tTEventPublisherServiceName,\n\t\t\tTEventPublisher\n\t\t>,\n\t) {\n\t\tsuper(\n\t\t\tConstructType.Subscriber,\n\t\t\tlogger,\n\t\t\tservices,\n\t\t\t[],\n\t\t\tpublisherService,\n\t\t\toutputSchema,\n\t\t);\n\t}\n\n\tget subscribedEvents(): TSubscribedEvents | undefined {\n\t\treturn this._subscribedEvents;\n\t}\n}\n\n// Handler type for subscribers that receives an array of events\nexport type SubscriberHandler<\n\tTEventPublisher extends EventPublisher<any> | undefined,\n\tTSubscribedEvents extends ExtractPublisherMessage<TEventPublisher>['type'][],\n\tTServices extends Service[] = [],\n\tTLogger extends Logger = Logger,\n\tOutSchema extends StandardSchemaV1 | undefined = undefined,\n> = (\n\tctx: SubscriberContext<\n\t\tTEventPublisher,\n\t\tTSubscribedEvents,\n\t\tTServices,\n\t\tTLogger\n\t>,\n) => OutSchema extends StandardSchemaV1\n\t? InferStandardSchema<OutSchema> | Promise<InferStandardSchema<OutSchema>>\n\t: any | Promise<any>;\n\n// Context type for subscriber handlers\nexport type SubscriberContext<\n\tTEventPublisher extends EventPublisher<any> | undefined,\n\tTSubscribedEvents extends ExtractPublisherMessage<TEventPublisher>['type'][],\n\tTServices extends Service[] = [],\n\tTLogger extends Logger = Logger,\n> = {\n\tevents: ExtractEventPayloads<TEventPublisher, TSubscribedEvents>[];\n\tservices: ServiceRecord<TServices>;\n\tlogger: TLogger;\n};\n","import type {\n\tEventPublisher,\n\tExtractPublisherMessage,\n} from '@geekmidas/events';\nimport type { Logger } from '@geekmidas/logger';\nimport { DEFAULT_LOGGER } from '@geekmidas/logger/console';\nimport type { Service } from '@geekmidas/services';\nimport type { StandardSchemaV1 } from '@standard-schema/spec';\nimport { Subscriber, type SubscriberHandler } from './Subscriber';\n\nexport class SubscriberBuilder<\n\tTServices extends Service[] = [],\n\tTLogger extends Logger = Logger,\n\tOutSchema extends StandardSchemaV1 | undefined = undefined,\n\tTEventPublisher extends EventPublisher<any> | undefined = undefined,\n\tTEventPublisherServiceName extends string = string,\n\tTSubscribedEvents extends any[] = [],\n> {\n\tprivate _subscribedEvents: TSubscribedEvents = [] as any;\n\tprivate _timeout?: number;\n\tprivate outputSchema?: OutSchema;\n\tprivate _services: TServices = [] as Service[] as TServices;\n\tprivate _logger: TLogger = DEFAULT_LOGGER;\n\tprivate _publisher?: Service<TEventPublisherServiceName, TEventPublisher>;\n\n\tconstructor() {\n\t\tthis._timeout = 30000; // Default timeout\n\t}\n\n\ttimeout(timeout: number): this {\n\t\tthis._timeout = timeout;\n\t\treturn this;\n\t}\n\n\toutput<T extends StandardSchemaV1>(\n\t\tschema: T,\n\t): SubscriberBuilder<\n\t\tTServices,\n\t\tTLogger,\n\t\tT,\n\t\tTEventPublisher,\n\t\tTEventPublisherServiceName,\n\t\tTSubscribedEvents\n\t> {\n\t\tthis.outputSchema = schema as unknown as OutSchema;\n\t\treturn this as any;\n\t}\n\n\tservices<T extends Service[]>(\n\t\tservices: T,\n\t): SubscriberBuilder<\n\t\t[...TServices, ...T],\n\t\tTLogger,\n\t\tOutSchema,\n\t\tTEventPublisher,\n\t\tTEventPublisherServiceName,\n\t\tTSubscribedEvents\n\t> {\n\t\tthis._services = [...this._services, ...services] as any;\n\t\treturn this as any;\n\t}\n\n\tlogger<T extends Logger>(\n\t\tlogger: T,\n\t): SubscriberBuilder<\n\t\tTServices,\n\t\tT,\n\t\tOutSchema,\n\t\tTEventPublisher,\n\t\tTEventPublisherServiceName,\n\t\tTSubscribedEvents\n\t> {\n\t\tthis._logger = logger as unknown as TLogger;\n\t\treturn this as any;\n\t}\n\n\tpublisher<T extends EventPublisher<any>, TName extends string>(\n\t\tpublisher: Service<TName, T>,\n\t): SubscriberBuilder<\n\t\tTServices,\n\t\tTLogger,\n\t\tOutSchema,\n\t\tT,\n\t\tTName,\n\t\tTSubscribedEvents\n\t> {\n\t\tthis._publisher = publisher as any;\n\t\treturn this as any;\n\t}\n\n\tsubscribe<\n\t\tTEvent extends TEventPublisher extends EventPublisher<any>\n\t\t\t?\n\t\t\t\t\t| ExtractPublisherMessage<TEventPublisher>['type']\n\t\t\t\t\t| ExtractPublisherMessage<TEventPublisher>['type'][]\n\t\t\t: never,\n\t>(\n\t\tevent: TEvent,\n\t): SubscriberBuilder<\n\t\tTServices,\n\t\tTLogger,\n\t\tOutSchema,\n\t\tTEventPublisher,\n\t\tTEventPublisherServiceName,\n\t\tTEvent extends any[]\n\t\t\t? [...TSubscribedEvents, ...TEvent]\n\t\t\t: [...TSubscribedEvents, TEvent]\n\t> {\n\t\tconst eventsToAdd = Array.isArray(event) ? event : [event];\n\t\tthis._subscribedEvents = [...this._subscribedEvents, ...eventsToAdd] as any;\n\t\treturn this as any;\n\t}\n\n\thandle(\n\t\tfn: SubscriberHandler<\n\t\t\tTEventPublisher,\n\t\t\tTSubscribedEvents,\n\t\t\tTServices,\n\t\t\tTLogger,\n\t\t\tOutSchema\n\t\t>,\n\t): Subscriber<\n\t\tTServices,\n\t\tTLogger,\n\t\tOutSchema,\n\t\tTEventPublisher,\n\t\tTEventPublisherServiceName,\n\t\tTSubscribedEvents\n\t> {\n\t\tconst subscriber = new Subscriber(\n\t\t\tfn,\n\t\t\tthis._timeout,\n\t\t\tthis._subscribedEvents,\n\t\t\tthis.outputSchema,\n\t\t\tthis._services,\n\t\t\tthis._logger,\n\t\t\tthis._publisher,\n\t\t);\n\n\t\t// Reset builder state after creating the subscriber to prevent pollution\n\t\tthis._services = [] as Service[] as TServices;\n\t\tthis._logger = DEFAULT_LOGGER;\n\t\tthis._publisher = undefined;\n\t\tthis._subscribedEvents = [] as any;\n\t\tthis._timeout = 30000; // Reset to default\n\t\tthis.outputSchema = undefined;\n\n\t\treturn subscriber;\n\t}\n}\n","import { SubscriberBuilder } from './SubscriberBuilder';\n\nexport { Subscriber } from './Subscriber';\nexport { SubscriberBuilder };\n\nexport const s = new SubscriberBuilder();\n"],"mappings":";;;;AAWA,MAAMA,mBAAiB,IAAIC;AAU3B,IAAa,aAAb,cAQUC,4BAMR;CACD,oBAAoB;CAEpB,OAAO,aACNC,KACkD;AAClD,SAAO,QACN,OACC,IAAI,sBAAsB,QAC1B,IAAI,SAASC,gCAAc,WAC5B;CACD;CAED,YACiBC,SAOSC,UAAkB,KACjCC,mBACeC,cACAC,WAAsB,CAAE,GACxBC,SAAkBV,kBAClBW,kBAIxB;AACD,QACCP,gCAAc,YACd,QACA,UACA,CAAE,GACF,kBACA,aACA;EAxBe;EAOS;EACf;EACe;EACA;EACA;EACA;CAazB;CAED,IAAI,mBAAkD;AACrD,SAAO,KAAK;CACZ;AACD;;;;ACrED,IAAa,oBAAb,MAOE;CACD,AAAQ,oBAAuC,CAAE;CACjD,AAAQ;CACR,AAAQ;CACR,AAAQ,YAAuB,CAAE;CACjC,AAAQ,UAAmBQ;CAC3B,AAAQ;CAER,cAAc;AACb,OAAK,WAAW;CAChB;CAED,QAAQC,SAAuB;AAC9B,OAAK,WAAW;AAChB,SAAO;CACP;CAED,OACCC,QAQC;AACD,OAAK,eAAe;AACpB,SAAO;CACP;CAED,SACCC,UAQC;AACD,OAAK,YAAY,CAAC,GAAG,KAAK,WAAW,GAAG,QAAS;AACjD,SAAO;CACP;CAED,OACCC,QAQC;AACD,OAAK,UAAU;AACf,SAAO;CACP;CAED,UACCC,WAQC;AACD,OAAK,aAAa;AAClB,SAAO;CACP;CAED,UAOCC,OAUC;EACD,MAAM,cAAc,MAAM,QAAQ,MAAM,GAAG,QAAQ,CAAC,KAAM;AAC1D,OAAK,oBAAoB,CAAC,GAAG,KAAK,mBAAmB,GAAG,WAAY;AACpE,SAAO;CACP;CAED,OACCC,IAcC;EACD,MAAM,aAAa,IAAI,WACtB,IACA,KAAK,UACL,KAAK,mBACL,KAAK,cACL,KAAK,WACL,KAAK,SACL,KAAK;AAIN,OAAK,YAAY,CAAE;AACnB,OAAK,UAAUP;AACf,OAAK;AACL,OAAK,oBAAoB,CAAE;AAC3B,OAAK,WAAW;AAChB,OAAK;AAEL,SAAO;CACP;AACD;;;;AChJD,MAAa,IAAI,IAAI"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import "../Construct-
|
|
2
|
-
import { Subscriber, SubscriberHandler } from "../Subscriber-
|
|
1
|
+
import "../Construct-cjIs74Gb.cjs";
|
|
2
|
+
import { Subscriber, SubscriberHandler } from "../Subscriber-C6YXAmTp.cjs";
|
|
3
3
|
import { EventPublisher, ExtractPublisherMessage } from "@geekmidas/events";
|
|
4
4
|
import * as _geekmidas_logger8 from "@geekmidas/logger";
|
|
5
5
|
import { Logger } from "@geekmidas/logger";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import "../Construct-D0n7QTaI.mjs";
|
|
2
|
-
import { Subscriber, SubscriberHandler } from "../Subscriber-
|
|
2
|
+
import { Subscriber, SubscriberHandler } from "../Subscriber-C0v9iOrI.mjs";
|
|
3
3
|
import { Service } from "@geekmidas/services";
|
|
4
4
|
import { EventPublisher, ExtractPublisherMessage } from "@geekmidas/events";
|
|
5
5
|
import { Logger as Logger$1 } from "@geekmidas/logger";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"telemetry-
|
|
1
|
+
{"version":3,"file":"telemetry-3vdxGn4q.d.mts","names":[],"sources":["../src/telemetry.ts"],"sourcesContent":[],"mappings":";;;;;;;AA6FmB,UAlFF,gBAAA,CAkFE;EAAgB;;;EAQgB,CAAA,GAAA,EAAA,MAAA,CAAA,EAAA,OAAA;;;;;UAhFlC,gBAAA;;;;;;;;WASP;;;;;UAMO,iBAAA;;;;;;;;;;;;YAcN;;;;;;;;;;;;;;;;;;;;;;;;;;;UA4BM,SAAA;;;;;;;0BAOQ,mBAAmB;;;;;;;oBAQzB,4BAA4B;;;;;;;sBAQ1B,yBAAyB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"telemetry-
|
|
1
|
+
{"version":3,"file":"telemetry-Dqx-D3F7.d.cts","names":[],"sources":["../src/telemetry.ts"],"sourcesContent":[],"mappings":";;;;;;;AA6FmB,UAlFF,gBAAA,CAkFE;EAAgB;;;EAQgB,CAAA,GAAA,EAAA,MAAA,CAAA,EAAA,OAAA;;;;;UAhFlC,gBAAA;;;;;;;;WASP;;;;;UAMO,iBAAA;;;;;;;;;;;;YAcN;;;;;;;;;;;;;;;;;;;;;;;;;;;UA4BM,SAAA;;;;;;;0BAOQ,mBAAmB;;;;;;;oBAQzB,4BAA4B;;;;;;;sBAQ1B,yBAAyB"}
|
|
@@ -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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types-
|
|
1
|
+
{"version":3,"file":"types-BdAaYDvd.d.cts","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.cts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { HttpMethod, LowerHttpMethod, RemoveUndefined } from "./types-
|
|
1
|
+
import { HttpMethod, LowerHttpMethod, RemoveUndefined } from "./types-BdAaYDvd.cjs";
|
|
2
2
|
export { HttpMethod, LowerHttpMethod, RemoveUndefined };
|
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",
|
|
@@ -131,27 +121,25 @@
|
|
|
131
121
|
"@types/lodash.uniqby": "~4.7.9",
|
|
132
122
|
"@types/pg": "~8.15.6",
|
|
133
123
|
"@types/qs": "~6.15.0",
|
|
134
|
-
"@trpc/server": "~11.16.0",
|
|
135
124
|
"better-auth": "~1.4.18",
|
|
136
125
|
"kysely": "~0.28.8",
|
|
137
126
|
"pg": "~8.16.3",
|
|
138
127
|
"msw": "~2.10.3",
|
|
139
128
|
"zod": "~4.1.13",
|
|
140
129
|
"@geekmidas/audit": "^2.0.1",
|
|
141
|
-
"@geekmidas/cache": "^1.1.1",
|
|
142
130
|
"@geekmidas/db": "^1.0.2",
|
|
131
|
+
"@geekmidas/cache": "^1.1.1",
|
|
143
132
|
"@geekmidas/envkit": "^1.0.7",
|
|
144
133
|
"@geekmidas/errors": "^1.0.1",
|
|
145
|
-
"@geekmidas/
|
|
134
|
+
"@geekmidas/events": "^1.1.4",
|
|
146
135
|
"@geekmidas/logger": "^1.0.2",
|
|
147
|
-
"@geekmidas/rate-limit": "^
|
|
148
|
-
"@geekmidas/
|
|
149
|
-
"@geekmidas/
|
|
150
|
-
"@geekmidas/
|
|
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"
|
|
151
140
|
},
|
|
152
141
|
"peerDependencies": {
|
|
153
142
|
"@middy/core": ">=6.3.1",
|
|
154
|
-
"@trpc/server": ">=11.0.0",
|
|
155
143
|
"@types/aws-lambda": ">=8.10.92",
|
|
156
144
|
"hono": ">=4.8.2",
|
|
157
145
|
"msw": ">=2.0.0",
|
|
@@ -162,9 +150,9 @@
|
|
|
162
150
|
"@geekmidas/errors": "^1.0.1",
|
|
163
151
|
"@geekmidas/events": "^1.1.4",
|
|
164
152
|
"@geekmidas/logger": "^1.0.2",
|
|
153
|
+
"@geekmidas/rate-limit": "^3.0.0",
|
|
165
154
|
"@geekmidas/schema": "^1.0.2",
|
|
166
|
-
"@geekmidas/services": "^1.0
|
|
167
|
-
"@geekmidas/rate-limit": "^2.0.1"
|
|
155
|
+
"@geekmidas/services": "^1.1.0"
|
|
168
156
|
},
|
|
169
157
|
"peerDependenciesMeta": {
|
|
170
158
|
"@geekmidas/audit": {
|
|
@@ -200,9 +188,6 @@
|
|
|
200
188
|
"@middy/core": {
|
|
201
189
|
"optional": true
|
|
202
190
|
},
|
|
203
|
-
"@trpc/server": {
|
|
204
|
-
"optional": true
|
|
205
|
-
},
|
|
206
191
|
"@types/aws-lambda": {
|
|
207
192
|
"optional": true
|
|
208
193
|
},
|
package/src/adaptors/aws.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
export { AWSScheduledFunction } from '../crons/AWSScheduledFunction';
|
|
1
2
|
export { AmazonApiGatewayV1Endpoint } from '../endpoints/AmazonApiGatewayV1EndpointAdaptor';
|
|
2
3
|
export { AmazonApiGatewayV2Endpoint } from '../endpoints/AmazonApiGatewayV2EndpointAdaptor';
|
|
3
4
|
export { AWSLambdaFunction } from '../functions/AWSLambdaFunction';
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import type { EnvironmentParser } from '@geekmidas/envkit';
|
|
2
|
+
import type { EventPublisher } from '@geekmidas/events';
|
|
3
|
+
import type { Logger } from '@geekmidas/logger';
|
|
4
|
+
import type { ComposableStandardSchema } from '@geekmidas/schema';
|
|
5
|
+
import type { Service } from '@geekmidas/services';
|
|
6
|
+
import type { StandardSchemaV1 } from '@standard-schema/spec';
|
|
7
|
+
import { AWSLambdaFunction } from '../functions/AWSLambdaFunction';
|
|
8
|
+
import type { Cron } from './Cron';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* AWS Lambda adaptor for {@link Cron} constructs.
|
|
12
|
+
*
|
|
13
|
+
* A `Cron` is a {@link import('../functions').Function} that is invoked on a
|
|
14
|
+
* schedule (an EventBridge rule) rather than by an API request. Because of
|
|
15
|
+
* that, the runtime execution pipeline is identical to a regular Lambda
|
|
16
|
+
* function: input parsing, service/database/auditor wiring, event publishing,
|
|
17
|
+
* error handling, and the `runWithRequestContext` wrapper that powers
|
|
18
|
+
* request-scoped logging via `serviceContext.getLogger()`.
|
|
19
|
+
*
|
|
20
|
+
* This adaptor therefore reuses {@link AWSLambdaFunction} wholesale and only
|
|
21
|
+
* narrows the constructor to accept a `Cron`. The schedule expression itself
|
|
22
|
+
* (`cron.schedule`) is **deploy-time** infrastructure consumed by the CLI to
|
|
23
|
+
* provision the EventBridge rule — it is not needed at runtime.
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* ```typescript
|
|
27
|
+
* import { AWSScheduledFunction } from '@geekmidas/constructs/crons';
|
|
28
|
+
* import { cancelPastBookings } from '../../../src/crons/cancelPastBookings.js';
|
|
29
|
+
* import { envParser } from '../../../src/env';
|
|
30
|
+
*
|
|
31
|
+
* const adapter = new AWSScheduledFunction(envParser, cancelPastBookings);
|
|
32
|
+
*
|
|
33
|
+
* export const handler = adapter.handler;
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
36
|
+
export class AWSScheduledFunction<
|
|
37
|
+
TInput extends ComposableStandardSchema | undefined = undefined,
|
|
38
|
+
TServices extends Service[] = [],
|
|
39
|
+
TLogger extends Logger = Logger,
|
|
40
|
+
TOutSchema extends StandardSchemaV1 | undefined = undefined,
|
|
41
|
+
TEventPublisher extends EventPublisher<any> | undefined = undefined,
|
|
42
|
+
TEventPublisherServiceName extends string = string,
|
|
43
|
+
TDatabase = undefined,
|
|
44
|
+
TDatabaseServiceName extends string = string,
|
|
45
|
+
> extends AWSLambdaFunction<
|
|
46
|
+
TInput,
|
|
47
|
+
TOutSchema,
|
|
48
|
+
TServices,
|
|
49
|
+
TLogger,
|
|
50
|
+
TEventPublisher,
|
|
51
|
+
TEventPublisherServiceName,
|
|
52
|
+
undefined,
|
|
53
|
+
string,
|
|
54
|
+
TDatabase,
|
|
55
|
+
TDatabaseServiceName
|
|
56
|
+
> {
|
|
57
|
+
// biome-ignore lint/complexity/noUselessConstructor: narrows the inherited `Function` parameter to `Cron` for a clearer public API
|
|
58
|
+
constructor(
|
|
59
|
+
envParser: EnvironmentParser<{}>,
|
|
60
|
+
cron: Cron<
|
|
61
|
+
TInput,
|
|
62
|
+
TServices,
|
|
63
|
+
TLogger,
|
|
64
|
+
TOutSchema,
|
|
65
|
+
TEventPublisher,
|
|
66
|
+
TEventPublisherServiceName,
|
|
67
|
+
TDatabase,
|
|
68
|
+
TDatabaseServiceName
|
|
69
|
+
>,
|
|
70
|
+
) {
|
|
71
|
+
super(envParser, cron);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import { EnvironmentParser } from '@geekmidas/envkit';
|
|
2
|
+
import type { Logger } from '@geekmidas/logger';
|
|
3
|
+
import type { Service } from '@geekmidas/services';
|
|
4
|
+
import { ServiceDiscovery, serviceContext } from '@geekmidas/services';
|
|
5
|
+
import type { Context } from 'aws-lambda';
|
|
6
|
+
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
|
7
|
+
import { z } from 'zod/v4';
|
|
8
|
+
import { AWSScheduledFunction } from '../AWSScheduledFunction';
|
|
9
|
+
import { CronBuilder } from '../CronBuilder';
|
|
10
|
+
|
|
11
|
+
/** Spy logger whose `child()` returns itself, so all log calls land on it. */
|
|
12
|
+
function makeSpyLogger(): Logger {
|
|
13
|
+
const logger: Logger = {
|
|
14
|
+
trace: vi.fn(),
|
|
15
|
+
debug: vi.fn(),
|
|
16
|
+
info: vi.fn(),
|
|
17
|
+
warn: vi.fn(),
|
|
18
|
+
error: vi.fn(),
|
|
19
|
+
fatal: vi.fn(),
|
|
20
|
+
child: vi.fn(() => logger),
|
|
21
|
+
};
|
|
22
|
+
return logger;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// Minimal EventBridge scheduled-event envelope (no user payload).
|
|
26
|
+
const scheduledEvent = {
|
|
27
|
+
id: 'cdc73f9d-aea9-11e3-9d5a-835b769c0d9c',
|
|
28
|
+
version: '0',
|
|
29
|
+
account: '123456789012',
|
|
30
|
+
time: '2026-06-09T00:00:00Z',
|
|
31
|
+
region: 'us-east-1',
|
|
32
|
+
source: 'aws.events',
|
|
33
|
+
resources: ['arn:aws:events:us-east-1:123456789012:rule/daily'],
|
|
34
|
+
'detail-type': 'Scheduled Event',
|
|
35
|
+
detail: {},
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
const createMockContext = (): Context =>
|
|
39
|
+
({
|
|
40
|
+
functionName: 'cancelPastBookings',
|
|
41
|
+
functionVersion: '1',
|
|
42
|
+
invokedFunctionArn:
|
|
43
|
+
'arn:aws:lambda:us-east-1:123456789012:function:cancelPastBookings',
|
|
44
|
+
memoryLimitInMB: '128',
|
|
45
|
+
awsRequestId: 'test-request-id',
|
|
46
|
+
logGroupName: '/aws/lambda/cancelPastBookings',
|
|
47
|
+
logStreamName: '2026/06/09/[$LATEST]test-stream',
|
|
48
|
+
getRemainingTimeInMillis: () => 30000,
|
|
49
|
+
done: vi.fn(),
|
|
50
|
+
fail: vi.fn(),
|
|
51
|
+
succeed: vi.fn(),
|
|
52
|
+
callbackWaitsForEmptyEventLoop: true,
|
|
53
|
+
}) as unknown as Context;
|
|
54
|
+
|
|
55
|
+
class CounterService implements Service<'counter', CounterService> {
|
|
56
|
+
serviceName = 'counter' as const;
|
|
57
|
+
count = 0;
|
|
58
|
+
async register() {
|
|
59
|
+
return this;
|
|
60
|
+
}
|
|
61
|
+
increment() {
|
|
62
|
+
this.count += 1;
|
|
63
|
+
return this.count;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
describe('AWSScheduledFunction', () => {
|
|
68
|
+
let envParser: EnvironmentParser<{}>;
|
|
69
|
+
|
|
70
|
+
beforeEach(() => {
|
|
71
|
+
// ServiceDiscovery is a process-wide singleton that caches resolved
|
|
72
|
+
// instances; reset so each test (and ordering) starts clean.
|
|
73
|
+
ServiceDiscovery.reset();
|
|
74
|
+
envParser = new EnvironmentParser({});
|
|
75
|
+
vi.clearAllMocks();
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
it('runs the cron handler on a scheduled event', async () => {
|
|
79
|
+
const ran = vi.fn();
|
|
80
|
+
const cron = new CronBuilder().schedule('rate(1 day)').handle(async () => {
|
|
81
|
+
ran();
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
const adapter = new AWSScheduledFunction(envParser, cron);
|
|
85
|
+
const result = await adapter.handler(
|
|
86
|
+
scheduledEvent,
|
|
87
|
+
createMockContext(),
|
|
88
|
+
vi.fn(),
|
|
89
|
+
);
|
|
90
|
+
|
|
91
|
+
expect(ran).toHaveBeenCalledTimes(1);
|
|
92
|
+
// With no output schema the adaptor returns undefined, matching
|
|
93
|
+
// AWSLambdaFunction — crons typically don't return a response.
|
|
94
|
+
expect(result).toBeUndefined();
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
it('parses and returns output when the cron declares an output schema', async () => {
|
|
98
|
+
const cron = new CronBuilder()
|
|
99
|
+
.schedule('rate(1 day)')
|
|
100
|
+
.output(z.object({ cancelled: z.number() }))
|
|
101
|
+
.handle(async () => ({ cancelled: 3 }));
|
|
102
|
+
|
|
103
|
+
const adapter = new AWSScheduledFunction(envParser, cron);
|
|
104
|
+
const result = await adapter.handler(
|
|
105
|
+
scheduledEvent,
|
|
106
|
+
createMockContext(),
|
|
107
|
+
vi.fn(),
|
|
108
|
+
);
|
|
109
|
+
|
|
110
|
+
expect(result).toEqual({ cancelled: 3 });
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
it('exposes services to the cron handler', async () => {
|
|
114
|
+
let observed = 0;
|
|
115
|
+
const cron = new CronBuilder()
|
|
116
|
+
.schedule('rate(1 hour)')
|
|
117
|
+
.services([new CounterService()])
|
|
118
|
+
.handle(async ({ services }) => {
|
|
119
|
+
observed = services.counter.increment();
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
const adapter = new AWSScheduledFunction(envParser, cron);
|
|
123
|
+
await adapter.handler(scheduledEvent, createMockContext(), vi.fn());
|
|
124
|
+
|
|
125
|
+
expect(observed).toBe(1);
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
it('establishes request context so serviceContext.getLogger() works', async () => {
|
|
129
|
+
// The cron runs through the same runWithRequestContext wrapper as
|
|
130
|
+
// functions, so service code can resolve the request-scoped logger. We
|
|
131
|
+
// assert delegation via the cron's own logger rather than spying on the
|
|
132
|
+
// shared serviceContext proxy (which is a process-wide singleton).
|
|
133
|
+
let hadContext = false;
|
|
134
|
+
const logger = makeSpyLogger();
|
|
135
|
+
|
|
136
|
+
const cron = new CronBuilder()
|
|
137
|
+
.schedule('rate(1 day)')
|
|
138
|
+
.logger(logger)
|
|
139
|
+
.handle(async () => {
|
|
140
|
+
hadContext = serviceContext.hasContext();
|
|
141
|
+
serviceContext.getLogger().info('cron tick');
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
const adapter = new AWSScheduledFunction(envParser, cron);
|
|
145
|
+
await adapter.handler(scheduledEvent, createMockContext(), vi.fn());
|
|
146
|
+
|
|
147
|
+
expect(hadContext).toBe(true);
|
|
148
|
+
expect(logger.info).toHaveBeenCalledWith('cron tick');
|
|
149
|
+
// Context must not leak past the invocation.
|
|
150
|
+
expect(serviceContext.hasContext()).toBe(false);
|
|
151
|
+
});
|
|
152
|
+
});
|
package/src/crons/index.ts
CHANGED
|
@@ -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/trpc.cjs
DELETED
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
const require_chunk = require('../chunk-DWy1uDak.cjs');
|
|
2
|
-
const __geekmidas_services = require_chunk.__toESM(require("@geekmidas/services"));
|
|
3
|
-
|
|
4
|
-
//#region src/adaptors/trpc.ts
|
|
5
|
-
function createServicesMiddleware(mw, envParser) {
|
|
6
|
-
return (services) => {
|
|
7
|
-
const builder = mw(async (opts) => {
|
|
8
|
-
const ctx = opts.ctx;
|
|
9
|
-
const discovery = ctx.serviceDiscovery ?? __geekmidas_services.ServiceDiscovery.getInstance(envParser ?? (() => {
|
|
10
|
-
throw new Error("createServicesMiddleware: no `envParser` provided and `ctx.serviceDiscovery` is missing. Pass an EnvironmentParser to createServicesMiddleware(), or attach a ServiceDiscovery instance to the tRPC context.");
|
|
11
|
-
})());
|
|
12
|
-
const requestId = ctx.requestId ?? crypto.randomUUID();
|
|
13
|
-
const startTime = ctx.startTime ?? Date.now();
|
|
14
|
-
return (0, __geekmidas_services.runWithRequestContext)({
|
|
15
|
-
logger: ctx.logger,
|
|
16
|
-
requestId,
|
|
17
|
-
startTime
|
|
18
|
-
}, async () => {
|
|
19
|
-
const resolved = await discovery.register(services);
|
|
20
|
-
return opts.next({ ctx: {
|
|
21
|
-
...opts.ctx,
|
|
22
|
-
...resolved
|
|
23
|
-
} });
|
|
24
|
-
});
|
|
25
|
-
});
|
|
26
|
-
const middlewares = builder._middlewares;
|
|
27
|
-
if (middlewares?.length) {
|
|
28
|
-
const last = middlewares[middlewares.length - 1];
|
|
29
|
-
if (last) last._services = services;
|
|
30
|
-
}
|
|
31
|
-
return builder;
|
|
32
|
-
};
|
|
33
|
-
}
|
|
34
|
-
/**
|
|
35
|
-
* Create a tRPC middleware that establishes a request context for downstream
|
|
36
|
-
* code without resolving any services. Useful when services aren't needed on
|
|
37
|
-
* a procedure but the handler (or libraries it calls) still wants to read
|
|
38
|
-
* `serviceContext.getLogger()` / `getRequestId()` / `getRequestStartTime()`.
|
|
39
|
-
*
|
|
40
|
-
* `requestId` and `startTime` are pulled from the tRPC context when present,
|
|
41
|
-
* otherwise generated (`crypto.randomUUID()` and `Date.now()`).
|
|
42
|
-
*
|
|
43
|
-
* @example
|
|
44
|
-
* ```ts
|
|
45
|
-
* const withRequestContext = createRequestContextMiddleware(t.middleware);
|
|
46
|
-
* export const baseProcedure = t.procedure.use(withRequestContext);
|
|
47
|
-
* ```
|
|
48
|
-
*/
|
|
49
|
-
function createRequestContextMiddleware(mw) {
|
|
50
|
-
return mw(async (opts) => {
|
|
51
|
-
const ctx = opts.ctx;
|
|
52
|
-
const requestId = ctx.requestId ?? crypto.randomUUID();
|
|
53
|
-
const startTime = ctx.startTime ?? Date.now();
|
|
54
|
-
return (0, __geekmidas_services.runWithRequestContext)({
|
|
55
|
-
logger: ctx.logger,
|
|
56
|
-
requestId,
|
|
57
|
-
startTime
|
|
58
|
-
}, () => opts.next());
|
|
59
|
-
});
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
//#endregion
|
|
63
|
-
exports.createRequestContextMiddleware = createRequestContextMiddleware;
|
|
64
|
-
exports.createServicesMiddleware = createServicesMiddleware;
|
|
65
|
-
//# sourceMappingURL=trpc.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"trpc.cjs","names":["mw: CreateMiddleware<TContext, TMeta>","envParser?: EnvironmentParser<{}>","services: [...T]"],"sources":["../../src/adaptors/trpc.ts"],"sourcesContent":["import type { EnvironmentParser } from '@geekmidas/envkit';\nimport type { Logger } from '@geekmidas/logger';\nimport {\n\trunWithRequestContext,\n\ttype Service,\n\tServiceDiscovery,\n\ttype ServiceRecord,\n} from '@geekmidas/services';\nimport type {\n\tTRPCMiddlewareBuilder,\n\tTRPCMiddlewareFunction,\n} from '@trpc/server';\n\n/**\n * Shape of `t.middleware` from `@trpc/server`. We accept this rather than the\n * initialized `t` object so callers retain ownership of their tRPC instance\n * (no double-initialization, no opinion on context/meta shape).\n */\ntype CreateMiddleware<TContext, TMeta> = <$ContextOverrides>(\n\tfn: TRPCMiddlewareFunction<\n\t\tTContext,\n\t\tTMeta,\n\t\tobject,\n\t\t$ContextOverrides,\n\t\tunknown\n\t>,\n) => TRPCMiddlewareBuilder<TContext, TMeta, $ContextOverrides, unknown>;\n\n/**\n * Result of `createServicesMiddleware`: a function that accepts a service\n * tuple and returns a tRPC middleware that merges resolved services onto the\n * context.\n */\nexport type ServicesMiddleware<\n\tTContext extends object,\n\tTMeta extends object,\n> = <const T extends Service[]>(\n\tservices: [...T],\n) => TRPCMiddlewareBuilder<TContext, TMeta, ServiceRecord<T>, unknown>;\n\n/**\n * Context shape required by `createServicesMiddleware` overload 2.\n * Procedures that pull services via context-stored discovery must expose it\n * under `serviceDiscovery`.\n */\nexport interface ContextWithServiceDiscovery {\n\tserviceDiscovery: ServiceDiscovery;\n}\n\n/**\n * Minimum context required for request-context propagation. `logger` must be\n * present so services can call `serviceContext.getLogger()`. `requestId` and\n * `startTime` are auto-generated if missing.\n */\nexport interface ContextWithLogger {\n\tlogger: Logger;\n\trequestId?: string;\n\tstartTime?: number;\n}\n\n/**\n * Create a tRPC middleware that:\n *\n * 1. Resolves the requested services via `ServiceDiscovery`.\n * 2. Wraps the downstream call in `runWithRequestContext` so any code reached\n * by the procedure (including service method implementations) can read the\n * current logger/request id via `serviceContext`.\n * 3. Merges the resolved services onto the tRPC context so handlers can access\n * them by service name (`ctx.database`, `ctx.cache`, ...).\n *\n * Two overloads:\n * - Pass an `envParser` to create a per-request `ServiceDiscovery` instance.\n * - Omit `envParser` to read `ctx.serviceDiscovery` from the tRPC context.\n *\n * @example\n * ```ts\n * import { initTRPC } from '@trpc/server';\n * import { createServicesMiddleware } from '@geekmidas/constructs/trpc';\n *\n * const t = initTRPC.context<Context>().create();\n * const withServices = createServicesMiddleware(t.middleware, envParser);\n *\n * export const authedProcedure = t.procedure.use(\n * withServices([databaseService, cacheService]),\n * );\n * ```\n */\nexport function createServicesMiddleware<\n\tTContext extends ContextWithLogger & object,\n\tTMeta extends object,\n>(\n\tmw: CreateMiddleware<TContext, TMeta>,\n\tenvParser: EnvironmentParser<{}>,\n): ServicesMiddleware<TContext, TMeta>;\nexport function createServicesMiddleware<\n\tTContext extends ContextWithLogger & ContextWithServiceDiscovery & object,\n\tTMeta extends object,\n>(mw: CreateMiddleware<TContext, TMeta>): ServicesMiddleware<TContext, TMeta>;\nexport function createServicesMiddleware<\n\tTContext extends ContextWithLogger & object,\n\tTMeta extends object,\n>(\n\tmw: CreateMiddleware<TContext, TMeta>,\n\tenvParser?: EnvironmentParser<{}>,\n): ServicesMiddleware<TContext, TMeta> {\n\treturn (<const T extends Service[]>(services: [...T]) => {\n\t\tconst builder = mw(async (opts) => {\n\t\t\tconst ctx = opts.ctx as TContext & Partial<ContextWithServiceDiscovery>;\n\n\t\t\tconst discovery =\n\t\t\t\tctx.serviceDiscovery ??\n\t\t\t\tServiceDiscovery.getInstance(\n\t\t\t\t\tenvParser ??\n\t\t\t\t\t\t(() => {\n\t\t\t\t\t\t\t// Hit only if overload 2 was selected but ctx.serviceDiscovery is\n\t\t\t\t\t\t\t// missing at runtime — surface the mistake immediately rather\n\t\t\t\t\t\t\t// than letting an undefined env parser fail deep inside register.\n\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t'createServicesMiddleware: no `envParser` provided and ' +\n\t\t\t\t\t\t\t\t\t'`ctx.serviceDiscovery` is missing. Pass an EnvironmentParser ' +\n\t\t\t\t\t\t\t\t\t'to createServicesMiddleware(), or attach a ServiceDiscovery ' +\n\t\t\t\t\t\t\t\t\t'instance to the tRPC context.',\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t})(),\n\t\t\t\t);\n\n\t\t\tconst requestId = ctx.requestId ?? crypto.randomUUID();\n\t\t\tconst startTime = ctx.startTime ?? Date.now();\n\n\t\t\treturn runWithRequestContext(\n\t\t\t\t{ logger: ctx.logger, requestId, startTime },\n\t\t\t\tasync () => {\n\t\t\t\t\tconst resolved = await discovery.register(services);\n\t\t\t\t\treturn opts.next({\n\t\t\t\t\t\tctx: { ...opts.ctx, ...resolved } as typeof opts.ctx &\n\t\t\t\t\t\t\tServiceRecord<T>,\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t);\n\t\t});\n\n\t\t// Tag the inner middleware function with the requested services so external\n\t\t// tooling (e.g. detect-procedures route generators) can introspect a\n\t\t// procedure's service dependencies without re-executing middleware.\n\t\tconst middlewares = (\n\t\t\tbuilder as unknown as { _middlewares?: Array<{ _services?: Service[] }> }\n\t\t)._middlewares;\n\t\tif (middlewares?.length) {\n\t\t\tconst last = middlewares[middlewares.length - 1];\n\t\t\tif (last) last._services = services as unknown as Service[];\n\t\t}\n\n\t\treturn builder as TRPCMiddlewareBuilder<\n\t\t\tTContext,\n\t\t\tTMeta,\n\t\t\tServiceRecord<T>,\n\t\t\tunknown\n\t\t>;\n\t}) as ServicesMiddleware<TContext, TMeta>;\n}\n\n/**\n * Create a tRPC middleware that establishes a request context for downstream\n * code without resolving any services. Useful when services aren't needed on\n * a procedure but the handler (or libraries it calls) still wants to read\n * `serviceContext.getLogger()` / `getRequestId()` / `getRequestStartTime()`.\n *\n * `requestId` and `startTime` are pulled from the tRPC context when present,\n * otherwise generated (`crypto.randomUUID()` and `Date.now()`).\n *\n * @example\n * ```ts\n * const withRequestContext = createRequestContextMiddleware(t.middleware);\n * export const baseProcedure = t.procedure.use(withRequestContext);\n * ```\n */\nexport function createRequestContextMiddleware<\n\tTContext extends ContextWithLogger & object,\n\tTMeta extends object,\n>(\n\tmw: CreateMiddleware<TContext, TMeta>,\n): TRPCMiddlewareBuilder<TContext, TMeta, object, unknown> {\n\treturn mw(async (opts) => {\n\t\tconst ctx = opts.ctx as TContext;\n\t\tconst requestId = ctx.requestId ?? crypto.randomUUID();\n\t\tconst startTime = ctx.startTime ?? Date.now();\n\t\treturn runWithRequestContext(\n\t\t\t{ logger: ctx.logger, requestId, startTime },\n\t\t\t() => opts.next(),\n\t\t);\n\t});\n}\n"],"mappings":";;;;AAkGA,SAAgB,yBAIfA,IACAC,WACsC;AACtC,QAAQ,CAA4BC,aAAqB;EACxD,MAAM,UAAU,GAAG,OAAO,SAAS;GAClC,MAAM,MAAM,KAAK;GAEjB,MAAM,YACL,IAAI,oBACJ,sCAAiB,YAChB,aACC,CAAC,MAAM;AAIN,UAAM,IAAI,MACT;GAKD,IAAG,CACL;GAEF,MAAM,YAAY,IAAI,aAAa,OAAO,YAAY;GACtD,MAAM,YAAY,IAAI,aAAa,KAAK,KAAK;AAE7C,UAAO,gDACN;IAAE,QAAQ,IAAI;IAAQ;IAAW;GAAW,GAC5C,YAAY;IACX,MAAM,WAAW,MAAM,UAAU,SAAS,SAAS;AACnD,WAAO,KAAK,KAAK,EAChB,KAAK;KAAE,GAAG,KAAK;KAAK,GAAG;IAAU,EAEjC,EAAC;GACF,EACD;EACD,EAAC;EAKF,MAAM,cACL,QACC;AACF,MAAI,aAAa,QAAQ;GACxB,MAAM,OAAO,YAAY,YAAY,SAAS;AAC9C,OAAI,KAAM,MAAK,YAAY;EAC3B;AAED,SAAO;CAMP;AACD;;;;;;;;;;;;;;;;AAiBD,SAAgB,+BAIfF,IAC0D;AAC1D,QAAO,GAAG,OAAO,SAAS;EACzB,MAAM,MAAM,KAAK;EACjB,MAAM,YAAY,IAAI,aAAa,OAAO,YAAY;EACtD,MAAM,YAAY,IAAI,aAAa,KAAK,KAAK;AAC7C,SAAO,gDACN;GAAE,QAAQ,IAAI;GAAQ;GAAW;EAAW,GAC5C,MAAM,KAAK,MAAM,CACjB;CACD,EAAC;AACF"}
|
package/dist/adaptors/trpc.d.cts
DELETED
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
import { EnvironmentParser } from "@geekmidas/envkit";
|
|
2
|
-
import { Logger } from "@geekmidas/logger";
|
|
3
|
-
import { Service, ServiceDiscovery, ServiceRecord } from "@geekmidas/services";
|
|
4
|
-
import { TRPCMiddlewareBuilder, TRPCMiddlewareFunction } from "@trpc/server";
|
|
5
|
-
|
|
6
|
-
//#region src/adaptors/trpc.d.ts
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* Shape of `t.middleware` from `@trpc/server`. We accept this rather than the
|
|
10
|
-
* initialized `t` object so callers retain ownership of their tRPC instance
|
|
11
|
-
* (no double-initialization, no opinion on context/meta shape).
|
|
12
|
-
*/
|
|
13
|
-
type CreateMiddleware<TContext, TMeta> = <$ContextOverrides>(fn: TRPCMiddlewareFunction<TContext, TMeta, object, $ContextOverrides, unknown>) => TRPCMiddlewareBuilder<TContext, TMeta, $ContextOverrides, unknown>;
|
|
14
|
-
/**
|
|
15
|
-
* Result of `createServicesMiddleware`: a function that accepts a service
|
|
16
|
-
* tuple and returns a tRPC middleware that merges resolved services onto the
|
|
17
|
-
* context.
|
|
18
|
-
*/
|
|
19
|
-
type ServicesMiddleware<TContext extends object, TMeta extends object> = <const T extends Service[]>(services: [...T]) => TRPCMiddlewareBuilder<TContext, TMeta, ServiceRecord<T>, unknown>;
|
|
20
|
-
/**
|
|
21
|
-
* Context shape required by `createServicesMiddleware` overload 2.
|
|
22
|
-
* Procedures that pull services via context-stored discovery must expose it
|
|
23
|
-
* under `serviceDiscovery`.
|
|
24
|
-
*/
|
|
25
|
-
interface ContextWithServiceDiscovery {
|
|
26
|
-
serviceDiscovery: ServiceDiscovery;
|
|
27
|
-
}
|
|
28
|
-
/**
|
|
29
|
-
* Minimum context required for request-context propagation. `logger` must be
|
|
30
|
-
* present so services can call `serviceContext.getLogger()`. `requestId` and
|
|
31
|
-
* `startTime` are auto-generated if missing.
|
|
32
|
-
*/
|
|
33
|
-
interface ContextWithLogger {
|
|
34
|
-
logger: Logger;
|
|
35
|
-
requestId?: string;
|
|
36
|
-
startTime?: number;
|
|
37
|
-
}
|
|
38
|
-
/**
|
|
39
|
-
* Create a tRPC middleware that:
|
|
40
|
-
*
|
|
41
|
-
* 1. Resolves the requested services via `ServiceDiscovery`.
|
|
42
|
-
* 2. Wraps the downstream call in `runWithRequestContext` so any code reached
|
|
43
|
-
* by the procedure (including service method implementations) can read the
|
|
44
|
-
* current logger/request id via `serviceContext`.
|
|
45
|
-
* 3. Merges the resolved services onto the tRPC context so handlers can access
|
|
46
|
-
* them by service name (`ctx.database`, `ctx.cache`, ...).
|
|
47
|
-
*
|
|
48
|
-
* Two overloads:
|
|
49
|
-
* - Pass an `envParser` to create a per-request `ServiceDiscovery` instance.
|
|
50
|
-
* - Omit `envParser` to read `ctx.serviceDiscovery` from the tRPC context.
|
|
51
|
-
*
|
|
52
|
-
* @example
|
|
53
|
-
* ```ts
|
|
54
|
-
* import { initTRPC } from '@trpc/server';
|
|
55
|
-
* import { createServicesMiddleware } from '@geekmidas/constructs/trpc';
|
|
56
|
-
*
|
|
57
|
-
* const t = initTRPC.context<Context>().create();
|
|
58
|
-
* const withServices = createServicesMiddleware(t.middleware, envParser);
|
|
59
|
-
*
|
|
60
|
-
* export const authedProcedure = t.procedure.use(
|
|
61
|
-
* withServices([databaseService, cacheService]),
|
|
62
|
-
* );
|
|
63
|
-
* ```
|
|
64
|
-
*/
|
|
65
|
-
declare function createServicesMiddleware<TContext extends ContextWithLogger & object, TMeta extends object>(mw: CreateMiddleware<TContext, TMeta>, envParser: EnvironmentParser<{}>): ServicesMiddleware<TContext, TMeta>;
|
|
66
|
-
declare function createServicesMiddleware<TContext extends ContextWithLogger & ContextWithServiceDiscovery & object, TMeta extends object>(mw: CreateMiddleware<TContext, TMeta>): ServicesMiddleware<TContext, TMeta>;
|
|
67
|
-
/**
|
|
68
|
-
* Create a tRPC middleware that establishes a request context for downstream
|
|
69
|
-
* code without resolving any services. Useful when services aren't needed on
|
|
70
|
-
* a procedure but the handler (or libraries it calls) still wants to read
|
|
71
|
-
* `serviceContext.getLogger()` / `getRequestId()` / `getRequestStartTime()`.
|
|
72
|
-
*
|
|
73
|
-
* `requestId` and `startTime` are pulled from the tRPC context when present,
|
|
74
|
-
* otherwise generated (`crypto.randomUUID()` and `Date.now()`).
|
|
75
|
-
*
|
|
76
|
-
* @example
|
|
77
|
-
* ```ts
|
|
78
|
-
* const withRequestContext = createRequestContextMiddleware(t.middleware);
|
|
79
|
-
* export const baseProcedure = t.procedure.use(withRequestContext);
|
|
80
|
-
* ```
|
|
81
|
-
*/
|
|
82
|
-
declare function createRequestContextMiddleware<TContext extends ContextWithLogger & object, TMeta extends object>(mw: CreateMiddleware<TContext, TMeta>): TRPCMiddlewareBuilder<TContext, TMeta, object, unknown>;
|
|
83
|
-
//#endregion
|
|
84
|
-
export { ContextWithLogger, ContextWithServiceDiscovery, ServicesMiddleware, createRequestContextMiddleware, createServicesMiddleware };
|
|
85
|
-
//# sourceMappingURL=trpc.d.cts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"trpc.d.cts","names":[],"sources":["../../src/adaptors/trpc.ts"],"sourcesContent":[],"mappings":";;;;;;;;;AAWsB;;;KAOjB,gBAGH,CAAA,QAAA,EAAA,KAAA,CAAA,GAAA,CAAA,iBAAA,CAAA,CAAA,EAAA,EAFG,sBAEH,CADA,QACA,EAAA,KAAA,EAAA,MAAA,EAEA,iBAFA,EAAA,OAAA,CAAA,EAAA,GAKG,qBALH,CAKyB,QALzB,EAKmC,KALnC,EAK0C,iBAL1C,EAAA,OAAA,CAAA;;;;;;AAKG,KAOO,kBAPP,CAAA,iBAAA,MAAA,EAAA,cAAA,MAAA,CAAA,GAAA,CAAA,gBAUgB,OAVhB,EAAA,CAAA,CAAA,QAAA,EAAA,CAAA,GAWU,CAXV,CAAA,EAAA,GAYA,qBAZA,CAYsB,QAZtB,EAYgC,KAZhC,EAYuC,aAZvC,CAYqD,CAZrD,CAAA,EAAA,OAAA,CAAA;AAAqB;AAO1B;;;;AAK2B,UAOV,2BAAA,CAPU;EAAQ,gBAAE,EAQlB,gBARkB;;;;AAAX;AAO1B;AASA;AAiCgB,UAjCC,iBAAA,CAiCuB;EAAA,MAAA,EAhC/B,MAgC+B;EAAA,SACtB,CAAA,EAAA,MAAA;EAAiB,SAGb,CAAA,EAAA,MAAA;;;;;;;AAED;AACrB;;;;;;;;;;AAG4D;AA+E5D;;;;;;;;;AAKwB;iBA9FR,0CACE,sDAGb,iBAAiB,UAAU,mBACpB,wBACT,mBAAmB,UAAU;iBAChB,0CACE,oBAAoB,gEAEhC,iBAAiB,UAAU,SAAS,mBAAmB,UAAU;;;;;;;;;;;;;;;;iBA+EvD,gDACE,sDAGb,iBAAiB,UAAU,SAC7B,sBAAsB,UAAU"}
|