@pikku/core 0.11.0 → 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 (184) hide show
  1. package/CHANGELOG.md +35 -1
  2. package/dist/errors/error-handler.js +3 -3
  3. package/dist/errors/errors.d.ts +1 -1
  4. package/dist/errors/errors.js +3 -3
  5. package/dist/function/function-runner.d.ts +8 -8
  6. package/dist/function/function-runner.js +88 -23
  7. package/dist/function/functions.types.d.ts +104 -33
  8. package/dist/function/functions.types.js +50 -7
  9. package/dist/handle-error.d.ts +1 -1
  10. package/dist/handle-error.js +1 -1
  11. package/dist/index.d.ts +6 -2
  12. package/dist/index.js +5 -2
  13. package/dist/middleware/auth-apikey.d.ts +1 -1
  14. package/dist/middleware/auth-apikey.js +3 -3
  15. package/dist/middleware/auth-bearer.d.ts +1 -1
  16. package/dist/middleware/auth-bearer.js +3 -3
  17. package/dist/middleware/auth-cookie.d.ts +1 -1
  18. package/dist/middleware/auth-cookie.js +5 -5
  19. package/dist/middleware/timeout.d.ts +1 -1
  20. package/dist/middleware/timeout.js +3 -2
  21. package/dist/middleware-runner.d.ts +6 -20
  22. package/dist/middleware-runner.js +19 -20
  23. package/dist/permissions.d.ts +6 -89
  24. package/dist/permissions.js +24 -81
  25. package/dist/pikku-state.d.ts +32 -104
  26. package/dist/pikku-state.js +140 -66
  27. package/dist/schema.d.ts +8 -6
  28. package/dist/schema.js +25 -13
  29. package/dist/services/user-session-service.d.ts +7 -3
  30. package/dist/services/user-session-service.js +8 -1
  31. package/dist/services/workflow-service.d.ts +38 -0
  32. package/dist/services/workflow-service.js +1 -0
  33. package/dist/types/core.types.d.ts +40 -41
  34. package/dist/types/core.types.js +4 -15
  35. package/dist/types/state.types.d.ts +135 -0
  36. package/dist/types/state.types.js +1 -0
  37. package/dist/utils.d.ts +9 -1
  38. package/dist/utils.js +48 -3
  39. package/dist/wirings/channel/channel-common.js +2 -3
  40. package/dist/wirings/channel/channel-handler.d.ts +3 -2
  41. package/dist/wirings/channel/channel-handler.js +7 -10
  42. package/dist/wirings/channel/channel-runner.d.ts +2 -2
  43. package/dist/wirings/channel/channel-runner.js +5 -5
  44. package/dist/wirings/channel/channel.types.d.ts +10 -5
  45. package/dist/wirings/channel/local/local-channel-runner.d.ts +1 -1
  46. package/dist/wirings/channel/local/local-channel-runner.js +19 -26
  47. package/dist/wirings/channel/log-channels.js +1 -1
  48. package/dist/wirings/channel/serverless/serverless-channel-runner.d.ts +1 -1
  49. package/dist/wirings/channel/serverless/serverless-channel-runner.js +43 -48
  50. package/dist/wirings/cli/channel/cli-channel-runner.js +3 -2
  51. package/dist/wirings/cli/cli-runner.d.ts +5 -5
  52. package/dist/wirings/cli/cli-runner.js +20 -38
  53. package/dist/wirings/cli/cli.types.d.ts +16 -11
  54. package/dist/wirings/forge-node/forge-node.types.d.ts +120 -0
  55. package/dist/wirings/forge-node/forge-node.types.js +38 -0
  56. package/dist/wirings/forge-node/index.d.ts +1 -0
  57. package/dist/wirings/forge-node/index.js +1 -0
  58. package/dist/wirings/http/http-runner.d.ts +8 -8
  59. package/dist/wirings/http/http-runner.js +46 -51
  60. package/dist/wirings/http/http.types.d.ts +19 -11
  61. package/dist/wirings/http/log-http-routes.js +1 -1
  62. package/dist/wirings/http/routers/path-to-regex.js +2 -2
  63. package/dist/wirings/mcp/mcp-runner.d.ts +2 -2
  64. package/dist/wirings/mcp/mcp-runner.js +33 -40
  65. package/dist/wirings/mcp/mcp.types.d.ts +6 -0
  66. package/dist/wirings/queue/queue-runner.d.ts +3 -3
  67. package/dist/wirings/queue/queue-runner.js +13 -23
  68. package/dist/wirings/queue/queue.types.d.ts +4 -11
  69. package/dist/wirings/rpc/index.d.ts +1 -1
  70. package/dist/wirings/rpc/index.js +1 -1
  71. package/dist/wirings/rpc/rpc-runner.d.ts +17 -16
  72. package/dist/wirings/rpc/rpc-runner.js +98 -61
  73. package/dist/wirings/rpc/rpc-types.d.ts +7 -0
  74. package/dist/wirings/scheduler/log-schedulers.js +1 -1
  75. package/dist/wirings/scheduler/scheduler-runner.d.ts +3 -3
  76. package/dist/wirings/scheduler/scheduler-runner.js +18 -29
  77. package/dist/wirings/scheduler/scheduler.types.d.ts +3 -8
  78. package/dist/wirings/trigger/index.d.ts +2 -0
  79. package/dist/wirings/trigger/index.js +2 -0
  80. package/dist/wirings/trigger/trigger-runner.d.ts +29 -0
  81. package/dist/wirings/trigger/trigger-runner.js +57 -0
  82. package/dist/wirings/trigger/trigger.types.d.ts +42 -0
  83. package/dist/wirings/trigger/trigger.types.js +1 -0
  84. package/dist/wirings/workflow/dsl/index.d.ts +5 -0
  85. package/dist/wirings/workflow/dsl/index.js +4 -0
  86. package/dist/wirings/workflow/dsl/workflow-dsl.types.d.ts +286 -0
  87. package/dist/wirings/workflow/dsl/workflow-dsl.types.js +5 -0
  88. package/dist/wirings/workflow/dsl/workflow-runner.d.ts +5 -0
  89. package/dist/wirings/workflow/dsl/workflow-runner.js +22 -0
  90. package/dist/wirings/workflow/graph/graph-node.d.ts +122 -0
  91. package/dist/wirings/workflow/graph/graph-node.js +58 -0
  92. package/dist/wirings/workflow/graph/graph-runner.d.ts +35 -0
  93. package/dist/wirings/workflow/graph/graph-runner.js +452 -0
  94. package/dist/wirings/workflow/graph/index.d.ts +3 -0
  95. package/dist/wirings/workflow/graph/index.js +3 -0
  96. package/dist/wirings/workflow/graph/workflow-graph.types.d.ts +95 -0
  97. package/dist/wirings/workflow/graph/workflow-graph.types.js +15 -0
  98. package/dist/wirings/workflow/index.d.ts +7 -3
  99. package/dist/wirings/workflow/index.js +6 -3
  100. package/dist/wirings/workflow/pikku-workflow-service.d.ts +108 -10
  101. package/dist/wirings/workflow/pikku-workflow-service.js +274 -165
  102. package/dist/wirings/workflow/wire-workflow.d.ts +42 -0
  103. package/dist/wirings/workflow/wire-workflow.js +53 -0
  104. package/dist/wirings/workflow/workflow-utils.d.ts +23 -0
  105. package/dist/wirings/workflow/workflow-utils.js +66 -0
  106. package/dist/wirings/workflow/workflow.types.d.ts +135 -128
  107. package/package.json +11 -2
  108. package/src/errors/error-handler.ts +3 -3
  109. package/src/errors/errors.ts +3 -3
  110. package/src/factory-functions.test.ts +9 -36
  111. package/src/function/function-runner.test.ts +58 -69
  112. package/src/function/function-runner.ts +130 -37
  113. package/src/function/functions.types.ts +193 -54
  114. package/src/handle-error.ts +1 -1
  115. package/src/index.ts +10 -5
  116. package/src/middleware/auth-apikey.test.ts +360 -0
  117. package/src/middleware/auth-apikey.ts +3 -7
  118. package/src/middleware/auth-bearer.test.ts +447 -0
  119. package/src/middleware/auth-bearer.ts +27 -33
  120. package/src/middleware/auth-cookie.test.ts +525 -0
  121. package/src/middleware/auth-cookie.ts +6 -6
  122. package/src/middleware/timeout.ts +4 -2
  123. package/src/middleware-runner.test.ts +58 -127
  124. package/src/middleware-runner.ts +29 -25
  125. package/src/permissions.test.ts +68 -130
  126. package/src/permissions.ts +41 -100
  127. package/src/pikku-state.ts +156 -201
  128. package/src/schema.ts +42 -13
  129. package/src/services/user-session-service.ts +14 -4
  130. package/src/services/workflow-service.ts +74 -0
  131. package/src/types/core.types.ts +79 -58
  132. package/src/types/state.types.ts +195 -0
  133. package/src/utils.ts +59 -4
  134. package/src/wirings/channel/channel-common.ts +4 -7
  135. package/src/wirings/channel/channel-handler.ts +17 -23
  136. package/src/wirings/channel/channel-runner.ts +7 -7
  137. package/src/wirings/channel/channel.types.ts +14 -11
  138. package/src/wirings/channel/local/local-channel-runner.test.ts +8 -4
  139. package/src/wirings/channel/local/local-channel-runner.ts +23 -38
  140. package/src/wirings/channel/log-channels.ts +1 -1
  141. package/src/wirings/channel/serverless/serverless-channel-runner.ts +53 -79
  142. package/src/wirings/cli/channel/cli-channel-runner.ts +4 -3
  143. package/src/wirings/cli/cli-runner.test.ts +26 -26
  144. package/src/wirings/cli/cli-runner.ts +34 -71
  145. package/src/wirings/cli/cli.types.ts +23 -16
  146. package/src/wirings/forge-node/forge-node.types.ts +135 -0
  147. package/src/wirings/forge-node/index.ts +1 -0
  148. package/src/wirings/http/http-runner.test.ts +10 -10
  149. package/src/wirings/http/http-runner.ts +56 -66
  150. package/src/wirings/http/http.types.ts +19 -14
  151. package/src/wirings/http/log-http-routes.ts +1 -1
  152. package/src/wirings/http/routers/path-to-regex.test.ts +30 -19
  153. package/src/wirings/http/routers/path-to-regex.ts +2 -2
  154. package/src/wirings/mcp/mcp-runner.ts +44 -69
  155. package/src/wirings/mcp/mcp.types.ts +6 -0
  156. package/src/wirings/queue/queue-runner.test.ts +641 -0
  157. package/src/wirings/queue/queue-runner.ts +16 -38
  158. package/src/wirings/queue/queue.types.ts +4 -11
  159. package/src/wirings/rpc/index.ts +1 -1
  160. package/src/wirings/rpc/rpc-runner.ts +129 -77
  161. package/src/wirings/rpc/rpc-types.ts +8 -0
  162. package/src/wirings/scheduler/log-schedulers.ts +1 -1
  163. package/src/wirings/scheduler/scheduler-runner.test.ts +627 -0
  164. package/src/wirings/scheduler/scheduler-runner.ts +29 -55
  165. package/src/wirings/scheduler/scheduler.types.ts +3 -9
  166. package/src/wirings/trigger/index.ts +2 -0
  167. package/src/wirings/trigger/trigger-runner.ts +96 -0
  168. package/src/wirings/trigger/trigger.types.ts +56 -0
  169. package/src/wirings/workflow/dsl/index.ts +30 -0
  170. package/src/wirings/workflow/dsl/workflow-dsl.types.ts +312 -0
  171. package/src/wirings/workflow/dsl/workflow-runner.ts +27 -0
  172. package/src/wirings/workflow/graph/graph-node.ts +227 -0
  173. package/src/wirings/workflow/graph/graph-runner.ts +694 -0
  174. package/src/wirings/workflow/graph/index.ts +3 -0
  175. package/src/wirings/workflow/graph/workflow-graph.types.ts +126 -0
  176. package/src/wirings/workflow/index.ts +60 -12
  177. package/src/wirings/workflow/pikku-workflow-service.ts +401 -195
  178. package/src/wirings/workflow/wire-workflow.ts +94 -0
  179. package/src/wirings/workflow/workflow-utils.ts +120 -0
  180. package/src/wirings/workflow/workflow.types.ts +167 -188
  181. package/tsconfig.tsbuildinfo +1 -1
  182. package/dist/wirings/workflow/workflow-runner.d.ts +0 -35
  183. package/dist/wirings/workflow/workflow-runner.js +0 -68
  184. package/src/wirings/workflow/workflow-runner.ts +0 -85
@@ -20,5 +20,5 @@ export declare const authAPIKey: import("../types/core.types.js").CorePikkuMiddl
20
20
  }, import("../types/core.types.js").CoreSingletonServices<{
21
21
  logLevel?: import("../index.js").LogLevel;
22
22
  secrets?: {};
23
- workflow?: import("../wirings/workflow/workflow.types.js").WorkflowServiceConfig;
23
+ workflow?: import("../index.js").WorkflowServiceConfig;
24
24
  }>, import("../types/core.types.js").CoreUserSession>;
@@ -16,8 +16,8 @@ import { pikkuMiddleware, pikkuMiddlewareFactory } from '../types/core.types.js'
16
16
  * ])
17
17
  * ```
18
18
  */
19
- export const authAPIKey = pikkuMiddlewareFactory(({ source }) => pikkuMiddleware(async ({ userSession: userSessionService, jwt: jwtService }, { http }, next) => {
20
- if (!http?.request || userSessionService.get()) {
19
+ export const authAPIKey = pikkuMiddlewareFactory(({ source }) => pikkuMiddleware(async ({ jwt: jwtService }, { http, session: SessionService }, next) => {
20
+ if (!http?.request || !SessionService || SessionService.get()) {
21
21
  return next();
22
22
  }
23
23
  let apiKey = null;
@@ -30,7 +30,7 @@ export const authAPIKey = pikkuMiddlewareFactory(({ source }) => pikkuMiddleware
30
30
  if (apiKey && jwtService) {
31
31
  const userSession = await jwtService.decode(apiKey);
32
32
  if (userSession) {
33
- userSessionService.setInitial(userSession);
33
+ SessionService.setInitial(userSession);
34
34
  }
35
35
  }
36
36
  return next();
@@ -36,5 +36,5 @@ export declare const authBearer: import("../types/core.types.js").CorePikkuMiddl
36
36
  }, import("../types/core.types.js").CoreSingletonServices<{
37
37
  logLevel?: import("../index.js").LogLevel;
38
38
  secrets?: {};
39
- workflow?: import("../wirings/workflow/workflow.types.js").WorkflowServiceConfig;
39
+ workflow?: import("../index.js").WorkflowServiceConfig;
40
40
  }>, CoreUserSession>;
@@ -29,9 +29,9 @@ import { pikkuMiddleware, pikkuMiddlewareFactory, } from '../types/core.types.js
29
29
  * ])
30
30
  * ```
31
31
  */
32
- export const authBearer = pikkuMiddlewareFactory(({ token } = {}) => pikkuMiddleware(async ({ userSession: userSessionService, jwt: jwtService }, { http }, next) => {
32
+ export const authBearer = pikkuMiddlewareFactory(({ token } = {}) => pikkuMiddleware(async ({ jwt: jwtService }, { http, session }, next) => {
33
33
  // Skip if session already exists.
34
- if (!http?.request || userSessionService.get()) {
34
+ if (!http?.request || !session || session.get()) {
35
35
  return next();
36
36
  }
37
37
  const authHeader = http.request.header('authorization') ||
@@ -51,7 +51,7 @@ export const authBearer = pikkuMiddlewareFactory(({ token } = {}) => pikkuMiddle
51
51
  userSession = await jwtService.decode(bearerToken);
52
52
  }
53
53
  if (userSession) {
54
- userSessionService.setInitial(userSession);
54
+ session.setInitial(userSession);
55
55
  }
56
56
  }
57
57
  return next();
@@ -35,5 +35,5 @@ export declare const authCookie: import("../types/core.types.js").CorePikkuMiddl
35
35
  }, import("../types/core.types.js").CoreSingletonServices<{
36
36
  logLevel?: import("../index.js").LogLevel;
37
37
  secrets?: {};
38
- workflow?: import("../wirings/workflow/workflow.types.js").WorkflowServiceConfig;
38
+ workflow?: import("../index.js").WorkflowServiceConfig;
39
39
  }>, import("../types/core.types.js").CoreUserSession>;
@@ -28,8 +28,8 @@ import { getRelativeTimeOffsetFromNow, } from '../time-utils.js';
28
28
  * ])
29
29
  * ```
30
30
  */
31
- export const authCookie = pikkuMiddlewareFactory(({ name, options, expiresIn }) => pikkuMiddleware(async ({ userSession: userSessionService, jwt: jwtService, logger }, { http }, next) => {
32
- if (!http?.request || userSessionService.get()) {
31
+ export const authCookie = pikkuMiddlewareFactory(({ name, options, expiresIn }) => pikkuMiddleware(async ({ jwt: jwtService, logger }, { http, session: SessionService }, next) => {
32
+ if (!http?.request || !SessionService || SessionService.get()) {
33
33
  return next();
34
34
  }
35
35
  // Try to decode session from cookie
@@ -37,7 +37,7 @@ export const authCookie = pikkuMiddlewareFactory(({ name, options, expiresIn })
37
37
  if (cookieValue && jwtService) {
38
38
  const userSession = await jwtService.decode(cookieValue);
39
39
  if (userSession) {
40
- userSessionService.setInitial(userSession);
40
+ SessionService.setInitial(userSession);
41
41
  }
42
42
  }
43
43
  await next();
@@ -45,8 +45,8 @@ export const authCookie = pikkuMiddlewareFactory(({ name, options, expiresIn })
45
45
  if (!http?.response) {
46
46
  return;
47
47
  }
48
- if (userSessionService.sessionChanged) {
49
- const session = userSessionService.get();
48
+ if (SessionService.sessionChanged) {
49
+ const session = SessionService.get();
50
50
  if (jwtService) {
51
51
  http.response.cookie(name, await jwtService.encode(expiresIn, session), {
52
52
  ...options,
@@ -3,5 +3,5 @@ export declare const timeout: () => import("../types/core.types.js").CorePikkuMi
3
3
  }, import("../types/core.types.js").CoreSingletonServices<{
4
4
  logLevel?: import("../index.js").LogLevel;
5
5
  secrets?: {};
6
- workflow?: import("../wirings/workflow/workflow.types.js").WorkflowServiceConfig;
6
+ workflow?: import("../index.js").WorkflowServiceConfig;
7
7
  }>, import("../types/core.types.js").CoreUserSession>;
@@ -1,8 +1,9 @@
1
1
  import { RequestTimeoutError } from '../errors/errors.js';
2
2
  import { pikkuMiddleware, pikkuMiddlewareFactory } from '../types/core.types.js';
3
- export const timeout = () => pikkuMiddlewareFactory(({ timeout }) => pikkuMiddleware(async (_services, _interaction, next) => {
4
- setTimeout(() => {
3
+ export const timeout = () => pikkuMiddlewareFactory(({ timeout }) => pikkuMiddleware(async (_services, _wire, next) => {
4
+ const timeoutId = setTimeout(() => {
5
5
  throw new RequestTimeoutError();
6
6
  }, timeout);
7
7
  await next();
8
+ clearTimeout(timeoutId);
8
9
  }));
@@ -1,10 +1,9 @@
1
- import { UserSessionService } from './services/user-session-service.js';
2
- import { CoreSingletonServices, PikkuInteraction, CorePikkuMiddleware, CorePikkuMiddlewareGroup, PikkuWiringTypes, MiddlewareMetadata } from './types/core.types.js';
1
+ import { CoreSingletonServices, PikkuWire, CorePikkuMiddleware, CorePikkuMiddlewareGroup, PikkuWiringTypes, MiddlewareMetadata } from './types/core.types.js';
3
2
  /**
4
3
  * Runs a chain of middleware functions in sequence before executing the main function.
5
4
  *
6
5
  * @param services - An object containing services (e.g., singletonServices, userSession, etc.)
7
- * @param interaction - The interaction context, e.g., { http }.
6
+ * @param wire - The wire context, e.g., { http }.
8
7
  * @param middlewares - An array of middleware functions to run.
9
8
  * @param main - The main function to execute after all middleware have run.
10
9
  * @returns A promise resolving to the result of the main function.
@@ -17,9 +16,7 @@ import { CoreSingletonServices, PikkuInteraction, CorePikkuMiddleware, CorePikku
17
16
  * async () => { return await runMain(); }
18
17
  * );
19
18
  */
20
- export declare const runMiddleware: <Middleware extends CorePikkuMiddleware>(services: CoreSingletonServices & {
21
- userSession?: UserSessionService<any>;
22
- }, interaction: PikkuInteraction, middlewares: readonly Middleware[], main?: () => Promise<unknown>) => Promise<unknown>;
19
+ export declare const runMiddleware: <Middleware extends CorePikkuMiddleware>(services: CoreSingletonServices, wire: PikkuWire, middlewares: readonly Middleware[], main?: () => Promise<unknown>) => Promise<unknown>;
23
20
  /**
24
21
  * Registers global middleware for a specific tag.
25
22
  *
@@ -53,19 +50,7 @@ export declare const runMiddleware: <Middleware extends CorePikkuMiddleware>(ser
53
50
  * ])
54
51
  * ```
55
52
  */
56
- export declare const addMiddleware: <PikkuMiddleware extends CorePikkuMiddleware>(tag: string, middleware: CorePikkuMiddlewareGroup) => CorePikkuMiddlewareGroup;
57
- /**
58
- * Retrieves a registered middleware function by its name.
59
- *
60
- * This function looks up middleware that was registered with registerMiddleware.
61
- * It's used internally by the framework to resolve middleware references in metadata.
62
- *
63
- * @param {string} name - The unique name (pikkuFuncName) of the middleware function.
64
- * @returns {CorePikkuMiddleware | undefined} The middleware function, or undefined if not found.
65
- *
66
- * @internal
67
- */
68
- export declare const getMiddlewareByName: (name: string) => CorePikkuMiddleware | undefined;
53
+ export declare const addMiddleware: <PikkuMiddleware extends CorePikkuMiddleware>(tag: string, middleware: CorePikkuMiddlewareGroup, packageName?: string | null) => CorePikkuMiddlewareGroup;
69
54
  /**
70
55
  * Combines wiring-specific middleware with function-level middleware.
71
56
  *
@@ -88,9 +73,10 @@ export declare const getMiddlewareByName: (name: string) => CorePikkuMiddleware
88
73
  * })
89
74
  * ```
90
75
  */
91
- export declare const combineMiddleware: (wireType: PikkuWiringTypes, uid: string, { wireInheritedMiddleware, wireMiddleware, funcInheritedMiddleware, funcMiddleware, }?: {
76
+ export declare const combineMiddleware: (wireType: PikkuWiringTypes, uid: string, { wireInheritedMiddleware, wireMiddleware, funcInheritedMiddleware, funcMiddleware, packageName, }?: {
92
77
  wireInheritedMiddleware?: MiddlewareMetadata[];
93
78
  wireMiddleware?: CorePikkuMiddleware[];
94
79
  funcInheritedMiddleware?: MiddlewareMetadata[];
95
80
  funcMiddleware?: CorePikkuMiddleware[];
81
+ packageName?: string | null;
96
82
  }) => readonly CorePikkuMiddleware[];
@@ -1,11 +1,10 @@
1
- import { PikkuWiringTypes, } from './types/core.types.js';
2
1
  import { pikkuState } from './pikku-state.js';
3
2
  import { freezeDedupe } from './utils.js';
4
3
  /**
5
4
  * Runs a chain of middleware functions in sequence before executing the main function.
6
5
  *
7
6
  * @param services - An object containing services (e.g., singletonServices, userSession, etc.)
8
- * @param interaction - The interaction context, e.g., { http }.
7
+ * @param wire - The wire context, e.g., { http }.
9
8
  * @param middlewares - An array of middleware functions to run.
10
9
  * @param main - The main function to execute after all middleware have run.
11
10
  * @returns A promise resolving to the result of the main function.
@@ -18,12 +17,12 @@ import { freezeDedupe } from './utils.js';
18
17
  * async () => { return await runMain(); }
19
18
  * );
20
19
  */
21
- export const runMiddleware = async (services, interaction, middlewares, main) => {
20
+ export const runMiddleware = async (services, wire, middlewares, main) => {
22
21
  // Deduplicate middleware using Set to avoid running the same middleware multiple times
23
22
  let result;
24
23
  const dispatch = async (index) => {
25
24
  if (middlewares && index < middlewares.length) {
26
- return await middlewares[index](services, interaction, () => dispatch(index + 1));
25
+ return await middlewares[index](services, wire, () => dispatch(index + 1));
27
26
  }
28
27
  else if (main) {
29
28
  result = await main();
@@ -65,8 +64,8 @@ export const runMiddleware = async (services, interaction, middlewares, main) =>
65
64
  * ])
66
65
  * ```
67
66
  */
68
- export const addMiddleware = (tag, middleware) => {
69
- const tagGroups = pikkuState('middleware', 'tagGroup');
67
+ export const addMiddleware = (tag, middleware, packageName = null) => {
68
+ const tagGroups = pikkuState(packageName, 'middleware', 'tagGroup');
70
69
  tagGroups[tag] = middleware;
71
70
  return middleware;
72
71
  };
@@ -81,20 +80,20 @@ export const addMiddleware = (tag, middleware) => {
81
80
  *
82
81
  * @internal
83
82
  */
84
- export const getMiddlewareByName = (name) => {
85
- const middlewareStore = pikkuState('misc', 'middleware');
83
+ const getMiddlewareByName = (name) => {
84
+ const middlewareStore = pikkuState(null, 'misc', 'middleware');
86
85
  const middleware = middlewareStore[name];
87
86
  return middleware?.[0];
88
87
  };
89
88
  const middlewareCache = {
90
- [PikkuWiringTypes.http]: {},
91
- [PikkuWiringTypes.rpc]: {},
92
- [PikkuWiringTypes.channel]: {},
93
- [PikkuWiringTypes.queue]: {},
94
- [PikkuWiringTypes.scheduler]: {},
95
- [PikkuWiringTypes.mcp]: {},
96
- [PikkuWiringTypes.cli]: {},
97
- [PikkuWiringTypes.workflow]: {},
89
+ http: {},
90
+ rpc: {},
91
+ channel: {},
92
+ queue: {},
93
+ scheduler: {},
94
+ mcp: {},
95
+ cli: {},
96
+ workflow: {},
98
97
  };
99
98
  /**
100
99
  * Combines wiring-specific middleware with function-level middleware.
@@ -118,7 +117,7 @@ const middlewareCache = {
118
117
  * })
119
118
  * ```
120
119
  */
121
- export const combineMiddleware = (wireType, uid, { wireInheritedMiddleware, wireMiddleware, funcInheritedMiddleware, funcMiddleware, } = {}) => {
120
+ export const combineMiddleware = (wireType, uid, { wireInheritedMiddleware, wireMiddleware, funcInheritedMiddleware, funcMiddleware, packageName = null, } = {}) => {
122
121
  if (middlewareCache[wireType][uid]) {
123
122
  return middlewareCache[wireType][uid];
124
123
  }
@@ -128,7 +127,7 @@ export const combineMiddleware = (wireType, uid, { wireInheritedMiddleware, wire
128
127
  for (const meta of wireInheritedMiddleware) {
129
128
  if (meta.type === 'http') {
130
129
  // Look up HTTP middleware group from pikkuState
131
- const group = pikkuState('middleware', 'httpGroup')[meta.route];
130
+ const group = pikkuState(packageName, 'middleware', 'httpGroup')[meta.route];
132
131
  if (group) {
133
132
  // At runtime, all factories should be resolved to middleware
134
133
  resolved.push(...group);
@@ -136,7 +135,7 @@ export const combineMiddleware = (wireType, uid, { wireInheritedMiddleware, wire
136
135
  }
137
136
  else if (meta.type === 'tag') {
138
137
  // Look up tag middleware group from pikkuState
139
- const group = pikkuState('middleware', 'tagGroup')[meta.tag];
138
+ const group = pikkuState(packageName, 'middleware', 'tagGroup')[meta.tag];
140
139
  if (group) {
141
140
  // At runtime, all factories should be resolved to middleware
142
141
  resolved.push(...group);
@@ -160,7 +159,7 @@ export const combineMiddleware = (wireType, uid, { wireInheritedMiddleware, wire
160
159
  for (const meta of funcInheritedMiddleware) {
161
160
  if (meta.type === 'tag') {
162
161
  // Look up tag middleware group from pikkuState
163
- const group = pikkuState('middleware', 'tagGroup')[meta.tag];
162
+ const group = pikkuState(packageName, 'middleware', 'tagGroup')[meta.tag];
164
163
  if (group) {
165
164
  // At runtime, all factories should be resolved to middleware
166
165
  resolved.push(...group);
@@ -1,43 +1,5 @@
1
- import { CoreServices, CoreUserSession, PikkuWiringTypes, PermissionMetadata } from './types/core.types.js';
1
+ import { CoreServices, PikkuWiringTypes, PermissionMetadata, PikkuWire } from './types/core.types.js';
2
2
  import { CorePermissionGroup, CorePikkuPermission } from './function/functions.types.js';
3
- /**
4
- * This function validates permissions by iterating over permission groups and executing the corresponding permission functions. If all functions in at least one group return true, the permission is considered valid.
5
- * @param services - The core services required for permission validation.
6
- * @param data - The data to be used in the permission validation functions.
7
- * @param session - An optional user session for permission validation.
8
- * @returns A promise that resolves to void.
9
- */
10
- export declare const verifyPermissions: (permissions: CorePermissionGroup, services: CoreServices, data: any, session?: CoreUserSession) => Promise<boolean>;
11
- /**
12
- * Registers a single permission function by name in the global permission store.
13
- *
14
- * This function is used by CLI-generated code to register permission functions
15
- * that can be referenced by name in metadata. It stores permissions in a special
16
- * namespace to avoid conflicts with tag-based permissions.
17
- *
18
- * @param {string} name - The unique name (pikkuFuncName) of the permission function.
19
- * @param {CorePikkuPermission} permission - The permission function to register.
20
- *
21
- * @example
22
- * ```typescript
23
- * // Called by CLI-generated pikku-permissions.gen.ts
24
- * registerPermission('adminPermission_src_permissions_ts_10_5', adminPermission)
25
- * registerPermission('readPermission_src_permissions_ts_20_10', readPermission)
26
- * ```
27
- */
28
- export declare const registerPermission: (name: string, permission: CorePikkuPermission<any>) => void;
29
- /**
30
- * Retrieves a registered permission function by its name.
31
- *
32
- * This function looks up permissions that was registered with registerPermission.
33
- * It's used internally by the framework to resolve permission references in metadata.
34
- *
35
- * @param {string} name - The unique name (pikkuFuncName) of the permission function.
36
- * @returns {CorePikkuPermission | undefined} The permission function, or undefined if not found.
37
- *
38
- * @internal
39
- */
40
- export declare const getPermissionByName: (name: string) => CorePikkuPermission | undefined;
41
3
  /**
42
4
  * Adds global permissions for a specific tag.
43
5
  *
@@ -66,63 +28,18 @@ export declare const getPermissionByName: (name: string) => CorePikkuPermission
66
28
  * ])
67
29
  * ```
68
30
  */
69
- export declare const addPermission: (tag: string, permissions: CorePermissionGroup | CorePikkuPermission[]) => CorePermissionGroup | CorePikkuPermission[];
70
- /**
71
- * Retrieves permissions for a given set of tags.
72
- *
73
- * This function looks up all permissions registered for any of the provided tags
74
- * and returns them as a flattened array.
75
- *
76
- * @param {string[]} tags - Array of tags to look up permissions for.
77
- * @returns {any[]} Array of permission functions that apply to the given tags.
78
- *
79
- * @example
80
- * ```typescript
81
- * // Get all permissions for tags 'api' and 'auth'
82
- * const permissions = getPermissionsForTags(['api', 'auth'])
83
- * ```
84
- */
85
- export declare const getPermissionsForTags: (tags?: string[]) => readonly (CorePermissionGroup | CorePikkuPermission)[];
86
- /**
87
- * Combines wiring-specific permissions with function-level permissions.
88
- *
89
- * This function resolves permission metadata into actual permission functions and combines them.
90
- * It filters out wire permissions without tags from inheritedPermissions to avoid duplication
91
- * (those are passed separately as wirePermissions).
92
- *
93
- * @param {object} options - Configuration object for combining permissions.
94
- * @param {PermissionMetadata[] | undefined} options.wireInheritedPermissions - Metadata from wiring (HTTP + tags + wire with tags).
95
- * @param {CorePermissionGroup | CorePikkuPermission[] | undefined} options.wirePermissions - Inline wire permissions.
96
- * @param {PermissionMetadata[] | undefined} options.funcInheritedPermissions - Function permissions metadata (only tags).
97
- * @param {CorePermissionGroup | CorePikkuPermission[] | undefined} options.funcPermissions - Inline function permissions.
98
- * @returns {(CorePermissionGroup | CorePikkuPermission)[]} Combined array of resolved permissions.
99
- *
100
- * @example
101
- * ```typescript
102
- * const combined = combinePermissions(wireType, wireId, {
103
- * wireInheritedPermissions: meta.permissions,
104
- * wirePermissions: inlinePermissions,
105
- * funcInheritedPermissions: funcMeta.permissions,
106
- * funcPermissions: funcConfig.permissions
107
- * })
108
- * ```
109
- */
110
- export declare const combinePermissions: (wireType: PikkuWiringTypes, uid: string, { wireInheritedPermissions, wirePermissions, funcInheritedPermissions, funcPermissions, }?: {
111
- wireInheritedPermissions?: PermissionMetadata[];
112
- wirePermissions?: CorePermissionGroup | CorePikkuPermission[];
113
- funcInheritedPermissions?: PermissionMetadata[];
114
- funcPermissions?: CorePermissionGroup | CorePikkuPermission[];
115
- }) => readonly (CorePermissionGroup | CorePikkuPermission)[];
31
+ export declare const addPermission: (tag: string, permissions: CorePermissionGroup | CorePikkuPermission[], packageName?: string | null) => CorePermissionGroup | CorePikkuPermission[];
116
32
  /**
117
33
  * Runs permission checks using combined permissions from all sources.
118
34
  * Combines permissions from wire and function levels, then validates them.
119
35
  */
120
- export declare const runPermissions: (wireType: PikkuWiringTypes, uid: string, { wireInheritedPermissions, wirePermissions, funcInheritedPermissions, funcPermissions, allServices, data, session, }: {
36
+ export declare const runPermissions: (wireType: PikkuWiringTypes, uid: string, { wireInheritedPermissions, wirePermissions, funcInheritedPermissions, funcPermissions, services, wire, data, packageName, }: {
121
37
  wireInheritedPermissions?: PermissionMetadata[];
122
38
  wirePermissions?: CorePermissionGroup | CorePikkuPermission[];
123
39
  funcInheritedPermissions?: PermissionMetadata[];
124
40
  funcPermissions?: CorePermissionGroup | CorePikkuPermission[];
125
- allServices: CoreServices;
41
+ services: CoreServices;
42
+ wire: PikkuWire<any, never, any, never, never, never>;
126
43
  data: any;
127
- session?: CoreUserSession;
44
+ packageName?: string | null;
128
45
  }) => Promise<void>;
@@ -1,4 +1,3 @@
1
- import { PikkuWiringTypes, } from './types/core.types.js';
2
1
  import { pikkuState } from './pikku-state.js';
3
2
  import { ForbiddenError } from './errors/errors.js';
4
3
  import { freezeDedupe } from './utils.js';
@@ -6,10 +5,10 @@ import { freezeDedupe } from './utils.js';
6
5
  * This function validates permissions by iterating over permission groups and executing the corresponding permission functions. If all functions in at least one group return true, the permission is considered valid.
7
6
  * @param services - The core services required for permission validation.
8
7
  * @param data - The data to be used in the permission validation functions.
9
- * @param session - An optional user session for permission validation.
8
+ * @param wire - The wire object containing request/response context and session.
10
9
  * @returns A promise that resolves to void.
11
10
  */
12
- export const verifyPermissions = async (permissions, services, data, session) => {
11
+ const verifyPermissions = async (permissions, services, data, wire) => {
13
12
  if (!permissions) {
14
13
  return true;
15
14
  }
@@ -20,13 +19,13 @@ export const verifyPermissions = async (permissions, services, data, session) =>
20
19
  }
21
20
  for (const funcs of permissionGroups) {
22
21
  if (funcs instanceof Array) {
23
- const permissioned = await Promise.all(funcs.map((func) => func(services, data, session)));
22
+ const permissioned = await Promise.all(funcs.map((func) => func(services, data, wire)));
24
23
  if (permissioned.every((result) => result)) {
25
24
  valid = true;
26
25
  }
27
26
  }
28
27
  else {
29
- valid = await funcs(services, data, session);
28
+ valid = await funcs(services, data, wire);
30
29
  }
31
30
  if (valid) {
32
31
  return true;
@@ -34,27 +33,6 @@ export const verifyPermissions = async (permissions, services, data, session) =>
34
33
  }
35
34
  return false;
36
35
  };
37
- /**
38
- * Registers a single permission function by name in the global permission store.
39
- *
40
- * This function is used by CLI-generated code to register permission functions
41
- * that can be referenced by name in metadata. It stores permissions in a special
42
- * namespace to avoid conflicts with tag-based permissions.
43
- *
44
- * @param {string} name - The unique name (pikkuFuncName) of the permission function.
45
- * @param {CorePikkuPermission} permission - The permission function to register.
46
- *
47
- * @example
48
- * ```typescript
49
- * // Called by CLI-generated pikku-permissions.gen.ts
50
- * registerPermission('adminPermission_src_permissions_ts_10_5', adminPermission)
51
- * registerPermission('readPermission_src_permissions_ts_20_10', readPermission)
52
- * ```
53
- */
54
- export const registerPermission = (name, permission) => {
55
- const permissionStore = pikkuState('misc', 'permissions');
56
- permissionStore[name] = [permission];
57
- };
58
36
  /**
59
37
  * Retrieves a registered permission function by its name.
60
38
  *
@@ -66,8 +44,8 @@ export const registerPermission = (name, permission) => {
66
44
  *
67
45
  * @internal
68
46
  */
69
- export const getPermissionByName = (name) => {
70
- const permissionStore = pikkuState('misc', 'permissions');
47
+ const getPermissionByName = (name) => {
48
+ const permissionStore = pikkuState(null, 'misc', 'permissions');
71
49
  const permission = permissionStore[name];
72
50
  if (Array.isArray(permission) && permission.length === 1) {
73
51
  return permission[0];
@@ -102,59 +80,23 @@ export const getPermissionByName = (name) => {
102
80
  * ])
103
81
  * ```
104
82
  */
105
- export const addPermission = (tag, permissions) => {
106
- const tagGroups = pikkuState('permissions', 'tagGroup');
83
+ export const addPermission = (tag, permissions, packageName = null) => {
84
+ const tagGroups = pikkuState(packageName, 'permissions', 'tagGroup');
107
85
  if (tagGroups[tag]) {
108
86
  throw new Error(`Permissions for tag '${tag}' already exist. Use a different tag or remove the existing permissions first.`);
109
87
  }
110
88
  tagGroups[tag] = permissions;
111
89
  return permissions;
112
90
  };
113
- const EMPTY = [];
114
- /**
115
- * Retrieves permissions for a given set of tags.
116
- *
117
- * This function looks up all permissions registered for any of the provided tags
118
- * and returns them as a flattened array.
119
- *
120
- * @param {string[]} tags - Array of tags to look up permissions for.
121
- * @returns {any[]} Array of permission functions that apply to the given tags.
122
- *
123
- * @example
124
- * ```typescript
125
- * // Get all permissions for tags 'api' and 'auth'
126
- * const permissions = getPermissionsForTags(['api', 'auth'])
127
- * ```
128
- */
129
- export const getPermissionsForTags = (tags) => {
130
- if (!tags || tags.length === 0) {
131
- return EMPTY;
132
- }
133
- const permissionsStore = pikkuState('permissions', 'tagGroup');
134
- const applicablePermissions = [];
135
- // Collect permissions for all matching tags
136
- for (const tag of new Set(tags)) {
137
- const tagPermissions = permissionsStore[tag];
138
- if (tagPermissions) {
139
- if (Array.isArray(tagPermissions)) {
140
- applicablePermissions.push(...tagPermissions);
141
- }
142
- else {
143
- applicablePermissions.push(tagPermissions);
144
- }
145
- }
146
- }
147
- return applicablePermissions;
148
- };
149
91
  const combinedPermissionsCache = {
150
- [PikkuWiringTypes.http]: {},
151
- [PikkuWiringTypes.rpc]: {},
152
- [PikkuWiringTypes.channel]: {},
153
- [PikkuWiringTypes.queue]: {},
154
- [PikkuWiringTypes.scheduler]: {},
155
- [PikkuWiringTypes.mcp]: {},
156
- [PikkuWiringTypes.cli]: {},
157
- [PikkuWiringTypes.workflow]: {},
92
+ http: {},
93
+ rpc: {},
94
+ channel: {},
95
+ queue: {},
96
+ scheduler: {},
97
+ mcp: {},
98
+ cli: {},
99
+ workflow: {},
158
100
  };
159
101
  /**
160
102
  * Combines wiring-specific permissions with function-level permissions.
@@ -180,7 +122,7 @@ const combinedPermissionsCache = {
180
122
  * })
181
123
  * ```
182
124
  */
183
- export const combinePermissions = (wireType, uid, { wireInheritedPermissions, wirePermissions, funcInheritedPermissions, funcPermissions, } = {}) => {
125
+ const combinePermissions = (wireType, uid, { wireInheritedPermissions, wirePermissions, funcInheritedPermissions, funcPermissions, packageName = null, } = {}) => {
184
126
  if (combinedPermissionsCache[wireType][uid]) {
185
127
  return combinedPermissionsCache[wireType][uid];
186
128
  }
@@ -190,7 +132,7 @@ export const combinePermissions = (wireType, uid, { wireInheritedPermissions, wi
190
132
  for (const meta of wireInheritedPermissions) {
191
133
  if (meta.type === 'http') {
192
134
  // Look up HTTP permission group from pikkuState
193
- const group = pikkuState('permissions', 'httpGroup')[meta.route];
135
+ const group = pikkuState(packageName, 'permissions', 'httpGroup')[meta.route];
194
136
  if (group) {
195
137
  if (Array.isArray(group)) {
196
138
  resolved.push(...group);
@@ -202,7 +144,7 @@ export const combinePermissions = (wireType, uid, { wireInheritedPermissions, wi
202
144
  }
203
145
  else if (meta.type === 'tag') {
204
146
  // Look up tag permission group from pikkuState
205
- const group = pikkuState('permissions', 'tagGroup')[meta.tag];
147
+ const group = pikkuState(packageName, 'permissions', 'tagGroup')[meta.tag];
206
148
  if (group) {
207
149
  if (Array.isArray(group)) {
208
150
  resolved.push(...group);
@@ -235,7 +177,7 @@ export const combinePermissions = (wireType, uid, { wireInheritedPermissions, wi
235
177
  for (const meta of funcInheritedPermissions) {
236
178
  if (meta.type === 'tag') {
237
179
  // Look up tag permission group from pikkuState
238
- const group = pikkuState('permissions', 'tagGroup')[meta.tag];
180
+ const group = pikkuState(packageName, 'permissions', 'tagGroup')[meta.tag];
239
181
  if (group) {
240
182
  if (Array.isArray(group)) {
241
183
  resolved.push(...group);
@@ -265,26 +207,27 @@ export const combinePermissions = (wireType, uid, { wireInheritedPermissions, wi
265
207
  * Runs permission checks using combined permissions from all sources.
266
208
  * Combines permissions from wire and function levels, then validates them.
267
209
  */
268
- export const runPermissions = async (wireType, uid, { wireInheritedPermissions, wirePermissions, funcInheritedPermissions, funcPermissions, allServices, data, session, }) => {
210
+ export const runPermissions = async (wireType, uid, { wireInheritedPermissions, wirePermissions, funcInheritedPermissions, funcPermissions, services, wire, data, packageName = null, }) => {
269
211
  // Combine all permissions: wireInheritedPermissions → wirePermissions → funcInheritedPermissions → funcPermissions
270
212
  const allPermissions = combinePermissions(wireType, uid, {
271
213
  wireInheritedPermissions,
272
214
  wirePermissions,
273
215
  funcInheritedPermissions,
274
216
  funcPermissions,
217
+ packageName,
275
218
  });
276
219
  // Check all combined permissions - at least one must pass if any exist
277
220
  if (allPermissions.length > 0) {
278
221
  let permissioned = false;
279
222
  for (const permission of allPermissions) {
280
- const result = await verifyPermissions(typeof permission === 'function' ? { permission } : permission, allServices, data, session);
223
+ const result = await verifyPermissions(typeof permission === 'function' ? { permission } : permission, services, data, wire);
281
224
  if (result) {
282
225
  permissioned = true;
283
226
  // Continue executing all permissions (don't break early)
284
227
  }
285
228
  }
286
229
  if (!permissioned) {
287
- allServices.logger.debug('Permission denied - combined permissions');
230
+ services.logger.debug('Permission denied - combined permissions');
288
231
  throw new ForbiddenError('Permission denied');
289
232
  }
290
233
  }