@pikku/core 0.11.2 → 0.12.1

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 (436) hide show
  1. package/CHANGELOG.md +57 -2
  2. package/dist/crypto-utils.d.ts +2 -0
  3. package/dist/crypto-utils.js +78 -0
  4. package/dist/errors/errors.d.ts +14 -0
  5. package/dist/errors/errors.js +26 -0
  6. package/dist/errors/index.d.ts +1 -1
  7. package/dist/errors/index.js +1 -1
  8. package/dist/function/function-runner.d.ts +10 -4
  9. package/dist/function/function-runner.js +126 -45
  10. package/dist/function/functions.types.d.ts +32 -87
  11. package/dist/function/functions.types.js +16 -46
  12. package/dist/function/index.d.ts +2 -2
  13. package/dist/function/index.js +1 -2
  14. package/dist/handle-error.d.ts +2 -2
  15. package/dist/handle-error.js +3 -12
  16. package/dist/index.d.ts +30 -26
  17. package/dist/index.js +19 -29
  18. package/dist/internal.d.ts +3 -0
  19. package/dist/internal.js +2 -0
  20. package/dist/middleware/auth-apikey.d.ts +2 -2
  21. package/dist/middleware/auth-apikey.js +3 -3
  22. package/dist/middleware/auth-bearer.d.ts +3 -3
  23. package/dist/middleware/auth-bearer.js +4 -7
  24. package/dist/middleware/auth-cookie.d.ts +4 -4
  25. package/dist/middleware/auth-cookie.js +7 -9
  26. package/dist/middleware/cors.d.ts +46 -0
  27. package/dist/middleware/cors.js +81 -0
  28. package/dist/middleware/index.d.ts +5 -3
  29. package/dist/middleware/index.js +5 -3
  30. package/dist/middleware/remote-auth.d.ts +5 -0
  31. package/dist/middleware/remote-auth.js +55 -0
  32. package/dist/middleware/timeout.d.ts +2 -2
  33. package/dist/middleware-runner.d.ts +1 -1
  34. package/dist/middleware-runner.js +8 -10
  35. package/dist/permissions.d.ts +2 -2
  36. package/dist/permissions.js +11 -15
  37. package/dist/pikku-state.d.ts +10 -8
  38. package/dist/pikku-state.js +48 -25
  39. package/dist/schema.d.ts +4 -4
  40. package/dist/schema.js +20 -15
  41. package/dist/services/ai-agent-runner-service.d.ts +43 -0
  42. package/dist/services/ai-agent-runner-service.js +1 -0
  43. package/dist/services/ai-run-state-service.d.ts +13 -0
  44. package/dist/services/ai-run-state-service.js +1 -0
  45. package/dist/services/ai-storage-service.d.ts +18 -0
  46. package/dist/services/ai-storage-service.js +1 -0
  47. package/dist/services/content-service.d.ts +6 -0
  48. package/dist/services/deployment-service.d.ts +19 -0
  49. package/dist/services/deployment-service.js +1 -0
  50. package/dist/services/gopass-secrets.d.ts +47 -0
  51. package/dist/services/gopass-secrets.js +97 -0
  52. package/dist/services/in-memory-ai-run-state-service.d.ts +15 -0
  53. package/dist/services/in-memory-ai-run-state-service.js +44 -0
  54. package/dist/services/in-memory-trigger-service.d.ts +22 -0
  55. package/dist/services/in-memory-trigger-service.js +48 -0
  56. package/dist/services/in-memory-workflow-service.d.ts +59 -0
  57. package/dist/services/in-memory-workflow-service.js +287 -0
  58. package/dist/services/index.d.ts +26 -11
  59. package/dist/services/index.js +11 -13
  60. package/dist/services/local-content.d.ts +2 -1
  61. package/dist/services/local-content.js +6 -1
  62. package/dist/services/local-secrets.d.ts +25 -2
  63. package/dist/services/local-secrets.js +45 -0
  64. package/dist/services/local-variables.d.ts +6 -1
  65. package/dist/services/local-variables.js +18 -0
  66. package/dist/services/logger-console.d.ts +2 -1
  67. package/dist/services/scheduler-service.d.ts +9 -1
  68. package/dist/services/scheduler-service.js +8 -0
  69. package/dist/services/schema-service.d.ts +6 -0
  70. package/dist/services/scoped-secret-service.d.ts +16 -0
  71. package/dist/services/scoped-secret-service.js +35 -0
  72. package/dist/services/secret-service.d.ts +25 -4
  73. package/dist/services/trigger-service.d.ts +16 -0
  74. package/dist/services/trigger-service.js +1 -0
  75. package/dist/services/typed-secret-service.d.ts +30 -0
  76. package/dist/services/typed-secret-service.js +40 -0
  77. package/dist/services/typed-variables-service.d.ts +27 -0
  78. package/dist/services/typed-variables-service.js +46 -0
  79. package/dist/services/user-session-service.d.ts +15 -2
  80. package/dist/services/user-session-service.js +17 -0
  81. package/dist/services/variables-service.d.ts +5 -0
  82. package/dist/services/workflow-service.d.ts +9 -5
  83. package/dist/types/core.types.d.ts +67 -25
  84. package/dist/types/core.types.js +8 -1
  85. package/dist/types/state.types.d.ts +53 -59
  86. package/dist/utils.d.ts +7 -6
  87. package/dist/utils.js +27 -12
  88. package/dist/version.d.ts +6 -0
  89. package/dist/version.js +19 -0
  90. package/dist/wirings/ai-agent/ai-agent-assistant-ui.d.ts +5 -0
  91. package/dist/wirings/ai-agent/ai-agent-assistant-ui.js +146 -0
  92. package/dist/wirings/ai-agent/ai-agent-helpers.d.ts +28 -0
  93. package/dist/wirings/ai-agent/ai-agent-helpers.js +40 -0
  94. package/dist/wirings/ai-agent/ai-agent-memory.d.ts +29 -0
  95. package/dist/wirings/ai-agent/ai-agent-memory.js +199 -0
  96. package/dist/wirings/ai-agent/ai-agent-model-config.d.ts +9 -0
  97. package/dist/wirings/ai-agent/ai-agent-model-config.js +36 -0
  98. package/dist/wirings/ai-agent/ai-agent-prepare.d.ts +59 -0
  99. package/dist/wirings/ai-agent/ai-agent-prepare.js +348 -0
  100. package/dist/wirings/ai-agent/ai-agent-registry.d.ts +15 -0
  101. package/dist/wirings/ai-agent/ai-agent-registry.js +47 -0
  102. package/dist/wirings/ai-agent/ai-agent-runner.d.ts +3 -0
  103. package/dist/wirings/ai-agent/ai-agent-runner.js +195 -0
  104. package/dist/wirings/ai-agent/ai-agent-stream.d.ts +12 -0
  105. package/dist/wirings/ai-agent/ai-agent-stream.js +662 -0
  106. package/dist/wirings/ai-agent/ai-agent.types.d.ts +313 -0
  107. package/dist/wirings/ai-agent/ai-agent.types.js +1 -0
  108. package/dist/wirings/ai-agent/index.d.ts +7 -0
  109. package/dist/wirings/ai-agent/index.js +6 -0
  110. package/dist/wirings/channel/channel-common.d.ts +8 -5
  111. package/dist/wirings/channel/channel-common.js +15 -8
  112. package/dist/wirings/channel/channel-handler.d.ts +3 -3
  113. package/dist/wirings/channel/channel-handler.js +15 -6
  114. package/dist/wirings/channel/channel-middleware-runner.d.ts +9 -0
  115. package/dist/wirings/channel/channel-middleware-runner.js +73 -0
  116. package/dist/wirings/channel/channel-runner.d.ts +5 -5
  117. package/dist/wirings/channel/channel-runner.js +10 -9
  118. package/dist/wirings/channel/channel-store.d.ts +1 -1
  119. package/dist/wirings/channel/channel.types.d.ts +9 -7
  120. package/dist/wirings/channel/define-channel-routes.d.ts +21 -0
  121. package/dist/wirings/channel/define-channel-routes.js +23 -0
  122. package/dist/wirings/channel/index.d.ts +10 -8
  123. package/dist/wirings/channel/index.js +7 -8
  124. package/dist/wirings/channel/local/index.d.ts +3 -3
  125. package/dist/wirings/channel/local/index.js +3 -3
  126. package/dist/wirings/channel/local/local-channel-runner.d.ts +7 -2
  127. package/dist/wirings/channel/local/local-channel-runner.js +22 -9
  128. package/dist/wirings/channel/local/local-eventhub-service.d.ts +2 -2
  129. package/dist/wirings/channel/log-channels.d.ts +1 -1
  130. package/dist/wirings/channel/pikku-abstract-channel-handler.d.ts +1 -1
  131. package/dist/wirings/channel/serverless/index.d.ts +1 -1
  132. package/dist/wirings/channel/serverless/index.js +1 -1
  133. package/dist/wirings/channel/serverless/serverless-channel-runner.d.ts +4 -4
  134. package/dist/wirings/channel/serverless/serverless-channel-runner.js +40 -23
  135. package/dist/wirings/cli/channel/cli-channel-runner.d.ts +1 -1
  136. package/dist/wirings/cli/channel/index.d.ts +1 -1
  137. package/dist/wirings/cli/channel/index.js +1 -1
  138. package/dist/wirings/cli/cli-runner.d.ts +3 -3
  139. package/dist/wirings/cli/cli-runner.js +12 -8
  140. package/dist/wirings/cli/cli.types.d.ts +9 -9
  141. package/dist/wirings/cli/command-parser.d.ts +1 -1
  142. package/dist/wirings/cli/define-cli-commands.d.ts +19 -0
  143. package/dist/wirings/cli/define-cli-commands.js +20 -0
  144. package/dist/wirings/cli/index.d.ts +2 -3
  145. package/dist/wirings/cli/index.js +1 -3
  146. package/dist/wirings/http/http-routes.d.ts +69 -0
  147. package/dist/wirings/http/http-routes.js +139 -0
  148. package/dist/wirings/http/http-runner.d.ts +9 -9
  149. package/dist/wirings/http/http-runner.js +79 -34
  150. package/dist/wirings/http/http.types.d.ts +77 -41
  151. package/dist/wirings/http/index.d.ts +5 -4
  152. package/dist/wirings/http/index.js +4 -3
  153. package/dist/wirings/http/log-http-routes.d.ts +1 -1
  154. package/dist/wirings/http/pikku-fetch-http-request.d.ts +1 -1
  155. package/dist/wirings/http/pikku-fetch-http-response.d.ts +2 -2
  156. package/dist/wirings/http/pikku-fetch-http-response.js +6 -1
  157. package/dist/wirings/http/routers/http-router.d.ts +1 -1
  158. package/dist/wirings/http/routers/path-to-regex.d.ts +2 -2
  159. package/dist/wirings/mcp/index.d.ts +4 -3
  160. package/dist/wirings/mcp/index.js +3 -3
  161. package/dist/wirings/mcp/mcp-endpoint-registry.d.ts +1 -1
  162. package/dist/wirings/mcp/mcp-runner.d.ts +1 -6
  163. package/dist/wirings/mcp/mcp-runner.js +28 -40
  164. package/dist/wirings/mcp/mcp.types.d.ts +5 -5
  165. package/dist/wirings/node/index.d.ts +2 -0
  166. package/dist/wirings/node/index.js +1 -0
  167. package/dist/wirings/node/node.types.d.ts +20 -0
  168. package/dist/wirings/node/node.types.js +1 -0
  169. package/dist/wirings/oauth2/index.d.ts +3 -0
  170. package/dist/wirings/oauth2/index.js +2 -0
  171. package/dist/wirings/oauth2/oauth2-client.d.ts +47 -0
  172. package/dist/wirings/oauth2/oauth2-client.js +267 -0
  173. package/dist/wirings/oauth2/oauth2.types.d.ts +65 -0
  174. package/dist/wirings/oauth2/oauth2.types.js +4 -0
  175. package/dist/wirings/oauth2/wire-oauth2-credential.d.ts +20 -0
  176. package/dist/wirings/oauth2/wire-oauth2-credential.js +21 -0
  177. package/dist/wirings/queue/index.d.ts +1 -1
  178. package/dist/wirings/queue/queue-runner.d.ts +1 -5
  179. package/dist/wirings/queue/queue-runner.js +11 -8
  180. package/dist/wirings/queue/queue.types.d.ts +5 -5
  181. package/dist/wirings/queue/register-queue-helper.d.ts +2 -2
  182. package/dist/wirings/queue/register-queue-helper.js +1 -1
  183. package/dist/wirings/queue/validate-worker-config.d.ts +1 -1
  184. package/dist/wirings/rpc/index.d.ts +3 -1
  185. package/dist/wirings/rpc/index.js +2 -1
  186. package/dist/wirings/rpc/rpc-runner.d.ts +58 -8
  187. package/dist/wirings/rpc/rpc-runner.js +177 -31
  188. package/dist/wirings/rpc/rpc-types.d.ts +20 -4
  189. package/dist/wirings/rpc/wire-addon.d.ts +10 -0
  190. package/dist/wirings/rpc/wire-addon.js +9 -0
  191. package/dist/wirings/scheduler/index.d.ts +2 -2
  192. package/dist/wirings/scheduler/index.js +1 -2
  193. package/dist/wirings/scheduler/log-schedulers.d.ts +1 -1
  194. package/dist/wirings/scheduler/scheduler-runner.d.ts +3 -5
  195. package/dist/wirings/scheduler/scheduler-runner.js +11 -14
  196. package/dist/wirings/scheduler/scheduler.types.d.ts +2 -2
  197. package/dist/wirings/secret/index.d.ts +3 -0
  198. package/dist/wirings/secret/index.js +2 -0
  199. package/dist/wirings/secret/secret.types.d.ts +27 -0
  200. package/dist/wirings/secret/secret.types.js +1 -0
  201. package/dist/wirings/secret/validate-secret-definitions.d.ts +6 -0
  202. package/dist/wirings/secret/validate-secret-definitions.js +55 -0
  203. package/dist/wirings/trigger/index.d.ts +3 -2
  204. package/dist/wirings/trigger/index.js +2 -2
  205. package/dist/wirings/trigger/pikku-trigger-service.d.ts +22 -0
  206. package/dist/wirings/trigger/pikku-trigger-service.js +70 -0
  207. package/dist/wirings/trigger/trigger-runner.d.ts +18 -9
  208. package/dist/wirings/trigger/trigger-runner.js +48 -19
  209. package/dist/wirings/trigger/trigger.types.d.ts +99 -11
  210. package/dist/wirings/trigger/trigger.types.js +40 -1
  211. package/dist/wirings/variable/index.d.ts +3 -0
  212. package/dist/wirings/variable/index.js +2 -0
  213. package/dist/wirings/variable/validate-variable-definitions.d.ts +6 -0
  214. package/dist/wirings/variable/validate-variable-definitions.js +45 -0
  215. package/dist/wirings/variable/variable.types.d.ts +18 -0
  216. package/dist/wirings/variable/variable.types.js +1 -0
  217. package/dist/wirings/workflow/dsl/index.d.ts +1 -1
  218. package/dist/wirings/workflow/dsl/workflow-dsl.types.d.ts +7 -1
  219. package/dist/wirings/workflow/dsl/workflow-runner.js +3 -2
  220. package/dist/wirings/workflow/graph/graph-node.d.ts +1 -6
  221. package/dist/wirings/workflow/graph/graph-runner.d.ts +5 -31
  222. package/dist/wirings/workflow/graph/graph-runner.js +384 -296
  223. package/dist/wirings/workflow/graph/index.d.ts +4 -3
  224. package/dist/wirings/workflow/graph/index.js +3 -3
  225. package/dist/wirings/workflow/graph/template.d.ts +15 -0
  226. package/dist/wirings/workflow/graph/template.js +27 -0
  227. package/dist/wirings/workflow/graph/wire-workflow-graph.d.ts +15 -0
  228. package/dist/wirings/workflow/graph/wire-workflow-graph.js +8 -0
  229. package/dist/wirings/workflow/graph/workflow-graph.types.d.ts +0 -13
  230. package/dist/wirings/workflow/index.d.ts +6 -6
  231. package/dist/wirings/workflow/index.js +6 -4
  232. package/dist/wirings/workflow/pikku-workflow-service.d.ts +29 -19
  233. package/dist/wirings/workflow/pikku-workflow-service.js +217 -82
  234. package/dist/wirings/workflow/workflow-helpers.d.ts +36 -0
  235. package/dist/wirings/workflow/workflow-helpers.js +38 -0
  236. package/dist/wirings/workflow/workflow.types.d.ts +42 -95
  237. package/package.json +14 -15
  238. package/run-tests.sh +4 -1
  239. package/src/crypto-utils.test.ts +116 -0
  240. package/src/crypto-utils.ts +99 -0
  241. package/src/errors/error.test.ts +143 -2
  242. package/src/errors/errors.ts +27 -0
  243. package/src/errors/index.ts +1 -1
  244. package/src/factory-functions.test.ts +42 -2
  245. package/src/function/function-runner.test.ts +6 -13
  246. package/src/function/function-runner.ts +161 -53
  247. package/src/function/functions.types.ts +63 -132
  248. package/src/function/index.ts +5 -2
  249. package/src/handle-error.test.ts +361 -0
  250. package/src/handle-error.ts +6 -14
  251. package/src/index.ts +97 -30
  252. package/src/internal.ts +6 -0
  253. package/src/middleware/auth-apikey.test.ts +16 -13
  254. package/src/middleware/auth-apikey.ts +3 -3
  255. package/src/middleware/auth-bearer.test.ts +18 -15
  256. package/src/middleware/auth-bearer.ts +27 -32
  257. package/src/middleware/auth-cookie.test.ts +17 -14
  258. package/src/middleware/auth-cookie.ts +9 -13
  259. package/src/middleware/cors.test.ts +424 -0
  260. package/src/middleware/cors.ts +104 -0
  261. package/src/middleware/index.ts +5 -3
  262. package/src/middleware/remote-auth.test.ts +488 -0
  263. package/src/middleware/remote-auth.ts +68 -0
  264. package/src/middleware-runner.test.ts +123 -1
  265. package/src/middleware-runner.ts +13 -13
  266. package/src/permissions.test.ts +83 -9
  267. package/src/permissions.ts +17 -19
  268. package/src/pikku-state.test.ts +224 -0
  269. package/src/pikku-state.ts +59 -35
  270. package/src/run-tests-script.test.ts +49 -0
  271. package/src/schema.test.ts +198 -6
  272. package/src/schema.ts +28 -21
  273. package/src/services/ai-agent-runner-service.ts +41 -0
  274. package/src/services/ai-run-state-service.ts +20 -0
  275. package/src/services/ai-storage-service.ts +39 -0
  276. package/src/services/content-service.ts +7 -0
  277. package/src/services/deployment-service.ts +22 -0
  278. package/src/services/gopass-secrets.ts +98 -0
  279. package/src/services/in-memory-ai-run-state-service.ts +73 -0
  280. package/src/services/in-memory-trigger-service.ts +64 -0
  281. package/src/services/in-memory-workflow-service.test.ts +351 -0
  282. package/src/services/in-memory-workflow-service.ts +395 -0
  283. package/src/services/index.ts +50 -14
  284. package/src/services/local-content.ts +9 -3
  285. package/src/services/local-secrets.test.ts +80 -0
  286. package/src/services/local-secrets.ts +53 -2
  287. package/src/services/local-variables.test.ts +61 -0
  288. package/src/services/local-variables.ts +23 -1
  289. package/src/services/logger-console.test.ts +118 -0
  290. package/src/services/logger-console.ts +2 -1
  291. package/src/services/scheduler-service.ts +11 -1
  292. package/src/services/schema-service.ts +7 -0
  293. package/src/services/scoped-secret-service.test.ts +74 -0
  294. package/src/services/scoped-secret-service.ts +41 -0
  295. package/src/services/secret-service.ts +25 -4
  296. package/src/services/trigger-service.ts +17 -0
  297. package/src/services/typed-secret-service.test.ts +93 -0
  298. package/src/services/typed-secret-service.ts +70 -0
  299. package/src/services/typed-variables-service.test.ts +73 -0
  300. package/src/services/typed-variables-service.ts +81 -0
  301. package/src/services/user-session-service.test.ts +113 -0
  302. package/src/services/user-session-service.ts +25 -2
  303. package/src/services/variables-service.ts +5 -0
  304. package/src/services/workflow-service.ts +23 -13
  305. package/src/time-utils.test.ts +1 -1
  306. package/src/types/core.types.ts +95 -24
  307. package/src/types/state.types.ts +56 -73
  308. package/src/utils.test.ts +350 -0
  309. package/src/utils.ts +33 -18
  310. package/src/version.test.ts +80 -0
  311. package/src/version.ts +25 -0
  312. package/src/wirings/ai-agent/ai-agent-assistant-ui.test.ts +363 -0
  313. package/src/wirings/ai-agent/ai-agent-assistant-ui.ts +214 -0
  314. package/src/wirings/ai-agent/ai-agent-helpers.test.ts +152 -0
  315. package/src/wirings/ai-agent/ai-agent-helpers.ts +76 -0
  316. package/src/wirings/ai-agent/ai-agent-memory.ts +300 -0
  317. package/src/wirings/ai-agent/ai-agent-model-config.test.ts +115 -0
  318. package/src/wirings/ai-agent/ai-agent-model-config.ts +43 -0
  319. package/src/wirings/ai-agent/ai-agent-prepare.ts +504 -0
  320. package/src/wirings/ai-agent/ai-agent-registry.test.ts +37 -0
  321. package/src/wirings/ai-agent/ai-agent-registry.ts +82 -0
  322. package/src/wirings/ai-agent/ai-agent-runner.test.ts +317 -0
  323. package/src/wirings/ai-agent/ai-agent-runner.ts +251 -0
  324. package/src/wirings/ai-agent/ai-agent-stream.test.ts +652 -0
  325. package/src/wirings/ai-agent/ai-agent-stream.ts +1049 -0
  326. package/src/wirings/ai-agent/ai-agent.types.ts +328 -0
  327. package/src/wirings/ai-agent/index.ts +39 -0
  328. package/src/wirings/channel/channel-common.ts +33 -20
  329. package/src/wirings/channel/channel-handler.ts +26 -9
  330. package/src/wirings/channel/channel-middleware-runner.ts +119 -0
  331. package/src/wirings/channel/channel-runner.ts +15 -16
  332. package/src/wirings/channel/channel-store.ts +1 -1
  333. package/src/wirings/channel/channel.types.ts +21 -9
  334. package/src/wirings/channel/define-channel-routes.ts +25 -0
  335. package/src/wirings/channel/index.ts +23 -8
  336. package/src/wirings/channel/local/index.ts +3 -3
  337. package/src/wirings/channel/local/local-channel-runner.test.ts +57 -7
  338. package/src/wirings/channel/local/local-channel-runner.ts +40 -19
  339. package/src/wirings/channel/local/local-eventhub-service.test.ts +2 -2
  340. package/src/wirings/channel/local/local-eventhub-service.ts +2 -2
  341. package/src/wirings/channel/log-channels.ts +1 -1
  342. package/src/wirings/channel/pikku-abstract-channel-handler.ts +1 -1
  343. package/src/wirings/channel/serverless/index.ts +5 -1
  344. package/src/wirings/channel/serverless/serverless-channel-runner.ts +57 -36
  345. package/src/wirings/cli/channel/cli-channel-runner.ts +1 -1
  346. package/src/wirings/cli/channel/index.ts +1 -1
  347. package/src/wirings/cli/cli-runner.test.ts +10 -10
  348. package/src/wirings/cli/cli-runner.ts +28 -14
  349. package/src/wirings/cli/cli.types.ts +14 -14
  350. package/src/wirings/cli/command-parser.test.ts +9 -9
  351. package/src/wirings/cli/command-parser.ts +1 -1
  352. package/src/wirings/cli/define-cli-commands.ts +24 -0
  353. package/src/wirings/cli/index.ts +10 -4
  354. package/src/wirings/http/http-routes.test.ts +322 -0
  355. package/src/wirings/http/http-routes.ts +198 -0
  356. package/src/wirings/http/http-runner.test.ts +12 -20
  357. package/src/wirings/http/http-runner.ts +101 -51
  358. package/src/wirings/http/http.types.ts +119 -48
  359. package/src/wirings/http/index.ts +16 -4
  360. package/src/wirings/http/log-http-routes.ts +1 -1
  361. package/src/wirings/http/pikku-fetch-http-request.ts +1 -1
  362. package/src/wirings/http/pikku-fetch-http-response.ts +12 -5
  363. package/src/wirings/http/routers/http-router.ts +1 -1
  364. package/src/wirings/http/routers/path-to-regex.test.ts +1 -1
  365. package/src/wirings/http/routers/path-to-regex.ts +4 -3
  366. package/src/wirings/mcp/index.ts +27 -3
  367. package/src/wirings/mcp/mcp-endpoint-registry.test.ts +3 -3
  368. package/src/wirings/mcp/mcp-endpoint-registry.ts +5 -1
  369. package/src/wirings/mcp/mcp-runner.ts +48 -65
  370. package/src/wirings/mcp/mcp.types.ts +5 -5
  371. package/src/wirings/node/index.ts +2 -0
  372. package/src/wirings/node/node.types.ts +23 -0
  373. package/src/wirings/oauth2/index.ts +3 -0
  374. package/src/wirings/oauth2/oauth2-client.test.ts +929 -0
  375. package/src/wirings/oauth2/oauth2-client.ts +335 -0
  376. package/src/wirings/oauth2/oauth2.types.ts +69 -0
  377. package/src/wirings/oauth2/wire-oauth2-credential.ts +23 -0
  378. package/src/wirings/queue/index.ts +13 -2
  379. package/src/wirings/queue/queue-runner.test.ts +142 -73
  380. package/src/wirings/queue/queue-runner.ts +18 -14
  381. package/src/wirings/queue/queue.types.ts +5 -5
  382. package/src/wirings/queue/register-queue-helper.ts +3 -5
  383. package/src/wirings/queue/validate-worker-config.test.ts +108 -0
  384. package/src/wirings/queue/validate-worker-config.ts +4 -1
  385. package/src/wirings/rpc/index.ts +3 -1
  386. package/src/wirings/rpc/rpc-runner.ts +254 -41
  387. package/src/wirings/rpc/rpc-types.ts +28 -4
  388. package/src/wirings/rpc/wire-addon.ts +20 -0
  389. package/src/wirings/scheduler/index.ts +6 -4
  390. package/src/wirings/scheduler/log-schedulers.ts +1 -1
  391. package/src/wirings/scheduler/scheduler-runner.test.ts +78 -45
  392. package/src/wirings/scheduler/scheduler-runner.ts +20 -27
  393. package/src/wirings/scheduler/scheduler.types.ts +2 -2
  394. package/src/wirings/secret/index.ts +9 -0
  395. package/src/wirings/secret/secret.types.ts +32 -0
  396. package/src/wirings/secret/validate-secret-definitions.test.ts +140 -0
  397. package/src/wirings/secret/validate-secret-definitions.ts +82 -0
  398. package/src/wirings/trigger/index.ts +10 -2
  399. package/src/wirings/trigger/pikku-trigger-service.ts +112 -0
  400. package/src/wirings/trigger/trigger-runner.test.ts +79 -0
  401. package/src/wirings/trigger/trigger-runner.ts +80 -41
  402. package/src/wirings/trigger/trigger.types.ts +144 -22
  403. package/src/wirings/variable/index.ts +8 -0
  404. package/src/wirings/variable/validate-variable-definitions.test.ts +91 -0
  405. package/src/wirings/variable/validate-variable-definitions.ts +69 -0
  406. package/src/wirings/variable/variable.types.ts +22 -0
  407. package/src/wirings/workflow/dsl/index.ts +1 -0
  408. package/src/wirings/workflow/dsl/workflow-dsl.types.ts +9 -1
  409. package/src/wirings/workflow/dsl/workflow-runner.ts +4 -3
  410. package/src/wirings/workflow/graph/graph-node.ts +1 -6
  411. package/src/wirings/workflow/graph/graph-runner.test.ts +487 -0
  412. package/src/wirings/workflow/graph/graph-runner.ts +496 -374
  413. package/src/wirings/workflow/graph/index.ts +14 -3
  414. package/src/wirings/workflow/graph/template.test.ts +49 -0
  415. package/src/wirings/workflow/graph/template.ts +42 -0
  416. package/src/wirings/workflow/graph/wire-workflow-graph.ts +29 -0
  417. package/src/wirings/workflow/graph/workflow-graph.types.ts +0 -22
  418. package/src/wirings/workflow/index.ts +21 -10
  419. package/src/wirings/workflow/pikku-workflow-service.test.ts +200 -0
  420. package/src/wirings/workflow/pikku-workflow-service.ts +308 -105
  421. package/src/wirings/workflow/workflow-helpers.test.ts +129 -0
  422. package/src/wirings/workflow/workflow-helpers.ts +79 -0
  423. package/src/wirings/workflow/workflow.types.ts +47 -92
  424. package/tsconfig.tsbuildinfo +1 -1
  425. package/dist/wirings/forge-node/forge-node.types.d.ts +0 -120
  426. package/dist/wirings/forge-node/forge-node.types.js +0 -38
  427. package/dist/wirings/forge-node/index.d.ts +0 -1
  428. package/dist/wirings/forge-node/index.js +0 -1
  429. package/dist/wirings/workflow/wire-workflow.d.ts +0 -42
  430. package/dist/wirings/workflow/wire-workflow.js +0 -53
  431. package/dist/wirings/workflow/workflow-utils.d.ts +0 -23
  432. package/dist/wirings/workflow/workflow-utils.js +0 -66
  433. package/src/wirings/forge-node/forge-node.types.ts +0 -135
  434. package/src/wirings/forge-node/index.ts +0 -1
  435. package/src/wirings/workflow/wire-workflow.ts +0 -94
  436. package/src/wirings/workflow/workflow-utils.ts +0 -120
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Type-safe helper for defining CLI commands that can be composed.
3
+ * Returns the commands record as-is (identity function) for use with `wireCLI`.
4
+ *
5
+ * @example
6
+ * ```typescript
7
+ * export const chatCommands = defineCLICommands({
8
+ * chat: pikkuCLICommand({ func: chatFunc }),
9
+ * 'chat:history': pikkuCLICommand({ func: historyFunc }),
10
+ * })
11
+ *
12
+ * wireCLI({
13
+ * program: 'my-app',
14
+ * commands: { ...chatCommands, other: pikkuCLICommand({ func: otherFunc }) }
15
+ * })
16
+ * ```
17
+ */
18
+ export function defineCLICommands(commands) {
19
+ return commands;
20
+ }
@@ -1,5 +1,4 @@
1
- export * from './cli.types.js';
2
- export * from './cli-runner.js';
3
- export * from './command-parser.js';
4
1
  export { wireCLI, runCLICommand, pikkuCLIRender, executeCLI, CLIError, } from './cli-runner.js';
5
2
  export { parseCLIArguments, generateCommandHelp } from './command-parser.js';
3
+ export { defineCLICommands } from './define-cli-commands.js';
4
+ export type { CLIMeta, CLICommandMeta, CLIProgramMeta, CoreCLI, CoreCLICommandConfig, CorePikkuCLIRender, } from './cli.types.js';
@@ -1,5 +1,3 @@
1
- export * from './cli.types.js';
2
- export * from './cli-runner.js';
3
- export * from './command-parser.js';
4
1
  export { wireCLI, runCLICommand, pikkuCLIRender, executeCLI, CLIError, } from './cli-runner.js';
5
2
  export { parseCLIArguments, generateCommandHelp } from './command-parser.js';
3
+ export { defineCLICommands } from './define-cli-commands.js';
@@ -0,0 +1,69 @@
1
+ import type { HTTPRouteMap, HTTPRouteContract, HTTPRoutesGroupConfig, WireHTTPRoutesConfig } from './http.types.js';
2
+ /**
3
+ * Type-safe helper for defining route contracts that can be composed.
4
+ * Supports optional group-level config that cascades to all routes.
5
+ *
6
+ * @example
7
+ * ```typescript
8
+ * // Simple routes without group config
9
+ * export const todosRoutes = defineHTTPRoutes({
10
+ * list: { method: 'get', route: '/todos', func: listTodos },
11
+ * get: { method: 'get', route: '/todos/:id', func: getTodo },
12
+ * })
13
+ *
14
+ * // Routes with group-level config
15
+ * export const todosRoutes = defineHTTPRoutes({
16
+ * auth: true,
17
+ * tags: ['todos'],
18
+ * routes: {
19
+ * list: { method: 'get', route: '/todos', func: listTodos },
20
+ * get: { method: 'get', route: '/todos/:id', func: getTodo },
21
+ * }
22
+ * })
23
+ * ```
24
+ */
25
+ export declare function defineHTTPRoutes<T extends HTTPRouteMap>(routes: T): HTTPRouteContract<T>;
26
+ export declare function defineHTTPRoutes<T extends HTTPRouteMap>(config: HTTPRoutesGroupConfig & {
27
+ routes: T;
28
+ }): HTTPRouteContract<T>;
29
+ /**
30
+ * Wires multiple HTTP routes from a nested map or array configuration.
31
+ * Inspired by ts-rest's contract pattern, provides a single place to wire an entire API.
32
+ *
33
+ * @example
34
+ * ```typescript
35
+ * // Nested object format
36
+ * wireHTTPRoutes({
37
+ * basePath: '/api/v1',
38
+ * tags: ['api'],
39
+ * routes: {
40
+ * todos: {
41
+ * list: { method: 'get', route: '/todos', func: listTodos },
42
+ * get: { method: 'get', route: '/todos/:id', func: getTodo },
43
+ * },
44
+ * auth: {
45
+ * login: { method: 'post', route: '/auth/login', func: login, auth: false },
46
+ * },
47
+ * },
48
+ * })
49
+ *
50
+ * // Flat array format
51
+ * wireHTTPRoutes({
52
+ * basePath: '/api',
53
+ * routes: [
54
+ * { method: 'get', route: '/todos', func: listTodos },
55
+ * { method: 'post', route: '/todos', func: createTodo },
56
+ * ],
57
+ * })
58
+ *
59
+ * // Composing route contracts
60
+ * wireHTTPRoutes({
61
+ * basePath: '/api/v1',
62
+ * routes: {
63
+ * todos: todosRoutes, // from defineHTTPRoutes()
64
+ * auth: authRoutes, // from defineHTTPRoutes()
65
+ * },
66
+ * })
67
+ * ```
68
+ */
69
+ export declare const wireHTTPRoutes: (config: WireHTTPRoutesConfig) => void;
@@ -0,0 +1,139 @@
1
+ import { wireHTTP } from './http-runner.js';
2
+ export function defineHTTPRoutes(configOrRoutes) {
3
+ // If it has a 'routes' property and contains a map (not a route config), it's config + routes
4
+ if ('routes' in configOrRoutes &&
5
+ typeof configOrRoutes.routes === 'object' &&
6
+ !isRouteConfig(configOrRoutes.routes)) {
7
+ return configOrRoutes;
8
+ }
9
+ // Otherwise it's just routes
10
+ return { routes: configOrRoutes };
11
+ }
12
+ /**
13
+ * Wires multiple HTTP routes from a nested map or array configuration.
14
+ * Inspired by ts-rest's contract pattern, provides a single place to wire an entire API.
15
+ *
16
+ * @example
17
+ * ```typescript
18
+ * // Nested object format
19
+ * wireHTTPRoutes({
20
+ * basePath: '/api/v1',
21
+ * tags: ['api'],
22
+ * routes: {
23
+ * todos: {
24
+ * list: { method: 'get', route: '/todos', func: listTodos },
25
+ * get: { method: 'get', route: '/todos/:id', func: getTodo },
26
+ * },
27
+ * auth: {
28
+ * login: { method: 'post', route: '/auth/login', func: login, auth: false },
29
+ * },
30
+ * },
31
+ * })
32
+ *
33
+ * // Flat array format
34
+ * wireHTTPRoutes({
35
+ * basePath: '/api',
36
+ * routes: [
37
+ * { method: 'get', route: '/todos', func: listTodos },
38
+ * { method: 'post', route: '/todos', func: createTodo },
39
+ * ],
40
+ * })
41
+ *
42
+ * // Composing route contracts
43
+ * wireHTTPRoutes({
44
+ * basePath: '/api/v1',
45
+ * routes: {
46
+ * todos: todosRoutes, // from defineHTTPRoutes()
47
+ * auth: authRoutes, // from defineHTTPRoutes()
48
+ * },
49
+ * })
50
+ * ```
51
+ */
52
+ export const wireHTTPRoutes = (config) => {
53
+ const { routes, ...groupConfig } = config;
54
+ if (Array.isArray(routes)) {
55
+ routes.forEach((route) => registerRoute(route, groupConfig));
56
+ }
57
+ else {
58
+ processRouteMap(routes, groupConfig);
59
+ }
60
+ };
61
+ /**
62
+ * Recursively processes a route map, handling nested maps and contracts
63
+ */
64
+ function processRouteMap(map, parentConfig) {
65
+ for (const [_key, value] of Object.entries(map)) {
66
+ if (isRouteConfig(value)) {
67
+ registerRoute(value, parentConfig);
68
+ }
69
+ else if (isRouteContract(value)) {
70
+ // Merge parent config with contract config, then process routes
71
+ const mergedConfig = mergeGroupConfig(parentConfig, value);
72
+ processRouteMap(value.routes, mergedConfig);
73
+ }
74
+ else {
75
+ // Nested map without config
76
+ processRouteMap(value, parentConfig);
77
+ }
78
+ }
79
+ }
80
+ /**
81
+ * Merge group configs with proper cascading behavior:
82
+ * - basePath: Concatenates
83
+ * - tags: Merges (parent + child)
84
+ * - middleware: Merges (parent runs first)
85
+ * - auth: Inner overrides outer
86
+ * - permissions: Inner overrides outer
87
+ */
88
+ function mergeGroupConfig(parent, child) {
89
+ return {
90
+ basePath: (parent.basePath || '') + (child.basePath || ''),
91
+ tags: [...(parent.tags || []), ...(child.tags || [])],
92
+ middleware: [...(parent.middleware || []), ...(child.middleware || [])],
93
+ auth: child.auth ?? parent.auth,
94
+ permissions: child.permissions ?? parent.permissions,
95
+ };
96
+ }
97
+ /**
98
+ * Registers a single route by calling wireHTTP with merged configuration
99
+ */
100
+ function registerRoute(route, groupConfig) {
101
+ const fullRoute = (groupConfig.basePath || '') + route.route;
102
+ wireHTTP({
103
+ method: route.method,
104
+ route: fullRoute,
105
+ func: route.func,
106
+ auth: route.auth ?? groupConfig.auth,
107
+ tags: [...(groupConfig.tags || []), ...(route.tags || [])],
108
+ middleware: [
109
+ ...(groupConfig.middleware || []),
110
+ ...(route.middleware || []),
111
+ ],
112
+ permissions: route.permissions ?? groupConfig.permissions,
113
+ contentType: route.contentType,
114
+ timeout: route.timeout,
115
+ headers: route.headers,
116
+ docs: route.docs,
117
+ sse: route.sse,
118
+ });
119
+ }
120
+ /**
121
+ * Type guard to check if a value is an individual route config
122
+ */
123
+ function isRouteConfig(value) {
124
+ return (typeof value === 'object' &&
125
+ value !== null &&
126
+ 'method' in value &&
127
+ 'func' in value &&
128
+ 'route' in value);
129
+ }
130
+ /**
131
+ * Type guard to check if a value is a route contract (has routes property but is not a route config)
132
+ */
133
+ function isRouteContract(value) {
134
+ return (typeof value === 'object' &&
135
+ value !== null &&
136
+ 'routes' in value &&
137
+ !('method' in value) &&
138
+ !('func' in value));
139
+ }
@@ -1,6 +1,6 @@
1
- import { CoreHTTPFunctionWiring, RunHTTPWiringOptions, RunHTTPWiringParams, PikkuHTTP, PikkuHTTPRequest, PikkuHTTPResponse } from './http.types.js';
2
- import { CorePikkuFunction, CorePikkuFunctionSessionless, CorePikkuPermission, CorePermissionGroup } from '../../function/functions.types.js';
3
- import { CorePikkuMiddleware, CorePikkuMiddlewareGroup } from '../../types/core.types.js';
1
+ import type { CoreHTTPFunctionWiring, RunHTTPWiringOptions, PikkuHTTP, PikkuHTTPRequest, PikkuHTTPResponse } from './http.types.js';
2
+ import type { CorePikkuFunction, CorePikkuFunctionSessionless, CorePikkuPermission, CorePermissionGroup } from '../../function/functions.types.js';
3
+ import type { CorePikkuMiddleware, CorePikkuMiddlewareGroup } from '../../types/core.types.js';
4
4
  import { PikkuFetchHTTPResponse } from './pikku-fetch-http-response.js';
5
5
  /**
6
6
  * Registers HTTP middleware for a specific route pattern.
@@ -101,10 +101,10 @@ export declare const createHTTPWire: (request: PikkuHTTPRequest | undefined, res
101
101
  * @template In Expected input data type.
102
102
  * @template Out Expected output data type.
103
103
  * @param {Request} request - The native Fetch API Request object.
104
- * @param {RunHTTPWiringOptions & RunHTTPWiringParams} params - Additional options including services and session management.
104
+ * @param {RunHTTPWiringOptions} params - Additional options including services and session management.
105
105
  * @returns {Promise<Response>} A promise that resolves to a Fetch API Response object.
106
106
  */
107
- export declare const fetch: <In, Out>(request: Request, params: RunHTTPWiringOptions & RunHTTPWiringParams) => Promise<Response>;
107
+ export declare const fetch: <In, Out>(request: Request, params?: RunHTTPWiringOptions) => Promise<Response>;
108
108
  /**
109
109
  * Executes an HTTP route using a Pikku-specific request wrapper.
110
110
  *
@@ -114,10 +114,10 @@ export declare const fetch: <In, Out>(request: Request, params: RunHTTPWiringOpt
114
114
  * @template In Expected input data type.
115
115
  * @template Out Expected output data type.
116
116
  * @param {Request | PikkuHTTPRequest} request - The request object.
117
- * @param {RunHTTPWiringOptions & RunHTTPWiringParams} params - Execution options including services and session configuration.
117
+ * @param {RunHTTPWiringOptions} params - Execution options including services and session configuration.
118
118
  * @returns {Promise<PikkuFetchHTTPResponse>} A promise that resolves to a PikkuFetchHTTPResponse object.
119
119
  */
120
- export declare const pikkuFetch: <In, Out>(request: Request | PikkuHTTPRequest, params: RunHTTPWiringOptions & RunHTTPWiringParams) => Promise<PikkuFetchHTTPResponse>;
120
+ export declare const pikkuFetch: <In, Out>(request: Request | PikkuHTTPRequest, params?: RunHTTPWiringOptions) => Promise<PikkuFetchHTTPResponse>;
121
121
  /**
122
122
  * Core function to process an HTTP request through route matching, validation,
123
123
  * middleware execution, error handling, and session service cleanup.
@@ -133,7 +133,7 @@ export declare const pikkuFetch: <In, Out>(request: Request | PikkuHTTPRequest,
133
133
  * @template Out Expected output data type.
134
134
  * @param {Request | PikkuHTTPRequest} request - The incoming HTTP request.
135
135
  * @param {PikkuHTTPResponse} response - The response object to be populated.
136
- * @param {RunHTTPWiringOptions & RunHTTPWiringParams} options - Options such as singleton services, session handling, and error configuration.
136
+ * @param {RunHTTPWiringOptions} options - Options such as singleton services, session handling, and error configuration.
137
137
  * @returns {Promise<Out | void>} The output from the route handler or void if an error occurred.
138
138
  */
139
- export declare const fetchData: <In, Out>(request: Request | PikkuHTTPRequest, response: PikkuHTTPResponse, { singletonServices, createWireServices, skipUserSession, respondWith404, logWarningsForStatusCodes, coerceDataFromSchema, bubbleErrors, generateRequestId, }: RunHTTPWiringOptions & RunHTTPWiringParams) => Promise<Out | void>;
139
+ export declare const fetchData: <In, Out>(request: Request | PikkuHTTPRequest, response: PikkuHTTPResponse, { skipUserSession, respondWith404, logWarningsForStatusCodes, coerceDataFromSchema, bubbleErrors, generateRequestId, }?: RunHTTPWiringOptions) => Promise<Out | void>;
@@ -1,5 +1,6 @@
1
- import { NotFoundError } from '../../errors/errors.js';
1
+ import { NotFoundError, PikkuMissingMetaError } from '../../errors/errors.js';
2
2
  import { closeWireServices, createWeakUID, isSerializable, } from '../../utils.js';
3
+ import { getSingletonServices, getCreateWireServices, } from '../../pikku-state.js';
3
4
  import { PikkuSessionService } from '../../services/user-session-service.js';
4
5
  import { handleHTTPError } from '../../handle-error.js';
5
6
  import { pikkuState } from '../../pikku-state.js';
@@ -7,7 +8,21 @@ import { PikkuFetchHTTPResponse } from './pikku-fetch-http-response.js';
7
8
  import { PikkuFetchHTTPRequest } from './pikku-fetch-http-request.js';
8
9
  import { addFunction, runPikkuFunc } from '../../function/function-runner.js';
9
10
  import { httpRouter } from './routers/http-router.js';
10
- import { startWorkflowByHttpWire } from '../workflow/workflow-utils.js';
11
+ import { validateSchema } from '../../schema.js';
12
+ import { runMiddleware } from '../../middleware-runner.js';
13
+ /**
14
+ * Extract headers from a PikkuHTTPRequest based on the schema keys
15
+ */
16
+ function extractHeadersFromRequest(request, headerKeys) {
17
+ const headers = {};
18
+ for (const headerName of headerKeys) {
19
+ const value = request.header(headerName);
20
+ if (value !== null) {
21
+ headers[headerName] = value;
22
+ }
23
+ }
24
+ return headers;
25
+ }
11
26
  /**
12
27
  * Registers HTTP middleware for a specific route pattern.
13
28
  *
@@ -95,10 +110,10 @@ export const wireHTTP = (httpWiring) => {
95
110
  const httpMeta = pikkuState(null, 'http', 'meta');
96
111
  const routeMeta = httpMeta[httpWiring.method][httpWiring.route];
97
112
  if (!routeMeta) {
98
- throw new Error('Route metadata not found');
113
+ throw new PikkuMissingMetaError(`Missing generated metadata for HTTP route '${httpWiring.method.toUpperCase()} ${httpWiring.route}'`);
99
114
  }
100
115
  if (httpWiring.func) {
101
- addFunction(routeMeta.pikkuFuncName, httpWiring.func);
116
+ addFunction(routeMeta.pikkuFuncId, httpWiring.func);
102
117
  }
103
118
  const routes = pikkuState(null, 'http', 'routes');
104
119
  if (!routes.has(httpWiring.method)) {
@@ -184,6 +199,12 @@ const executeRoute = async (services, matchedRoute, http, options) => {
184
199
  const { singletonServices, createWireServices, skipUserSession, requestId } = services;
185
200
  // Attach URL parameters to the request object
186
201
  http?.request?.setParams(params);
202
+ // Validate request headers if schema is defined
203
+ if (meta.headersSchemaName && http.request && singletonServices.schema) {
204
+ const headerKeys = singletonServices.schema.getSchemaKeys(meta.headersSchemaName);
205
+ const rawHeaders = extractHeadersFromRequest(http.request, headerKeys);
206
+ await validateSchema(singletonServices.logger, singletonServices.schema, meta.headersSchemaName, rawHeaders);
207
+ }
187
208
  const requiresSession = route.auth !== false;
188
209
  let wireServices;
189
210
  let result;
@@ -192,7 +213,13 @@ const executeRoute = async (services, matchedRoute, http, options) => {
192
213
  if (skipUserSession && requiresSession) {
193
214
  throw new Error("Can't skip trying to get user session if auth is required");
194
215
  }
195
- const data = () => http.request.data();
216
+ let cachedData;
217
+ const data = async () => {
218
+ if (cachedData === undefined) {
219
+ cachedData = await http.request.data();
220
+ }
221
+ return cachedData;
222
+ };
196
223
  let channel;
197
224
  if (matchedRoute.route.sse) {
198
225
  const response = http?.response;
@@ -220,14 +247,15 @@ const executeRoute = async (services, matchedRoute, http, options) => {
220
247
  state: 'open',
221
248
  };
222
249
  }
223
- const wire = { http, channel, session: userSession };
224
- if (matchedRoute.meta.workflow === true) {
225
- await startWorkflowByHttpWire(singletonServices, createWireServices, matchedRoute, wire);
226
- return wireServices
227
- ? { wireServices, result: http.response }
228
- : { result: http.response };
229
- }
230
- result = await runPikkuFunc('http', `${meta.method}:${meta.route}`, meta.pikkuFuncName, {
250
+ const wire = {
251
+ http,
252
+ channel,
253
+ session: userSession.get(),
254
+ setSession: (s) => userSession.setInitial(s),
255
+ getSession: () => userSession.get(),
256
+ hasSessionChanged: () => userSession.sessionChanged,
257
+ };
258
+ result = await runPikkuFunc('http', `${meta.method}:${meta.route}`, meta.pikkuFuncId, {
231
259
  singletonServices,
232
260
  createWireServices,
233
261
  auth: route.auth !== false,
@@ -239,17 +267,20 @@ const executeRoute = async (services, matchedRoute, http, options) => {
239
267
  coerceDataFromSchema: options.coerceDataFromSchema,
240
268
  tags: route.tags,
241
269
  wire,
270
+ sessionService: userSession,
242
271
  });
243
- // Respond with either a binary or JSON response based on configuration
244
- if (route.returnsJSON === false) {
245
- http?.response?.arrayBuffer(result);
246
- }
247
- else {
248
- http?.response?.json(result);
272
+ if (!matchedRoute.route.sse) {
273
+ if (result === undefined || result === null) {
274
+ http?.response?.status(204);
275
+ }
276
+ else if (route.returnsJSON === false) {
277
+ http?.response?.arrayBuffer(result);
278
+ }
279
+ else {
280
+ http?.response?.status(200);
281
+ http?.response?.json(result);
282
+ }
249
283
  }
250
- http?.response?.status(200);
251
- // TODO: Evaluate if the response stream should be explicitly ended.
252
- // http?.response?.end()
253
284
  return wireServices ? { result, wireServices } : { result };
254
285
  };
255
286
  /**
@@ -264,10 +295,10 @@ const executeRoute = async (services, matchedRoute, http, options) => {
264
295
  * @template In Expected input data type.
265
296
  * @template Out Expected output data type.
266
297
  * @param {Request} request - The native Fetch API Request object.
267
- * @param {RunHTTPWiringOptions & RunHTTPWiringParams} params - Additional options including services and session management.
298
+ * @param {RunHTTPWiringOptions} params - Additional options including services and session management.
268
299
  * @returns {Promise<Response>} A promise that resolves to a Fetch API Response object.
269
300
  */
270
- export const fetch = async (request, params) => {
301
+ export const fetch = async (request, params = {}) => {
271
302
  const pikkuResponse = new PikkuFetchHTTPResponse();
272
303
  await fetchData(request, pikkuResponse, params);
273
304
  return pikkuResponse.toResponse();
@@ -281,10 +312,10 @@ export const fetch = async (request, params) => {
281
312
  * @template In Expected input data type.
282
313
  * @template Out Expected output data type.
283
314
  * @param {Request | PikkuHTTPRequest} request - The request object.
284
- * @param {RunHTTPWiringOptions & RunHTTPWiringParams} params - Execution options including services and session configuration.
315
+ * @param {RunHTTPWiringOptions} params - Execution options including services and session configuration.
285
316
  * @returns {Promise<PikkuFetchHTTPResponse>} A promise that resolves to a PikkuFetchHTTPResponse object.
286
317
  */
287
- export const pikkuFetch = async (request, params) => {
318
+ export const pikkuFetch = async (request, params = {}) => {
288
319
  const pikkuResponse = new PikkuFetchHTTPResponse();
289
320
  await fetchData(request, pikkuResponse, params);
290
321
  return pikkuResponse;
@@ -304,24 +335,39 @@ export const pikkuFetch = async (request, params) => {
304
335
  * @template Out Expected output data type.
305
336
  * @param {Request | PikkuHTTPRequest} request - The incoming HTTP request.
306
337
  * @param {PikkuHTTPResponse} response - The response object to be populated.
307
- * @param {RunHTTPWiringOptions & RunHTTPWiringParams} options - Options such as singleton services, session handling, and error configuration.
338
+ * @param {RunHTTPWiringOptions} options - Options such as singleton services, session handling, and error configuration.
308
339
  * @returns {Promise<Out | void>} The output from the route handler or void if an error occurred.
309
340
  */
310
- export const fetchData = async (request, response, { singletonServices, createWireServices, skipUserSession = false, respondWith404 = true, logWarningsForStatusCodes = [], coerceDataFromSchema = true, bubbleErrors = false, generateRequestId, }) => {
311
- const requestId = request.getHeader?.('x-request-id') ||
312
- generateRequestId?.() ||
313
- createWeakUID();
341
+ export const fetchData = async (request, response, { skipUserSession = false, respondWith404 = true, logWarningsForStatusCodes = [], coerceDataFromSchema = true, bubbleErrors = false, generateRequestId, } = {}) => {
342
+ const singletonServices = getSingletonServices();
343
+ const createWireServices = getCreateWireServices();
314
344
  let wireServices;
315
345
  let result;
316
346
  // Combine the request and response into one wire object
317
- const http = createHTTPWire(request instanceof Request ? new PikkuFetchHTTPRequest(request) : request, response);
347
+ const pikkuRequest = request instanceof Request ? new PikkuFetchHTTPRequest(request) : request;
348
+ let requestId = null;
349
+ try {
350
+ requestId = pikkuRequest.header('x-request-id');
351
+ }
352
+ catch { }
353
+ requestId = requestId || generateRequestId?.() || createWeakUID();
354
+ const http = createHTTPWire(pikkuRequest, response);
318
355
  const apiType = http.request.method();
319
356
  const apiRoute = http.request.path();
320
357
  // Locate the matching route based on the HTTP method and path
321
358
  const matchedRoute = getMatchingRoute(apiType, apiRoute);
322
359
  try {
323
- // If no route matches, log the occurrence and throw a NotFoundError
324
360
  if (!matchedRoute) {
361
+ if (apiType.toLowerCase() === 'options') {
362
+ const httpGroups = pikkuState(null, 'middleware', 'httpGroup');
363
+ const globalMiddleware = httpGroups['*'];
364
+ const wire = { http: http };
365
+ if (globalMiddleware) {
366
+ await runMiddleware(singletonServices, wire, globalMiddleware);
367
+ }
368
+ response.status(204).json(undefined);
369
+ return;
370
+ }
325
371
  singletonServices.logger.info({
326
372
  message: 'Route not found',
327
373
  apiRoute,
@@ -340,7 +386,6 @@ export const fetchData = async (request, response, { singletonServices, createWi
340
386
  return result;
341
387
  }
342
388
  catch (e) {
343
- // Handle errors and, depending on configuration, bubble them up or respond with an error
344
389
  handleHTTPError(e, http, requestId, singletonServices.logger, logWarningsForStatusCodes, respondWith404, bubbleErrors);
345
390
  }
346
391
  finally {