@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.
- package/CHANGELOG.md +57 -2
- package/dist/crypto-utils.d.ts +2 -0
- package/dist/crypto-utils.js +78 -0
- package/dist/errors/errors.d.ts +14 -0
- package/dist/errors/errors.js +26 -0
- package/dist/errors/index.d.ts +1 -1
- package/dist/errors/index.js +1 -1
- package/dist/function/function-runner.d.ts +10 -4
- package/dist/function/function-runner.js +126 -45
- package/dist/function/functions.types.d.ts +32 -87
- package/dist/function/functions.types.js +16 -46
- package/dist/function/index.d.ts +2 -2
- package/dist/function/index.js +1 -2
- package/dist/handle-error.d.ts +2 -2
- package/dist/handle-error.js +3 -12
- package/dist/index.d.ts +30 -26
- package/dist/index.js +19 -29
- package/dist/internal.d.ts +3 -0
- package/dist/internal.js +2 -0
- package/dist/middleware/auth-apikey.d.ts +2 -2
- package/dist/middleware/auth-apikey.js +3 -3
- package/dist/middleware/auth-bearer.d.ts +3 -3
- package/dist/middleware/auth-bearer.js +4 -7
- package/dist/middleware/auth-cookie.d.ts +4 -4
- package/dist/middleware/auth-cookie.js +7 -9
- package/dist/middleware/cors.d.ts +46 -0
- package/dist/middleware/cors.js +81 -0
- package/dist/middleware/index.d.ts +5 -3
- package/dist/middleware/index.js +5 -3
- package/dist/middleware/remote-auth.d.ts +5 -0
- package/dist/middleware/remote-auth.js +55 -0
- package/dist/middleware/timeout.d.ts +2 -2
- package/dist/middleware-runner.d.ts +1 -1
- package/dist/middleware-runner.js +8 -10
- package/dist/permissions.d.ts +2 -2
- package/dist/permissions.js +11 -15
- package/dist/pikku-state.d.ts +10 -8
- package/dist/pikku-state.js +48 -25
- package/dist/schema.d.ts +4 -4
- package/dist/schema.js +20 -15
- package/dist/services/ai-agent-runner-service.d.ts +43 -0
- package/dist/services/ai-agent-runner-service.js +1 -0
- package/dist/services/ai-run-state-service.d.ts +13 -0
- package/dist/services/ai-run-state-service.js +1 -0
- package/dist/services/ai-storage-service.d.ts +18 -0
- package/dist/services/ai-storage-service.js +1 -0
- package/dist/services/content-service.d.ts +6 -0
- package/dist/services/deployment-service.d.ts +19 -0
- package/dist/services/deployment-service.js +1 -0
- package/dist/services/gopass-secrets.d.ts +47 -0
- package/dist/services/gopass-secrets.js +97 -0
- package/dist/services/in-memory-ai-run-state-service.d.ts +15 -0
- package/dist/services/in-memory-ai-run-state-service.js +44 -0
- package/dist/services/in-memory-trigger-service.d.ts +22 -0
- package/dist/services/in-memory-trigger-service.js +48 -0
- package/dist/services/in-memory-workflow-service.d.ts +59 -0
- package/dist/services/in-memory-workflow-service.js +287 -0
- package/dist/services/index.d.ts +26 -11
- package/dist/services/index.js +11 -13
- package/dist/services/local-content.d.ts +2 -1
- package/dist/services/local-content.js +6 -1
- package/dist/services/local-secrets.d.ts +25 -2
- package/dist/services/local-secrets.js +45 -0
- package/dist/services/local-variables.d.ts +6 -1
- package/dist/services/local-variables.js +18 -0
- package/dist/services/logger-console.d.ts +2 -1
- package/dist/services/scheduler-service.d.ts +9 -1
- package/dist/services/scheduler-service.js +8 -0
- package/dist/services/schema-service.d.ts +6 -0
- package/dist/services/scoped-secret-service.d.ts +16 -0
- package/dist/services/scoped-secret-service.js +35 -0
- package/dist/services/secret-service.d.ts +25 -4
- package/dist/services/trigger-service.d.ts +16 -0
- package/dist/services/trigger-service.js +1 -0
- package/dist/services/typed-secret-service.d.ts +30 -0
- package/dist/services/typed-secret-service.js +40 -0
- package/dist/services/typed-variables-service.d.ts +27 -0
- package/dist/services/typed-variables-service.js +46 -0
- package/dist/services/user-session-service.d.ts +15 -2
- package/dist/services/user-session-service.js +17 -0
- package/dist/services/variables-service.d.ts +5 -0
- package/dist/services/workflow-service.d.ts +9 -5
- package/dist/types/core.types.d.ts +67 -25
- package/dist/types/core.types.js +8 -1
- package/dist/types/state.types.d.ts +53 -59
- package/dist/utils.d.ts +7 -6
- package/dist/utils.js +27 -12
- package/dist/version.d.ts +6 -0
- package/dist/version.js +19 -0
- package/dist/wirings/ai-agent/ai-agent-assistant-ui.d.ts +5 -0
- package/dist/wirings/ai-agent/ai-agent-assistant-ui.js +146 -0
- package/dist/wirings/ai-agent/ai-agent-helpers.d.ts +28 -0
- package/dist/wirings/ai-agent/ai-agent-helpers.js +40 -0
- package/dist/wirings/ai-agent/ai-agent-memory.d.ts +29 -0
- package/dist/wirings/ai-agent/ai-agent-memory.js +199 -0
- package/dist/wirings/ai-agent/ai-agent-model-config.d.ts +9 -0
- package/dist/wirings/ai-agent/ai-agent-model-config.js +36 -0
- package/dist/wirings/ai-agent/ai-agent-prepare.d.ts +59 -0
- package/dist/wirings/ai-agent/ai-agent-prepare.js +348 -0
- package/dist/wirings/ai-agent/ai-agent-registry.d.ts +15 -0
- package/dist/wirings/ai-agent/ai-agent-registry.js +47 -0
- package/dist/wirings/ai-agent/ai-agent-runner.d.ts +3 -0
- package/dist/wirings/ai-agent/ai-agent-runner.js +195 -0
- package/dist/wirings/ai-agent/ai-agent-stream.d.ts +12 -0
- package/dist/wirings/ai-agent/ai-agent-stream.js +662 -0
- package/dist/wirings/ai-agent/ai-agent.types.d.ts +313 -0
- package/dist/wirings/ai-agent/ai-agent.types.js +1 -0
- package/dist/wirings/ai-agent/index.d.ts +7 -0
- package/dist/wirings/ai-agent/index.js +6 -0
- package/dist/wirings/channel/channel-common.d.ts +8 -5
- package/dist/wirings/channel/channel-common.js +15 -8
- package/dist/wirings/channel/channel-handler.d.ts +3 -3
- package/dist/wirings/channel/channel-handler.js +15 -6
- package/dist/wirings/channel/channel-middleware-runner.d.ts +9 -0
- package/dist/wirings/channel/channel-middleware-runner.js +73 -0
- package/dist/wirings/channel/channel-runner.d.ts +5 -5
- package/dist/wirings/channel/channel-runner.js +10 -9
- package/dist/wirings/channel/channel-store.d.ts +1 -1
- package/dist/wirings/channel/channel.types.d.ts +9 -7
- package/dist/wirings/channel/define-channel-routes.d.ts +21 -0
- package/dist/wirings/channel/define-channel-routes.js +23 -0
- package/dist/wirings/channel/index.d.ts +10 -8
- package/dist/wirings/channel/index.js +7 -8
- package/dist/wirings/channel/local/index.d.ts +3 -3
- package/dist/wirings/channel/local/index.js +3 -3
- package/dist/wirings/channel/local/local-channel-runner.d.ts +7 -2
- package/dist/wirings/channel/local/local-channel-runner.js +22 -9
- package/dist/wirings/channel/local/local-eventhub-service.d.ts +2 -2
- package/dist/wirings/channel/log-channels.d.ts +1 -1
- package/dist/wirings/channel/pikku-abstract-channel-handler.d.ts +1 -1
- package/dist/wirings/channel/serverless/index.d.ts +1 -1
- package/dist/wirings/channel/serverless/index.js +1 -1
- package/dist/wirings/channel/serverless/serverless-channel-runner.d.ts +4 -4
- package/dist/wirings/channel/serverless/serverless-channel-runner.js +40 -23
- package/dist/wirings/cli/channel/cli-channel-runner.d.ts +1 -1
- package/dist/wirings/cli/channel/index.d.ts +1 -1
- package/dist/wirings/cli/channel/index.js +1 -1
- package/dist/wirings/cli/cli-runner.d.ts +3 -3
- package/dist/wirings/cli/cli-runner.js +12 -8
- package/dist/wirings/cli/cli.types.d.ts +9 -9
- package/dist/wirings/cli/command-parser.d.ts +1 -1
- package/dist/wirings/cli/define-cli-commands.d.ts +19 -0
- package/dist/wirings/cli/define-cli-commands.js +20 -0
- package/dist/wirings/cli/index.d.ts +2 -3
- package/dist/wirings/cli/index.js +1 -3
- package/dist/wirings/http/http-routes.d.ts +69 -0
- package/dist/wirings/http/http-routes.js +139 -0
- package/dist/wirings/http/http-runner.d.ts +9 -9
- package/dist/wirings/http/http-runner.js +79 -34
- package/dist/wirings/http/http.types.d.ts +77 -41
- package/dist/wirings/http/index.d.ts +5 -4
- package/dist/wirings/http/index.js +4 -3
- package/dist/wirings/http/log-http-routes.d.ts +1 -1
- package/dist/wirings/http/pikku-fetch-http-request.d.ts +1 -1
- package/dist/wirings/http/pikku-fetch-http-response.d.ts +2 -2
- package/dist/wirings/http/pikku-fetch-http-response.js +6 -1
- package/dist/wirings/http/routers/http-router.d.ts +1 -1
- package/dist/wirings/http/routers/path-to-regex.d.ts +2 -2
- package/dist/wirings/mcp/index.d.ts +4 -3
- package/dist/wirings/mcp/index.js +3 -3
- package/dist/wirings/mcp/mcp-endpoint-registry.d.ts +1 -1
- package/dist/wirings/mcp/mcp-runner.d.ts +1 -6
- package/dist/wirings/mcp/mcp-runner.js +28 -40
- package/dist/wirings/mcp/mcp.types.d.ts +5 -5
- package/dist/wirings/node/index.d.ts +2 -0
- package/dist/wirings/node/index.js +1 -0
- package/dist/wirings/node/node.types.d.ts +20 -0
- package/dist/wirings/node/node.types.js +1 -0
- package/dist/wirings/oauth2/index.d.ts +3 -0
- package/dist/wirings/oauth2/index.js +2 -0
- package/dist/wirings/oauth2/oauth2-client.d.ts +47 -0
- package/dist/wirings/oauth2/oauth2-client.js +267 -0
- package/dist/wirings/oauth2/oauth2.types.d.ts +65 -0
- package/dist/wirings/oauth2/oauth2.types.js +4 -0
- package/dist/wirings/oauth2/wire-oauth2-credential.d.ts +20 -0
- package/dist/wirings/oauth2/wire-oauth2-credential.js +21 -0
- package/dist/wirings/queue/index.d.ts +1 -1
- package/dist/wirings/queue/queue-runner.d.ts +1 -5
- package/dist/wirings/queue/queue-runner.js +11 -8
- package/dist/wirings/queue/queue.types.d.ts +5 -5
- package/dist/wirings/queue/register-queue-helper.d.ts +2 -2
- package/dist/wirings/queue/register-queue-helper.js +1 -1
- package/dist/wirings/queue/validate-worker-config.d.ts +1 -1
- package/dist/wirings/rpc/index.d.ts +3 -1
- package/dist/wirings/rpc/index.js +2 -1
- package/dist/wirings/rpc/rpc-runner.d.ts +58 -8
- package/dist/wirings/rpc/rpc-runner.js +177 -31
- package/dist/wirings/rpc/rpc-types.d.ts +20 -4
- package/dist/wirings/rpc/wire-addon.d.ts +10 -0
- package/dist/wirings/rpc/wire-addon.js +9 -0
- package/dist/wirings/scheduler/index.d.ts +2 -2
- package/dist/wirings/scheduler/index.js +1 -2
- package/dist/wirings/scheduler/log-schedulers.d.ts +1 -1
- package/dist/wirings/scheduler/scheduler-runner.d.ts +3 -5
- package/dist/wirings/scheduler/scheduler-runner.js +11 -14
- package/dist/wirings/scheduler/scheduler.types.d.ts +2 -2
- package/dist/wirings/secret/index.d.ts +3 -0
- package/dist/wirings/secret/index.js +2 -0
- package/dist/wirings/secret/secret.types.d.ts +27 -0
- package/dist/wirings/secret/secret.types.js +1 -0
- package/dist/wirings/secret/validate-secret-definitions.d.ts +6 -0
- package/dist/wirings/secret/validate-secret-definitions.js +55 -0
- package/dist/wirings/trigger/index.d.ts +3 -2
- package/dist/wirings/trigger/index.js +2 -2
- package/dist/wirings/trigger/pikku-trigger-service.d.ts +22 -0
- package/dist/wirings/trigger/pikku-trigger-service.js +70 -0
- package/dist/wirings/trigger/trigger-runner.d.ts +18 -9
- package/dist/wirings/trigger/trigger-runner.js +48 -19
- package/dist/wirings/trigger/trigger.types.d.ts +99 -11
- package/dist/wirings/trigger/trigger.types.js +40 -1
- package/dist/wirings/variable/index.d.ts +3 -0
- package/dist/wirings/variable/index.js +2 -0
- package/dist/wirings/variable/validate-variable-definitions.d.ts +6 -0
- package/dist/wirings/variable/validate-variable-definitions.js +45 -0
- package/dist/wirings/variable/variable.types.d.ts +18 -0
- package/dist/wirings/variable/variable.types.js +1 -0
- package/dist/wirings/workflow/dsl/index.d.ts +1 -1
- package/dist/wirings/workflow/dsl/workflow-dsl.types.d.ts +7 -1
- package/dist/wirings/workflow/dsl/workflow-runner.js +3 -2
- package/dist/wirings/workflow/graph/graph-node.d.ts +1 -6
- package/dist/wirings/workflow/graph/graph-runner.d.ts +5 -31
- package/dist/wirings/workflow/graph/graph-runner.js +384 -296
- package/dist/wirings/workflow/graph/index.d.ts +4 -3
- package/dist/wirings/workflow/graph/index.js +3 -3
- package/dist/wirings/workflow/graph/template.d.ts +15 -0
- package/dist/wirings/workflow/graph/template.js +27 -0
- package/dist/wirings/workflow/graph/wire-workflow-graph.d.ts +15 -0
- package/dist/wirings/workflow/graph/wire-workflow-graph.js +8 -0
- package/dist/wirings/workflow/graph/workflow-graph.types.d.ts +0 -13
- package/dist/wirings/workflow/index.d.ts +6 -6
- package/dist/wirings/workflow/index.js +6 -4
- package/dist/wirings/workflow/pikku-workflow-service.d.ts +29 -19
- package/dist/wirings/workflow/pikku-workflow-service.js +217 -82
- package/dist/wirings/workflow/workflow-helpers.d.ts +36 -0
- package/dist/wirings/workflow/workflow-helpers.js +38 -0
- package/dist/wirings/workflow/workflow.types.d.ts +42 -95
- package/package.json +14 -15
- package/run-tests.sh +4 -1
- package/src/crypto-utils.test.ts +116 -0
- package/src/crypto-utils.ts +99 -0
- package/src/errors/error.test.ts +143 -2
- package/src/errors/errors.ts +27 -0
- package/src/errors/index.ts +1 -1
- package/src/factory-functions.test.ts +42 -2
- package/src/function/function-runner.test.ts +6 -13
- package/src/function/function-runner.ts +161 -53
- package/src/function/functions.types.ts +63 -132
- package/src/function/index.ts +5 -2
- package/src/handle-error.test.ts +361 -0
- package/src/handle-error.ts +6 -14
- package/src/index.ts +97 -30
- package/src/internal.ts +6 -0
- package/src/middleware/auth-apikey.test.ts +16 -13
- package/src/middleware/auth-apikey.ts +3 -3
- package/src/middleware/auth-bearer.test.ts +18 -15
- package/src/middleware/auth-bearer.ts +27 -32
- package/src/middleware/auth-cookie.test.ts +17 -14
- package/src/middleware/auth-cookie.ts +9 -13
- package/src/middleware/cors.test.ts +424 -0
- package/src/middleware/cors.ts +104 -0
- package/src/middleware/index.ts +5 -3
- package/src/middleware/remote-auth.test.ts +488 -0
- package/src/middleware/remote-auth.ts +68 -0
- package/src/middleware-runner.test.ts +123 -1
- package/src/middleware-runner.ts +13 -13
- package/src/permissions.test.ts +83 -9
- package/src/permissions.ts +17 -19
- package/src/pikku-state.test.ts +224 -0
- package/src/pikku-state.ts +59 -35
- package/src/run-tests-script.test.ts +49 -0
- package/src/schema.test.ts +198 -6
- package/src/schema.ts +28 -21
- package/src/services/ai-agent-runner-service.ts +41 -0
- package/src/services/ai-run-state-service.ts +20 -0
- package/src/services/ai-storage-service.ts +39 -0
- package/src/services/content-service.ts +7 -0
- package/src/services/deployment-service.ts +22 -0
- package/src/services/gopass-secrets.ts +98 -0
- package/src/services/in-memory-ai-run-state-service.ts +73 -0
- package/src/services/in-memory-trigger-service.ts +64 -0
- package/src/services/in-memory-workflow-service.test.ts +351 -0
- package/src/services/in-memory-workflow-service.ts +395 -0
- package/src/services/index.ts +50 -14
- package/src/services/local-content.ts +9 -3
- package/src/services/local-secrets.test.ts +80 -0
- package/src/services/local-secrets.ts +53 -2
- package/src/services/local-variables.test.ts +61 -0
- package/src/services/local-variables.ts +23 -1
- package/src/services/logger-console.test.ts +118 -0
- package/src/services/logger-console.ts +2 -1
- package/src/services/scheduler-service.ts +11 -1
- package/src/services/schema-service.ts +7 -0
- package/src/services/scoped-secret-service.test.ts +74 -0
- package/src/services/scoped-secret-service.ts +41 -0
- package/src/services/secret-service.ts +25 -4
- package/src/services/trigger-service.ts +17 -0
- package/src/services/typed-secret-service.test.ts +93 -0
- package/src/services/typed-secret-service.ts +70 -0
- package/src/services/typed-variables-service.test.ts +73 -0
- package/src/services/typed-variables-service.ts +81 -0
- package/src/services/user-session-service.test.ts +113 -0
- package/src/services/user-session-service.ts +25 -2
- package/src/services/variables-service.ts +5 -0
- package/src/services/workflow-service.ts +23 -13
- package/src/time-utils.test.ts +1 -1
- package/src/types/core.types.ts +95 -24
- package/src/types/state.types.ts +56 -73
- package/src/utils.test.ts +350 -0
- package/src/utils.ts +33 -18
- package/src/version.test.ts +80 -0
- package/src/version.ts +25 -0
- package/src/wirings/ai-agent/ai-agent-assistant-ui.test.ts +363 -0
- package/src/wirings/ai-agent/ai-agent-assistant-ui.ts +214 -0
- package/src/wirings/ai-agent/ai-agent-helpers.test.ts +152 -0
- package/src/wirings/ai-agent/ai-agent-helpers.ts +76 -0
- package/src/wirings/ai-agent/ai-agent-memory.ts +300 -0
- package/src/wirings/ai-agent/ai-agent-model-config.test.ts +115 -0
- package/src/wirings/ai-agent/ai-agent-model-config.ts +43 -0
- package/src/wirings/ai-agent/ai-agent-prepare.ts +504 -0
- package/src/wirings/ai-agent/ai-agent-registry.test.ts +37 -0
- package/src/wirings/ai-agent/ai-agent-registry.ts +82 -0
- package/src/wirings/ai-agent/ai-agent-runner.test.ts +317 -0
- package/src/wirings/ai-agent/ai-agent-runner.ts +251 -0
- package/src/wirings/ai-agent/ai-agent-stream.test.ts +652 -0
- package/src/wirings/ai-agent/ai-agent-stream.ts +1049 -0
- package/src/wirings/ai-agent/ai-agent.types.ts +328 -0
- package/src/wirings/ai-agent/index.ts +39 -0
- package/src/wirings/channel/channel-common.ts +33 -20
- package/src/wirings/channel/channel-handler.ts +26 -9
- package/src/wirings/channel/channel-middleware-runner.ts +119 -0
- package/src/wirings/channel/channel-runner.ts +15 -16
- package/src/wirings/channel/channel-store.ts +1 -1
- package/src/wirings/channel/channel.types.ts +21 -9
- package/src/wirings/channel/define-channel-routes.ts +25 -0
- package/src/wirings/channel/index.ts +23 -8
- package/src/wirings/channel/local/index.ts +3 -3
- package/src/wirings/channel/local/local-channel-runner.test.ts +57 -7
- package/src/wirings/channel/local/local-channel-runner.ts +40 -19
- package/src/wirings/channel/local/local-eventhub-service.test.ts +2 -2
- package/src/wirings/channel/local/local-eventhub-service.ts +2 -2
- package/src/wirings/channel/log-channels.ts +1 -1
- package/src/wirings/channel/pikku-abstract-channel-handler.ts +1 -1
- package/src/wirings/channel/serverless/index.ts +5 -1
- package/src/wirings/channel/serverless/serverless-channel-runner.ts +57 -36
- package/src/wirings/cli/channel/cli-channel-runner.ts +1 -1
- package/src/wirings/cli/channel/index.ts +1 -1
- package/src/wirings/cli/cli-runner.test.ts +10 -10
- package/src/wirings/cli/cli-runner.ts +28 -14
- package/src/wirings/cli/cli.types.ts +14 -14
- package/src/wirings/cli/command-parser.test.ts +9 -9
- package/src/wirings/cli/command-parser.ts +1 -1
- package/src/wirings/cli/define-cli-commands.ts +24 -0
- package/src/wirings/cli/index.ts +10 -4
- package/src/wirings/http/http-routes.test.ts +322 -0
- package/src/wirings/http/http-routes.ts +198 -0
- package/src/wirings/http/http-runner.test.ts +12 -20
- package/src/wirings/http/http-runner.ts +101 -51
- package/src/wirings/http/http.types.ts +119 -48
- package/src/wirings/http/index.ts +16 -4
- package/src/wirings/http/log-http-routes.ts +1 -1
- package/src/wirings/http/pikku-fetch-http-request.ts +1 -1
- package/src/wirings/http/pikku-fetch-http-response.ts +12 -5
- package/src/wirings/http/routers/http-router.ts +1 -1
- package/src/wirings/http/routers/path-to-regex.test.ts +1 -1
- package/src/wirings/http/routers/path-to-regex.ts +4 -3
- package/src/wirings/mcp/index.ts +27 -3
- package/src/wirings/mcp/mcp-endpoint-registry.test.ts +3 -3
- package/src/wirings/mcp/mcp-endpoint-registry.ts +5 -1
- package/src/wirings/mcp/mcp-runner.ts +48 -65
- package/src/wirings/mcp/mcp.types.ts +5 -5
- package/src/wirings/node/index.ts +2 -0
- package/src/wirings/node/node.types.ts +23 -0
- package/src/wirings/oauth2/index.ts +3 -0
- package/src/wirings/oauth2/oauth2-client.test.ts +929 -0
- package/src/wirings/oauth2/oauth2-client.ts +335 -0
- package/src/wirings/oauth2/oauth2.types.ts +69 -0
- package/src/wirings/oauth2/wire-oauth2-credential.ts +23 -0
- package/src/wirings/queue/index.ts +13 -2
- package/src/wirings/queue/queue-runner.test.ts +142 -73
- package/src/wirings/queue/queue-runner.ts +18 -14
- package/src/wirings/queue/queue.types.ts +5 -5
- package/src/wirings/queue/register-queue-helper.ts +3 -5
- package/src/wirings/queue/validate-worker-config.test.ts +108 -0
- package/src/wirings/queue/validate-worker-config.ts +4 -1
- package/src/wirings/rpc/index.ts +3 -1
- package/src/wirings/rpc/rpc-runner.ts +254 -41
- package/src/wirings/rpc/rpc-types.ts +28 -4
- package/src/wirings/rpc/wire-addon.ts +20 -0
- package/src/wirings/scheduler/index.ts +6 -4
- package/src/wirings/scheduler/log-schedulers.ts +1 -1
- package/src/wirings/scheduler/scheduler-runner.test.ts +78 -45
- package/src/wirings/scheduler/scheduler-runner.ts +20 -27
- package/src/wirings/scheduler/scheduler.types.ts +2 -2
- package/src/wirings/secret/index.ts +9 -0
- package/src/wirings/secret/secret.types.ts +32 -0
- package/src/wirings/secret/validate-secret-definitions.test.ts +140 -0
- package/src/wirings/secret/validate-secret-definitions.ts +82 -0
- package/src/wirings/trigger/index.ts +10 -2
- package/src/wirings/trigger/pikku-trigger-service.ts +112 -0
- package/src/wirings/trigger/trigger-runner.test.ts +79 -0
- package/src/wirings/trigger/trigger-runner.ts +80 -41
- package/src/wirings/trigger/trigger.types.ts +144 -22
- package/src/wirings/variable/index.ts +8 -0
- package/src/wirings/variable/validate-variable-definitions.test.ts +91 -0
- package/src/wirings/variable/validate-variable-definitions.ts +69 -0
- package/src/wirings/variable/variable.types.ts +22 -0
- package/src/wirings/workflow/dsl/index.ts +1 -0
- package/src/wirings/workflow/dsl/workflow-dsl.types.ts +9 -1
- package/src/wirings/workflow/dsl/workflow-runner.ts +4 -3
- package/src/wirings/workflow/graph/graph-node.ts +1 -6
- package/src/wirings/workflow/graph/graph-runner.test.ts +487 -0
- package/src/wirings/workflow/graph/graph-runner.ts +496 -374
- package/src/wirings/workflow/graph/index.ts +14 -3
- package/src/wirings/workflow/graph/template.test.ts +49 -0
- package/src/wirings/workflow/graph/template.ts +42 -0
- package/src/wirings/workflow/graph/wire-workflow-graph.ts +29 -0
- package/src/wirings/workflow/graph/workflow-graph.types.ts +0 -22
- package/src/wirings/workflow/index.ts +21 -10
- package/src/wirings/workflow/pikku-workflow-service.test.ts +200 -0
- package/src/wirings/workflow/pikku-workflow-service.ts +308 -105
- package/src/wirings/workflow/workflow-helpers.test.ts +129 -0
- package/src/wirings/workflow/workflow-helpers.ts +79 -0
- package/src/wirings/workflow/workflow.types.ts +47 -92
- package/tsconfig.tsbuildinfo +1 -1
- package/dist/wirings/forge-node/forge-node.types.d.ts +0 -120
- package/dist/wirings/forge-node/forge-node.types.js +0 -38
- package/dist/wirings/forge-node/index.d.ts +0 -1
- package/dist/wirings/forge-node/index.js +0 -1
- package/dist/wirings/workflow/wire-workflow.d.ts +0 -42
- package/dist/wirings/workflow/wire-workflow.js +0 -53
- package/dist/wirings/workflow/workflow-utils.d.ts +0 -23
- package/dist/wirings/workflow/workflow-utils.js +0 -66
- package/src/wirings/forge-node/forge-node.types.ts +0 -135
- package/src/wirings/forge-node/index.ts +0 -1
- package/src/wirings/workflow/wire-workflow.ts +0 -94
- 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,
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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, {
|
|
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 {
|
|
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
|
|
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.
|
|
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
|
-
|
|
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 = {
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
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
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
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
|
|
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
|
|
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
|
|
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, {
|
|
311
|
-
const
|
|
312
|
-
|
|
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
|
|
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 {
|