@lakutata/entrypoint 3.0.0-beta.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/LICENSE +23 -0
- package/README.md +183 -0
- package/THIRD_PARTY_NOTICES.md +206 -0
- package/dist/cjs/Entrypoint.d.ts +868 -0
- package/dist/cjs/Entrypoint.js +998 -0
- package/dist/cjs/adapter/commander/CommanderCLIEntrypoint.d.ts +192 -0
- package/dist/cjs/adapter/commander/CommanderCLIEntrypoint.js +439 -0
- package/dist/cjs/adapter/commander/Prompt.d.ts +22 -0
- package/dist/cjs/adapter/commander/Prompt.js +164 -0
- package/dist/cjs/adapter/commander/Width.d.ts +12 -0
- package/dist/cjs/adapter/commander/Width.js +67 -0
- package/dist/cjs/adapter/electron/ElectronIPCServiceEntrypoint.d.ts +203 -0
- package/dist/cjs/adapter/electron/ElectronIPCServiceEntrypoint.js +249 -0
- package/dist/cjs/adapter/express/ExpressHTTPEntrypoint.d.ts +172 -0
- package/dist/cjs/adapter/express/ExpressHTTPEntrypoint.js +301 -0
- package/dist/cjs/adapter/express/Responders.d.ts +89 -0
- package/dist/cjs/adapter/express/Responders.js +71 -0
- package/dist/cjs/adapter/express/StaticUI.d.ts +83 -0
- package/dist/cjs/adapter/express/StaticUI.js +104 -0
- package/dist/cjs/adapter/fastify/FastifyHTTPEntrypoint.d.ts +156 -0
- package/dist/cjs/adapter/fastify/FastifyHTTPEntrypoint.js +339 -0
- package/dist/cjs/adapter/fastify/Responders.d.ts +88 -0
- package/dist/cjs/adapter/fastify/Responders.js +77 -0
- package/dist/cjs/adapter/http/HTTPServiceEntrypoint.d.ts +117 -0
- package/dist/cjs/adapter/http/HTTPServiceEntrypoint.js +257 -0
- package/dist/cjs/adapter/jsonrpc/JSONRPCProtocol.d.ts +194 -0
- package/dist/cjs/adapter/jsonrpc/JSONRPCProtocol.js +187 -0
- package/dist/cjs/adapter/jsonrpc/JSONRPCServiceEntrypoint.d.ts +154 -0
- package/dist/cjs/adapter/jsonrpc/JSONRPCServiceEntrypoint.js +397 -0
- package/dist/cjs/adapter/schedule/ScheduleEntrypoint.d.ts +86 -0
- package/dist/cjs/adapter/schedule/ScheduleEntrypoint.js +275 -0
- package/dist/cjs/adapter/socket.io/SocketIOServiceEntrypoint.d.ts +138 -0
- package/dist/cjs/adapter/socket.io/SocketIOServiceEntrypoint.js +216 -0
- package/dist/cjs/channel/BuiltinChannels.d.ts +18 -0
- package/dist/cjs/channel/BuiltinChannels.js +128 -0
- package/dist/cjs/channel/Channel.d.ts +196 -0
- package/dist/cjs/channel/Channel.js +106 -0
- package/dist/cjs/channel/EntrypointAdapter.d.ts +195 -0
- package/dist/cjs/channel/EntrypointAdapter.js +43 -0
- package/dist/cjs/context/BaseContext.d.ts +75 -0
- package/dist/cjs/context/BaseContext.js +90 -0
- package/dist/cjs/context/CLIContext.d.ts +38 -0
- package/dist/cjs/context/CLIContext.js +53 -0
- package/dist/cjs/context/HTTPContext.d.ts +52 -0
- package/dist/cjs/context/HTTPContext.js +78 -0
- package/dist/cjs/context/ScheduleContext.d.ts +47 -0
- package/dist/cjs/context/ScheduleContext.js +65 -0
- package/dist/cjs/context/ServiceContext.d.ts +47 -0
- package/dist/cjs/context/ServiceContext.js +62 -0
- package/dist/cjs/decorators/CLIAction.d.ts +120 -0
- package/dist/cjs/decorators/CLIAction.js +13 -0
- package/dist/cjs/decorators/HTTPAction.d.ts +178 -0
- package/dist/cjs/decorators/HTTPAction.js +14 -0
- package/dist/cjs/decorators/Prefix.d.ts +44 -0
- package/dist/cjs/decorators/Prefix.js +48 -0
- package/dist/cjs/decorators/Schedule.d.ts +120 -0
- package/dist/cjs/decorators/Schedule.js +64 -0
- package/dist/cjs/decorators/ServiceAction.d.ts +116 -0
- package/dist/cjs/decorators/ServiceAction.js +12 -0
- package/dist/cjs/decorators/UseMiddlewares.d.ts +52 -0
- package/dist/cjs/decorators/UseMiddlewares.js +58 -0
- package/dist/cjs/decorators/http/DELETE.d.ts +87 -0
- package/dist/cjs/decorators/http/DELETE.js +7 -0
- package/dist/cjs/decorators/http/GET.d.ts +89 -0
- package/dist/cjs/decorators/http/GET.js +7 -0
- package/dist/cjs/decorators/http/HEAD.d.ts +84 -0
- package/dist/cjs/decorators/http/HEAD.js +7 -0
- package/dist/cjs/decorators/http/OPTIONS.d.ts +80 -0
- package/dist/cjs/decorators/http/OPTIONS.js +7 -0
- package/dist/cjs/decorators/http/PATCH.d.ts +90 -0
- package/dist/cjs/decorators/http/PATCH.js +7 -0
- package/dist/cjs/decorators/http/POST.d.ts +91 -0
- package/dist/cjs/decorators/http/POST.js +7 -0
- package/dist/cjs/decorators/http/PUT.d.ts +92 -0
- package/dist/cjs/decorators/http/PUT.js +7 -0
- package/dist/cjs/exceptions/AccessDeniedException.d.ts +10 -0
- package/dist/cjs/exceptions/AccessDeniedException.js +17 -0
- package/dist/cjs/exceptions/ControllerActionNotFoundException.d.ts +9 -0
- package/dist/cjs/exceptions/ControllerActionNotFoundException.js +16 -0
- package/dist/cjs/exceptions/DuplicateActionNameException.d.ts +8 -0
- package/dist/cjs/exceptions/DuplicateActionNameException.js +15 -0
- package/dist/cjs/exceptions/EntrypointStoppedException.d.ts +9 -0
- package/dist/cjs/exceptions/EntrypointStoppedException.js +16 -0
- package/dist/cjs/exceptions/InvalidActionGroupException.d.ts +4 -0
- package/dist/cjs/exceptions/InvalidActionGroupException.js +11 -0
- package/dist/cjs/exceptions/InvalidChannelException.d.ts +8 -0
- package/dist/cjs/exceptions/InvalidChannelException.js +15 -0
- package/dist/cjs/exceptions/InvalidEntrypointAdapterException.d.ts +9 -0
- package/dist/cjs/exceptions/InvalidEntrypointAdapterException.js +16 -0
- package/dist/cjs/exceptions/InvalidMiddlewareException.d.ts +8 -0
- package/dist/cjs/exceptions/InvalidMiddlewareException.js +15 -0
- package/dist/cjs/exceptions/InvalidPrefixException.d.ts +8 -0
- package/dist/cjs/exceptions/InvalidPrefixException.js +15 -0
- package/dist/cjs/exceptions/MiddlewareNextCalledException.d.ts +8 -0
- package/dist/cjs/exceptions/MiddlewareNextCalledException.js +15 -0
- package/dist/cjs/exceptions/RouteNotFoundException.d.ts +9 -0
- package/dist/cjs/exceptions/RouteNotFoundException.js +16 -0
- package/dist/cjs/exceptions/ServiceInvokeException.d.ts +11 -0
- package/dist/cjs/exceptions/ServiceInvokeException.js +14 -0
- package/dist/cjs/exports/CTRLDecorators.d.ts +13 -0
- package/dist/cjs/exports/CTRLDecorators.js +38 -0
- package/dist/cjs/exports/Channel.d.ts +14 -0
- package/dist/cjs/exports/Channel.js +33 -0
- package/dist/cjs/exports/CommanderAdapter.d.ts +1 -0
- package/dist/cjs/exports/CommanderAdapter.js +8 -0
- package/dist/cjs/exports/ElectronAdapter.d.ts +1 -0
- package/dist/cjs/exports/ElectronAdapter.js +9 -0
- package/dist/cjs/exports/Entrypoint.d.ts +24 -0
- package/dist/cjs/exports/Entrypoint.js +55 -0
- package/dist/cjs/exports/ExpressAdapter.d.ts +4 -0
- package/dist/cjs/exports/ExpressAdapter.js +15 -0
- package/dist/cjs/exports/FastifyAdapter.d.ts +4 -0
- package/dist/cjs/exports/FastifyAdapter.js +14 -0
- package/dist/cjs/exports/JSONRPCAdapter.d.ts +2 -0
- package/dist/cjs/exports/JSONRPCAdapter.js +11 -0
- package/dist/cjs/exports/SocketIOAdapter.d.ts +1 -0
- package/dist/cjs/exports/SocketIOAdapter.js +9 -0
- package/dist/cjs/lib/AccessControl.d.ts +118 -0
- package/dist/cjs/lib/AccessControl.js +208 -0
- package/dist/cjs/lib/AccessControlRule.d.ts +91 -0
- package/dist/cjs/lib/AccessControlRule.js +76 -0
- package/dist/cjs/lib/ActionOptions.d.ts +67 -0
- package/dist/cjs/lib/ActionOptions.js +67 -0
- package/dist/cjs/lib/ActionResult.d.ts +28 -0
- package/dist/cjs/lib/ActionResult.js +28 -0
- package/dist/cjs/lib/ApplicationOf.d.ts +6 -0
- package/dist/cjs/lib/ApplicationOf.js +14 -0
- package/dist/cjs/lib/Controller.d.ts +59 -0
- package/dist/cjs/lib/Controller.js +64 -0
- package/dist/cjs/lib/ControllerEntrypoint.d.ts +168 -0
- package/dist/cjs/lib/ControllerEntrypoint.js +239 -0
- package/dist/cjs/lib/GetActionDTOAndOptions.d.ts +29 -0
- package/dist/cjs/lib/GetActionDTOAndOptions.js +49 -0
- package/dist/cjs/lib/HTTPErrors.d.ts +55 -0
- package/dist/cjs/lib/HTTPErrors.js +52 -0
- package/dist/cjs/lib/Middleware.d.ts +146 -0
- package/dist/cjs/lib/Middleware.js +144 -0
- package/dist/cjs/lib/Prefix.d.ts +98 -0
- package/dist/cjs/lib/Prefix.js +151 -0
- package/dist/cjs/lib/Result.d.ts +173 -0
- package/dist/cjs/lib/Result.js +153 -0
- package/dist/cjs/lib/ServiceResponseCodec.d.ts +82 -0
- package/dist/cjs/lib/ServiceResponseCodec.js +117 -0
- package/dist/cjs/lib/StringifyPattern.d.ts +7 -0
- package/dist/cjs/lib/StringifyPattern.js +58 -0
- package/dist/cjs/lib/UnsetValue.d.ts +12 -0
- package/dist/cjs/lib/UnsetValue.js +216 -0
- package/dist/cjs/lib/pattern/GlobPattern.d.ts +34 -0
- package/dist/cjs/lib/pattern/GlobPattern.js +68 -0
- package/dist/cjs/lib/pattern/PatternManager.d.ts +103 -0
- package/dist/cjs/lib/pattern/PatternManager.js +233 -0
- package/dist/cjs/lib/schedule/Cron.d.ts +56 -0
- package/dist/cjs/lib/schedule/Cron.js +282 -0
- package/dist/cjs/package.json +1 -0
- package/dist/cjs/types/CLIContextParams.d.ts +14 -0
- package/dist/cjs/types/CLIContextParams.js +2 -0
- package/dist/cjs/types/ErrorDescription.d.ts +14 -0
- package/dist/cjs/types/ErrorDescription.js +2 -0
- package/dist/cjs/types/HTTPContextParams.d.ts +27 -0
- package/dist/cjs/types/HTTPContextParams.js +2 -0
- package/dist/cjs/types/ScheduleContextParams.d.ts +21 -0
- package/dist/cjs/types/ScheduleContextParams.js +2 -0
- package/dist/cjs/types/ServiceContextParams.d.ts +16 -0
- package/dist/cjs/types/ServiceContextParams.js +2 -0
- package/dist/esm/Entrypoint.js +985 -0
- package/dist/esm/adapter/commander/CommanderCLIEntrypoint.js +433 -0
- package/dist/esm/adapter/commander/Prompt.js +127 -0
- package/dist/esm/adapter/commander/Width.js +63 -0
- package/dist/esm/adapter/electron/ElectronIPCServiceEntrypoint.js +212 -0
- package/dist/esm/adapter/express/ExpressHTTPEntrypoint.js +295 -0
- package/dist/esm/adapter/express/Responders.js +66 -0
- package/dist/esm/adapter/express/StaticUI.js +96 -0
- package/dist/esm/adapter/fastify/FastifyHTTPEntrypoint.js +333 -0
- package/dist/esm/adapter/fastify/Responders.js +73 -0
- package/dist/esm/adapter/http/HTTPServiceEntrypoint.js +253 -0
- package/dist/esm/adapter/jsonrpc/JSONRPCProtocol.js +182 -0
- package/dist/esm/adapter/jsonrpc/JSONRPCServiceEntrypoint.js +361 -0
- package/dist/esm/adapter/schedule/ScheduleEntrypoint.js +272 -0
- package/dist/esm/adapter/socket.io/SocketIOServiceEntrypoint.js +212 -0
- package/dist/esm/channel/BuiltinChannels.js +125 -0
- package/dist/esm/channel/Channel.js +100 -0
- package/dist/esm/channel/EntrypointAdapter.js +39 -0
- package/dist/esm/context/BaseContext.js +87 -0
- package/dist/esm/context/CLIContext.js +49 -0
- package/dist/esm/context/HTTPContext.js +74 -0
- package/dist/esm/context/ScheduleContext.js +61 -0
- package/dist/esm/context/ServiceContext.js +58 -0
- package/dist/esm/decorators/CLIAction.js +10 -0
- package/dist/esm/decorators/HTTPAction.js +11 -0
- package/dist/esm/decorators/Prefix.js +45 -0
- package/dist/esm/decorators/Schedule.js +61 -0
- package/dist/esm/decorators/ServiceAction.js +9 -0
- package/dist/esm/decorators/UseMiddlewares.js +55 -0
- package/dist/esm/decorators/http/DELETE.js +4 -0
- package/dist/esm/decorators/http/GET.js +4 -0
- package/dist/esm/decorators/http/HEAD.js +4 -0
- package/dist/esm/decorators/http/OPTIONS.js +4 -0
- package/dist/esm/decorators/http/PATCH.js +4 -0
- package/dist/esm/decorators/http/POST.js +4 -0
- package/dist/esm/decorators/http/PUT.js +4 -0
- package/dist/esm/exceptions/AccessDeniedException.js +13 -0
- package/dist/esm/exceptions/ControllerActionNotFoundException.js +12 -0
- package/dist/esm/exceptions/DuplicateActionNameException.js +11 -0
- package/dist/esm/exceptions/EntrypointStoppedException.js +12 -0
- package/dist/esm/exceptions/InvalidActionGroupException.js +7 -0
- package/dist/esm/exceptions/InvalidChannelException.js +11 -0
- package/dist/esm/exceptions/InvalidEntrypointAdapterException.js +12 -0
- package/dist/esm/exceptions/InvalidMiddlewareException.js +11 -0
- package/dist/esm/exceptions/InvalidPrefixException.js +11 -0
- package/dist/esm/exceptions/MiddlewareNextCalledException.js +11 -0
- package/dist/esm/exceptions/RouteNotFoundException.js +12 -0
- package/dist/esm/exceptions/ServiceInvokeException.js +10 -0
- package/dist/esm/exports/CTRLDecorators.js +19 -0
- package/dist/esm/exports/Channel.js +11 -0
- package/dist/esm/exports/CommanderAdapter.js +1 -0
- package/dist/esm/exports/ElectronAdapter.js +1 -0
- package/dist/esm/exports/Entrypoint.js +22 -0
- package/dist/esm/exports/ExpressAdapter.js +3 -0
- package/dist/esm/exports/FastifyAdapter.js +3 -0
- package/dist/esm/exports/JSONRPCAdapter.js +2 -0
- package/dist/esm/exports/SocketIOAdapter.js +1 -0
- package/dist/esm/lib/AccessControl.js +204 -0
- package/dist/esm/lib/AccessControlRule.js +72 -0
- package/dist/esm/lib/ActionOptions.js +63 -0
- package/dist/esm/lib/ActionResult.js +24 -0
- package/dist/esm/lib/ApplicationOf.js +11 -0
- package/dist/esm/lib/Controller.js +61 -0
- package/dist/esm/lib/ControllerEntrypoint.js +229 -0
- package/dist/esm/lib/GetActionDTOAndOptions.js +46 -0
- package/dist/esm/lib/HTTPErrors.js +48 -0
- package/dist/esm/lib/Middleware.js +134 -0
- package/dist/esm/lib/Prefix.js +143 -0
- package/dist/esm/lib/Result.js +147 -0
- package/dist/esm/lib/ServiceResponseCodec.js +113 -0
- package/dist/esm/lib/StringifyPattern.js +55 -0
- package/dist/esm/lib/UnsetValue.js +213 -0
- package/dist/esm/lib/pattern/GlobPattern.js +64 -0
- package/dist/esm/lib/pattern/PatternManager.js +229 -0
- package/dist/esm/lib/schedule/Cron.js +277 -0
- package/dist/esm/types/CLIContextParams.js +1 -0
- package/dist/esm/types/ErrorDescription.js +1 -0
- package/dist/esm/types/HTTPContextParams.js +1 -0
- package/dist/esm/types/ScheduleContextParams.js +1 -0
- package/dist/esm/types/ServiceContextParams.js +1 -0
- package/dist/types/Entrypoint.d.ts +868 -0
- package/dist/types/adapter/commander/CommanderCLIEntrypoint.d.ts +192 -0
- package/dist/types/adapter/commander/Prompt.d.ts +22 -0
- package/dist/types/adapter/commander/Width.d.ts +12 -0
- package/dist/types/adapter/electron/ElectronIPCServiceEntrypoint.d.ts +203 -0
- package/dist/types/adapter/express/ExpressHTTPEntrypoint.d.ts +172 -0
- package/dist/types/adapter/express/Responders.d.ts +89 -0
- package/dist/types/adapter/express/StaticUI.d.ts +83 -0
- package/dist/types/adapter/fastify/FastifyHTTPEntrypoint.d.ts +156 -0
- package/dist/types/adapter/fastify/Responders.d.ts +88 -0
- package/dist/types/adapter/http/HTTPServiceEntrypoint.d.ts +117 -0
- package/dist/types/adapter/jsonrpc/JSONRPCProtocol.d.ts +194 -0
- package/dist/types/adapter/jsonrpc/JSONRPCServiceEntrypoint.d.ts +154 -0
- package/dist/types/adapter/schedule/ScheduleEntrypoint.d.ts +86 -0
- package/dist/types/adapter/socket.io/SocketIOServiceEntrypoint.d.ts +138 -0
- package/dist/types/channel/BuiltinChannels.d.ts +18 -0
- package/dist/types/channel/Channel.d.ts +196 -0
- package/dist/types/channel/EntrypointAdapter.d.ts +195 -0
- package/dist/types/context/BaseContext.d.ts +75 -0
- package/dist/types/context/CLIContext.d.ts +38 -0
- package/dist/types/context/HTTPContext.d.ts +52 -0
- package/dist/types/context/ScheduleContext.d.ts +47 -0
- package/dist/types/context/ServiceContext.d.ts +47 -0
- package/dist/types/decorators/CLIAction.d.ts +120 -0
- package/dist/types/decorators/HTTPAction.d.ts +178 -0
- package/dist/types/decorators/Prefix.d.ts +44 -0
- package/dist/types/decorators/Schedule.d.ts +120 -0
- package/dist/types/decorators/ServiceAction.d.ts +116 -0
- package/dist/types/decorators/UseMiddlewares.d.ts +52 -0
- package/dist/types/decorators/http/DELETE.d.ts +87 -0
- package/dist/types/decorators/http/GET.d.ts +89 -0
- package/dist/types/decorators/http/HEAD.d.ts +84 -0
- package/dist/types/decorators/http/OPTIONS.d.ts +80 -0
- package/dist/types/decorators/http/PATCH.d.ts +90 -0
- package/dist/types/decorators/http/POST.d.ts +91 -0
- package/dist/types/decorators/http/PUT.d.ts +92 -0
- package/dist/types/exceptions/AccessDeniedException.d.ts +10 -0
- package/dist/types/exceptions/ControllerActionNotFoundException.d.ts +9 -0
- package/dist/types/exceptions/DuplicateActionNameException.d.ts +8 -0
- package/dist/types/exceptions/EntrypointStoppedException.d.ts +9 -0
- package/dist/types/exceptions/InvalidActionGroupException.d.ts +4 -0
- package/dist/types/exceptions/InvalidChannelException.d.ts +8 -0
- package/dist/types/exceptions/InvalidEntrypointAdapterException.d.ts +9 -0
- package/dist/types/exceptions/InvalidMiddlewareException.d.ts +8 -0
- package/dist/types/exceptions/InvalidPrefixException.d.ts +8 -0
- package/dist/types/exceptions/MiddlewareNextCalledException.d.ts +8 -0
- package/dist/types/exceptions/RouteNotFoundException.d.ts +9 -0
- package/dist/types/exceptions/ServiceInvokeException.d.ts +11 -0
- package/dist/types/exports/CTRLDecorators.d.ts +13 -0
- package/dist/types/exports/Channel.d.ts +14 -0
- package/dist/types/exports/CommanderAdapter.d.ts +1 -0
- package/dist/types/exports/ElectronAdapter.d.ts +1 -0
- package/dist/types/exports/Entrypoint.d.ts +24 -0
- package/dist/types/exports/ExpressAdapter.d.ts +4 -0
- package/dist/types/exports/FastifyAdapter.d.ts +4 -0
- package/dist/types/exports/JSONRPCAdapter.d.ts +2 -0
- package/dist/types/exports/SocketIOAdapter.d.ts +1 -0
- package/dist/types/lib/AccessControl.d.ts +118 -0
- package/dist/types/lib/AccessControlRule.d.ts +91 -0
- package/dist/types/lib/ActionOptions.d.ts +67 -0
- package/dist/types/lib/ActionResult.d.ts +28 -0
- package/dist/types/lib/ApplicationOf.d.ts +6 -0
- package/dist/types/lib/Controller.d.ts +59 -0
- package/dist/types/lib/ControllerEntrypoint.d.ts +168 -0
- package/dist/types/lib/GetActionDTOAndOptions.d.ts +29 -0
- package/dist/types/lib/HTTPErrors.d.ts +55 -0
- package/dist/types/lib/Middleware.d.ts +146 -0
- package/dist/types/lib/Prefix.d.ts +98 -0
- package/dist/types/lib/Result.d.ts +173 -0
- package/dist/types/lib/ServiceResponseCodec.d.ts +82 -0
- package/dist/types/lib/StringifyPattern.d.ts +7 -0
- package/dist/types/lib/UnsetValue.d.ts +12 -0
- package/dist/types/lib/pattern/GlobPattern.d.ts +34 -0
- package/dist/types/lib/pattern/PatternManager.d.ts +103 -0
- package/dist/types/lib/schedule/Cron.d.ts +56 -0
- package/dist/types/types/CLIContextParams.d.ts +14 -0
- package/dist/types/types/ErrorDescription.d.ts +14 -0
- package/dist/types/types/HTTPContextParams.d.ts +27 -0
- package/dist/types/types/ScheduleContextParams.d.ts +21 -0
- package/dist/types/types/ServiceContextParams.d.ts +16 -0
- package/package.json +152 -0
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
import type { ActionPattern } from '@lakutata/core';
|
|
2
|
+
import type { BaseContext } from '../context/BaseContext.js';
|
|
3
|
+
import type { ActionDetails } from '../lib/ControllerEntrypoint.js';
|
|
4
|
+
import type { PrefixOptions } from '../lib/Prefix.js';
|
|
5
|
+
import type { BaseActionInfo } from '../Entrypoint.js';
|
|
6
|
+
/**
|
|
7
|
+
* How the requests of a channel arrive:
|
|
8
|
+
* - `request`: a caller waits for the result (HTTP, CLI, service, MCP, D-Bus).
|
|
9
|
+
* - `delivery`: no caller waits, the adapter acknowledges the outcome (message queues).
|
|
10
|
+
* - `trigger`: no external caller, the adapter runs the actions on its own (schedules).
|
|
11
|
+
*/
|
|
12
|
+
export type ChannelKind = 'request' | 'delivery' | 'trigger';
|
|
13
|
+
/**
|
|
14
|
+
* An action of a channel, as given to {@link ChannelDefinition.createMatcher}: one per address.
|
|
15
|
+
*/
|
|
16
|
+
export interface ChannelEntry {
|
|
17
|
+
/**
|
|
18
|
+
* The action's details: its address (`details.pattern`), controller, method, DTO and options.
|
|
19
|
+
*/
|
|
20
|
+
readonly details: ActionDetails;
|
|
21
|
+
/**
|
|
22
|
+
* The action's description, with the fields of {@link ChannelDefinition.describe}.
|
|
23
|
+
*/
|
|
24
|
+
readonly info: BaseActionInfo & Record<string, unknown>;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* The action matching a request, with the parameters taken from its address.
|
|
28
|
+
*/
|
|
29
|
+
export interface ChannelMatch {
|
|
30
|
+
/**
|
|
31
|
+
* The matching action: one of the entries given to {@link ChannelDefinition.createMatcher}.
|
|
32
|
+
*/
|
|
33
|
+
readonly entry: ChannelEntry;
|
|
34
|
+
/**
|
|
35
|
+
* The parameters taken from the request's address (such as route parameters); they are merged into the action's
|
|
36
|
+
* input and take precedence over the request's data.
|
|
37
|
+
*/
|
|
38
|
+
readonly params?: Record<string, unknown>;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* The lookup of a channel's actions, created by {@link ChannelDefinition.createMatcher}.
|
|
42
|
+
*/
|
|
43
|
+
export interface ChannelMatcher {
|
|
44
|
+
/**
|
|
45
|
+
* Find the action of a request.
|
|
46
|
+
* @param context The request's context.
|
|
47
|
+
* @returns The matching action, `undefined` when none matches (the request then fails with
|
|
48
|
+
* {@link ChannelDefinition.notFound}).
|
|
49
|
+
*/
|
|
50
|
+
match(context: BaseContext): ChannelMatch | undefined;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* A channel: how the actions declare their addresses and how a request finds its action. The entrypoint package
|
|
54
|
+
* defines `http`, `cli`, `service` and `schedule`; a package providing another transport defines its channel with
|
|
55
|
+
* {@link defineChannel} and registers the actions of its decorators with `registerControllerAction`.
|
|
56
|
+
*/
|
|
57
|
+
export interface ChannelDefinition {
|
|
58
|
+
/**
|
|
59
|
+
* The channel's name, which is also the key of its adapters in the entrypoint options.
|
|
60
|
+
*/
|
|
61
|
+
readonly name: string;
|
|
62
|
+
/**
|
|
63
|
+
* How the channel's requests arrive.
|
|
64
|
+
*/
|
|
65
|
+
readonly kind: ChannelKind;
|
|
66
|
+
/**
|
|
67
|
+
* The `type` of the channel's request contexts; the access control rules are selected by it.
|
|
68
|
+
*/
|
|
69
|
+
readonly contextType: string;
|
|
70
|
+
/**
|
|
71
|
+
* Check, and possibly normalize, an address when an action is declared and when a controller prefix is applied to
|
|
72
|
+
* it; throw to reject it.
|
|
73
|
+
* @param address The address given to the action decorator.
|
|
74
|
+
* @returns The address to register.
|
|
75
|
+
*/
|
|
76
|
+
validate?(address: ActionPattern): ActionPattern;
|
|
77
|
+
/**
|
|
78
|
+
* The text identifying an address, from which the action's id is derived: two addresses with the same text are
|
|
79
|
+
* the same action.
|
|
80
|
+
* @param address The action's address.
|
|
81
|
+
* @returns The identifying text.
|
|
82
|
+
*/
|
|
83
|
+
identify(address: ActionPattern): string;
|
|
84
|
+
/**
|
|
85
|
+
* The fields describing an address in the action's description (such as `{route}` for HTTP).
|
|
86
|
+
* @param address The action's address.
|
|
87
|
+
* @returns The fields added to the action's description.
|
|
88
|
+
*/
|
|
89
|
+
describe(address: ActionPattern): Record<string, unknown>;
|
|
90
|
+
/**
|
|
91
|
+
* Apply a controller's prefixes to an address; without this method the channel's addresses are not prefixed.
|
|
92
|
+
* @param prefix The controller's prefixes (set with `@Prefix`).
|
|
93
|
+
* @param address The action's address.
|
|
94
|
+
* @returns The prefixed address, `undefined` when the prefixes do not concern the channel.
|
|
95
|
+
*/
|
|
96
|
+
prefix?(prefix: PrefixOptions, address: ActionPattern): ActionPattern | undefined;
|
|
97
|
+
/**
|
|
98
|
+
* Create the lookup of the channel's actions, once when the entrypoint starts.
|
|
99
|
+
* @param entries The channel's actions, one per address.
|
|
100
|
+
* @returns The lookup.
|
|
101
|
+
*/
|
|
102
|
+
createMatcher(entries: ChannelEntry[]): ChannelMatcher;
|
|
103
|
+
/**
|
|
104
|
+
* Prepare a matched request's context before its dispatch (the service channel removes the pattern keys from the
|
|
105
|
+
* data). Not called for the requests dispatched to an action directly (`ChannelRuntime.dispatchTo`).
|
|
106
|
+
* @param entry The matched action.
|
|
107
|
+
* @param context The request's context, changed in place.
|
|
108
|
+
*/
|
|
109
|
+
prepare?(entry: ChannelEntry, context: BaseContext): void;
|
|
110
|
+
/**
|
|
111
|
+
* The error a request matching no action fails with.
|
|
112
|
+
* @param context The request's context.
|
|
113
|
+
* @returns The error to throw.
|
|
114
|
+
*/
|
|
115
|
+
notFound(context: BaseContext): Error;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Define a channel. A package providing a channel defines it when it is loaded; defining the same definition object
|
|
119
|
+
* again does nothing.
|
|
120
|
+
* @param definition The channel's definition.
|
|
121
|
+
* @returns The same definition.
|
|
122
|
+
* @throws {InvalidChannelException} When another definition already has the name.
|
|
123
|
+
* @example
|
|
124
|
+
* ```typescript
|
|
125
|
+
* import {Controller, ControllerActionNotFoundException, type BaseContext, type ControllerProperty} from 'lakutata/com/entrypoint'
|
|
126
|
+
* import {defineChannel, registerControllerAction, type ChannelEntry} from '@lakutata/entrypoint/channel'
|
|
127
|
+
* import {FlexibleDTO} from 'lakutata/dtos'
|
|
128
|
+
*
|
|
129
|
+
* //A channel of the messages of a queue, addressed by their topic
|
|
130
|
+
* export const QueueChannel = defineChannel({
|
|
131
|
+
* name: 'queue',
|
|
132
|
+
* kind: 'delivery',
|
|
133
|
+
* contextType: 'QUEUE',
|
|
134
|
+
* identify: (address): string => address.topic,
|
|
135
|
+
* describe: (address): Record<string, unknown> => ({topic: address.topic}),
|
|
136
|
+
* createMatcher: (entries: ChannelEntry[]) => ({
|
|
137
|
+
* match: (context: BaseContext) => {
|
|
138
|
+
* const entry: ChannelEntry | undefined = entries.find(candidate => candidate.details.pattern.topic === context.topic)
|
|
139
|
+
* return entry ? {entry: entry} : undefined
|
|
140
|
+
* }
|
|
141
|
+
* }),
|
|
142
|
+
* notFound: (context: BaseContext): Error => new ControllerActionNotFoundException('No action handles the topic {topic}', {topic: context.topic})
|
|
143
|
+
* })
|
|
144
|
+
*
|
|
145
|
+
* //The decorator declaring the actions of the channel
|
|
146
|
+
* export function OnMessage(topic: string) {
|
|
147
|
+
* return <ClassPrototype extends Controller>(target: ClassPrototype, propertyKey: ControllerProperty<ClassPrototype>): void => {
|
|
148
|
+
* registerControllerAction(QueueChannel, target, propertyKey, {topic: topic}, FlexibleDTO, {})
|
|
149
|
+
* }
|
|
150
|
+
* }
|
|
151
|
+
* ```
|
|
152
|
+
*/
|
|
153
|
+
export declare function defineChannel<Definition extends ChannelDefinition>(definition: Definition): Definition;
|
|
154
|
+
/**
|
|
155
|
+
* Get a defined channel.
|
|
156
|
+
* @param name The channel's name.
|
|
157
|
+
* @returns The channel's definition.
|
|
158
|
+
* @throws {InvalidChannelException} When no channel has the name.
|
|
159
|
+
* @example
|
|
160
|
+
* ```typescript
|
|
161
|
+
* import {getChannel, type ChannelDefinition} from '@lakutata/entrypoint/channel'
|
|
162
|
+
*
|
|
163
|
+
* const http: ChannelDefinition = getChannel('http')
|
|
164
|
+
* console.log(http.kind, http.contextType) //request HTTP
|
|
165
|
+
* ```
|
|
166
|
+
*/
|
|
167
|
+
export declare function getChannel(name: string): ChannelDefinition;
|
|
168
|
+
/**
|
|
169
|
+
* Whether a channel is defined.
|
|
170
|
+
* @param name The channel's name.
|
|
171
|
+
* @returns `true` when a channel has the name.
|
|
172
|
+
* @example
|
|
173
|
+
* ```typescript
|
|
174
|
+
* import {hasChannel} from '@lakutata/entrypoint/channel'
|
|
175
|
+
*
|
|
176
|
+
* console.log(hasChannel('schedule')) //true
|
|
177
|
+
* console.log(hasChannel('queue')) //false until a package defines it
|
|
178
|
+
* ```
|
|
179
|
+
*/
|
|
180
|
+
export declare function hasChannel(name: string): boolean;
|
|
181
|
+
/**
|
|
182
|
+
* Find the channel whose requests have a context type.
|
|
183
|
+
* @param contextType The `type` of a request context (`HTTP`, `CLI`…).
|
|
184
|
+
* @returns The first channel defined with the context type, `undefined` when there is none.
|
|
185
|
+
* @example
|
|
186
|
+
* ```typescript
|
|
187
|
+
* import {ContextType, type BaseContext} from 'lakutata/com/entrypoint'
|
|
188
|
+
* import {getChannelByContextType} from '@lakutata/entrypoint/channel'
|
|
189
|
+
*
|
|
190
|
+
* declare const context: BaseContext
|
|
191
|
+
*
|
|
192
|
+
* console.log(getChannelByContextType(ContextType.SERVICE)?.name) //service
|
|
193
|
+
* console.log(getChannelByContextType(context.type)?.name)
|
|
194
|
+
* ```
|
|
195
|
+
*/
|
|
196
|
+
export declare function getChannelByContextType(contextType: string): ChannelDefinition | undefined;
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
import type { ActionPattern, BaseObject, DTO, IBaseObjectConstructor, JSONSchema, Module, Schema } from '@lakutata/core';
|
|
2
|
+
import type { Controller } from '../lib/Controller.js';
|
|
3
|
+
import type { BaseContext } from '../context/BaseContext.js';
|
|
4
|
+
import type { BaseActionInfo } from '../Entrypoint.js';
|
|
5
|
+
import type { MiddlewareDefinition } from '../lib/Middleware.js';
|
|
6
|
+
import type { ChannelDefinition } from './Channel.js';
|
|
7
|
+
/**
|
|
8
|
+
* The options of a request dispatched by an adapter ({@link ChannelRuntime.dispatch}).
|
|
9
|
+
*/
|
|
10
|
+
export interface DispatchOptions {
|
|
11
|
+
/**
|
|
12
|
+
* Aborts the request (its client went away, its deadline passed): the controller's `signal` aborts, the request's
|
|
13
|
+
* container is destroyed and the dispatch resolves to `undefined` at once. A request whose signal is already
|
|
14
|
+
* aborted is not run.
|
|
15
|
+
*/
|
|
16
|
+
readonly signal?: AbortSignal;
|
|
17
|
+
/**
|
|
18
|
+
* The parameters the transport took from the request's address (such as route parameters); they are merged into
|
|
19
|
+
* the action's input and take precedence over the request's data and the matcher's parameters.
|
|
20
|
+
*/
|
|
21
|
+
readonly params?: Record<string, unknown>;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* The description of an action given to the adapters ({@link ChannelRuntime.actions}): one per address (an HTTP route
|
|
25
|
+
* declared for two methods has two), with the fields of its channel (`route`, `command`, `pattern`…).
|
|
26
|
+
*/
|
|
27
|
+
export type ChannelActionInfo = BaseActionInfo & Record<string, unknown> & {
|
|
28
|
+
/**
|
|
29
|
+
* The action's address in its channel (`{route, method}` for HTTP, `{command}` for CLI, the pattern for service),
|
|
30
|
+
* with its controller prefix.
|
|
31
|
+
*/
|
|
32
|
+
readonly address: ActionPattern;
|
|
33
|
+
/**
|
|
34
|
+
* The DTO validating the action's input (`FlexibleDTO`, accepting any input, when the action declares none).
|
|
35
|
+
*/
|
|
36
|
+
readonly dto: typeof DTO;
|
|
37
|
+
/**
|
|
38
|
+
* The schema of the action's result, declared with `@Return`; `undefined` without it.
|
|
39
|
+
*/
|
|
40
|
+
readonly returnSchema: Schema | undefined;
|
|
41
|
+
};
|
|
42
|
+
/**
|
|
43
|
+
* What the entrypoint gives an adapter when it starts it ({@link EntrypointAdapter.start}): the channel's actions and
|
|
44
|
+
* the functions dispatching the requests to them.
|
|
45
|
+
*/
|
|
46
|
+
export interface ChannelRuntime<Context extends BaseContext = BaseContext> {
|
|
47
|
+
/**
|
|
48
|
+
* The adapter's channel.
|
|
49
|
+
*/
|
|
50
|
+
readonly channel: ChannelDefinition;
|
|
51
|
+
/**
|
|
52
|
+
* The module owning the entrypoint (the application).
|
|
53
|
+
*/
|
|
54
|
+
readonly module: Module;
|
|
55
|
+
/**
|
|
56
|
+
* The channel's actions, one per address.
|
|
57
|
+
*/
|
|
58
|
+
readonly actions: ReadonlyArray<ChannelActionInfo>;
|
|
59
|
+
/**
|
|
60
|
+
* The entrypoint's controller classes, for the channels serving what the controllers declare besides their actions
|
|
61
|
+
* (their prefixes, their metadata).
|
|
62
|
+
*/
|
|
63
|
+
readonly controllers: ReadonlyArray<IBaseObjectConstructor<Controller>>;
|
|
64
|
+
/**
|
|
65
|
+
* Get an object from the entrypoint's container, such as a component the adapter uses (an autoloaded class is
|
|
66
|
+
* registered on first use).
|
|
67
|
+
* @param target The object's registration name or symbol, or its class.
|
|
68
|
+
* @returns The object, once created and initialized.
|
|
69
|
+
* @throws {Error} When the object is not registered or fails to be created.
|
|
70
|
+
*/
|
|
71
|
+
getObject<T extends BaseObject>(target: string | symbol | IBaseObjectConstructor<T>): Promise<T>;
|
|
72
|
+
/**
|
|
73
|
+
* Resolves once every adapter of the entrypoint started and the application launched (its objects and its
|
|
74
|
+
* bootstrap are ready), for the adapters acting on their own rather than on requests (running a command,
|
|
75
|
+
* triggering the schedules). Without an application (a bare container) it never resolves unless the entrypoint's
|
|
76
|
+
* `launched()` is called.
|
|
77
|
+
*/
|
|
78
|
+
readonly ready: Promise<void>;
|
|
79
|
+
/**
|
|
80
|
+
* Dispatch a request to the action it matches: the request runs in a container of its own, through the
|
|
81
|
+
* middlewares, the input validation, the access control and the action. It is tracked as in progress until it
|
|
82
|
+
* ends, so the entrypoint waits for it when it stops.
|
|
83
|
+
* @param context The request's context, of the channel's context class.
|
|
84
|
+
* @param options The request's abort signal and address parameters.
|
|
85
|
+
* @returns The action's result; `undefined` when the request is aborted by its signal.
|
|
86
|
+
* @throws {Error} The channel's not-found error when no action matches (`ControllerActionNotFoundException` for
|
|
87
|
+
* the built-in channels), the input validation error, the access control's denial (`AccessDeniedException`), the
|
|
88
|
+
* error of a middleware or of the action, or `EntrypointStoppedException` when the entrypoint stopped before the
|
|
89
|
+
* request completed.
|
|
90
|
+
*/
|
|
91
|
+
dispatch(context: Context, options?: DispatchOptions): Promise<unknown>;
|
|
92
|
+
/**
|
|
93
|
+
* Dispatch a request to a given action without matching it, for the channels binding a trigger to each action
|
|
94
|
+
* (schedules, subscriptions); the request runs as with {@link ChannelRuntime.dispatch}.
|
|
95
|
+
* @param action One of the objects of {@link ChannelRuntime.actions} (compared by identity, not a copy).
|
|
96
|
+
* @param context The request's context, of the channel's context class.
|
|
97
|
+
* @param options The request's abort signal and address parameters.
|
|
98
|
+
* @returns The action's result; `undefined` when the request is aborted by its signal.
|
|
99
|
+
* @throws {Error} The channel's not-found error when the action is not one of the runtime's, and the errors of
|
|
100
|
+
* {@link ChannelRuntime.dispatch}.
|
|
101
|
+
*/
|
|
102
|
+
dispatchTo(action: ChannelActionInfo, context: Context, options?: DispatchOptions): Promise<unknown>;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* An adapter: a transport receiving a channel's requests (an HTTP server, a CLI parser, a socket server, the
|
|
106
|
+
* scheduler). It is given to the entrypoint options under its channel's key; the entrypoint starts it when it
|
|
107
|
+
* initializes and stops it, then closes it, when it is destroyed. The adapter packages export functions creating them
|
|
108
|
+
* (`expressHTTPEntrypoint()`, `scheduleEntrypoint()`…).
|
|
109
|
+
*/
|
|
110
|
+
export interface EntrypointAdapter<Context extends BaseContext = BaseContext> {
|
|
111
|
+
/**
|
|
112
|
+
* The adapter's channel, which is also its key in the entrypoint options.
|
|
113
|
+
*/
|
|
114
|
+
readonly channel: string;
|
|
115
|
+
/**
|
|
116
|
+
* The channel's definition, defined by the entrypoint before it starts the adapter (for the packages defining their
|
|
117
|
+
* channel with their adapter).
|
|
118
|
+
*/
|
|
119
|
+
readonly definition?: ChannelDefinition;
|
|
120
|
+
/**
|
|
121
|
+
* The adapter's name, to tell apart the adapters of a channel.
|
|
122
|
+
*/
|
|
123
|
+
readonly name?: string;
|
|
124
|
+
/**
|
|
125
|
+
* The middlewares run around the requests of this adapter, after the entrypoint's and before the controller's and
|
|
126
|
+
* the action's.
|
|
127
|
+
*/
|
|
128
|
+
readonly middlewares?: MiddlewareDefinition[];
|
|
129
|
+
/**
|
|
130
|
+
* Start receiving requests. The entrypoint starts its adapters one after the other and awaits each; a rejection
|
|
131
|
+
* fails the entrypoint's initialization.
|
|
132
|
+
* @param runtime The channel's actions and the functions dispatching the requests.
|
|
133
|
+
*/
|
|
134
|
+
start(runtime: ChannelRuntime<Context>): void | Promise<void>;
|
|
135
|
+
/**
|
|
136
|
+
* Stop receiving requests; the entrypoint then waits for the requests in progress (aborting them after its
|
|
137
|
+
* `shutdownTimeout`) before it calls {@link EntrypointAdapter.close}.
|
|
138
|
+
*/
|
|
139
|
+
stop?(): void | Promise<void>;
|
|
140
|
+
/**
|
|
141
|
+
* Release the resources (connections, servers) once the requests in progress ended or were aborted.
|
|
142
|
+
*/
|
|
143
|
+
close?(): void | Promise<void>;
|
|
144
|
+
/**
|
|
145
|
+
* Push an event to a client of the adapter (a window's renderer, a socket); its listeners receive the arguments.
|
|
146
|
+
* Called by {@link Entrypoint.notify}.
|
|
147
|
+
* @param clientId The client's id, as set in its requests' contexts (`ServiceContext.clientId`).
|
|
148
|
+
* @param event The event's name.
|
|
149
|
+
* @param args The arguments given to the client's listeners.
|
|
150
|
+
* @returns Whether the adapter has the client.
|
|
151
|
+
*/
|
|
152
|
+
notify?(clientId: string, event: string, args: unknown[]): boolean;
|
|
153
|
+
/**
|
|
154
|
+
* Push an event to every client of the adapter. Called by {@link Entrypoint.broadcast}.
|
|
155
|
+
* @param event The event's name.
|
|
156
|
+
* @param args The arguments given to the clients' listeners.
|
|
157
|
+
* @returns The number of clients the event was pushed to.
|
|
158
|
+
*/
|
|
159
|
+
broadcast?(event: string, args: unknown[]): number;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Whether a value is an adapter: an object with a string `channel` and a `start` function.
|
|
163
|
+
* @param value The value to check.
|
|
164
|
+
* @returns `true` when the value is an adapter.
|
|
165
|
+
* @example
|
|
166
|
+
* ```typescript
|
|
167
|
+
* import {expressHTTPEntrypoint} from 'lakutata/adapter/express'
|
|
168
|
+
* import {isEntrypointAdapter} from '@lakutata/entrypoint/channel'
|
|
169
|
+
*
|
|
170
|
+
* console.log(isEntrypointAdapter(expressHTTPEntrypoint())) //true
|
|
171
|
+
* console.log(isEntrypointAdapter({channel: 'http'})) //false: no start function
|
|
172
|
+
* ```
|
|
173
|
+
*/
|
|
174
|
+
export declare function isEntrypointAdapter(value: unknown): value is EntrypointAdapter;
|
|
175
|
+
/**
|
|
176
|
+
* Map the commands of CLI actions to the JSON schemas of their input, as a CLI adapter builds its commands from.
|
|
177
|
+
* @param actions The CLI channel's actions ({@link ChannelRuntime.actions} of a CLI adapter).
|
|
178
|
+
* @returns Each command mapped to its input's JSON schema; an action without command is mapped under `undefined`.
|
|
179
|
+
* @example
|
|
180
|
+
* ```typescript
|
|
181
|
+
* import {type CLIContext, type EntrypointAdapter} from 'lakutata/com/entrypoint'
|
|
182
|
+
* import {commandMap} from '@lakutata/entrypoint/channel'
|
|
183
|
+
*
|
|
184
|
+
* //A CLI adapter printing the commands and their options
|
|
185
|
+
* export const HelpCLIEntrypoint: EntrypointAdapter<CLIContext> = {
|
|
186
|
+
* channel: 'cli',
|
|
187
|
+
* start: (runtime): void => {
|
|
188
|
+
* for (const [command, schema] of commandMap(runtime.actions)) {
|
|
189
|
+
* console.log(command, Object.keys(schema.properties ?? {}).join(' '))
|
|
190
|
+
* }
|
|
191
|
+
* }
|
|
192
|
+
* }
|
|
193
|
+
* ```
|
|
194
|
+
*/
|
|
195
|
+
export declare function commandMap(actions: ReadonlyArray<ChannelActionInfo>): Map<string, JSONSchema>;
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { DTO, type ActionPattern } from '@lakutata/core';
|
|
2
|
+
/**
|
|
3
|
+
* The kinds of the request contexts of the built-in channels, held by `BaseContext.type`.
|
|
4
|
+
*/
|
|
5
|
+
export declare enum ContextType {
|
|
6
|
+
/**
|
|
7
|
+
* A command of a CLI adapter (`CLIContext`).
|
|
8
|
+
*/
|
|
9
|
+
CLI = "CLI",
|
|
10
|
+
/**
|
|
11
|
+
* A request of an HTTP adapter (`HTTPContext`).
|
|
12
|
+
*/
|
|
13
|
+
HTTP = "HTTP",
|
|
14
|
+
/**
|
|
15
|
+
* A message of a service adapter: Socket.IO, JSON-RPC, Electron IPC, HTTP service (`ServiceContext`).
|
|
16
|
+
*/
|
|
17
|
+
SERVICE = "SERVICE",
|
|
18
|
+
/**
|
|
19
|
+
* A run of a scheduled action (`ScheduleContext`).
|
|
20
|
+
*/
|
|
21
|
+
SCHEDULE = "SCHEDULE"
|
|
22
|
+
}
|
|
23
|
+
export type ContextParams<T extends {} = {}> = T & Record<string, any>;
|
|
24
|
+
/**
|
|
25
|
+
* The context of a request: what an adapter knows about it, given to the controller (`this.context`), the middlewares
|
|
26
|
+
* (`invocation.context`) and the access control rules. Each channel has its subclass (`HTTPContext`, `CLIContext`,
|
|
27
|
+
* `ServiceContext`, `ScheduleContext`); test it with `instanceof` in an action serving several channels. A context is
|
|
28
|
+
* a DTO: its properties are validated when it is created and when they change; it also holds the extra properties
|
|
29
|
+
* given by its adapter (the Socket.IO socket, the JSON-RPC request), read by the adapters' helpers
|
|
30
|
+
* (`socketOfContext`…). The adapters create the contexts: an application only reads them.
|
|
31
|
+
* @example
|
|
32
|
+
* ```typescript
|
|
33
|
+
* import {Controller, CLIContext, HTTPContext, ServiceContext} from 'lakutata/com/entrypoint'
|
|
34
|
+
* import {CLIAction, GET, ServiceAction} from 'lakutata/decorator/ctrl'
|
|
35
|
+
*
|
|
36
|
+
* class VersionController extends Controller {
|
|
37
|
+
* //One action for the three channels: the context tells them apart
|
|
38
|
+
* @GET('/version')
|
|
39
|
+
* @CLIAction('version')
|
|
40
|
+
* @ServiceAction({act: 'version'})
|
|
41
|
+
* public async version(): Promise<{ version: string, via: string }> {
|
|
42
|
+
* let via: string = this.context.type
|
|
43
|
+
* if (this.context instanceof HTTPContext) via = `${this.context.method.toUpperCase()} ${this.context.route}`
|
|
44
|
+
* if (this.context instanceof CLIContext) via = `the command ${this.context.command}`
|
|
45
|
+
* if (this.context instanceof ServiceContext) via = `the client ${this.context.clientId ?? 'unknown'}`
|
|
46
|
+
* return {version: '1.0.0', via: via}
|
|
47
|
+
* }
|
|
48
|
+
* }
|
|
49
|
+
* ```
|
|
50
|
+
*/
|
|
51
|
+
export declare class BaseContext<T extends Record<string, any> = {}> extends DTO {
|
|
52
|
+
/**
|
|
53
|
+
* The kind of the context: a `ContextType` for the built-in channels, the context type declared by its channel for
|
|
54
|
+
* the channels of other packages.
|
|
55
|
+
*/
|
|
56
|
+
readonly type: ContextType | string;
|
|
57
|
+
/**
|
|
58
|
+
* The input of the action before its validation: for HTTP the query string merged with the parsed body (the route
|
|
59
|
+
* parameters are merged over it when the action runs, not into it), for CLI the arguments and the options of the
|
|
60
|
+
* command, for a service the message without the keys of the action's pattern, for a scheduled run an empty
|
|
61
|
+
* object. A middleware may change it before the validation.
|
|
62
|
+
*/
|
|
63
|
+
data: ActionPattern<T>;
|
|
64
|
+
/**
|
|
65
|
+
* The language of the request (a BCP 47 tag such as `'zh-CN'`), set by the i18n middleware (`I18nMiddleware` of
|
|
66
|
+
* `lakutata/com/i18n`): the validation errors of an invalid input are then written in it. Undefined without it.
|
|
67
|
+
*/
|
|
68
|
+
locale?: string;
|
|
69
|
+
/**
|
|
70
|
+
* Create a context, validating its properties.
|
|
71
|
+
* @param params The properties of the context: its `type`, its `data`, and those of its channel.
|
|
72
|
+
* @throws {InvalidValueException} When a property is invalid or a required one is missing.
|
|
73
|
+
*/
|
|
74
|
+
constructor(params: ContextParams);
|
|
75
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { BaseContext, type ContextParams, ContextType } from './BaseContext.js';
|
|
2
|
+
import { type CLIContextParams } from '../types/CLIContextParams.js';
|
|
3
|
+
/**
|
|
4
|
+
* The context of a command run by a CLI adapter (`commanderCLIEntrypoint`): `this.context` of a controller action
|
|
5
|
+
* declared with `@CLIAction`, when it runs as a command. Its `data` holds the positional arguments and the options of
|
|
6
|
+
* the command, before their validation.
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* import {Controller, CLIContext} from 'lakutata/com/entrypoint'
|
|
10
|
+
* import {CLIAction} from 'lakutata/decorator/ctrl'
|
|
11
|
+
*
|
|
12
|
+
* class CacheController extends Controller {
|
|
13
|
+
* //"app cache clear" prints "cache clear: done"
|
|
14
|
+
* @CLIAction('cache clear')
|
|
15
|
+
* public async clear(): Promise<string> {
|
|
16
|
+
* const command: string = this.context instanceof CLIContext ? this.context.command : 'unknown'
|
|
17
|
+
* return `${command}: done`
|
|
18
|
+
* }
|
|
19
|
+
* }
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
export declare class CLIContext<T extends Record<string, any> = {}> extends BaseContext<T> {
|
|
23
|
+
/**
|
|
24
|
+
* Always `ContextType.CLI`.
|
|
25
|
+
*/
|
|
26
|
+
readonly type: ContextType;
|
|
27
|
+
/**
|
|
28
|
+
* The command of the action as declared, its controller prefix included (`'user:get <id>'`), not the arguments
|
|
29
|
+
* typed by the user.
|
|
30
|
+
*/
|
|
31
|
+
command: string;
|
|
32
|
+
/**
|
|
33
|
+
* Create the context of a command, validating its properties.
|
|
34
|
+
* @param params The command and its data.
|
|
35
|
+
* @throws {InvalidValueException} When a property is invalid or a required one is missing.
|
|
36
|
+
*/
|
|
37
|
+
constructor(params: ContextParams<CLIContextParams>);
|
|
38
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { BaseContext, type ContextParams, ContextType } from './BaseContext.js';
|
|
2
|
+
import { IncomingMessage, ServerResponse } from 'node:http';
|
|
3
|
+
import { type HTTPContextParams } from '../types/HTTPContextParams.js';
|
|
4
|
+
/**
|
|
5
|
+
* The context of a request served by an HTTP adapter (`expressHTTPEntrypoint`, `fastifyHTTPEntrypoint`):
|
|
6
|
+
* `this.context` of a controller action declared with `@HTTPAction` or `@GET`…, when it runs for an HTTP request. It
|
|
7
|
+
* gives the Node.js request and response, to read or set headers; once an action has sent the response itself (its
|
|
8
|
+
* headers sent), the adapter writes neither its value nor its error.
|
|
9
|
+
* @example
|
|
10
|
+
* ```typescript
|
|
11
|
+
* import {Controller, HTTPContext} from 'lakutata/com/entrypoint'
|
|
12
|
+
* import {GET} from 'lakutata/decorator/ctrl'
|
|
13
|
+
*
|
|
14
|
+
* class AgentController extends Controller {
|
|
15
|
+
* //GET /agent: answered with the header Cache-Control and the JSON {"agent": "curl/8.0", "route": "/agent"}
|
|
16
|
+
* @GET('/agent')
|
|
17
|
+
* public async agent(): Promise<{ agent: string, route: string }> {
|
|
18
|
+
* if (!(this.context instanceof HTTPContext)) return {agent: '', route: ''}
|
|
19
|
+
* this.context.response.setHeader('Cache-Control', 'no-store')
|
|
20
|
+
* return {agent: this.context.request.headers['user-agent'] ?? '', route: this.context.route}
|
|
21
|
+
* }
|
|
22
|
+
* }
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
export declare class HTTPContext<T extends Record<string, any> = {}> extends BaseContext<T> {
|
|
26
|
+
/**
|
|
27
|
+
* Always `ContextType.HTTP`.
|
|
28
|
+
*/
|
|
29
|
+
readonly type: ContextType;
|
|
30
|
+
/**
|
|
31
|
+
* The route of the action as declared, its controller prefix included (`'/users/:id'`), not the requested path.
|
|
32
|
+
*/
|
|
33
|
+
readonly route: string;
|
|
34
|
+
/**
|
|
35
|
+
* The HTTP method of the action, as declared (`'get'` for `@GET`).
|
|
36
|
+
*/
|
|
37
|
+
readonly method: string;
|
|
38
|
+
/**
|
|
39
|
+
* The Node.js request (the raw request of Fastify, the Express request).
|
|
40
|
+
*/
|
|
41
|
+
readonly request: IncomingMessage;
|
|
42
|
+
/**
|
|
43
|
+
* The Node.js response (the raw reply of Fastify, the Express response).
|
|
44
|
+
*/
|
|
45
|
+
readonly response: ServerResponse;
|
|
46
|
+
/**
|
|
47
|
+
* Create the context of an HTTP request, validating its properties.
|
|
48
|
+
* @param params The route, the method, the request, the response and the data of the request.
|
|
49
|
+
* @throws {InvalidValueException} When a property is invalid or a required one is missing.
|
|
50
|
+
*/
|
|
51
|
+
constructor(params: ContextParams<HTTPContextParams>);
|
|
52
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { BaseContext, type ContextParams, ContextType } from './BaseContext.js';
|
|
2
|
+
import { type ScheduleContextParams } from '../types/ScheduleContextParams.js';
|
|
3
|
+
/**
|
|
4
|
+
* The context of a run of a scheduled action (`scheduleEntrypoint`): `this.context` of a controller action declared
|
|
5
|
+
* with `@Schedule`, when the schedule runs it. Its `data` is an empty object.
|
|
6
|
+
* @example
|
|
7
|
+
* ```typescript
|
|
8
|
+
* import {Controller, ScheduleContext} from 'lakutata/com/entrypoint'
|
|
9
|
+
* import {Schedule} from 'lakutata/decorator/ctrl'
|
|
10
|
+
*
|
|
11
|
+
* class ReportController extends Controller {
|
|
12
|
+
* //Every hour: logs "run 1 of every 1h, planned at …", then "run 2…"
|
|
13
|
+
* @Schedule('1h')
|
|
14
|
+
* public async hourly(): Promise<void> {
|
|
15
|
+
* if (!(this.context instanceof ScheduleContext)) return
|
|
16
|
+
* const delay: number = Date.now() - this.context.scheduledAt.getTime()
|
|
17
|
+
* console.log(`run ${this.context.run} of ${this.context.schedule}, planned at ${this.context.scheduledAt.toISOString()} (${delay}ms late)`)
|
|
18
|
+
* }
|
|
19
|
+
* }
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
export declare class ScheduleContext<T extends Record<string, any> = {}> extends BaseContext<T> {
|
|
23
|
+
/**
|
|
24
|
+
* Always `ContextType.SCHEDULE`.
|
|
25
|
+
*/
|
|
26
|
+
readonly type: ContextType;
|
|
27
|
+
/**
|
|
28
|
+
* The schedule of the action, as a text: `'every '` and the interval as declared (`'every 30s'`, `'every 500ms'` for a
|
|
29
|
+
* number), or `'cron '` and the expression (`'cron 0 * * * *'`).
|
|
30
|
+
*/
|
|
31
|
+
readonly schedule: string;
|
|
32
|
+
/**
|
|
33
|
+
* The time the run was planned for; the run starts at it or a little later (the time of the launch for the
|
|
34
|
+
* `immediate` run).
|
|
35
|
+
*/
|
|
36
|
+
readonly scheduledAt: Date;
|
|
37
|
+
/**
|
|
38
|
+
* The number of the run in this process, from 1, counting the runs started (not the skipped ones).
|
|
39
|
+
*/
|
|
40
|
+
readonly run: number;
|
|
41
|
+
/**
|
|
42
|
+
* Create the context of a scheduled run, validating its properties.
|
|
43
|
+
* @param params The schedule, the planned time, the run number and the data of the run.
|
|
44
|
+
* @throws {InvalidValueException} When a property is invalid or a required one is missing.
|
|
45
|
+
*/
|
|
46
|
+
constructor(params: ContextParams<ScheduleContextParams>);
|
|
47
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { type ActionPattern } from '@lakutata/core';
|
|
2
|
+
import { BaseContext, type ContextParams, ContextType } from './BaseContext.js';
|
|
3
|
+
import { type ServiceContextParams } from '../types/ServiceContextParams.js';
|
|
4
|
+
/**
|
|
5
|
+
* The context of a message received by a service adapter (`socketIOServiceEntrypoint`, `jsonRPCServiceEntrypoint`,
|
|
6
|
+
* `electronIPCServiceEntrypoint`, `httpServiceEntrypoint`): `this.context` of a controller action declared with
|
|
7
|
+
* `@ServiceAction`, when it runs for a message. Its `input` is the whole message, matched against the actions'
|
|
8
|
+
* patterns; its `data` is the message without the keys of the matched pattern. The adapters' helpers give the
|
|
9
|
+
* transport objects (`socketOfContext`, `httpRequestOfContext`, `ipcEventOfContext`, `jsonRPCRequestOfContext`).
|
|
10
|
+
* @example
|
|
11
|
+
* ```typescript
|
|
12
|
+
* import {Controller, ServiceContext} from 'lakutata/com/entrypoint'
|
|
13
|
+
* import {ServiceAction} from 'lakutata/decorator/ctrl'
|
|
14
|
+
*
|
|
15
|
+
* class ChatController extends Controller {
|
|
16
|
+
* //The message {act: 'join', room: 'lobby'}: answered with the payload {room: 'lobby', client: <the client id>}
|
|
17
|
+
* @ServiceAction({act: 'join'})
|
|
18
|
+
* public async join(input: { room: string }): Promise<{ room: string, client?: string }> {
|
|
19
|
+
* const client: string | undefined = this.context instanceof ServiceContext ? this.context.clientId : undefined
|
|
20
|
+
* return {room: input.room, client: client}
|
|
21
|
+
* }
|
|
22
|
+
* }
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
export declare class ServiceContext<T extends Record<string, any> = {}> extends BaseContext<T> {
|
|
26
|
+
/**
|
|
27
|
+
* Always `ContextType.SERVICE`.
|
|
28
|
+
*/
|
|
29
|
+
readonly type: ContextType;
|
|
30
|
+
/**
|
|
31
|
+
* The message as received, matched against the actions' patterns: a copy of the data given at creation, which
|
|
32
|
+
* keeps the keys of the pattern (they are removed from `data` once the action is matched), the nested ones
|
|
33
|
+
* included.
|
|
34
|
+
*/
|
|
35
|
+
input: ActionPattern<T>;
|
|
36
|
+
/**
|
|
37
|
+
* The id of the client of the request (the renderer of an Electron window, a Socket.IO socket, an HTTP service
|
|
38
|
+
* client): `Entrypoint.notify()` pushes events to it by this id. Undefined for the transports without clients.
|
|
39
|
+
*/
|
|
40
|
+
readonly clientId?: string;
|
|
41
|
+
/**
|
|
42
|
+
* Create the context of a service message, validating its properties; `input` is set to a copy of `data`.
|
|
43
|
+
* @param params The message (`data`), its client id, and the adapter's extra properties.
|
|
44
|
+
* @throws {InvalidValueException} When a property is invalid or a required one is missing.
|
|
45
|
+
*/
|
|
46
|
+
constructor(params: ContextParams<ServiceContextParams>);
|
|
47
|
+
}
|