@pikku/core 0.11.1 → 0.11.2
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 +24 -0
- package/dist/errors/error-handler.js +3 -3
- package/dist/function/function-runner.d.ts +4 -3
- package/dist/function/function-runner.js +60 -14
- package/dist/function/functions.types.d.ts +84 -5
- package/dist/function/functions.types.js +41 -1
- package/dist/index.d.ts +6 -2
- package/dist/index.js +5 -2
- package/dist/middleware/auth-apikey.d.ts +1 -1
- package/dist/middleware/auth-bearer.d.ts +1 -1
- package/dist/middleware/auth-cookie.d.ts +1 -1
- package/dist/middleware/timeout.d.ts +1 -1
- package/dist/middleware-runner.d.ts +3 -14
- package/dist/middleware-runner.js +8 -8
- package/dist/permissions.d.ts +3 -86
- package/dist/permissions.js +11 -67
- package/dist/pikku-state.d.ts +32 -104
- package/dist/pikku-state.js +140 -66
- package/dist/schema.d.ts +8 -6
- package/dist/schema.js +25 -13
- package/dist/services/workflow-service.d.ts +38 -0
- package/dist/services/workflow-service.js +1 -0
- package/dist/types/core.types.d.ts +12 -4
- package/dist/types/core.types.js +1 -1
- package/dist/types/state.types.d.ts +135 -0
- package/dist/types/state.types.js +1 -0
- package/dist/utils.d.ts +8 -0
- package/dist/utils.js +45 -0
- package/dist/wirings/channel/channel-handler.js +1 -1
- package/dist/wirings/channel/channel-runner.js +5 -5
- package/dist/wirings/channel/log-channels.js +1 -1
- package/dist/wirings/channel/serverless/serverless-channel-runner.js +2 -2
- package/dist/wirings/cli/channel/cli-channel-runner.js +3 -2
- package/dist/wirings/cli/cli-runner.js +10 -10
- package/dist/wirings/cli/cli.types.d.ts +1 -0
- package/dist/wirings/forge-node/forge-node.types.d.ts +120 -0
- package/dist/wirings/forge-node/forge-node.types.js +38 -0
- package/dist/wirings/forge-node/index.d.ts +1 -0
- package/dist/wirings/forge-node/index.js +1 -0
- package/dist/wirings/http/http-runner.d.ts +2 -2
- package/dist/wirings/http/http-runner.js +21 -12
- package/dist/wirings/http/http.types.d.ts +14 -1
- 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/mcp-runner.js +21 -21
- package/dist/wirings/queue/queue-runner.js +6 -6
- 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 +7 -8
- package/dist/wirings/rpc/rpc-runner.js +62 -14
- package/dist/wirings/rpc/rpc-types.d.ts +7 -0
- package/dist/wirings/scheduler/log-schedulers.js +1 -1
- package/dist/wirings/scheduler/scheduler-runner.js +5 -5
- package/dist/wirings/trigger/index.d.ts +2 -0
- package/dist/wirings/trigger/index.js +2 -0
- package/dist/wirings/trigger/trigger-runner.d.ts +29 -0
- package/dist/wirings/trigger/trigger-runner.js +57 -0
- package/dist/wirings/trigger/trigger.types.d.ts +42 -0
- package/dist/wirings/trigger/trigger.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 +286 -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 +22 -0
- package/dist/wirings/workflow/graph/graph-node.d.ts +122 -0
- package/dist/wirings/workflow/graph/graph-node.js +58 -0
- package/dist/wirings/workflow/graph/graph-runner.d.ts +35 -0
- package/dist/wirings/workflow/graph/graph-runner.js +452 -0
- package/dist/wirings/workflow/graph/index.d.ts +3 -0
- package/dist/wirings/workflow/graph/index.js +3 -0
- package/dist/wirings/workflow/graph/workflow-graph.types.d.ts +95 -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 +6 -11
- package/dist/wirings/workflow/pikku-workflow-service.d.ts +96 -6
- package/dist/wirings/workflow/pikku-workflow-service.js +230 -103
- package/dist/wirings/workflow/wire-workflow.d.ts +42 -0
- package/dist/wirings/workflow/wire-workflow.js +53 -0
- package/dist/wirings/workflow/workflow-utils.d.ts +23 -0
- package/dist/wirings/workflow/workflow-utils.js +66 -0
- package/dist/wirings/workflow/workflow.types.d.ts +133 -211
- package/package.json +10 -1
- package/src/errors/error-handler.ts +3 -3
- package/src/function/function-runner.test.ts +1 -1
- package/src/function/function-runner.ts +86 -16
- package/src/function/functions.types.ts +126 -4
- package/src/index.ts +10 -5
- package/src/middleware-runner.ts +16 -9
- package/src/permissions.test.ts +28 -86
- package/src/permissions.ts +21 -80
- package/src/pikku-state.ts +156 -201
- package/src/schema.ts +42 -13
- package/src/services/workflow-service.ts +74 -0
- package/src/types/core.types.ts +12 -3
- package/src/types/state.types.ts +195 -0
- package/src/utils.ts +55 -0
- package/src/wirings/channel/channel-handler.ts +1 -1
- package/src/wirings/channel/channel-runner.ts +5 -5
- package/src/wirings/channel/local/local-channel-runner.test.ts +3 -1
- package/src/wirings/channel/log-channels.ts +1 -1
- package/src/wirings/channel/serverless/serverless-channel-runner.ts +2 -2
- package/src/wirings/cli/channel/cli-channel-runner.ts +4 -3
- package/src/wirings/cli/cli-runner.test.ts +19 -19
- package/src/wirings/cli/cli-runner.ts +10 -9
- package/src/wirings/cli/cli.types.ts +1 -0
- package/src/wirings/forge-node/forge-node.types.ts +135 -0
- package/src/wirings/forge-node/index.ts +1 -0
- package/src/wirings/http/http-runner.test.ts +2 -2
- package/src/wirings/http/http-runner.ts +30 -13
- package/src/wirings/http/http.types.ts +14 -0
- 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/mcp-runner.ts +21 -21
- package/src/wirings/queue/queue-runner.test.ts +19 -19
- package/src/wirings/queue/queue-runner.ts +6 -6
- package/src/wirings/rpc/index.ts +1 -1
- package/src/wirings/rpc/rpc-runner.ts +88 -22
- package/src/wirings/rpc/rpc-types.ts +8 -0
- package/src/wirings/scheduler/log-schedulers.ts +1 -1
- package/src/wirings/scheduler/scheduler-runner.test.ts +27 -27
- package/src/wirings/scheduler/scheduler-runner.ts +5 -5
- package/src/wirings/trigger/index.ts +2 -0
- package/src/wirings/trigger/trigger-runner.ts +96 -0
- package/src/wirings/trigger/trigger.types.ts +56 -0
- package/src/wirings/workflow/dsl/index.ts +30 -0
- package/src/wirings/workflow/dsl/workflow-dsl.types.ts +312 -0
- package/src/wirings/workflow/dsl/workflow-runner.ts +27 -0
- package/src/wirings/workflow/graph/graph-node.ts +227 -0
- package/src/wirings/workflow/graph/graph-runner.ts +694 -0
- package/src/wirings/workflow/graph/index.ts +3 -0
- package/src/wirings/workflow/graph/workflow-graph.types.ts +126 -0
- package/src/wirings/workflow/index.ts +53 -26
- package/src/wirings/workflow/pikku-workflow-service.ts +333 -117
- package/src/wirings/workflow/wire-workflow.ts +94 -0
- package/src/wirings/workflow/workflow-utils.ts +120 -0
- package/src/wirings/workflow/workflow.types.ts +166 -277
- 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
|
@@ -1,188 +0,0 @@
|
|
|
1
|
-
import { runMiddleware, combineMiddleware } from '../middleware-runner.js'
|
|
2
|
-
import { runPermissions } from '../permissions.js'
|
|
3
|
-
import { pikkuState } from '../pikku-state.js'
|
|
4
|
-
import { coerceTopLevelDataFromSchema, validateSchema } from '../schema.js'
|
|
5
|
-
import {
|
|
6
|
-
CoreServices,
|
|
7
|
-
CoreUserSession,
|
|
8
|
-
CorePikkuMiddleware,
|
|
9
|
-
PikkuWiringTypes,
|
|
10
|
-
PikkuWire,
|
|
11
|
-
MiddlewareMetadata,
|
|
12
|
-
PermissionMetadata,
|
|
13
|
-
CoreSingletonServices,
|
|
14
|
-
CreateWireServices,
|
|
15
|
-
} from '../types/core.types.js'
|
|
16
|
-
import {
|
|
17
|
-
CorePermissionGroup,
|
|
18
|
-
CorePikkuFunctionConfig,
|
|
19
|
-
CorePikkuPermission,
|
|
20
|
-
} from './functions.types.js'
|
|
21
|
-
import { SessionService } from '../services/user-session-service.js'
|
|
22
|
-
import { ForbiddenError } from '../errors/errors.js'
|
|
23
|
-
import { rpcService } from '../wirings/rpc/rpc-runner.js'
|
|
24
|
-
import { closeWireServices } from '../utils.js'
|
|
25
|
-
|
|
26
|
-
export const addFunction = (
|
|
27
|
-
funcName: string,
|
|
28
|
-
funcConfig: CorePikkuFunctionConfig<any, any>
|
|
29
|
-
) => {
|
|
30
|
-
pikkuState('function', 'functions').set(funcName, funcConfig)
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
export const runPikkuFuncDirectly = async <In, Out>(
|
|
34
|
-
funcName: string,
|
|
35
|
-
allServices: CoreServices,
|
|
36
|
-
wire: PikkuWire,
|
|
37
|
-
data: In,
|
|
38
|
-
userSession?: SessionService<CoreUserSession>
|
|
39
|
-
) => {
|
|
40
|
-
const funcConfig = pikkuState('function', 'functions').get(funcName)
|
|
41
|
-
if (!funcConfig) {
|
|
42
|
-
throw new Error(`Function not found: ${funcName}`)
|
|
43
|
-
}
|
|
44
|
-
// Inject session into wire
|
|
45
|
-
const wireWithSession = {
|
|
46
|
-
...wire,
|
|
47
|
-
session: userSession,
|
|
48
|
-
}
|
|
49
|
-
return (await funcConfig.func(allServices, data, wireWithSession)) as Out
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
export const runPikkuFunc = async <In = any, Out = any>(
|
|
53
|
-
wireType: PikkuWiringTypes,
|
|
54
|
-
wireId: string,
|
|
55
|
-
funcName: string,
|
|
56
|
-
{
|
|
57
|
-
singletonServices,
|
|
58
|
-
createWireServices,
|
|
59
|
-
data,
|
|
60
|
-
auth: wiringAuth,
|
|
61
|
-
inheritedMiddleware,
|
|
62
|
-
wireMiddleware,
|
|
63
|
-
inheritedPermissions,
|
|
64
|
-
wirePermissions,
|
|
65
|
-
coerceDataFromSchema,
|
|
66
|
-
tags = [],
|
|
67
|
-
wire,
|
|
68
|
-
}: {
|
|
69
|
-
singletonServices: CoreSingletonServices
|
|
70
|
-
createWireServices?: CreateWireServices
|
|
71
|
-
data: () => Promise<In> | In
|
|
72
|
-
auth?: boolean
|
|
73
|
-
inheritedMiddleware?: MiddlewareMetadata[]
|
|
74
|
-
wireMiddleware?: CorePikkuMiddleware[]
|
|
75
|
-
inheritedPermissions?: PermissionMetadata[]
|
|
76
|
-
wirePermissions?: CorePermissionGroup | CorePikkuPermission[]
|
|
77
|
-
coerceDataFromSchema?: boolean
|
|
78
|
-
tags?: string[]
|
|
79
|
-
wire: PikkuWire
|
|
80
|
-
}
|
|
81
|
-
): Promise<Out> => {
|
|
82
|
-
const funcConfig = pikkuState('function', 'functions').get(funcName)
|
|
83
|
-
if (!funcConfig) {
|
|
84
|
-
throw new Error(`Function not found: ${funcName}`)
|
|
85
|
-
}
|
|
86
|
-
const funcMeta = pikkuState('function', 'meta')[funcName]
|
|
87
|
-
if (!funcMeta) {
|
|
88
|
-
throw new Error(`Function meta not found: ${funcName}`)
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
// Convert tags to PermissionMetadata and merge with inheritedPermissions
|
|
92
|
-
const mergedInheritedPermissions: PermissionMetadata[] = [
|
|
93
|
-
...(inheritedPermissions || []),
|
|
94
|
-
...(tags?.map((tag) => ({ type: 'tag' as const, tag })) || []),
|
|
95
|
-
]
|
|
96
|
-
|
|
97
|
-
// Populate initialSession from session.initial
|
|
98
|
-
const wireWithInitialSession = {
|
|
99
|
-
...wire,
|
|
100
|
-
initialSession: wire.session?.initial,
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
// Helper function to run permissions and execute the function
|
|
104
|
-
const executeFunction = async () => {
|
|
105
|
-
const session = wireWithInitialSession.initialSession
|
|
106
|
-
if (wiringAuth === true || funcConfig.auth === true) {
|
|
107
|
-
// This means it was explicitly enabled in either wiring or function and has to be respected
|
|
108
|
-
if (!session) {
|
|
109
|
-
throw new ForbiddenError('Authentication required')
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
if (wiringAuth === undefined && funcConfig.auth === undefined) {
|
|
113
|
-
// We always default to requiring auth unless explicitly disabled
|
|
114
|
-
if (!session) {
|
|
115
|
-
// throw new ForbiddenError('Authentication required')
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
// Evaluate the data from the lazy function
|
|
120
|
-
const actualData = await data()
|
|
121
|
-
|
|
122
|
-
// Validate and coerce data if schema is defined
|
|
123
|
-
const inputSchemaName = funcMeta.inputSchemaName
|
|
124
|
-
if (inputSchemaName) {
|
|
125
|
-
// Validate request data against the defined schema, if any
|
|
126
|
-
await validateSchema(
|
|
127
|
-
singletonServices.logger,
|
|
128
|
-
singletonServices.schema,
|
|
129
|
-
inputSchemaName,
|
|
130
|
-
actualData
|
|
131
|
-
)
|
|
132
|
-
// Coerce (top level) query string parameters or date objects if specified by the schema
|
|
133
|
-
if (coerceDataFromSchema) {
|
|
134
|
-
coerceTopLevelDataFromSchema(inputSchemaName, actualData)
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
const rpcLessWire = { ...wireWithInitialSession, rpc: undefined }
|
|
139
|
-
|
|
140
|
-
await runPermissions(wireType, wireId, {
|
|
141
|
-
wireInheritedPermissions: mergedInheritedPermissions,
|
|
142
|
-
wirePermissions: wirePermissions,
|
|
143
|
-
funcInheritedPermissions: funcMeta.permissions,
|
|
144
|
-
funcPermissions: funcConfig.permissions,
|
|
145
|
-
services: singletonServices,
|
|
146
|
-
wire: rpcLessWire as any,
|
|
147
|
-
data: actualData,
|
|
148
|
-
})
|
|
149
|
-
|
|
150
|
-
const wireServices = await createWireServices?.(
|
|
151
|
-
singletonServices,
|
|
152
|
-
wireWithInitialSession
|
|
153
|
-
)
|
|
154
|
-
try {
|
|
155
|
-
const services = { ...singletonServices, ...wireServices }
|
|
156
|
-
const rpc = rpcService.getContextRPCService(
|
|
157
|
-
services,
|
|
158
|
-
wireWithInitialSession
|
|
159
|
-
)
|
|
160
|
-
return await funcConfig.func(services, actualData, {
|
|
161
|
-
...wireWithInitialSession,
|
|
162
|
-
rpc,
|
|
163
|
-
})
|
|
164
|
-
} finally {
|
|
165
|
-
if (wireServices) {
|
|
166
|
-
await closeWireServices(singletonServices.logger, wireServices)
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
const allMiddleware = combineMiddleware(wireType, wireId, {
|
|
172
|
-
wireInheritedMiddleware: inheritedMiddleware,
|
|
173
|
-
wireMiddleware,
|
|
174
|
-
funcInheritedMiddleware: funcMeta.middleware,
|
|
175
|
-
funcMiddleware: funcConfig.middleware,
|
|
176
|
-
})
|
|
177
|
-
|
|
178
|
-
if (allMiddleware.length > 0) {
|
|
179
|
-
return (await runMiddleware<CorePikkuMiddleware>(
|
|
180
|
-
singletonServices,
|
|
181
|
-
wire,
|
|
182
|
-
allMiddleware,
|
|
183
|
-
executeFunction
|
|
184
|
-
)) as Out
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
return (await executeFunction()) as Out
|
|
188
|
-
}
|
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
import { pikkuState } from '../../pikku-state.js'
|
|
2
|
-
import { PikkuError } from '../../errors/error-handler.js'
|
|
3
|
-
import { addFunction } from '../../function/function-runner.js'
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Exception thrown when workflow needs to pause for async step
|
|
7
|
-
*/
|
|
8
|
-
export class WorkflowAsyncException extends Error {
|
|
9
|
-
constructor(
|
|
10
|
-
public readonly runId: string,
|
|
11
|
-
public readonly stepName: string
|
|
12
|
-
) {
|
|
13
|
-
super(`Workflow paused at step: ${stepName}`)
|
|
14
|
-
this.name = 'WorkflowAsyncException'
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* Exception thrown when workflow is cancelled
|
|
20
|
-
*/
|
|
21
|
-
export class WorkflowCancelledException extends Error {
|
|
22
|
-
constructor(
|
|
23
|
-
public readonly runId: string,
|
|
24
|
-
public readonly reason?: string
|
|
25
|
-
) {
|
|
26
|
-
super(reason || 'Workflow cancelled')
|
|
27
|
-
this.name = 'WorkflowCancelledException'
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
* Error class for workflow not found
|
|
33
|
-
*/
|
|
34
|
-
export class WorkflowNotFoundError extends PikkuError {
|
|
35
|
-
constructor(name: string) {
|
|
36
|
-
super(`Workflow not found: ${name}`)
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
/**
|
|
41
|
-
* Error class for workflow not found
|
|
42
|
-
*/
|
|
43
|
-
export class WorkflowRunNotFound extends PikkuError {
|
|
44
|
-
constructor(runId: string) {
|
|
45
|
-
super(`Workflow run not found: ${runId}`)
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
/**
|
|
50
|
-
* Add a workflow to the system
|
|
51
|
-
* This is called by the generated workflow wirings
|
|
52
|
-
*/
|
|
53
|
-
export const addWorkflow = (workflowName: string, workflowFunc: any) => {
|
|
54
|
-
// Get workflow metadata from inspector
|
|
55
|
-
const meta = pikkuState('workflows', 'meta')
|
|
56
|
-
const workflowMeta = meta[workflowName]
|
|
57
|
-
if (!workflowMeta) {
|
|
58
|
-
throw new Error(
|
|
59
|
-
`Workflow metadata not found for '${workflowName}'. Make sure to run the CLI to generate metadata.`
|
|
60
|
-
)
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
// Store workflow definition in state
|
|
64
|
-
const registrations = pikkuState('workflows', 'registrations')
|
|
65
|
-
registrations.set(workflowName, {
|
|
66
|
-
name: workflowName,
|
|
67
|
-
func: workflowFunc,
|
|
68
|
-
})
|
|
69
|
-
|
|
70
|
-
// Register the function with pikku
|
|
71
|
-
addFunction(workflowMeta.pikkuFuncName, workflowFunc)
|
|
72
|
-
}
|