@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.
Files changed (325) hide show
  1. package/LICENSE +23 -0
  2. package/README.md +183 -0
  3. package/THIRD_PARTY_NOTICES.md +206 -0
  4. package/dist/cjs/Entrypoint.d.ts +868 -0
  5. package/dist/cjs/Entrypoint.js +998 -0
  6. package/dist/cjs/adapter/commander/CommanderCLIEntrypoint.d.ts +192 -0
  7. package/dist/cjs/adapter/commander/CommanderCLIEntrypoint.js +439 -0
  8. package/dist/cjs/adapter/commander/Prompt.d.ts +22 -0
  9. package/dist/cjs/adapter/commander/Prompt.js +164 -0
  10. package/dist/cjs/adapter/commander/Width.d.ts +12 -0
  11. package/dist/cjs/adapter/commander/Width.js +67 -0
  12. package/dist/cjs/adapter/electron/ElectronIPCServiceEntrypoint.d.ts +203 -0
  13. package/dist/cjs/adapter/electron/ElectronIPCServiceEntrypoint.js +249 -0
  14. package/dist/cjs/adapter/express/ExpressHTTPEntrypoint.d.ts +172 -0
  15. package/dist/cjs/adapter/express/ExpressHTTPEntrypoint.js +301 -0
  16. package/dist/cjs/adapter/express/Responders.d.ts +89 -0
  17. package/dist/cjs/adapter/express/Responders.js +71 -0
  18. package/dist/cjs/adapter/express/StaticUI.d.ts +83 -0
  19. package/dist/cjs/adapter/express/StaticUI.js +104 -0
  20. package/dist/cjs/adapter/fastify/FastifyHTTPEntrypoint.d.ts +156 -0
  21. package/dist/cjs/adapter/fastify/FastifyHTTPEntrypoint.js +339 -0
  22. package/dist/cjs/adapter/fastify/Responders.d.ts +88 -0
  23. package/dist/cjs/adapter/fastify/Responders.js +77 -0
  24. package/dist/cjs/adapter/http/HTTPServiceEntrypoint.d.ts +117 -0
  25. package/dist/cjs/adapter/http/HTTPServiceEntrypoint.js +257 -0
  26. package/dist/cjs/adapter/jsonrpc/JSONRPCProtocol.d.ts +194 -0
  27. package/dist/cjs/adapter/jsonrpc/JSONRPCProtocol.js +187 -0
  28. package/dist/cjs/adapter/jsonrpc/JSONRPCServiceEntrypoint.d.ts +154 -0
  29. package/dist/cjs/adapter/jsonrpc/JSONRPCServiceEntrypoint.js +397 -0
  30. package/dist/cjs/adapter/schedule/ScheduleEntrypoint.d.ts +86 -0
  31. package/dist/cjs/adapter/schedule/ScheduleEntrypoint.js +275 -0
  32. package/dist/cjs/adapter/socket.io/SocketIOServiceEntrypoint.d.ts +138 -0
  33. package/dist/cjs/adapter/socket.io/SocketIOServiceEntrypoint.js +216 -0
  34. package/dist/cjs/channel/BuiltinChannels.d.ts +18 -0
  35. package/dist/cjs/channel/BuiltinChannels.js +128 -0
  36. package/dist/cjs/channel/Channel.d.ts +196 -0
  37. package/dist/cjs/channel/Channel.js +106 -0
  38. package/dist/cjs/channel/EntrypointAdapter.d.ts +195 -0
  39. package/dist/cjs/channel/EntrypointAdapter.js +43 -0
  40. package/dist/cjs/context/BaseContext.d.ts +75 -0
  41. package/dist/cjs/context/BaseContext.js +90 -0
  42. package/dist/cjs/context/CLIContext.d.ts +38 -0
  43. package/dist/cjs/context/CLIContext.js +53 -0
  44. package/dist/cjs/context/HTTPContext.d.ts +52 -0
  45. package/dist/cjs/context/HTTPContext.js +78 -0
  46. package/dist/cjs/context/ScheduleContext.d.ts +47 -0
  47. package/dist/cjs/context/ScheduleContext.js +65 -0
  48. package/dist/cjs/context/ServiceContext.d.ts +47 -0
  49. package/dist/cjs/context/ServiceContext.js +62 -0
  50. package/dist/cjs/decorators/CLIAction.d.ts +120 -0
  51. package/dist/cjs/decorators/CLIAction.js +13 -0
  52. package/dist/cjs/decorators/HTTPAction.d.ts +178 -0
  53. package/dist/cjs/decorators/HTTPAction.js +14 -0
  54. package/dist/cjs/decorators/Prefix.d.ts +44 -0
  55. package/dist/cjs/decorators/Prefix.js +48 -0
  56. package/dist/cjs/decorators/Schedule.d.ts +120 -0
  57. package/dist/cjs/decorators/Schedule.js +64 -0
  58. package/dist/cjs/decorators/ServiceAction.d.ts +116 -0
  59. package/dist/cjs/decorators/ServiceAction.js +12 -0
  60. package/dist/cjs/decorators/UseMiddlewares.d.ts +52 -0
  61. package/dist/cjs/decorators/UseMiddlewares.js +58 -0
  62. package/dist/cjs/decorators/http/DELETE.d.ts +87 -0
  63. package/dist/cjs/decorators/http/DELETE.js +7 -0
  64. package/dist/cjs/decorators/http/GET.d.ts +89 -0
  65. package/dist/cjs/decorators/http/GET.js +7 -0
  66. package/dist/cjs/decorators/http/HEAD.d.ts +84 -0
  67. package/dist/cjs/decorators/http/HEAD.js +7 -0
  68. package/dist/cjs/decorators/http/OPTIONS.d.ts +80 -0
  69. package/dist/cjs/decorators/http/OPTIONS.js +7 -0
  70. package/dist/cjs/decorators/http/PATCH.d.ts +90 -0
  71. package/dist/cjs/decorators/http/PATCH.js +7 -0
  72. package/dist/cjs/decorators/http/POST.d.ts +91 -0
  73. package/dist/cjs/decorators/http/POST.js +7 -0
  74. package/dist/cjs/decorators/http/PUT.d.ts +92 -0
  75. package/dist/cjs/decorators/http/PUT.js +7 -0
  76. package/dist/cjs/exceptions/AccessDeniedException.d.ts +10 -0
  77. package/dist/cjs/exceptions/AccessDeniedException.js +17 -0
  78. package/dist/cjs/exceptions/ControllerActionNotFoundException.d.ts +9 -0
  79. package/dist/cjs/exceptions/ControllerActionNotFoundException.js +16 -0
  80. package/dist/cjs/exceptions/DuplicateActionNameException.d.ts +8 -0
  81. package/dist/cjs/exceptions/DuplicateActionNameException.js +15 -0
  82. package/dist/cjs/exceptions/EntrypointStoppedException.d.ts +9 -0
  83. package/dist/cjs/exceptions/EntrypointStoppedException.js +16 -0
  84. package/dist/cjs/exceptions/InvalidActionGroupException.d.ts +4 -0
  85. package/dist/cjs/exceptions/InvalidActionGroupException.js +11 -0
  86. package/dist/cjs/exceptions/InvalidChannelException.d.ts +8 -0
  87. package/dist/cjs/exceptions/InvalidChannelException.js +15 -0
  88. package/dist/cjs/exceptions/InvalidEntrypointAdapterException.d.ts +9 -0
  89. package/dist/cjs/exceptions/InvalidEntrypointAdapterException.js +16 -0
  90. package/dist/cjs/exceptions/InvalidMiddlewareException.d.ts +8 -0
  91. package/dist/cjs/exceptions/InvalidMiddlewareException.js +15 -0
  92. package/dist/cjs/exceptions/InvalidPrefixException.d.ts +8 -0
  93. package/dist/cjs/exceptions/InvalidPrefixException.js +15 -0
  94. package/dist/cjs/exceptions/MiddlewareNextCalledException.d.ts +8 -0
  95. package/dist/cjs/exceptions/MiddlewareNextCalledException.js +15 -0
  96. package/dist/cjs/exceptions/RouteNotFoundException.d.ts +9 -0
  97. package/dist/cjs/exceptions/RouteNotFoundException.js +16 -0
  98. package/dist/cjs/exceptions/ServiceInvokeException.d.ts +11 -0
  99. package/dist/cjs/exceptions/ServiceInvokeException.js +14 -0
  100. package/dist/cjs/exports/CTRLDecorators.d.ts +13 -0
  101. package/dist/cjs/exports/CTRLDecorators.js +38 -0
  102. package/dist/cjs/exports/Channel.d.ts +14 -0
  103. package/dist/cjs/exports/Channel.js +33 -0
  104. package/dist/cjs/exports/CommanderAdapter.d.ts +1 -0
  105. package/dist/cjs/exports/CommanderAdapter.js +8 -0
  106. package/dist/cjs/exports/ElectronAdapter.d.ts +1 -0
  107. package/dist/cjs/exports/ElectronAdapter.js +9 -0
  108. package/dist/cjs/exports/Entrypoint.d.ts +24 -0
  109. package/dist/cjs/exports/Entrypoint.js +55 -0
  110. package/dist/cjs/exports/ExpressAdapter.d.ts +4 -0
  111. package/dist/cjs/exports/ExpressAdapter.js +15 -0
  112. package/dist/cjs/exports/FastifyAdapter.d.ts +4 -0
  113. package/dist/cjs/exports/FastifyAdapter.js +14 -0
  114. package/dist/cjs/exports/JSONRPCAdapter.d.ts +2 -0
  115. package/dist/cjs/exports/JSONRPCAdapter.js +11 -0
  116. package/dist/cjs/exports/SocketIOAdapter.d.ts +1 -0
  117. package/dist/cjs/exports/SocketIOAdapter.js +9 -0
  118. package/dist/cjs/lib/AccessControl.d.ts +118 -0
  119. package/dist/cjs/lib/AccessControl.js +208 -0
  120. package/dist/cjs/lib/AccessControlRule.d.ts +91 -0
  121. package/dist/cjs/lib/AccessControlRule.js +76 -0
  122. package/dist/cjs/lib/ActionOptions.d.ts +67 -0
  123. package/dist/cjs/lib/ActionOptions.js +67 -0
  124. package/dist/cjs/lib/ActionResult.d.ts +28 -0
  125. package/dist/cjs/lib/ActionResult.js +28 -0
  126. package/dist/cjs/lib/ApplicationOf.d.ts +6 -0
  127. package/dist/cjs/lib/ApplicationOf.js +14 -0
  128. package/dist/cjs/lib/Controller.d.ts +59 -0
  129. package/dist/cjs/lib/Controller.js +64 -0
  130. package/dist/cjs/lib/ControllerEntrypoint.d.ts +168 -0
  131. package/dist/cjs/lib/ControllerEntrypoint.js +239 -0
  132. package/dist/cjs/lib/GetActionDTOAndOptions.d.ts +29 -0
  133. package/dist/cjs/lib/GetActionDTOAndOptions.js +49 -0
  134. package/dist/cjs/lib/HTTPErrors.d.ts +55 -0
  135. package/dist/cjs/lib/HTTPErrors.js +52 -0
  136. package/dist/cjs/lib/Middleware.d.ts +146 -0
  137. package/dist/cjs/lib/Middleware.js +144 -0
  138. package/dist/cjs/lib/Prefix.d.ts +98 -0
  139. package/dist/cjs/lib/Prefix.js +151 -0
  140. package/dist/cjs/lib/Result.d.ts +173 -0
  141. package/dist/cjs/lib/Result.js +153 -0
  142. package/dist/cjs/lib/ServiceResponseCodec.d.ts +82 -0
  143. package/dist/cjs/lib/ServiceResponseCodec.js +117 -0
  144. package/dist/cjs/lib/StringifyPattern.d.ts +7 -0
  145. package/dist/cjs/lib/StringifyPattern.js +58 -0
  146. package/dist/cjs/lib/UnsetValue.d.ts +12 -0
  147. package/dist/cjs/lib/UnsetValue.js +216 -0
  148. package/dist/cjs/lib/pattern/GlobPattern.d.ts +34 -0
  149. package/dist/cjs/lib/pattern/GlobPattern.js +68 -0
  150. package/dist/cjs/lib/pattern/PatternManager.d.ts +103 -0
  151. package/dist/cjs/lib/pattern/PatternManager.js +233 -0
  152. package/dist/cjs/lib/schedule/Cron.d.ts +56 -0
  153. package/dist/cjs/lib/schedule/Cron.js +282 -0
  154. package/dist/cjs/package.json +1 -0
  155. package/dist/cjs/types/CLIContextParams.d.ts +14 -0
  156. package/dist/cjs/types/CLIContextParams.js +2 -0
  157. package/dist/cjs/types/ErrorDescription.d.ts +14 -0
  158. package/dist/cjs/types/ErrorDescription.js +2 -0
  159. package/dist/cjs/types/HTTPContextParams.d.ts +27 -0
  160. package/dist/cjs/types/HTTPContextParams.js +2 -0
  161. package/dist/cjs/types/ScheduleContextParams.d.ts +21 -0
  162. package/dist/cjs/types/ScheduleContextParams.js +2 -0
  163. package/dist/cjs/types/ServiceContextParams.d.ts +16 -0
  164. package/dist/cjs/types/ServiceContextParams.js +2 -0
  165. package/dist/esm/Entrypoint.js +985 -0
  166. package/dist/esm/adapter/commander/CommanderCLIEntrypoint.js +433 -0
  167. package/dist/esm/adapter/commander/Prompt.js +127 -0
  168. package/dist/esm/adapter/commander/Width.js +63 -0
  169. package/dist/esm/adapter/electron/ElectronIPCServiceEntrypoint.js +212 -0
  170. package/dist/esm/adapter/express/ExpressHTTPEntrypoint.js +295 -0
  171. package/dist/esm/adapter/express/Responders.js +66 -0
  172. package/dist/esm/adapter/express/StaticUI.js +96 -0
  173. package/dist/esm/adapter/fastify/FastifyHTTPEntrypoint.js +333 -0
  174. package/dist/esm/adapter/fastify/Responders.js +73 -0
  175. package/dist/esm/adapter/http/HTTPServiceEntrypoint.js +253 -0
  176. package/dist/esm/adapter/jsonrpc/JSONRPCProtocol.js +182 -0
  177. package/dist/esm/adapter/jsonrpc/JSONRPCServiceEntrypoint.js +361 -0
  178. package/dist/esm/adapter/schedule/ScheduleEntrypoint.js +272 -0
  179. package/dist/esm/adapter/socket.io/SocketIOServiceEntrypoint.js +212 -0
  180. package/dist/esm/channel/BuiltinChannels.js +125 -0
  181. package/dist/esm/channel/Channel.js +100 -0
  182. package/dist/esm/channel/EntrypointAdapter.js +39 -0
  183. package/dist/esm/context/BaseContext.js +87 -0
  184. package/dist/esm/context/CLIContext.js +49 -0
  185. package/dist/esm/context/HTTPContext.js +74 -0
  186. package/dist/esm/context/ScheduleContext.js +61 -0
  187. package/dist/esm/context/ServiceContext.js +58 -0
  188. package/dist/esm/decorators/CLIAction.js +10 -0
  189. package/dist/esm/decorators/HTTPAction.js +11 -0
  190. package/dist/esm/decorators/Prefix.js +45 -0
  191. package/dist/esm/decorators/Schedule.js +61 -0
  192. package/dist/esm/decorators/ServiceAction.js +9 -0
  193. package/dist/esm/decorators/UseMiddlewares.js +55 -0
  194. package/dist/esm/decorators/http/DELETE.js +4 -0
  195. package/dist/esm/decorators/http/GET.js +4 -0
  196. package/dist/esm/decorators/http/HEAD.js +4 -0
  197. package/dist/esm/decorators/http/OPTIONS.js +4 -0
  198. package/dist/esm/decorators/http/PATCH.js +4 -0
  199. package/dist/esm/decorators/http/POST.js +4 -0
  200. package/dist/esm/decorators/http/PUT.js +4 -0
  201. package/dist/esm/exceptions/AccessDeniedException.js +13 -0
  202. package/dist/esm/exceptions/ControllerActionNotFoundException.js +12 -0
  203. package/dist/esm/exceptions/DuplicateActionNameException.js +11 -0
  204. package/dist/esm/exceptions/EntrypointStoppedException.js +12 -0
  205. package/dist/esm/exceptions/InvalidActionGroupException.js +7 -0
  206. package/dist/esm/exceptions/InvalidChannelException.js +11 -0
  207. package/dist/esm/exceptions/InvalidEntrypointAdapterException.js +12 -0
  208. package/dist/esm/exceptions/InvalidMiddlewareException.js +11 -0
  209. package/dist/esm/exceptions/InvalidPrefixException.js +11 -0
  210. package/dist/esm/exceptions/MiddlewareNextCalledException.js +11 -0
  211. package/dist/esm/exceptions/RouteNotFoundException.js +12 -0
  212. package/dist/esm/exceptions/ServiceInvokeException.js +10 -0
  213. package/dist/esm/exports/CTRLDecorators.js +19 -0
  214. package/dist/esm/exports/Channel.js +11 -0
  215. package/dist/esm/exports/CommanderAdapter.js +1 -0
  216. package/dist/esm/exports/ElectronAdapter.js +1 -0
  217. package/dist/esm/exports/Entrypoint.js +22 -0
  218. package/dist/esm/exports/ExpressAdapter.js +3 -0
  219. package/dist/esm/exports/FastifyAdapter.js +3 -0
  220. package/dist/esm/exports/JSONRPCAdapter.js +2 -0
  221. package/dist/esm/exports/SocketIOAdapter.js +1 -0
  222. package/dist/esm/lib/AccessControl.js +204 -0
  223. package/dist/esm/lib/AccessControlRule.js +72 -0
  224. package/dist/esm/lib/ActionOptions.js +63 -0
  225. package/dist/esm/lib/ActionResult.js +24 -0
  226. package/dist/esm/lib/ApplicationOf.js +11 -0
  227. package/dist/esm/lib/Controller.js +61 -0
  228. package/dist/esm/lib/ControllerEntrypoint.js +229 -0
  229. package/dist/esm/lib/GetActionDTOAndOptions.js +46 -0
  230. package/dist/esm/lib/HTTPErrors.js +48 -0
  231. package/dist/esm/lib/Middleware.js +134 -0
  232. package/dist/esm/lib/Prefix.js +143 -0
  233. package/dist/esm/lib/Result.js +147 -0
  234. package/dist/esm/lib/ServiceResponseCodec.js +113 -0
  235. package/dist/esm/lib/StringifyPattern.js +55 -0
  236. package/dist/esm/lib/UnsetValue.js +213 -0
  237. package/dist/esm/lib/pattern/GlobPattern.js +64 -0
  238. package/dist/esm/lib/pattern/PatternManager.js +229 -0
  239. package/dist/esm/lib/schedule/Cron.js +277 -0
  240. package/dist/esm/types/CLIContextParams.js +1 -0
  241. package/dist/esm/types/ErrorDescription.js +1 -0
  242. package/dist/esm/types/HTTPContextParams.js +1 -0
  243. package/dist/esm/types/ScheduleContextParams.js +1 -0
  244. package/dist/esm/types/ServiceContextParams.js +1 -0
  245. package/dist/types/Entrypoint.d.ts +868 -0
  246. package/dist/types/adapter/commander/CommanderCLIEntrypoint.d.ts +192 -0
  247. package/dist/types/adapter/commander/Prompt.d.ts +22 -0
  248. package/dist/types/adapter/commander/Width.d.ts +12 -0
  249. package/dist/types/adapter/electron/ElectronIPCServiceEntrypoint.d.ts +203 -0
  250. package/dist/types/adapter/express/ExpressHTTPEntrypoint.d.ts +172 -0
  251. package/dist/types/adapter/express/Responders.d.ts +89 -0
  252. package/dist/types/adapter/express/StaticUI.d.ts +83 -0
  253. package/dist/types/adapter/fastify/FastifyHTTPEntrypoint.d.ts +156 -0
  254. package/dist/types/adapter/fastify/Responders.d.ts +88 -0
  255. package/dist/types/adapter/http/HTTPServiceEntrypoint.d.ts +117 -0
  256. package/dist/types/adapter/jsonrpc/JSONRPCProtocol.d.ts +194 -0
  257. package/dist/types/adapter/jsonrpc/JSONRPCServiceEntrypoint.d.ts +154 -0
  258. package/dist/types/adapter/schedule/ScheduleEntrypoint.d.ts +86 -0
  259. package/dist/types/adapter/socket.io/SocketIOServiceEntrypoint.d.ts +138 -0
  260. package/dist/types/channel/BuiltinChannels.d.ts +18 -0
  261. package/dist/types/channel/Channel.d.ts +196 -0
  262. package/dist/types/channel/EntrypointAdapter.d.ts +195 -0
  263. package/dist/types/context/BaseContext.d.ts +75 -0
  264. package/dist/types/context/CLIContext.d.ts +38 -0
  265. package/dist/types/context/HTTPContext.d.ts +52 -0
  266. package/dist/types/context/ScheduleContext.d.ts +47 -0
  267. package/dist/types/context/ServiceContext.d.ts +47 -0
  268. package/dist/types/decorators/CLIAction.d.ts +120 -0
  269. package/dist/types/decorators/HTTPAction.d.ts +178 -0
  270. package/dist/types/decorators/Prefix.d.ts +44 -0
  271. package/dist/types/decorators/Schedule.d.ts +120 -0
  272. package/dist/types/decorators/ServiceAction.d.ts +116 -0
  273. package/dist/types/decorators/UseMiddlewares.d.ts +52 -0
  274. package/dist/types/decorators/http/DELETE.d.ts +87 -0
  275. package/dist/types/decorators/http/GET.d.ts +89 -0
  276. package/dist/types/decorators/http/HEAD.d.ts +84 -0
  277. package/dist/types/decorators/http/OPTIONS.d.ts +80 -0
  278. package/dist/types/decorators/http/PATCH.d.ts +90 -0
  279. package/dist/types/decorators/http/POST.d.ts +91 -0
  280. package/dist/types/decorators/http/PUT.d.ts +92 -0
  281. package/dist/types/exceptions/AccessDeniedException.d.ts +10 -0
  282. package/dist/types/exceptions/ControllerActionNotFoundException.d.ts +9 -0
  283. package/dist/types/exceptions/DuplicateActionNameException.d.ts +8 -0
  284. package/dist/types/exceptions/EntrypointStoppedException.d.ts +9 -0
  285. package/dist/types/exceptions/InvalidActionGroupException.d.ts +4 -0
  286. package/dist/types/exceptions/InvalidChannelException.d.ts +8 -0
  287. package/dist/types/exceptions/InvalidEntrypointAdapterException.d.ts +9 -0
  288. package/dist/types/exceptions/InvalidMiddlewareException.d.ts +8 -0
  289. package/dist/types/exceptions/InvalidPrefixException.d.ts +8 -0
  290. package/dist/types/exceptions/MiddlewareNextCalledException.d.ts +8 -0
  291. package/dist/types/exceptions/RouteNotFoundException.d.ts +9 -0
  292. package/dist/types/exceptions/ServiceInvokeException.d.ts +11 -0
  293. package/dist/types/exports/CTRLDecorators.d.ts +13 -0
  294. package/dist/types/exports/Channel.d.ts +14 -0
  295. package/dist/types/exports/CommanderAdapter.d.ts +1 -0
  296. package/dist/types/exports/ElectronAdapter.d.ts +1 -0
  297. package/dist/types/exports/Entrypoint.d.ts +24 -0
  298. package/dist/types/exports/ExpressAdapter.d.ts +4 -0
  299. package/dist/types/exports/FastifyAdapter.d.ts +4 -0
  300. package/dist/types/exports/JSONRPCAdapter.d.ts +2 -0
  301. package/dist/types/exports/SocketIOAdapter.d.ts +1 -0
  302. package/dist/types/lib/AccessControl.d.ts +118 -0
  303. package/dist/types/lib/AccessControlRule.d.ts +91 -0
  304. package/dist/types/lib/ActionOptions.d.ts +67 -0
  305. package/dist/types/lib/ActionResult.d.ts +28 -0
  306. package/dist/types/lib/ApplicationOf.d.ts +6 -0
  307. package/dist/types/lib/Controller.d.ts +59 -0
  308. package/dist/types/lib/ControllerEntrypoint.d.ts +168 -0
  309. package/dist/types/lib/GetActionDTOAndOptions.d.ts +29 -0
  310. package/dist/types/lib/HTTPErrors.d.ts +55 -0
  311. package/dist/types/lib/Middleware.d.ts +146 -0
  312. package/dist/types/lib/Prefix.d.ts +98 -0
  313. package/dist/types/lib/Result.d.ts +173 -0
  314. package/dist/types/lib/ServiceResponseCodec.d.ts +82 -0
  315. package/dist/types/lib/StringifyPattern.d.ts +7 -0
  316. package/dist/types/lib/UnsetValue.d.ts +12 -0
  317. package/dist/types/lib/pattern/GlobPattern.d.ts +34 -0
  318. package/dist/types/lib/pattern/PatternManager.d.ts +103 -0
  319. package/dist/types/lib/schedule/Cron.d.ts +56 -0
  320. package/dist/types/types/CLIContextParams.d.ts +14 -0
  321. package/dist/types/types/ErrorDescription.d.ts +14 -0
  322. package/dist/types/types/HTTPContextParams.d.ts +27 -0
  323. package/dist/types/types/ScheduleContextParams.d.ts +21 -0
  324. package/dist/types/types/ServiceContextParams.d.ts +16 -0
  325. package/package.json +152 -0
@@ -0,0 +1,249 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.ipcEventOfContext = ipcEventOfContext;
37
+ exports.electronIPCServiceEntrypoint = electronIPCServiceEntrypoint;
38
+ const ServiceContext_js_1 = require("../../context/ServiceContext.js");
39
+ const BuiltinChannels_js_1 = require("../../channel/BuiltinChannels.js");
40
+ const ServiceResponseCodec_js_1 = require("../../lib/ServiceResponseCodec.js");
41
+ const EntrypointStoppedException_js_1 = require("../../exceptions/EntrypointStoppedException.js");
42
+ /**
43
+ * Get the IPC event of a service action's request, when {@link electronIPCServiceEntrypoint} serves it (to reach the
44
+ * invoking renderer or frame).
45
+ * @param context The service action's context (`this.context` in a controller).
46
+ * @returns The IPC event (Electron's `IpcMainInvokeEvent`, typed as `Event`), or `undefined` when another adapter serves
47
+ * the request.
48
+ * @example
49
+ * ```typescript
50
+ * import {Controller, ServiceContext} from 'lakutata/com/entrypoint'
51
+ * import {ipcEventOfContext} from 'lakutata/adapter/electron'
52
+ * import {ServiceAction} from 'lakutata/decorator/ctrl'
53
+ * import type {IpcMainInvokeEvent} from 'electron'
54
+ *
55
+ * class WindowController extends Controller {
56
+ * //ipcRenderer.invoke('lakutata:service', {cmd: 'window.url'})
57
+ * @ServiceAction({cmd: 'window.url'})
58
+ * public async url(): Promise<string | undefined> {
59
+ * return ipcEventOfContext<IpcMainInvokeEvent>(this.context as ServiceContext)?.sender.getURL()
60
+ * }
61
+ * }
62
+ * ```
63
+ */
64
+ function ipcEventOfContext(context) {
65
+ return context.event;
66
+ }
67
+ /**
68
+ * The ipcMain of the main process of Electron
69
+ */
70
+ async function loadIPCMain() {
71
+ let ipcMain;
72
+ try {
73
+ //Electron is not a dependency: it is loaded where it runs
74
+ const electronModule = 'electron';
75
+ const electron = await Promise.resolve(`${electronModule}`).then(s => __importStar(require(s)));
76
+ ipcMain = electron.ipcMain ?? electron.default?.ipcMain;
77
+ }
78
+ catch {
79
+ ipcMain = undefined;
80
+ }
81
+ if (!ipcMain)
82
+ throw new Error('electronIPCServiceEntrypoint runs in the main process of Electron (or is given its ipcMain)');
83
+ return ipcMain;
84
+ }
85
+ /**
86
+ * Create a service adapter of an entrypoint served over Electron's IPC, in the main process. It needs the optional
87
+ * peer dependency `electron`: without the `ipcMain` option, the entrypoint fails to start outside Electron's main
88
+ * process.
89
+ *
90
+ * A renderer invokes the channel with the action's pattern and input, and optionally its client id:
91
+ * `ipcRenderer.invoke('lakutata:service', {cmd: 'echo', text: 'hi'}, clientId)`. The invocation resolves to
92
+ * `{success, error, payload}` (see `ServiceResponseCodec`): `payload` is the result, or `error` the whole error object
93
+ * when the action failed (no matching action, validation…).
94
+ *
95
+ * Each page is a client, identified by the id it gives (a non-empty string of at most 200 characters), which its
96
+ * requests carry as `ServiceContext.clientId`. A page registers by sending its id on `<channel>:subscribe` (or with
97
+ * any invocation giving it); a page reloaded in the same frame replaces its previous id. The events pushed by
98
+ * `Entrypoint.notify` and `Entrypoint.broadcast` are sent to the page's frame on `<channel>:event` with the event name
99
+ * and its arguments array. A destroyed renderer drops its clients.
100
+ *
101
+ * When a renderer is destroyed, its requests in progress are aborted (their abort signal fires). When the entrypoint
102
+ * stops, the new invocations resolve to an `EntrypointStoppedException` error; once the requests in progress end, the
103
+ * IPC handlers are removed.
104
+ * @param options The adapter options; by default it serves the channel `'lakutata:service'` on Electron's `ipcMain`.
105
+ * @returns The adapter, to give to the `service` option of `buildEntrypoints`.
106
+ * @example
107
+ * ```typescript
108
+ * import {Application} from 'lakutata'
109
+ * import {buildEntrypoints, Controller} from 'lakutata/com/entrypoint'
110
+ * import {ServiceAction} from 'lakutata/decorator/ctrl'
111
+ * import {electronIPCServiceEntrypoint} from 'lakutata/adapter/electron'
112
+ * import type {IpcRenderer, IpcRendererEvent} from 'electron'
113
+ *
114
+ * class EchoController extends Controller {
115
+ * @ServiceAction({cmd: 'echo'})
116
+ * public async echo(input: {text: string}): Promise<string> {
117
+ * return input.text
118
+ * }
119
+ * }
120
+ *
121
+ * //In the main process
122
+ * Application.run({
123
+ * id: 'desktop.app',
124
+ * name: 'Desktop',
125
+ * components: {
126
+ * entrypoint: buildEntrypoints({
127
+ * controllers: [EchoController],
128
+ * service: electronIPCServiceEntrypoint()
129
+ * })
130
+ * }
131
+ * })
132
+ *
133
+ * //In the preload script of a window
134
+ * declare const ipcRenderer: IpcRenderer
135
+ * const clientId: string = crypto.randomUUID()
136
+ * //The events pushed by entrypoint.notify(clientId, 'progress', 50)
137
+ * ipcRenderer.on('lakutata:service:event', (event: IpcRendererEvent, name: string, args: unknown[]): void => console.log(name, ...args))
138
+ * ipcRenderer.send('lakutata:service:subscribe', clientId)
139
+ * //{success: true, error: null, payload: 'hi'}
140
+ * console.log(await ipcRenderer.invoke('lakutata:service', {cmd: 'echo', text: 'hi'}, clientId))
141
+ * ```
142
+ */
143
+ function electronIPCServiceEntrypoint(options = {}) {
144
+ const channel = options.channel ?? 'lakutata:service';
145
+ const eventChannel = `${channel}:event`;
146
+ const subscribeChannel = `${channel}:subscribe`;
147
+ let ipcMain;
148
+ let stopping = false;
149
+ //The clients by their ids, the renderers whose destruction removes their clients
150
+ const clients = new Map();
151
+ const watched = new WeakSet();
152
+ /**
153
+ * Register the client of a page, by the id it gives (the one of the page loaded: a page loaded again in the main
154
+ * frame of its window replaces its client); undefined without id
155
+ * @param event
156
+ * @param clientId
157
+ */
158
+ const register = (event, clientId) => {
159
+ if (typeof clientId !== 'string' || !clientId || clientId.length > 200)
160
+ return undefined;
161
+ if (clients.get(clientId)?.sender === event.sender)
162
+ return clientId;
163
+ const frame = event.processId !== undefined && event.frameId !== undefined ? [event.processId, event.frameId] : undefined;
164
+ const main = !event.senderFrame?.parent;
165
+ for (const [id, client] of clients) {
166
+ const sameFrame = !!frame && !!client.frame && client.frame[0] === frame[0] && client.frame[1] === frame[1];
167
+ if (client.sender === event.sender && (sameFrame || (main && client.main)))
168
+ clients.delete(id);
169
+ }
170
+ clients.set(clientId, { sender: event.sender, frame: frame, main: main });
171
+ if (!watched.has(event.sender)) {
172
+ watched.add(event.sender);
173
+ event.sender.once('destroyed', () => {
174
+ for (const [id, client] of clients)
175
+ if (client.sender === event.sender)
176
+ clients.delete(id);
177
+ });
178
+ }
179
+ return clientId;
180
+ };
181
+ /**
182
+ * Send an event to a client, in its frame
183
+ * @param clientId
184
+ * @param client
185
+ * @param event
186
+ * @param args
187
+ */
188
+ const send = (clientId, client, event, args) => {
189
+ if (client.sender.isDestroyed?.()) {
190
+ clients.delete(clientId);
191
+ return false;
192
+ }
193
+ if (client.frame && client.sender.sendToFrame)
194
+ client.sender.sendToFrame(client.frame, eventChannel, event, args);
195
+ else if (client.sender.send)
196
+ client.sender.send(eventChannel, event, args);
197
+ else
198
+ return false;
199
+ return true;
200
+ };
201
+ return {
202
+ channel: 'service',
203
+ definition: BuiltinChannels_js_1.ServiceChannel,
204
+ name: options.name,
205
+ middlewares: options.middlewares,
206
+ start: async (runtime) => {
207
+ ipcMain = options.ipcMain ?? await loadIPCMain();
208
+ ipcMain.on?.(subscribeChannel, (event, clientId) => register(event, clientId));
209
+ ipcMain.handle(channel, async (event, data, clientId) => {
210
+ if (stopping)
211
+ return ServiceResponseCodec_js_1.ServiceResponseCodec.encodeError(new EntrypointStoppedException_js_1.EntrypointStoppedException('The entrypoint is stopping'));
212
+ //The request is aborted when its renderer is destroyed
213
+ const request = new AbortController();
214
+ const abort = () => request.abort();
215
+ event.sender.once('destroyed', abort);
216
+ try {
217
+ const context = new ServiceContext_js_1.ServiceContext({ data: data && typeof data === 'object' ? data : {}, event: event, clientId: register(event, clientId) });
218
+ return ServiceResponseCodec_js_1.ServiceResponseCodec.encode(await runtime.dispatch(context, { signal: request.signal }), false);
219
+ }
220
+ catch (error) {
221
+ return ServiceResponseCodec_js_1.ServiceResponseCodec.encodeError(error);
222
+ }
223
+ finally {
224
+ (event.sender.off ?? event.sender.removeListener)?.call(event.sender, 'destroyed', abort);
225
+ }
226
+ });
227
+ },
228
+ stop: () => {
229
+ //The new requests are refused, the requests in progress end
230
+ stopping = true;
231
+ },
232
+ close: () => {
233
+ ipcMain?.removeHandler(channel);
234
+ ipcMain?.removeAllListeners?.(subscribeChannel);
235
+ clients.clear();
236
+ },
237
+ notify: (clientId, event, args) => {
238
+ const client = clients.get(clientId);
239
+ return !!client && send(clientId, client, event, args);
240
+ },
241
+ broadcast: (event, args) => {
242
+ let sent = 0;
243
+ for (const [clientId, client] of [...clients])
244
+ if (send(clientId, client, event, args))
245
+ sent++;
246
+ return sent;
247
+ }
248
+ };
249
+ }
@@ -0,0 +1,172 @@
1
+ import { type Express, type Request, type RequestHandler } from 'express';
2
+ import { type Server, type ServerOptions } from 'node:http';
3
+ import type { Module } from '@lakutata/core';
4
+ import type { EntrypointAdapter } from '../../channel/EntrypointAdapter.js';
5
+ import type { MiddlewareDefinition } from '../../lib/Middleware.js';
6
+ import { HTTPContext } from '../../context/HTTPContext.js';
7
+ import { ExpressResponder } from './Responders.js';
8
+ /**
9
+ * What the `before` hook of {@link expressHTTPEntrypoint} receives besides the express application: the entrypoint's
10
+ * module, the HTTP server (not listening yet) and the routes the actions will occupy.
11
+ */
12
+ export type ExpressHookContext = {
13
+ /**
14
+ * The module owning the entrypoint, to get the application's objects from (`await module.getObject('db')`).
15
+ */
16
+ readonly module: Module;
17
+ /**
18
+ * The HTTP server serving the express application. It does not listen yet when the hook runs; attach other servers
19
+ * to it there (such as a socket.io server, see the `server` option of `socketIOServiceEntrypoint`).
20
+ */
21
+ readonly server: Server;
22
+ /**
23
+ * Each action route mapped to its HTTP methods, in lower case as declared (`'/users/:id'` → `{'get', 'delete'}`).
24
+ */
25
+ readonly routes: Map<string, Set<string>>;
26
+ /**
27
+ * The first segment of each action route (`'/device'`, `'/user'`…). A route starting with a parameter (`/:id`)
28
+ * adds none.
29
+ */
30
+ readonly actionPrefixes: string[];
31
+ /**
32
+ * Tell whether a request path belongs to the actions: it equals one of the action prefixes or starts with one
33
+ * followed by `/`.
34
+ */
35
+ readonly isActionPath: (requestPath: string) => boolean;
36
+ };
37
+ /**
38
+ * The options of {@link expressHTTPEntrypoint}.
39
+ */
40
+ export type ExpressHTTPEntrypointOptions = {
41
+ /**
42
+ * The adapter name, to tell apart several HTTP adapters of one entrypoint.
43
+ */
44
+ name?: string;
45
+ /**
46
+ * The port the server listens on; 0 picks a random free port. The entrypoint fails to start when the port is in use.
47
+ * @default 80
48
+ */
49
+ port?: number;
50
+ /**
51
+ * The host or address the server listens on.
52
+ * @default all the interfaces
53
+ */
54
+ host?: string;
55
+ /**
56
+ * The options of the Node.js HTTP server (`keepAliveTimeout`, `headersTimeout`, `requestTimeout`, in milliseconds…).
57
+ */
58
+ server?: ServerOptions & {
59
+ keepAliveTimeout?: number;
60
+ headersTimeout?: number;
61
+ requestTimeout?: number;
62
+ };
63
+ /**
64
+ * An existing express application to add the action routes to.
65
+ * @default a new express application
66
+ */
67
+ app?: Express;
68
+ /**
69
+ * The JSON and URL-encoded body parsers, with their size limit (bytes, or a text such as `'5mb'`); a larger body is
70
+ * answered with an error (413). `false` installs no parser, leaving the parsing to the application. The parsers are
71
+ * installed after the `before` hook, so the middlewares added there do not see a parsed body.
72
+ * @default {limit: '1mb'}
73
+ */
74
+ body?: false | {
75
+ limit?: string | number;
76
+ };
77
+ /**
78
+ * Build an action's input from a request. The route parameters are always merged over its result.
79
+ * @default the query parameters, then the properties of an object body over them
80
+ */
81
+ input?: (request: Request) => Record<string, unknown>;
82
+ /**
83
+ * How the results and the errors of the actions are written.
84
+ * @default JSONResponder
85
+ */
86
+ respond?: ExpressResponder;
87
+ /**
88
+ * The middlewares of this adapter's actions, run after the entrypoint's global middlewares.
89
+ */
90
+ middlewares?: MiddlewareDefinition[];
91
+ /**
92
+ * Run before the action routes are added, to add the application's own express middlewares and routes (they take
93
+ * precedence over the actions). A failure fails the entrypoint start.
94
+ */
95
+ before?: (app: Express, context: ExpressHookContext) => void | Promise<void>;
96
+ /**
97
+ * The handler of the requests that match no action and whose path is outside the action prefixes, such as the pages
98
+ * of a web application (see {@link staticUI}). The unmatched requests inside the action prefixes, and all of them
99
+ * without a fallback, are answered with a `RouteNotFoundException` (404).
100
+ */
101
+ fallback?: RequestHandler;
102
+ /**
103
+ * Run when the adapter stops, after the server is closed.
104
+ */
105
+ stop?: () => void | Promise<void>;
106
+ /**
107
+ * The interval between the comments keeping the event streams (`EventsResult`) alive through the proxies, in
108
+ * milliseconds.
109
+ * @default 15000
110
+ */
111
+ heartbeat?: number;
112
+ };
113
+ /**
114
+ * Create the HTTP adapter of an entrypoint served by an express application: each HTTP action (`@GET`, `@POST`,
115
+ * `@HTTPAction`…) becomes an express route. It needs the optional peer dependency `express`.
116
+ *
117
+ * An action's input is the request's query and body (see the `input` option) with the route parameters merged over
118
+ * them. Its result is written by the responder (JSON by default, 204 for no result); a `StatusResult` sets the status
119
+ * and the headers, a `FileResult` sends a file, a buffer or a stream (304 when its ETag matches `If-None-Match`), and an
120
+ * `EventsResult` streams Server-Sent Events. An action that writes the response itself (through
121
+ * `HTTPContext.response`) is left alone. The errors are written by the responder with their status (400 for the
122
+ * validation failures, 500 by default).
123
+ *
124
+ * When the client disconnects before the response, the action's abort signal fires and nothing is written. When the
125
+ * entrypoint stops, the server stops accepting connections, the event streams end, and the requests in progress are
126
+ * given up to one second after they settle to send their responses before the remaining connections are closed.
127
+ * @param options The adapter options; by default it listens on port 80 of all the interfaces with a new express
128
+ * application.
129
+ * @returns The adapter, to give to the `http` option of `buildEntrypoints`.
130
+ * @example
131
+ * ```typescript
132
+ * import {Application} from 'lakutata'
133
+ * import {buildEntrypoints, Controller} from 'lakutata/com/entrypoint'
134
+ * import {GET, POST} from 'lakutata/decorator/ctrl'
135
+ * import {expressHTTPEntrypoint, staticUI} from 'lakutata/adapter/express'
136
+ *
137
+ * class UserController extends Controller {
138
+ * //GET /users/1?verbose=true: the route parameter id merged over the query
139
+ * @GET('/users/:id')
140
+ * public async get(input: {id: string, verbose?: string}): Promise<{id: string}> {
141
+ * return {id: input.id}
142
+ * }
143
+ *
144
+ * //POST /users with the JSON body {"name": "Ada"}
145
+ * @POST('/users')
146
+ * public async create(input: {name: string}): Promise<{name: string}> {
147
+ * return {name: input.name}
148
+ * }
149
+ * }
150
+ *
151
+ * Application.run({
152
+ * id: 'web.app',
153
+ * name: 'Web',
154
+ * components: {
155
+ * entrypoint: buildEntrypoints({
156
+ * controllers: [UserController],
157
+ * http: expressHTTPEntrypoint({
158
+ * port: 8080,
159
+ * body: {limit: '5mb'},
160
+ * //The application's own routes, before the actions
161
+ * before: (app): void => {
162
+ * app.get('/health', (request, response): void => void response.send('ok'))
163
+ * },
164
+ * //The pages of the UI built in ./ui/dist, for the paths outside /users
165
+ * fallback: staticUI('./ui/dist')
166
+ * })
167
+ * })
168
+ * }
169
+ * })
170
+ * ```
171
+ */
172
+ export declare function expressHTTPEntrypoint(options?: ExpressHTTPEntrypointOptions): EntrypointAdapter<HTTPContext>;