@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.
Files changed (143) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/dist/errors/error-handler.js +3 -3
  3. package/dist/function/function-runner.d.ts +4 -3
  4. package/dist/function/function-runner.js +60 -14
  5. package/dist/function/functions.types.d.ts +84 -5
  6. package/dist/function/functions.types.js +41 -1
  7. package/dist/index.d.ts +6 -2
  8. package/dist/index.js +5 -2
  9. package/dist/middleware/auth-apikey.d.ts +1 -1
  10. package/dist/middleware/auth-bearer.d.ts +1 -1
  11. package/dist/middleware/auth-cookie.d.ts +1 -1
  12. package/dist/middleware/timeout.d.ts +1 -1
  13. package/dist/middleware-runner.d.ts +3 -14
  14. package/dist/middleware-runner.js +8 -8
  15. package/dist/permissions.d.ts +3 -86
  16. package/dist/permissions.js +11 -67
  17. package/dist/pikku-state.d.ts +32 -104
  18. package/dist/pikku-state.js +140 -66
  19. package/dist/schema.d.ts +8 -6
  20. package/dist/schema.js +25 -13
  21. package/dist/services/workflow-service.d.ts +38 -0
  22. package/dist/services/workflow-service.js +1 -0
  23. package/dist/types/core.types.d.ts +12 -4
  24. package/dist/types/core.types.js +1 -1
  25. package/dist/types/state.types.d.ts +135 -0
  26. package/dist/types/state.types.js +1 -0
  27. package/dist/utils.d.ts +8 -0
  28. package/dist/utils.js +45 -0
  29. package/dist/wirings/channel/channel-handler.js +1 -1
  30. package/dist/wirings/channel/channel-runner.js +5 -5
  31. package/dist/wirings/channel/log-channels.js +1 -1
  32. package/dist/wirings/channel/serverless/serverless-channel-runner.js +2 -2
  33. package/dist/wirings/cli/channel/cli-channel-runner.js +3 -2
  34. package/dist/wirings/cli/cli-runner.js +10 -10
  35. package/dist/wirings/cli/cli.types.d.ts +1 -0
  36. package/dist/wirings/forge-node/forge-node.types.d.ts +120 -0
  37. package/dist/wirings/forge-node/forge-node.types.js +38 -0
  38. package/dist/wirings/forge-node/index.d.ts +1 -0
  39. package/dist/wirings/forge-node/index.js +1 -0
  40. package/dist/wirings/http/http-runner.d.ts +2 -2
  41. package/dist/wirings/http/http-runner.js +21 -12
  42. package/dist/wirings/http/http.types.d.ts +14 -1
  43. package/dist/wirings/http/log-http-routes.js +1 -1
  44. package/dist/wirings/http/routers/path-to-regex.js +2 -2
  45. package/dist/wirings/mcp/mcp-runner.js +21 -21
  46. package/dist/wirings/queue/queue-runner.js +6 -6
  47. package/dist/wirings/rpc/index.d.ts +1 -1
  48. package/dist/wirings/rpc/index.js +1 -1
  49. package/dist/wirings/rpc/rpc-runner.d.ts +7 -8
  50. package/dist/wirings/rpc/rpc-runner.js +62 -14
  51. package/dist/wirings/rpc/rpc-types.d.ts +7 -0
  52. package/dist/wirings/scheduler/log-schedulers.js +1 -1
  53. package/dist/wirings/scheduler/scheduler-runner.js +5 -5
  54. package/dist/wirings/trigger/index.d.ts +2 -0
  55. package/dist/wirings/trigger/index.js +2 -0
  56. package/dist/wirings/trigger/trigger-runner.d.ts +29 -0
  57. package/dist/wirings/trigger/trigger-runner.js +57 -0
  58. package/dist/wirings/trigger/trigger.types.d.ts +42 -0
  59. package/dist/wirings/trigger/trigger.types.js +1 -0
  60. package/dist/wirings/workflow/dsl/index.d.ts +5 -0
  61. package/dist/wirings/workflow/dsl/index.js +4 -0
  62. package/dist/wirings/workflow/dsl/workflow-dsl.types.d.ts +286 -0
  63. package/dist/wirings/workflow/dsl/workflow-dsl.types.js +5 -0
  64. package/dist/wirings/workflow/dsl/workflow-runner.d.ts +5 -0
  65. package/dist/wirings/workflow/dsl/workflow-runner.js +22 -0
  66. package/dist/wirings/workflow/graph/graph-node.d.ts +122 -0
  67. package/dist/wirings/workflow/graph/graph-node.js +58 -0
  68. package/dist/wirings/workflow/graph/graph-runner.d.ts +35 -0
  69. package/dist/wirings/workflow/graph/graph-runner.js +452 -0
  70. package/dist/wirings/workflow/graph/index.d.ts +3 -0
  71. package/dist/wirings/workflow/graph/index.js +3 -0
  72. package/dist/wirings/workflow/graph/workflow-graph.types.d.ts +95 -0
  73. package/dist/wirings/workflow/graph/workflow-graph.types.js +15 -0
  74. package/dist/wirings/workflow/index.d.ts +7 -12
  75. package/dist/wirings/workflow/index.js +6 -11
  76. package/dist/wirings/workflow/pikku-workflow-service.d.ts +96 -6
  77. package/dist/wirings/workflow/pikku-workflow-service.js +230 -103
  78. package/dist/wirings/workflow/wire-workflow.d.ts +42 -0
  79. package/dist/wirings/workflow/wire-workflow.js +53 -0
  80. package/dist/wirings/workflow/workflow-utils.d.ts +23 -0
  81. package/dist/wirings/workflow/workflow-utils.js +66 -0
  82. package/dist/wirings/workflow/workflow.types.d.ts +133 -211
  83. package/package.json +10 -1
  84. package/src/errors/error-handler.ts +3 -3
  85. package/src/function/function-runner.test.ts +1 -1
  86. package/src/function/function-runner.ts +86 -16
  87. package/src/function/functions.types.ts +126 -4
  88. package/src/index.ts +10 -5
  89. package/src/middleware-runner.ts +16 -9
  90. package/src/permissions.test.ts +28 -86
  91. package/src/permissions.ts +21 -80
  92. package/src/pikku-state.ts +156 -201
  93. package/src/schema.ts +42 -13
  94. package/src/services/workflow-service.ts +74 -0
  95. package/src/types/core.types.ts +12 -3
  96. package/src/types/state.types.ts +195 -0
  97. package/src/utils.ts +55 -0
  98. package/src/wirings/channel/channel-handler.ts +1 -1
  99. package/src/wirings/channel/channel-runner.ts +5 -5
  100. package/src/wirings/channel/local/local-channel-runner.test.ts +3 -1
  101. package/src/wirings/channel/log-channels.ts +1 -1
  102. package/src/wirings/channel/serverless/serverless-channel-runner.ts +2 -2
  103. package/src/wirings/cli/channel/cli-channel-runner.ts +4 -3
  104. package/src/wirings/cli/cli-runner.test.ts +19 -19
  105. package/src/wirings/cli/cli-runner.ts +10 -9
  106. package/src/wirings/cli/cli.types.ts +1 -0
  107. package/src/wirings/forge-node/forge-node.types.ts +135 -0
  108. package/src/wirings/forge-node/index.ts +1 -0
  109. package/src/wirings/http/http-runner.test.ts +2 -2
  110. package/src/wirings/http/http-runner.ts +30 -13
  111. package/src/wirings/http/http.types.ts +14 -0
  112. package/src/wirings/http/log-http-routes.ts +1 -1
  113. package/src/wirings/http/routers/path-to-regex.test.ts +30 -19
  114. package/src/wirings/http/routers/path-to-regex.ts +2 -2
  115. package/src/wirings/mcp/mcp-runner.ts +21 -21
  116. package/src/wirings/queue/queue-runner.test.ts +19 -19
  117. package/src/wirings/queue/queue-runner.ts +6 -6
  118. package/src/wirings/rpc/index.ts +1 -1
  119. package/src/wirings/rpc/rpc-runner.ts +88 -22
  120. package/src/wirings/rpc/rpc-types.ts +8 -0
  121. package/src/wirings/scheduler/log-schedulers.ts +1 -1
  122. package/src/wirings/scheduler/scheduler-runner.test.ts +27 -27
  123. package/src/wirings/scheduler/scheduler-runner.ts +5 -5
  124. package/src/wirings/trigger/index.ts +2 -0
  125. package/src/wirings/trigger/trigger-runner.ts +96 -0
  126. package/src/wirings/trigger/trigger.types.ts +56 -0
  127. package/src/wirings/workflow/dsl/index.ts +30 -0
  128. package/src/wirings/workflow/dsl/workflow-dsl.types.ts +312 -0
  129. package/src/wirings/workflow/dsl/workflow-runner.ts +27 -0
  130. package/src/wirings/workflow/graph/graph-node.ts +227 -0
  131. package/src/wirings/workflow/graph/graph-runner.ts +694 -0
  132. package/src/wirings/workflow/graph/index.ts +3 -0
  133. package/src/wirings/workflow/graph/workflow-graph.types.ts +126 -0
  134. package/src/wirings/workflow/index.ts +53 -26
  135. package/src/wirings/workflow/pikku-workflow-service.ts +333 -117
  136. package/src/wirings/workflow/wire-workflow.ts +94 -0
  137. package/src/wirings/workflow/workflow-utils.ts +120 -0
  138. package/src/wirings/workflow/workflow.types.ts +166 -277
  139. package/tsconfig.tsbuildinfo +1 -1
  140. package/dist/wirings/workflow/workflow-runner.d.ts +0 -34
  141. package/dist/wirings/workflow/workflow-runner.js +0 -65
  142. package/src/function/function-runner.ts.bak +0 -188
  143. 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
- }