@pikku/core 0.11.1 → 0.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +55 -0
- package/dist/crypto-utils.d.ts +2 -0
- package/dist/crypto-utils.js +78 -0
- package/dist/errors/error-handler.js +3 -3
- package/dist/errors/errors.d.ts +8 -0
- package/dist/errors/errors.js +16 -0
- package/dist/errors/index.d.ts +0 -1
- package/dist/errors/index.js +0 -1
- package/dist/function/function-runner.d.ts +10 -3
- package/dist/function/function-runner.js +136 -31
- package/dist/function/functions.types.d.ts +35 -12
- package/dist/function/functions.types.js +16 -6
- package/dist/function/index.d.ts +2 -2
- package/dist/function/index.js +1 -2
- package/dist/handle-error.js +1 -10
- package/dist/index.d.ts +30 -24
- package/dist/index.js +19 -27
- package/dist/middleware/auth-apikey.d.ts +1 -1
- package/dist/middleware/auth-apikey.js +3 -3
- package/dist/middleware/auth-bearer.d.ts +1 -1
- package/dist/middleware/auth-bearer.js +3 -6
- package/dist/middleware/auth-cookie.d.ts +1 -1
- package/dist/middleware/auth-cookie.js +6 -8
- package/dist/middleware/cors.d.ts +46 -0
- package/dist/middleware/cors.js +73 -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 +1 -1
- package/dist/middleware-runner.d.ts +3 -14
- package/dist/middleware-runner.js +14 -16
- package/dist/permissions.d.ts +3 -86
- package/dist/permissions.js +20 -80
- package/dist/pikku-state.d.ts +33 -104
- package/dist/pikku-state.js +150 -66
- package/dist/schema.d.ts +8 -6
- package/dist/schema.js +31 -18
- package/dist/services/ai-agent-runner-service.d.ts +24 -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/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 +94 -0
- package/dist/services/in-memory-trigger-service.d.ts +23 -0
- package/dist/services/in-memory-trigger-service.js +50 -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 +25 -11
- package/dist/services/index.js +10 -13
- package/dist/services/local-secrets.d.ts +23 -0
- package/dist/services/local-secrets.js +45 -0
- package/dist/services/local-variables.d.ts +5 -0
- package/dist/services/local-variables.js +18 -0
- package/dist/services/scheduler-service.d.ts +21 -1
- package/dist/services/scheduler-service.js +14 -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 +23 -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 +13 -0
- 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 +43 -0
- package/dist/services/workflow-service.js +1 -0
- package/dist/types/core.types.d.ts +54 -10
- package/dist/types/core.types.js +7 -0
- package/dist/types/state.types.d.ts +127 -0
- package/dist/types/state.types.js +1 -0
- package/dist/utils.d.ts +10 -1
- package/dist/utils.js +60 -3
- package/dist/version.d.ts +6 -0
- package/dist/version.js +19 -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 +60 -0
- package/dist/wirings/ai-agent/ai-agent-prepare.js +312 -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 +96 -0
- package/dist/wirings/ai-agent/ai-agent-stream.d.ts +11 -0
- package/dist/wirings/ai-agent/ai-agent-stream.js +503 -0
- package/dist/wirings/ai-agent/ai-agent.types.d.ts +254 -0
- package/dist/wirings/ai-agent/ai-agent.types.js +1 -0
- package/dist/wirings/ai-agent/index.d.ts +5 -0
- package/dist/wirings/ai-agent/index.js +4 -0
- package/dist/wirings/channel/channel-common.d.ts +7 -4
- package/dist/wirings/channel/channel-common.js +15 -8
- package/dist/wirings/channel/channel-handler.js +13 -4
- 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.js +12 -12
- package/dist/wirings/channel/channel.types.d.ts +5 -1
- 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.js +18 -6
- package/dist/wirings/channel/log-channels.js +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.js +17 -6
- package/dist/wirings/cli/channel/cli-channel-runner.js +3 -2
- 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 +1 -1
- package/dist/wirings/cli/cli-runner.js +22 -18
- package/dist/wirings/cli/cli.types.d.ts +7 -6
- 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 +2 -2
- package/dist/wirings/http/http-runner.js +62 -27
- package/dist/wirings/http/http.types.d.ts +77 -24
- package/dist/wirings/http/index.d.ts +5 -4
- package/dist/wirings/http/index.js +4 -3
- package/dist/wirings/http/log-http-routes.js +1 -1
- package/dist/wirings/http/routers/path-to-regex.js +2 -2
- package/dist/wirings/mcp/index.d.ts +4 -3
- package/dist/wirings/mcp/index.js +3 -3
- package/dist/wirings/mcp/mcp-runner.d.ts +1 -3
- package/dist/wirings/mcp/mcp-runner.js +42 -56
- package/dist/wirings/mcp/mcp.types.d.ts +3 -3
- 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 +2 -2
- package/dist/wirings/queue/index.js +1 -1
- package/dist/wirings/queue/queue-runner.d.ts +7 -0
- package/dist/wirings/queue/queue-runner.js +23 -12
- package/dist/wirings/queue/queue.types.d.ts +8 -2
- package/dist/wirings/rpc/index.d.ts +1 -1
- package/dist/wirings/rpc/index.js +1 -1
- package/dist/wirings/rpc/rpc-runner.d.ts +40 -13
- package/dist/wirings/rpc/rpc-runner.js +191 -25
- package/dist/wirings/rpc/rpc-types.d.ts +15 -4
- package/dist/wirings/scheduler/index.d.ts +3 -3
- package/dist/wirings/scheduler/index.js +2 -3
- package/dist/wirings/scheduler/log-schedulers.js +1 -1
- package/dist/wirings/scheduler/scheduler-runner.d.ts +5 -0
- package/dist/wirings/scheduler/scheduler-runner.js +28 -10
- 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 -0
- package/dist/wirings/trigger/index.js +2 -0
- package/dist/wirings/trigger/pikku-trigger-service.d.ts +26 -0
- package/dist/wirings/trigger/pikku-trigger-service.js +75 -0
- package/dist/wirings/trigger/trigger-runner.d.ts +42 -0
- package/dist/wirings/trigger/trigger-runner.js +85 -0
- package/dist/wirings/trigger/trigger.types.d.ts +130 -0
- package/dist/wirings/trigger/trigger.types.js +40 -0
- 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 +5 -0
- package/dist/wirings/workflow/dsl/index.js +4 -0
- package/dist/wirings/workflow/dsl/workflow-dsl.types.d.ts +292 -0
- package/dist/wirings/workflow/dsl/workflow-dsl.types.js +5 -0
- package/dist/wirings/workflow/dsl/workflow-runner.d.ts +5 -0
- package/dist/wirings/workflow/dsl/workflow-runner.js +23 -0
- package/dist/wirings/workflow/graph/graph-node.d.ts +117 -0
- package/dist/wirings/workflow/graph/graph-node.js +58 -0
- package/dist/wirings/workflow/graph/graph-runner.d.ts +9 -0
- package/dist/wirings/workflow/graph/graph-runner.js +540 -0
- package/dist/wirings/workflow/graph/index.d.ts +4 -0
- package/dist/wirings/workflow/graph/index.js +3 -0
- 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 +82 -0
- package/dist/wirings/workflow/graph/workflow-graph.types.js +15 -0
- package/dist/wirings/workflow/index.d.ts +7 -12
- package/dist/wirings/workflow/index.js +8 -11
- package/dist/wirings/workflow/pikku-workflow-service.d.ts +114 -10
- package/dist/wirings/workflow/pikku-workflow-service.js +386 -115
- package/dist/wirings/workflow/workflow-helpers.d.ts +36 -0
- package/dist/wirings/workflow/workflow-helpers.js +38 -0
- package/dist/wirings/workflow/workflow-utils.d.ts +1 -0
- package/dist/wirings/workflow/workflow-utils.js +1 -0
- package/dist/wirings/workflow/workflow.types.d.ts +83 -214
- package/package.json +13 -6
- package/run-tests.sh +4 -1
- package/src/crypto-utils.ts +99 -0
- package/src/errors/error-handler.ts +3 -3
- package/src/errors/errors.ts +17 -0
- package/src/errors/index.ts +0 -1
- package/src/factory-functions.test.ts +42 -2
- package/src/function/function-runner.test.ts +5 -12
- package/src/function/function-runner.ts +195 -40
- package/src/function/functions.types.ts +66 -14
- package/src/function/index.ts +5 -2
- package/src/handle-error.ts +2 -10
- package/src/index.ts +106 -27
- package/src/middleware/auth-apikey.test.ts +15 -12
- package/src/middleware/auth-apikey.ts +3 -3
- package/src/middleware/auth-bearer.test.ts +17 -14
- package/src/middleware/auth-bearer.ts +25 -27
- package/src/middleware/auth-cookie.test.ts +16 -13
- package/src/middleware/auth-cookie.ts +6 -8
- package/src/middleware/cors.ts +96 -0
- package/src/middleware/index.ts +5 -3
- package/src/middleware/remote-auth.ts +68 -0
- package/src/middleware-runner.test.ts +122 -0
- package/src/middleware-runner.ts +24 -17
- package/src/permissions.test.ts +102 -86
- package/src/permissions.ts +32 -93
- package/src/pikku-state.ts +168 -201
- package/src/run-tests-script.test.ts +49 -0
- package/src/schema.ts +50 -18
- package/src/services/ai-agent-runner-service.ts +29 -0
- package/src/services/ai-run-state-service.ts +20 -0
- package/src/services/ai-storage-service.ts +39 -0
- package/src/services/deployment-service.ts +22 -0
- package/src/services/gopass-secrets.ts +95 -0
- package/src/services/in-memory-trigger-service.ts +68 -0
- package/src/services/in-memory-workflow-service.ts +395 -0
- package/src/services/index.ts +49 -14
- package/src/services/local-secrets.ts +51 -0
- package/src/services/local-variables.ts +22 -0
- package/src/services/scheduler-service.ts +29 -1
- package/src/services/schema-service.ts +7 -0
- package/src/services/scoped-secret-service.ts +41 -0
- package/src/services/secret-service.ts +25 -4
- package/src/services/trigger-service.ts +38 -0
- package/src/services/typed-secret-service.ts +70 -0
- package/src/services/typed-variables-service.ts +81 -0
- package/src/services/user-session-service.ts +23 -0
- package/src/services/variables-service.ts +5 -0
- package/src/services/workflow-service.ts +94 -0
- package/src/types/core.types.ts +82 -8
- package/src/types/state.types.ts +169 -0
- package/src/utils.ts +74 -5
- package/src/version.test.ts +80 -0
- package/src/version.ts +25 -0
- package/src/wirings/ai-agent/ai-agent-memory.ts +300 -0
- package/src/wirings/ai-agent/ai-agent-model-config.ts +43 -0
- package/src/wirings/ai-agent/ai-agent-prepare.ts +470 -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 +75 -0
- package/src/wirings/ai-agent/ai-agent-runner.ts +137 -0
- package/src/wirings/ai-agent/ai-agent-stream.test.ts +246 -0
- package/src/wirings/ai-agent/ai-agent-stream.ts +774 -0
- package/src/wirings/ai-agent/ai-agent.types.ts +273 -0
- package/src/wirings/ai-agent/index.ts +28 -0
- package/src/wirings/channel/channel-common.ts +32 -19
- package/src/wirings/channel/channel-handler.ts +18 -5
- package/src/wirings/channel/channel-middleware-runner.ts +119 -0
- package/src/wirings/channel/channel-runner.ts +14 -15
- package/src/wirings/channel/channel.types.ts +17 -1
- 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 +47 -2
- package/src/wirings/channel/local/local-channel-runner.ts +22 -6
- package/src/wirings/channel/log-channels.ts +1 -1
- package/src/wirings/channel/serverless/index.ts +5 -1
- package/src/wirings/channel/serverless/serverless-channel-runner.ts +22 -6
- package/src/wirings/cli/channel/cli-channel-runner.ts +4 -3
- package/src/wirings/cli/channel/index.ts +1 -1
- package/src/wirings/cli/cli-runner.test.ts +28 -28
- package/src/wirings/cli/cli-runner.ts +27 -19
- package/src/wirings/cli/cli.types.ts +12 -11
- package/src/wirings/cli/command-parser.test.ts +8 -8
- 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 +5 -5
- package/src/wirings/http/http-runner.ts +80 -29
- package/src/wirings/http/http.types.ts +121 -23
- package/src/wirings/http/index.ts +16 -4
- package/src/wirings/http/log-http-routes.ts +1 -1
- package/src/wirings/http/routers/path-to-regex.test.ts +30 -19
- package/src/wirings/http/routers/path-to-regex.ts +2 -2
- package/src/wirings/mcp/index.ts +27 -3
- package/src/wirings/mcp/mcp-endpoint-registry.test.ts +3 -3
- package/src/wirings/mcp/mcp-runner.ts +56 -67
- package/src/wirings/mcp/mcp.types.ts +3 -3
- 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 +14 -2
- package/src/wirings/queue/queue-runner.test.ts +115 -73
- package/src/wirings/queue/queue-runner.ts +39 -13
- package/src/wirings/queue/queue.types.ts +12 -2
- package/src/wirings/rpc/index.ts +1 -1
- package/src/wirings/rpc/rpc-runner.ts +270 -34
- package/src/wirings/rpc/rpc-types.ts +21 -4
- package/src/wirings/scheduler/index.ts +7 -4
- package/src/wirings/scheduler/log-schedulers.ts +1 -1
- package/src/wirings/scheduler/scheduler-runner.test.ts +97 -53
- package/src/wirings/scheduler/scheduler-runner.ts +50 -10
- package/src/wirings/secret/index.ts +9 -0
- package/src/wirings/secret/secret.types.ts +32 -0
- package/src/wirings/secret/validate-secret-definitions.ts +82 -0
- package/src/wirings/trigger/index.ts +10 -0
- package/src/wirings/trigger/pikku-trigger-service.ts +134 -0
- package/src/wirings/trigger/trigger-runner.ts +138 -0
- package/src/wirings/trigger/trigger.types.ts +178 -0
- package/src/wirings/variable/index.ts +8 -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 +31 -0
- package/src/wirings/workflow/dsl/workflow-dsl.types.ts +320 -0
- package/src/wirings/workflow/dsl/workflow-runner.ts +28 -0
- package/src/wirings/workflow/graph/graph-node.ts +222 -0
- package/src/wirings/workflow/graph/graph-runner.test.ts +495 -0
- package/src/wirings/workflow/graph/graph-runner.ts +816 -0
- package/src/wirings/workflow/graph/index.ts +14 -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 +104 -0
- package/src/wirings/workflow/index.ts +64 -26
- package/src/wirings/workflow/pikku-workflow-service.test.ts +212 -0
- package/src/wirings/workflow/pikku-workflow-service.ts +571 -136
- package/src/wirings/workflow/workflow-helpers.ts +79 -0
- package/src/wirings/workflow/workflow-utils.ts +0 -0
- package/src/wirings/workflow/workflow.types.ts +123 -279
- package/tsconfig.tsbuildinfo +1 -1
- package/dist/wirings/workflow/workflow-runner.d.ts +0 -34
- package/dist/wirings/workflow/workflow-runner.js +0 -65
- package/src/function/function-runner.ts.bak +0 -188
- package/src/wirings/workflow/workflow-runner.ts +0 -72
|
@@ -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
|
+
}
|
|
@@ -31,7 +31,7 @@ import { PikkuFetchHTTPResponse } from './pikku-fetch-http-response.js';
|
|
|
31
31
|
* ])
|
|
32
32
|
* ```
|
|
33
33
|
*/
|
|
34
|
-
export declare const addHTTPMiddleware: <PikkuMiddleware extends CorePikkuMiddleware>(pattern: string, middleware: CorePikkuMiddlewareGroup) => CorePikkuMiddlewareGroup;
|
|
34
|
+
export declare const addHTTPMiddleware: <PikkuMiddleware extends CorePikkuMiddleware>(pattern: string, middleware: CorePikkuMiddlewareGroup, packageName?: string | null) => CorePikkuMiddlewareGroup;
|
|
35
35
|
/**
|
|
36
36
|
* Registers HTTP permissions for a specific route pattern.
|
|
37
37
|
*
|
|
@@ -61,7 +61,7 @@ export declare const addHTTPMiddleware: <PikkuMiddleware extends CorePikkuMiddle
|
|
|
61
61
|
* ])
|
|
62
62
|
* ```
|
|
63
63
|
*/
|
|
64
|
-
export declare const addHTTPPermission: <PikkuPermission extends CorePikkuPermission>(pattern: string, permissions: CorePermissionGroup | CorePikkuPermission[]) => CorePermissionGroup | CorePikkuPermission[];
|
|
64
|
+
export declare const addHTTPPermission: <PikkuPermission extends CorePikkuPermission>(pattern: string, permissions: CorePermissionGroup | CorePikkuPermission[], packageName?: string | null) => CorePermissionGroup | CorePikkuPermission[];
|
|
65
65
|
/**
|
|
66
66
|
* Adds a new route to the global HTTP route registry.
|
|
67
67
|
*
|
|
@@ -1,12 +1,26 @@
|
|
|
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 { PikkuSessionService } from '../../services/user-session-service.js';
|
|
3
|
+
import { PikkuSessionService, createMiddlewareSessionWireProps, } from '../../services/user-session-service.js';
|
|
4
4
|
import { handleHTTPError } from '../../handle-error.js';
|
|
5
5
|
import { pikkuState } from '../../pikku-state.js';
|
|
6
6
|
import { PikkuFetchHTTPResponse } from './pikku-fetch-http-response.js';
|
|
7
7
|
import { PikkuFetchHTTPRequest } from './pikku-fetch-http-request.js';
|
|
8
8
|
import { addFunction, runPikkuFunc } from '../../function/function-runner.js';
|
|
9
9
|
import { httpRouter } from './routers/http-router.js';
|
|
10
|
+
import { validateSchema } from '../../schema.js';
|
|
11
|
+
/**
|
|
12
|
+
* Extract headers from a PikkuHTTPRequest based on the schema keys
|
|
13
|
+
*/
|
|
14
|
+
function extractHeadersFromRequest(request, headerKeys) {
|
|
15
|
+
const headers = {};
|
|
16
|
+
for (const headerName of headerKeys) {
|
|
17
|
+
const value = request.header(headerName);
|
|
18
|
+
if (value !== null) {
|
|
19
|
+
headers[headerName] = value;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
return headers;
|
|
23
|
+
}
|
|
10
24
|
/**
|
|
11
25
|
* Registers HTTP middleware for a specific route pattern.
|
|
12
26
|
*
|
|
@@ -36,8 +50,8 @@ import { httpRouter } from './routers/http-router.js';
|
|
|
36
50
|
* ])
|
|
37
51
|
* ```
|
|
38
52
|
*/
|
|
39
|
-
export const addHTTPMiddleware = (pattern, middleware) => {
|
|
40
|
-
const httpGroups = pikkuState('middleware', 'httpGroup');
|
|
53
|
+
export const addHTTPMiddleware = (pattern, middleware, packageName = null) => {
|
|
54
|
+
const httpGroups = pikkuState(packageName, 'middleware', 'httpGroup');
|
|
41
55
|
httpGroups[pattern] = middleware;
|
|
42
56
|
return middleware;
|
|
43
57
|
};
|
|
@@ -70,8 +84,8 @@ export const addHTTPMiddleware = (pattern, middleware) => {
|
|
|
70
84
|
* ])
|
|
71
85
|
* ```
|
|
72
86
|
*/
|
|
73
|
-
export const addHTTPPermission = (pattern, permissions) => {
|
|
74
|
-
const httpGroups = pikkuState('permissions', 'httpGroup');
|
|
87
|
+
export const addHTTPPermission = (pattern, permissions, packageName = null) => {
|
|
88
|
+
const httpGroups = pikkuState(packageName, 'permissions', 'httpGroup');
|
|
75
89
|
httpGroups[pattern] = permissions;
|
|
76
90
|
return permissions;
|
|
77
91
|
};
|
|
@@ -91,17 +105,19 @@ export const addHTTPPermission = (pattern, permissions) => {
|
|
|
91
105
|
* @param {CoreHTTPFunctionWiring<In, Out, Route, PikkuFunction, PikkuFunctionSessionless, PikkuPermission, PikkuMiddleware>} httpWiring - The HTTP wiring configuration object.
|
|
92
106
|
*/
|
|
93
107
|
export const wireHTTP = (httpWiring) => {
|
|
94
|
-
const httpMeta = pikkuState('http', 'meta');
|
|
108
|
+
const httpMeta = pikkuState(null, 'http', 'meta');
|
|
95
109
|
const routeMeta = httpMeta[httpWiring.method][httpWiring.route];
|
|
96
110
|
if (!routeMeta) {
|
|
97
|
-
throw new
|
|
111
|
+
throw new PikkuMissingMetaError(`Missing generated metadata for HTTP route '${httpWiring.method.toUpperCase()} ${httpWiring.route}'`);
|
|
98
112
|
}
|
|
99
|
-
|
|
100
|
-
|
|
113
|
+
if (httpWiring.func) {
|
|
114
|
+
addFunction(routeMeta.pikkuFuncId, httpWiring.func);
|
|
115
|
+
}
|
|
116
|
+
const routes = pikkuState(null, 'http', 'routes');
|
|
101
117
|
if (!routes.has(httpWiring.method)) {
|
|
102
118
|
routes.set(httpWiring.method, new Map());
|
|
103
119
|
}
|
|
104
|
-
pikkuState('http', 'routes')
|
|
120
|
+
pikkuState(null, 'http', 'routes')
|
|
105
121
|
.get(httpWiring.method)
|
|
106
122
|
?.set(httpWiring.route, httpWiring);
|
|
107
123
|
};
|
|
@@ -119,10 +135,10 @@ export const wireHTTP = (httpWiring) => {
|
|
|
119
135
|
const getMatchingRoute = (requestType, requestPath) => {
|
|
120
136
|
const matchedPath = httpRouter.match(requestType.toLowerCase(), requestPath);
|
|
121
137
|
if (matchedPath) {
|
|
122
|
-
const route = pikkuState('http', 'routes')
|
|
138
|
+
const route = pikkuState(null, 'http', 'routes')
|
|
123
139
|
.get(requestType.toLowerCase())
|
|
124
140
|
.get(matchedPath.route);
|
|
125
|
-
const meta = pikkuState('http', 'meta')[requestType.toLowerCase()][route.route];
|
|
141
|
+
const meta = pikkuState(null, 'http', 'meta')[requestType.toLowerCase()][route.route];
|
|
126
142
|
return {
|
|
127
143
|
matchedPath,
|
|
128
144
|
params: matchedPath.params,
|
|
@@ -179,17 +195,29 @@ const executeRoute = async (services, matchedRoute, http, options) => {
|
|
|
179
195
|
const userSession = new PikkuSessionService();
|
|
180
196
|
const { params, route, meta } = matchedRoute;
|
|
181
197
|
const { singletonServices, createWireServices, skipUserSession, requestId } = services;
|
|
198
|
+
// Attach URL parameters to the request object
|
|
199
|
+
http?.request?.setParams(params);
|
|
200
|
+
// Validate request headers if schema is defined
|
|
201
|
+
if (meta.headersSchemaName && http.request && singletonServices.schema) {
|
|
202
|
+
const headerKeys = singletonServices.schema.getSchemaKeys(meta.headersSchemaName);
|
|
203
|
+
const rawHeaders = extractHeadersFromRequest(http.request, headerKeys);
|
|
204
|
+
await validateSchema(singletonServices.logger, singletonServices.schema, meta.headersSchemaName, rawHeaders);
|
|
205
|
+
}
|
|
182
206
|
const requiresSession = route.auth !== false;
|
|
183
207
|
let wireServices;
|
|
184
208
|
let result;
|
|
185
|
-
// Attach URL parameters to the request object
|
|
186
|
-
http?.request?.setParams(params);
|
|
187
209
|
singletonServices.logger.info(`Matched route: ${route.route} | method: ${route.method.toUpperCase()} | auth: ${requiresSession.toString()}`);
|
|
188
210
|
// Ensure session is available when required
|
|
189
211
|
if (skipUserSession && requiresSession) {
|
|
190
212
|
throw new Error("Can't skip trying to get user session if auth is required");
|
|
191
213
|
}
|
|
192
|
-
|
|
214
|
+
let cachedData;
|
|
215
|
+
const data = async () => {
|
|
216
|
+
if (cachedData === undefined) {
|
|
217
|
+
cachedData = await http.request.data();
|
|
218
|
+
}
|
|
219
|
+
return cachedData;
|
|
220
|
+
};
|
|
193
221
|
let channel;
|
|
194
222
|
if (matchedRoute.route.sse) {
|
|
195
223
|
const response = http?.response;
|
|
@@ -217,8 +245,12 @@ const executeRoute = async (services, matchedRoute, http, options) => {
|
|
|
217
245
|
state: 'open',
|
|
218
246
|
};
|
|
219
247
|
}
|
|
220
|
-
const wire = {
|
|
221
|
-
|
|
248
|
+
const wire = {
|
|
249
|
+
http,
|
|
250
|
+
channel,
|
|
251
|
+
...createMiddlewareSessionWireProps(userSession),
|
|
252
|
+
};
|
|
253
|
+
result = await runPikkuFunc('http', `${meta.method}:${meta.route}`, meta.pikkuFuncId, {
|
|
222
254
|
singletonServices,
|
|
223
255
|
createWireServices,
|
|
224
256
|
auth: route.auth !== false,
|
|
@@ -230,17 +262,20 @@ const executeRoute = async (services, matchedRoute, http, options) => {
|
|
|
230
262
|
coerceDataFromSchema: options.coerceDataFromSchema,
|
|
231
263
|
tags: route.tags,
|
|
232
264
|
wire,
|
|
265
|
+
sessionService: userSession,
|
|
233
266
|
});
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
267
|
+
if (!matchedRoute.route.sse) {
|
|
268
|
+
if (result === undefined || result === null) {
|
|
269
|
+
http?.response?.status(204);
|
|
270
|
+
}
|
|
271
|
+
else if (route.returnsJSON === false) {
|
|
272
|
+
http?.response?.arrayBuffer(result);
|
|
273
|
+
}
|
|
274
|
+
else {
|
|
275
|
+
http?.response?.status(200);
|
|
276
|
+
http?.response?.json(result);
|
|
277
|
+
}
|
|
240
278
|
}
|
|
241
|
-
http?.response?.status(200);
|
|
242
|
-
// TODO: Evaluate if the response stream should be explicitly ended.
|
|
243
|
-
// http?.response?.end()
|
|
244
279
|
return wireServices ? { result, wireServices } : { result };
|
|
245
280
|
};
|
|
246
281
|
/**
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { SerializeOptions } from 'cookie';
|
|
2
|
-
import type {
|
|
2
|
+
import type { StandardSchemaV1 } from '@standard-schema/spec';
|
|
3
|
+
import { PikkuError } from '../../errors/error-handler.js';
|
|
3
4
|
import type { CoreServices, CoreSingletonServices, CoreUserSession, CreateWireServices, CorePikkuMiddleware, CommonWireMeta } from '../../types/core.types.js';
|
|
4
5
|
import type { CorePikkuFunction, CorePikkuFunctionSessionless, CorePikkuPermission, CorePermissionGroup, CorePikkuFunctionConfig } from '../../function/functions.types.js';
|
|
5
6
|
type ExtractHTTPWiringParams<S extends string> = S extends `${string}:${infer Param}/${infer Rest}` ? Param | ExtractHTTPWiringParams<`/${Rest}`> : S extends `${string}:${infer Param}` ? Param : never;
|
|
@@ -19,28 +20,43 @@ export type RunHTTPWiringOptions = Partial<{
|
|
|
19
20
|
}>;
|
|
20
21
|
export type RunHTTPWiringParams = {
|
|
21
22
|
singletonServices: CoreSingletonServices;
|
|
22
|
-
createWireServices
|
|
23
|
+
createWireServices?: CreateWireServices<CoreSingletonServices, CoreServices<CoreSingletonServices>, CoreUserSession>;
|
|
23
24
|
};
|
|
24
25
|
/**
|
|
25
26
|
* Represents the HTTP methods supported for API HTTP wirings.
|
|
26
|
-
|
|
27
|
+
*/
|
|
27
28
|
export type HTTPMethod = 'post' | 'get' | 'delete' | 'patch' | 'head' | 'put' | 'options';
|
|
28
29
|
/**
|
|
29
|
-
*
|
|
30
|
+
* Header schema type for request header validation.
|
|
31
|
+
* Uses Standard Schema interface - works with Zod, Valibot, ArkType, Effect Schema, etc.
|
|
32
|
+
*/
|
|
33
|
+
export type HTTPHeadersSchema = StandardSchemaV1<Record<string, string | string[] | undefined>>;
|
|
34
|
+
/**
|
|
35
|
+
* Documentation config for OpenAPI generation
|
|
36
|
+
*/
|
|
37
|
+
export type HTTPRouteDocsConfig = {
|
|
38
|
+
description?: string;
|
|
39
|
+
response?: string;
|
|
40
|
+
errors?: Array<typeof PikkuError>;
|
|
41
|
+
tags?: string[];
|
|
42
|
+
};
|
|
43
|
+
/**
|
|
44
|
+
* Common HTTP route configuration shared between wireHTTP and wireHTTPRoutes
|
|
30
45
|
*/
|
|
31
|
-
export type
|
|
46
|
+
export type HTTPRouteBaseConfig = {
|
|
32
47
|
contentType?: 'xml' | 'json';
|
|
48
|
+
timeout?: number;
|
|
49
|
+
tags?: string[];
|
|
50
|
+
headers?: HTTPHeadersSchema;
|
|
51
|
+
docs?: HTTPRouteDocsConfig;
|
|
52
|
+
};
|
|
53
|
+
/**
|
|
54
|
+
* Represents an API HTTP wiring without a function, including metadata such as content type, route, and timeout settings.
|
|
55
|
+
*/
|
|
56
|
+
export type CoreHTTPFunction = HTTPRouteBaseConfig & {
|
|
33
57
|
route: string;
|
|
34
58
|
eventChannel?: false;
|
|
35
59
|
returnsJSON?: false;
|
|
36
|
-
timeout?: number;
|
|
37
|
-
tags?: string[];
|
|
38
|
-
docs?: Partial<{
|
|
39
|
-
description: string;
|
|
40
|
-
response: string;
|
|
41
|
-
errors: Array<typeof PikkuError>;
|
|
42
|
-
tags: string[];
|
|
43
|
-
}>;
|
|
44
60
|
};
|
|
45
61
|
/**
|
|
46
62
|
* Represents a http wire within Pikku, including a request and response.
|
|
@@ -67,13 +83,12 @@ export type PikkuQuery<T = Record<string, string | undefined>> = Record<string,
|
|
|
67
83
|
* @template PikkuFunctionSessionless - The sessionless API function type, defaults to `CorePikkuFunctionSessionless`.
|
|
68
84
|
* @template PikkuPermission - The permission function type, defaults to `CorePikkuPermission`.
|
|
69
85
|
*/
|
|
70
|
-
export type CoreHTTPFunctionWiring<In, Out, R extends string, PikkuFunction extends CorePikkuFunction<In, Out, any, any> = CorePikkuFunction<In, Out>, PikkuFunctionSessionless extends CorePikkuFunctionSessionless<In, Out, any, any> = CorePikkuFunctionSessionless<In, Out>, PikkuPermission extends CorePikkuPermission<In, any, any> = CorePikkuPermission<In, any, any>, PikkuMiddleware extends CorePikkuMiddleware<any, any> = CorePikkuMiddleware<any>> = (CoreHTTPFunction & {
|
|
86
|
+
export type CoreHTTPFunctionWiring<In, Out, R extends string, PikkuFunction extends CorePikkuFunction<In, Out, any, any, any> = CorePikkuFunction<In, Out>, PikkuFunctionSessionless extends CorePikkuFunctionSessionless<In, Out, any, any, any> = CorePikkuFunctionSessionless<In, Out>, PikkuPermission extends CorePikkuPermission<In, any, any> = CorePikkuPermission<In, any, any>, PikkuMiddleware extends CorePikkuMiddleware<any, any> = CorePikkuMiddleware<any>> = (CoreHTTPFunction & {
|
|
71
87
|
route: R;
|
|
72
88
|
method: HTTPMethod;
|
|
73
89
|
func: CorePikkuFunctionConfig<PikkuFunction, PikkuPermission, PikkuMiddleware>;
|
|
74
90
|
permissions?: CorePermissionGroup<PikkuPermission>;
|
|
75
91
|
auth?: true;
|
|
76
|
-
tags?: string[];
|
|
77
92
|
middleware?: PikkuMiddleware[];
|
|
78
93
|
sse?: undefined;
|
|
79
94
|
}) | (CoreHTTPFunction & {
|
|
@@ -82,7 +97,6 @@ export type CoreHTTPFunctionWiring<In, Out, R extends string, PikkuFunction exte
|
|
|
82
97
|
func: CorePikkuFunctionConfig<PikkuFunctionSessionless, PikkuPermission, PikkuMiddleware>;
|
|
83
98
|
permissions?: undefined;
|
|
84
99
|
auth?: false;
|
|
85
|
-
tags?: string[];
|
|
86
100
|
middleware?: PikkuMiddleware[];
|
|
87
101
|
sse?: undefined;
|
|
88
102
|
}) | (CoreHTTPFunction & {
|
|
@@ -91,27 +105,24 @@ export type CoreHTTPFunctionWiring<In, Out, R extends string, PikkuFunction exte
|
|
|
91
105
|
func: CorePikkuFunctionConfig<PikkuFunction, PikkuPermission, PikkuMiddleware>;
|
|
92
106
|
permissions?: CorePermissionGroup<PikkuPermission>;
|
|
93
107
|
auth?: true;
|
|
94
|
-
sse?: boolean;
|
|
95
|
-
tags?: string[];
|
|
96
108
|
middleware?: PikkuMiddleware[];
|
|
109
|
+
sse?: boolean;
|
|
97
110
|
}) | (CoreHTTPFunction & {
|
|
98
111
|
route: R;
|
|
99
112
|
method: 'get';
|
|
100
113
|
func: CorePikkuFunctionConfig<PikkuFunctionSessionless, PikkuPermission, PikkuMiddleware>;
|
|
101
114
|
permissions?: undefined;
|
|
102
115
|
auth?: false;
|
|
103
|
-
sse?: boolean;
|
|
104
|
-
tags?: string[];
|
|
105
116
|
middleware?: PikkuMiddleware[];
|
|
117
|
+
sse?: boolean;
|
|
106
118
|
}) | (CoreHTTPFunction & {
|
|
107
119
|
route: R;
|
|
108
120
|
method: 'post';
|
|
109
121
|
func: CorePikkuFunctionConfig<PikkuFunction, PikkuPermission, PikkuMiddleware>;
|
|
110
122
|
permissions?: CorePermissionGroup<PikkuPermission>;
|
|
111
123
|
auth?: true;
|
|
112
|
-
query?: Array<keyof In>;
|
|
113
|
-
tags?: string[];
|
|
114
124
|
middleware?: PikkuMiddleware[];
|
|
125
|
+
query?: Array<keyof In>;
|
|
115
126
|
sse?: undefined;
|
|
116
127
|
}) | (CoreHTTPFunction & {
|
|
117
128
|
route: R;
|
|
@@ -119,9 +130,8 @@ export type CoreHTTPFunctionWiring<In, Out, R extends string, PikkuFunction exte
|
|
|
119
130
|
func: CorePikkuFunctionConfig<PikkuFunctionSessionless, PikkuPermission, PikkuMiddleware>;
|
|
120
131
|
permissions?: undefined;
|
|
121
132
|
auth?: false;
|
|
122
|
-
query?: Array<keyof In>;
|
|
123
|
-
tags?: string[];
|
|
124
133
|
middleware?: PikkuMiddleware[];
|
|
134
|
+
query?: Array<keyof In>;
|
|
125
135
|
sse?: undefined;
|
|
126
136
|
});
|
|
127
137
|
/**
|
|
@@ -141,7 +151,9 @@ export type HTTPWiringMeta = CommonWireMeta & {
|
|
|
141
151
|
params?: string[];
|
|
142
152
|
query?: string[];
|
|
143
153
|
inputTypes?: HTTPFunctionMetaInputTypes;
|
|
154
|
+
headersSchemaName?: string;
|
|
144
155
|
sse?: true;
|
|
156
|
+
groupBasePath?: string;
|
|
145
157
|
};
|
|
146
158
|
export type HTTPWiringsMeta = Record<HTTPMethod, Record<string, HTTPWiringMeta>>;
|
|
147
159
|
export type HTTPFunctionsMeta = Array<{
|
|
@@ -175,4 +187,45 @@ export interface PikkuHTTPResponse<Out = unknown> {
|
|
|
175
187
|
close?: () => void;
|
|
176
188
|
setMode?: (mode: 'stream') => void;
|
|
177
189
|
}
|
|
190
|
+
/**
|
|
191
|
+
* Single route configuration - supports all wireHTTP options
|
|
192
|
+
*/
|
|
193
|
+
export type HTTPRouteConfig<PikkuFunction extends CorePikkuFunction<any, any, any, any, any> | CorePikkuFunctionSessionless<any, any, any, any, any> = CorePikkuFunction<any, any, any, any, any> | CorePikkuFunctionSessionless<any, any, any, any, any>, PikkuPermission extends CorePikkuPermission<any, any, any> = CorePikkuPermission<any>, PikkuMiddleware extends CorePikkuMiddleware<any, any> = CorePikkuMiddleware<any, any>> = HTTPRouteBaseConfig & {
|
|
194
|
+
method: HTTPMethod;
|
|
195
|
+
route: string;
|
|
196
|
+
func: CorePikkuFunctionConfig<PikkuFunction, PikkuPermission, PikkuMiddleware>;
|
|
197
|
+
auth?: boolean;
|
|
198
|
+
permissions?: CorePermissionGroup<PikkuPermission>;
|
|
199
|
+
middleware?: PikkuMiddleware[];
|
|
200
|
+
sse?: boolean;
|
|
201
|
+
};
|
|
202
|
+
/**
|
|
203
|
+
* Group-level configuration applied to all routes
|
|
204
|
+
*/
|
|
205
|
+
export type HTTPRoutesGroupConfig<PikkuPermission extends CorePikkuPermission<any, any, any> = CorePikkuPermission<any>, PikkuMiddleware extends CorePikkuMiddleware<any, any> = CorePikkuMiddleware<any, any>> = {
|
|
206
|
+
basePath?: string;
|
|
207
|
+
tags?: string[];
|
|
208
|
+
auth?: boolean;
|
|
209
|
+
middleware?: PikkuMiddleware[];
|
|
210
|
+
permissions?: CorePermissionGroup<PikkuPermission>;
|
|
211
|
+
};
|
|
212
|
+
/**
|
|
213
|
+
* Nested route map - allows hierarchical organization
|
|
214
|
+
* Can contain individual routes, nested maps, or contracts with config
|
|
215
|
+
*/
|
|
216
|
+
export type HTTPRouteMap = {
|
|
217
|
+
[key: string]: HTTPRouteConfig | HTTPRouteMap | HTTPRouteContract;
|
|
218
|
+
};
|
|
219
|
+
/**
|
|
220
|
+
* A route contract with optional group config (returned by defineRoutes)
|
|
221
|
+
*/
|
|
222
|
+
export type HTTPRouteContract<T extends HTTPRouteMap = HTTPRouteMap> = HTTPRoutesGroupConfig & {
|
|
223
|
+
routes: T;
|
|
224
|
+
};
|
|
225
|
+
/**
|
|
226
|
+
* Full configuration for wireHTTPRoutes
|
|
227
|
+
*/
|
|
228
|
+
export type WireHTTPRoutesConfig = HTTPRoutesGroupConfig & {
|
|
229
|
+
routes: HTTPRouteMap | HTTPRouteConfig[];
|
|
230
|
+
};
|
|
178
231
|
export {};
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
export
|
|
2
|
-
export
|
|
3
|
-
export
|
|
1
|
+
export { PikkuFetchHTTPRequest } from './pikku-fetch-http-request.js';
|
|
2
|
+
export { PikkuFetchHTTPResponse } from './pikku-fetch-http-response.js';
|
|
3
|
+
export { logRoutes } from './log-http-routes.js';
|
|
4
4
|
export { fetch, fetchData, wireHTTP, addHTTPMiddleware, addHTTPPermission, } from './http-runner.js';
|
|
5
|
-
export
|
|
5
|
+
export { wireHTTPRoutes, defineHTTPRoutes } from './http-routes.js';
|
|
6
|
+
export type { AssertHTTPWiringParams, CoreHTTPFunctionWiring, HTTPMethod, HTTPRouteBaseConfig, HTTPWiringsMeta, PikkuHTTPRequest, PikkuHTTPResponse, PikkuQuery, RunHTTPWiringOptions, } from './http.types.js';
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
export
|
|
2
|
-
export
|
|
3
|
-
export
|
|
1
|
+
export { PikkuFetchHTTPRequest } from './pikku-fetch-http-request.js';
|
|
2
|
+
export { PikkuFetchHTTPResponse } from './pikku-fetch-http-response.js';
|
|
3
|
+
export { logRoutes } from './log-http-routes.js';
|
|
4
4
|
export { fetch, fetchData, wireHTTP, addHTTPMiddleware, addHTTPPermission, } from './http-runner.js';
|
|
5
|
+
export { wireHTTPRoutes, defineHTTPRoutes } from './http-routes.js';
|
|
@@ -4,7 +4,7 @@ import { pikkuState } from '../../pikku-state.js';
|
|
|
4
4
|
* @param logger - A logger for logging information.
|
|
5
5
|
*/
|
|
6
6
|
export const logRoutes = (logger) => {
|
|
7
|
-
const routesByType = pikkuState('http', 'routes');
|
|
7
|
+
const routesByType = pikkuState(null, 'http', 'routes');
|
|
8
8
|
if (routesByType.size === 0) {
|
|
9
9
|
logger.info('No routes added');
|
|
10
10
|
return;
|
|
@@ -10,8 +10,8 @@ export class PathToRegexRouter {
|
|
|
10
10
|
this.isInitialized = false;
|
|
11
11
|
}
|
|
12
12
|
initialize() {
|
|
13
|
-
const routes = pikkuState('http', 'routes');
|
|
14
|
-
const channelRoutes = pikkuState('channel', 'channels');
|
|
13
|
+
const routes = pikkuState(null, 'http', 'routes');
|
|
14
|
+
const channelRoutes = pikkuState(null, 'channel', 'channels');
|
|
15
15
|
// Helper function to compile routes for a given method
|
|
16
16
|
const compileRoutesForMethod = (method, routeEntries) => {
|
|
17
17
|
const methodCompiledRoutes = this.compiledRoutes.get(method) || new Map();
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
-
export
|
|
2
|
-
export
|
|
3
|
-
export
|
|
1
|
+
export { MCPEndpointRegistry } from './mcp-endpoint-registry.js';
|
|
2
|
+
export { MCPError, wireMCPResource, wireMCPPrompt, runMCPResource, runMCPTool, runMCPPrompt, } from './mcp-runner.js';
|
|
3
|
+
export { getMCPResourcesMeta, getMCPToolsMeta, getMCPPromptsMeta, } from './mcp-runner.js';
|
|
4
|
+
export type { AssertMCPResourceURIParams, CoreMCPPrompt, CoreMCPResource, CoreMCPTool, MCPPromptResponse, MCPResourceMeta, MCPResourceResponse, MCPToolMeta, MCPToolResponse, MCPPromptMeta, PikkuMCP, } from './mcp.types.js';
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export
|
|
2
|
-
export
|
|
3
|
-
export
|
|
1
|
+
export { MCPEndpointRegistry } from './mcp-endpoint-registry.js';
|
|
2
|
+
export { MCPError, wireMCPResource, wireMCPPrompt, runMCPResource, runMCPTool, runMCPPrompt, } from './mcp-runner.js';
|
|
3
|
+
export { getMCPResourcesMeta, getMCPToolsMeta, getMCPPromptsMeta, } from './mcp-runner.js';
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type CoreServices, type CoreSingletonServices, type CoreUserSession, type CreateWireServices } from '../../types/core.types.js';
|
|
2
|
-
import type { CoreMCPResource,
|
|
2
|
+
import type { CoreMCPResource, CoreMCPPrompt, JsonRpcRequest, JsonRpcResponse, JsonRpcErrorResponse, PikkuMCP } from './mcp.types.js';
|
|
3
3
|
import type { CorePikkuFunctionConfig, CorePikkuFunctionSessionless } from '../../function/functions.types.js';
|
|
4
4
|
export declare class MCPError extends Error {
|
|
5
5
|
readonly error: JsonRpcErrorResponse;
|
|
@@ -16,12 +16,10 @@ export type JsonRpcError = {
|
|
|
16
16
|
data?: any;
|
|
17
17
|
};
|
|
18
18
|
export declare const wireMCPResource: <PikkuFunctionConfig extends CorePikkuFunctionConfig<CorePikkuFunctionSessionless<any, any>> = CorePikkuFunctionConfig<CorePikkuFunctionSessionless<any, any>>>(mcpResource: CoreMCPResource<PikkuFunctionConfig>) => void;
|
|
19
|
-
export declare const wireMCPTool: <PikkuFunctionConfig extends CorePikkuFunctionConfig<CorePikkuFunctionSessionless<any, any>> = CorePikkuFunctionConfig<CorePikkuFunctionSessionless<any, any>>>(mcpTool: CoreMCPTool<PikkuFunctionConfig>) => void;
|
|
20
19
|
export declare const wireMCPPrompt: <PikkuFunctionConfig extends CorePikkuFunctionConfig<CorePikkuFunctionSessionless<any, any>> = CorePikkuFunctionConfig<CorePikkuFunctionSessionless<any, any>>>(mcpPrompt: CoreMCPPrompt<PikkuFunctionConfig>) => void;
|
|
21
20
|
export declare function runMCPResource(request: JsonRpcRequest, params: RunMCPEndpointParams, uri: string): Promise<JsonRpcResponse>;
|
|
22
21
|
export declare function runMCPTool(request: JsonRpcRequest, params: RunMCPEndpointParams, name: string): Promise<JsonRpcResponse>;
|
|
23
22
|
export declare function runMCPPrompt(request: JsonRpcRequest, params: RunMCPEndpointParams, name: string): Promise<JsonRpcResponse>;
|
|
24
|
-
export declare const getMCPTools: () => Map<string, CoreMCPTool>;
|
|
25
23
|
export declare const getMCPResources: () => Map<string, CoreMCPResource>;
|
|
26
24
|
export declare const getMCPResourcesMeta: () => import("./mcp.types.js").MCPResourceMeta;
|
|
27
25
|
export declare const getMCPToolsMeta: () => import("./mcp.types.js").MCPToolMeta;
|