@pikku/core 0.7.8 → 0.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (165) hide show
  1. package/CHANGELOG.md +26 -1
  2. package/dist/errors/error-handler.d.ts +2 -0
  3. package/dist/errors/errors.js +2 -0
  4. package/dist/{channel → events/channel}/channel-handler.d.ts +1 -1
  5. package/dist/{channel → events/channel}/channel-handler.js +4 -2
  6. package/dist/{channel → events/channel}/channel-runner.d.ts +1 -1
  7. package/dist/{channel → events/channel}/channel-runner.js +4 -4
  8. package/dist/{channel → events/channel}/channel-store.d.ts +1 -1
  9. package/dist/{channel → events/channel}/channel.types.d.ts +3 -3
  10. package/dist/{channel → events/channel}/local/local-channel-runner.js +6 -6
  11. package/dist/{channel → events/channel}/log-channels.d.ts +1 -1
  12. package/dist/{channel → events/channel}/log-channels.js +1 -1
  13. package/dist/{channel → events/channel}/serverless/serverless-channel-runner.js +7 -7
  14. package/dist/{http → events/http}/http-runner.d.ts +1 -1
  15. package/dist/{http → events/http}/http-runner.js +8 -8
  16. package/dist/{http → events/http}/http.types.d.ts +3 -3
  17. package/dist/{http → events/http}/index.d.ts +0 -1
  18. package/dist/{http → events/http}/index.js +0 -1
  19. package/dist/{http → events/http}/log-http-routes.d.ts +1 -1
  20. package/dist/{http → events/http}/log-http-routes.js +1 -1
  21. package/dist/{http → events/http}/pikku-fetch-http-request.js +1 -1
  22. package/dist/events/mcp/index.d.ts +3 -0
  23. package/dist/events/mcp/index.js +3 -0
  24. package/dist/events/mcp/mcp-endpoint-registry.d.ts +48 -0
  25. package/dist/events/mcp/mcp-endpoint-registry.js +122 -0
  26. package/dist/events/mcp/mcp-runner.d.ts +30 -0
  27. package/dist/events/mcp/mcp-runner.js +192 -0
  28. package/dist/events/mcp/mcp.types.d.ts +117 -0
  29. package/dist/events/queue/index.d.ts +6 -0
  30. package/dist/events/queue/index.js +6 -0
  31. package/dist/events/queue/queue-runner.d.ts +24 -0
  32. package/dist/events/queue/queue-runner.js +83 -0
  33. package/dist/events/queue/queue.types.d.ts +154 -0
  34. package/dist/events/queue/register-queue-helper.d.ts +17 -0
  35. package/dist/events/queue/register-queue-helper.js +34 -0
  36. package/dist/events/queue/validate-worker-config.d.ts +41 -0
  37. package/dist/events/queue/validate-worker-config.js +50 -0
  38. package/dist/events/rpc/index.d.ts +2 -0
  39. package/dist/events/rpc/rpc-runner.d.ts +25 -0
  40. package/dist/{rpc → events/rpc}/rpc-runner.js +2 -2
  41. package/dist/events/scheduler/index.d.ts +3 -0
  42. package/dist/events/scheduler/index.js +3 -0
  43. package/dist/{scheduler → events/scheduler}/log-schedulers.d.ts +1 -1
  44. package/dist/{scheduler → events/scheduler}/log-schedulers.js +1 -1
  45. package/dist/{scheduler → events/scheduler}/scheduler-runner.d.ts +4 -3
  46. package/dist/{scheduler → events/scheduler}/scheduler-runner.js +7 -4
  47. package/dist/{scheduler → events/scheduler}/scheduler.types.d.ts +3 -4
  48. package/dist/function/function-runner.d.ts +3 -2
  49. package/dist/function/function-runner.js +16 -40
  50. package/dist/function/functions.types.d.ts +3 -2
  51. package/dist/handle-error.d.ts +2 -2
  52. package/dist/handle-error.js +1 -1
  53. package/dist/index.d.ts +15 -7
  54. package/dist/index.js +15 -7
  55. package/dist/middleware-runner.d.ts +4 -4
  56. package/dist/middleware-runner.js +3 -1
  57. package/dist/pikku-state.d.ts +18 -4
  58. package/dist/pikku-state.js +12 -0
  59. package/dist/services/index.d.ts +2 -2
  60. package/dist/services/index.js +2 -2
  61. package/dist/services/jwt-service.d.ts +1 -1
  62. package/dist/services/user-session-service.d.ts +1 -1
  63. package/dist/types/core.types.d.ts +17 -14
  64. package/dist/types/core.types.js +3 -1
  65. package/lcov.info +3947 -3184
  66. package/package.json +9 -7
  67. package/src/errors/error-handler.ts +2 -1
  68. package/src/errors/errors.ts +2 -0
  69. package/src/{channel → events/channel}/channel-handler.ts +7 -3
  70. package/src/{channel → events/channel}/channel-runner.ts +5 -5
  71. package/src/{channel → events/channel}/channel-store.ts +1 -1
  72. package/src/{channel → events/channel}/channel.types.ts +3 -3
  73. package/src/{channel → events/channel}/local/local-channel-runner.test.ts +1 -1
  74. package/src/{channel → events/channel}/local/local-channel-runner.ts +7 -7
  75. package/src/{channel → events/channel}/local/local-eventhub-service.test.ts +1 -1
  76. package/src/{channel → events/channel}/log-channels.ts +2 -2
  77. package/src/{channel → events/channel}/serverless/serverless-channel-runner.ts +8 -8
  78. package/src/{http → events/http}/http-runner.test.ts +6 -7
  79. package/src/{http → events/http}/http-runner.ts +9 -9
  80. package/src/{http → events/http}/http.types.ts +3 -3
  81. package/src/{http → events/http}/index.ts +0 -1
  82. package/src/{http → events/http}/log-http-routes.ts +2 -2
  83. package/src/{http → events/http}/pikku-fetch-http-request.ts +1 -1
  84. package/src/events/mcp/index.ts +3 -0
  85. package/src/events/mcp/mcp-endpoint-registry.test.d.ts +1 -0
  86. package/src/events/mcp/mcp-endpoint-registry.test.ts +389 -0
  87. package/src/events/mcp/mcp-endpoint-registry.ts +165 -0
  88. package/src/events/mcp/mcp-runner.ts +321 -0
  89. package/src/events/mcp/mcp.types.ts +150 -0
  90. package/src/events/queue/index.ts +18 -0
  91. package/src/events/queue/queue-runner.ts +125 -0
  92. package/src/events/queue/queue.types.ts +176 -0
  93. package/src/events/queue/register-queue-helper.ts +62 -0
  94. package/src/events/queue/validate-worker-config.ts +113 -0
  95. package/src/events/rpc/index.ts +2 -0
  96. package/src/{rpc → events/rpc}/rpc-runner.ts +3 -3
  97. package/src/events/scheduler/index.ts +9 -0
  98. package/src/{scheduler → events/scheduler}/log-schedulers.ts +2 -2
  99. package/src/{scheduler → events/scheduler}/scheduler-runner.ts +11 -10
  100. package/src/{scheduler → events/scheduler}/scheduler.types.ts +2 -4
  101. package/src/function/function-runner.ts +38 -65
  102. package/src/function/functions.types.ts +3 -1
  103. package/src/handle-error.ts +2 -2
  104. package/src/index.ts +28 -7
  105. package/src/middleware/auth-apikey.ts +1 -1
  106. package/src/middleware/auth-bearer.ts +1 -1
  107. package/src/middleware/auth-cookie.ts +1 -1
  108. package/src/middleware-runner.ts +14 -7
  109. package/src/pikku-state.ts +40 -4
  110. package/src/services/index.ts +2 -2
  111. package/src/services/jwt-service.ts +1 -1
  112. package/src/services/user-session-service.ts +1 -1
  113. package/src/types/core.types.ts +24 -13
  114. package/tsconfig.json +3 -2
  115. package/tsconfig.tsbuildinfo +1 -1
  116. package/dist/rpc/index.d.ts +0 -2
  117. package/dist/rpc/rpc-runner.d.ts +0 -27
  118. package/dist/scheduler/index.d.ts +0 -3
  119. package/dist/scheduler/index.js +0 -3
  120. package/src/http/incomingmessage-to-request-convertor.ts +0 -0
  121. package/src/rpc/index.ts +0 -2
  122. package/src/scheduler/index.ts +0 -5
  123. /package/dist/{channel → events/channel}/channel-store.js +0 -0
  124. /package/dist/{channel → events/channel}/channel.types.js +0 -0
  125. /package/dist/{channel → events/channel}/eventhub-service.d.ts +0 -0
  126. /package/dist/{channel → events/channel}/eventhub-service.js +0 -0
  127. /package/dist/{channel → events/channel}/eventhub-store.d.ts +0 -0
  128. /package/dist/{channel → events/channel}/eventhub-store.js +0 -0
  129. /package/dist/{channel → events/channel}/index.d.ts +0 -0
  130. /package/dist/{channel → events/channel}/index.js +0 -0
  131. /package/dist/{channel → events/channel}/local/index.d.ts +0 -0
  132. /package/dist/{channel → events/channel}/local/index.js +0 -0
  133. /package/dist/{channel → events/channel}/local/local-channel-handler.d.ts +0 -0
  134. /package/dist/{channel → events/channel}/local/local-channel-handler.js +0 -0
  135. /package/dist/{channel → events/channel}/local/local-channel-runner.d.ts +0 -0
  136. /package/dist/{channel → events/channel}/local/local-eventhub-service.d.ts +0 -0
  137. /package/dist/{channel → events/channel}/local/local-eventhub-service.js +0 -0
  138. /package/dist/{channel → events/channel}/pikku-abstract-channel-handler.d.ts +0 -0
  139. /package/dist/{channel → events/channel}/pikku-abstract-channel-handler.js +0 -0
  140. /package/dist/{channel → events/channel}/serverless/index.d.ts +0 -0
  141. /package/dist/{channel → events/channel}/serverless/index.js +0 -0
  142. /package/dist/{channel → events/channel}/serverless/serverless-channel-runner.d.ts +0 -0
  143. /package/dist/{http → events/http}/http.types.js +0 -0
  144. /package/dist/{http → events/http}/pikku-fetch-http-request.d.ts +0 -0
  145. /package/dist/{http → events/http}/pikku-fetch-http-response.d.ts +0 -0
  146. /package/dist/{http → events/http}/pikku-fetch-http-response.js +0 -0
  147. /package/dist/{http/incomingmessage-to-request-convertor.d.ts → events/mcp/mcp.types.js} +0 -0
  148. /package/dist/{http/incomingmessage-to-request-convertor.js → events/queue/queue.types.js} +0 -0
  149. /package/dist/{rpc → events/rpc}/index.js +0 -0
  150. /package/dist/{rpc → events/rpc}/rpc-types.d.ts +0 -0
  151. /package/dist/{rpc → events/rpc}/rpc-types.js +0 -0
  152. /package/dist/{scheduler → events/scheduler}/scheduler.types.js +0 -0
  153. /package/src/{channel → events/channel}/eventhub-service.ts +0 -0
  154. /package/src/{channel → events/channel}/eventhub-store.ts +0 -0
  155. /package/src/{channel → events/channel}/index.ts +0 -0
  156. /package/src/{channel → events/channel}/local/index.ts +0 -0
  157. /package/src/{channel → events/channel}/local/local-channel-handler.ts +0 -0
  158. /package/src/{channel → events/channel}/local/local-eventhub-service.ts +0 -0
  159. /package/src/{channel → events/channel}/pikku-abstract-channel-handler.test.ts +0 -0
  160. /package/src/{channel → events/channel}/pikku-abstract-channel-handler.ts +0 -0
  161. /package/src/{channel → events/channel}/serverless/index.ts +0 -0
  162. /package/src/{http → events/http}/pikku-fetch-http-request.test.ts +0 -0
  163. /package/src/{http → events/http}/pikku-fetch-http-response.test.ts +0 -0
  164. /package/src/{http → events/http}/pikku-fetch-http-response.ts +0 -0
  165. /package/src/{rpc → events/rpc}/rpc-types.ts +0 -0
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Validates worker configuration using a mapping table
3
+ * This provides a flexible, maintainable way to validate configurations
4
+ * across different queue implementations
5
+ *
6
+ * @param config - The worker configuration to validate
7
+ * @param configMapping - The mapping table defining supported/unsupported configurations
8
+ * @returns Validation result with applied, ignored, warnings, and fallbacks
9
+ */
10
+ export function validateWorkerConfig(configMapping, config = {}) {
11
+ const applied = {};
12
+ const ignored = {};
13
+ const warnings = [];
14
+ const fallbacks = {};
15
+ // Process each configuration property
16
+ for (const [key, value] of Object.entries(config)) {
17
+ if (value === undefined)
18
+ continue;
19
+ const configKey = key;
20
+ // Check if it's a supported configuration
21
+ if (configKey in configMapping.supported) {
22
+ applied[configKey] = value;
23
+ continue;
24
+ }
25
+ // Check if it's a fallback configuration
26
+ if (configKey in configMapping.fallbacks) {
27
+ const fallbackMapping = configMapping.fallbacks[configKey];
28
+ applied[configKey] = value;
29
+ fallbacks[key] = fallbackMapping.fallbackValue;
30
+ warnings.push(`${key}: ${fallbackMapping.reason}. ${fallbackMapping.explanation}`);
31
+ continue;
32
+ }
33
+ // Check if it's an unsupported configuration
34
+ if (configKey in configMapping.unsupported) {
35
+ ignored[configKey] = value;
36
+ const mapping = configMapping.unsupported[configKey];
37
+ warnings.push(`${key}: ${mapping.reason}. ${mapping.explanation}`);
38
+ continue;
39
+ }
40
+ // Unknown configuration
41
+ ignored[configKey] = value;
42
+ warnings.push(`${key}: Unknown configuration option for this queue implementation`);
43
+ }
44
+ return {
45
+ applied,
46
+ ignored,
47
+ warnings,
48
+ fallbacks,
49
+ };
50
+ }
@@ -0,0 +1,2 @@
1
+ export { initialize } from './rpc-runner.js';
2
+ export type { PikkuRPC, RPCMeta } from './rpc-types.js';
@@ -0,0 +1,25 @@
1
+ import { CoreServices } from '../../types/core.types.js';
2
+ type RPCServiceConfig = {
3
+ coerceDataFromSchema: boolean;
4
+ };
5
+ export declare class PikkuRPCService {
6
+ private config?;
7
+ initialize(config: RPCServiceConfig): void;
8
+ injectRPCService(coreServices: CoreServices, depth?: number): {
9
+ schema?: import("../../index.js").SchemaService;
10
+ config: {
11
+ logLevel?: import("../../index.js").LogLevel;
12
+ secrets?: {};
13
+ };
14
+ logger: import("../../index.js").Logger;
15
+ variables: import("../../services/variables-service.js").VariablesService;
16
+ http?: import("../http/http.types.js").PikkuHTTP;
17
+ mcp?: import("../mcp/mcp.types.js").PikkuMCP;
18
+ rpc?: import("./rpc-types.js").PikkuRPC;
19
+ userSession?: import("../../index.js").UserSessionService<import("../../types/core.types.js").CoreUserSession> | undefined;
20
+ channel?: import("../channel/channel.types.js").PikkuChannel<unknown, unknown>;
21
+ };
22
+ }
23
+ export declare const rpcService: PikkuRPCService;
24
+ export declare const initialize: (config: RPCServiceConfig) => void;
25
+ export {};
@@ -1,5 +1,5 @@
1
- import { runPikkuFunc } from '../function/function-runner.js';
2
- import { pikkuState } from '../pikku-state.js';
1
+ import { runPikkuFunc } from '../../function/function-runner.js';
2
+ import { pikkuState } from '../../pikku-state.js';
3
3
  const getRPCMeta = (rpcName) => {
4
4
  const rpc = pikkuState('rpc', 'meta');
5
5
  const rpcMeta = rpc[rpcName];
@@ -0,0 +1,3 @@
1
+ export * from './scheduler.types.js';
2
+ export { runScheduledTask, addScheduledTask, getScheduledTasks, } from './scheduler-runner.js';
3
+ export * from './log-schedulers.js';
@@ -0,0 +1,3 @@
1
+ export * from './scheduler.types.js';
2
+ export { runScheduledTask, addScheduledTask, getScheduledTasks, } from './scheduler-runner.js';
3
+ export * from './log-schedulers.js';
@@ -1,4 +1,4 @@
1
- import { Logger } from '../services/index.js';
1
+ import { Logger } from '../../services/index.js';
2
2
  /**
3
3
  * Logs all the loaded scheduled tasks.
4
4
  * @param logger - A logger for logging information.
@@ -1,4 +1,4 @@
1
- import { pikkuState } from '../pikku-state.js';
1
+ import { pikkuState } from '../../pikku-state.js';
2
2
  /**
3
3
  * Logs all the loaded scheduled tasks.
4
4
  * @param logger - A logger for logging information.
@@ -1,6 +1,6 @@
1
- import type { CoreServices, CoreSingletonServices, CoreUserSession, CreateSessionServices } from '../types/core.types.js';
1
+ import type { CoreServices, CoreSingletonServices, CoreUserSession, CreateSessionServices } from '../../types/core.types.js';
2
2
  import type { CoreScheduledTask } from './scheduler.types.js';
3
- import type { CoreAPIFunctionSessionless } from '../function/functions.types.js';
3
+ import type { CoreAPIFunctionSessionless } from '../../function/functions.types.js';
4
4
  export type RunScheduledTasksParams = {
5
5
  name: string;
6
6
  session?: CoreUserSession;
@@ -8,4 +8,5 @@ export type RunScheduledTasksParams = {
8
8
  createSessionServices?: CreateSessionServices<CoreSingletonServices, CoreServices<CoreSingletonServices>, CoreUserSession>;
9
9
  };
10
10
  export declare const addScheduledTask: <APIFunction extends CoreAPIFunctionSessionless<void, void>>(scheduledTask: CoreScheduledTask<APIFunction>) => void;
11
- export declare function runScheduledTask<SingletonServices extends CoreSingletonServices = CoreSingletonServices, UserSession extends CoreUserSession = CoreUserSession>({ name, session, singletonServices, createSessionServices, }: RunScheduledTasksParams): Promise<void>;
11
+ export declare function runScheduledTask({ name, session, singletonServices, createSessionServices, }: RunScheduledTasksParams): Promise<void>;
12
+ export declare const getScheduledTasks: () => Map<string, CoreScheduledTask>;
@@ -1,7 +1,7 @@
1
- import { getErrorResponse } from '../errors/error-handler.js';
2
- import { closeSessionServices } from '../utils.js';
3
- import { pikkuState } from '../pikku-state.js';
4
- import { addFunction, runPikkuFunc } from '../function/function-runner.js';
1
+ import { getErrorResponse } from '../../errors/error-handler.js';
2
+ import { closeSessionServices } from '../../utils.js';
3
+ import { pikkuState } from '../../pikku-state.js';
4
+ import { addFunction, runPikkuFunc } from '../../function/function-runner.js';
5
5
  import { rpcService } from '../rpc/rpc-runner.js';
6
6
  export const addScheduledTask = (scheduledTask) => {
7
7
  const meta = pikkuState('scheduler', 'meta');
@@ -64,3 +64,6 @@ export async function runScheduledTask({ name, session, singletonServices, creat
64
64
  }
65
65
  }
66
66
  }
67
+ export const getScheduledTasks = () => {
68
+ return pikkuState('scheduler', 'tasks');
69
+ };
@@ -1,5 +1,5 @@
1
- import { APIDocs, CoreUserSession } from '../types/core.types.js';
2
- import { CoreAPIFunctionSessionless } from '../function/functions.types.js';
1
+ import { APIDocs, CoreUserSession } from '../../types/core.types.js';
2
+ import { CoreAPIFunctionSessionless } from '../../function/functions.types.js';
3
3
  /**
4
4
  * Represents metadata for scheduled tasks, including title, schedule, and documentation.
5
5
  */
@@ -14,11 +14,10 @@ export type ScheduledTasksMeta<UserSession extends CoreUserSession = any> = Reco
14
14
  /**
15
15
  * Represents a core scheduled task.
16
16
  */
17
- export type CoreScheduledTask<APIFunction = CoreAPIFunctionSessionless<void, void>, UserSession extends CoreUserSession = CoreUserSession> = {
17
+ export type CoreScheduledTask<APIFunction = CoreAPIFunctionSessionless<void, void>> = {
18
18
  name: string;
19
19
  schedule: string;
20
20
  func: APIFunction;
21
21
  docs?: APIDocs;
22
- session?: UserSession;
23
22
  tags?: string[];
24
23
  };
@@ -1,11 +1,12 @@
1
- import { CoreServices, CoreUserSession } from '../types/core.types.js';
1
+ import { CoreServices, CoreUserSession, PikkuFunctionMiddleware } from '../types/core.types.js';
2
2
  import { CorePermissionGroup, CorePikkuFunctionConfig } from './functions.types.js';
3
3
  export declare const addFunction: (funcName: string, funcConfig: CorePikkuFunctionConfig<any, any>) => void;
4
4
  export declare const runPikkuFuncDirectly: <In, Out>(funcName: string, allServices: CoreServices, data: In, session?: CoreUserSession) => Promise<Out>;
5
- export declare const runPikkuFunc: <In = any, Out = any>(funcName: string, { getAllServices, data, session, permissions: transportPermissions, coerceDataFromSchema, }: {
5
+ export declare const runPikkuFunc: <In = any, Out = any>(funcName: string, { getAllServices, data, session, permissions: transportPermissions, middleware: transportMiddleware, coerceDataFromSchema, }: {
6
6
  getAllServices: () => Promise<CoreServices> | CoreServices;
7
7
  data: In;
8
8
  session?: CoreUserSession;
9
9
  permissions?: CorePermissionGroup;
10
+ middleware?: PikkuFunctionMiddleware[];
10
11
  coerceDataFromSchema?: boolean;
11
12
  }) => Promise<Out>;
@@ -1,43 +1,8 @@
1
1
  import { ForbiddenError } from '../errors/errors.js';
2
+ import { runMiddleware } from '../middleware-runner.js';
2
3
  import { verifyPermissions } from '../permissions.js';
3
4
  import { pikkuState } from '../pikku-state.js';
4
5
  import { coerceTopLevelDataFromSchema, validateSchema } from '../schema.js';
5
- // Permission merging function
6
- function mergePermissions(logger, funcName, funcPermissions, transportPermissions) {
7
- if (!funcPermissions && !transportPermissions) {
8
- return undefined;
9
- }
10
- if (!funcPermissions) {
11
- return transportPermissions;
12
- }
13
- if (!transportPermissions) {
14
- return funcPermissions;
15
- }
16
- // Start with a copy of function permissions
17
- const mergedPermissions = { ...funcPermissions };
18
- // Merge in transport permissions
19
- for (const [key, transportValue] of Object.entries(transportPermissions)) {
20
- if (key in mergedPermissions) {
21
- // For permission arrays, concatenate and deduplicate values
22
- if (Array.isArray(mergedPermissions[key]) &&
23
- Array.isArray(transportValue)) {
24
- mergedPermissions[key] = [
25
- ...new Set([...mergedPermissions[key], ...transportValue]),
26
- ];
27
- }
28
- // For other types, warn about conflict and use the more restrictive (transport-level) value
29
- else {
30
- logger.warn(`Permission conflict on key "${key}" for function "${funcName}". Using transport-level permission.`);
31
- mergedPermissions[key] = transportValue;
32
- }
33
- }
34
- else {
35
- // If key doesn't exist in function permissions, add it
36
- mergedPermissions[key] = transportValue;
37
- }
38
- }
39
- return mergedPermissions;
40
- }
41
6
  export const addFunction = (funcName, funcConfig) => {
42
7
  pikkuState('function', 'functions').set(funcName, funcConfig);
43
8
  };
@@ -48,7 +13,7 @@ export const runPikkuFuncDirectly = async (funcName, allServices, data, session)
48
13
  }
49
14
  return (await funcConfig.func(allServices, data, session));
50
15
  };
51
- export const runPikkuFunc = async (funcName, { getAllServices, data, session, permissions: transportPermissions, coerceDataFromSchema, }) => {
16
+ export const runPikkuFunc = async (funcName, { getAllServices, data, session, permissions: transportPermissions, middleware: transportMiddleware, coerceDataFromSchema, }) => {
52
17
  const funcConfig = pikkuState('function', 'functions').get(funcName);
53
18
  if (!funcConfig) {
54
19
  throw new Error(`Function not found: ${funcName}`);
@@ -70,11 +35,22 @@ export const runPikkuFunc = async (funcName, { getAllServices, data, session, pe
70
35
  coerceTopLevelDataFromSchema(schemaName, data);
71
36
  }
72
37
  }
73
- // Execute permission checks
74
- const mergedPermissions = mergePermissions(allServices.logger, funcName, funcConfig.permissions, transportPermissions);
75
- const permissioned = await verifyPermissions(mergedPermissions, allServices, data, session);
38
+ let permissioned = true;
39
+ if (funcConfig.permissions) {
40
+ permissioned = await verifyPermissions(funcConfig.permissions, allServices, data, session);
41
+ }
42
+ if (!permissioned && transportPermissions) {
43
+ permissioned = await verifyPermissions(transportPermissions, allServices, data, session);
44
+ }
76
45
  if (permissioned === false) {
77
46
  throw new ForbiddenError('Permission denied');
78
47
  }
48
+ if (transportMiddleware || funcConfig.middleware) {
49
+ return (await runMiddleware(allServices, {
50
+ http: allServices.http,
51
+ mcp: allServices.mcp,
52
+ rpc: allServices.rpc,
53
+ }, [...(transportMiddleware || []), ...(funcConfig.middleware || [])], async () => await funcConfig.func(allServices, data, session)));
54
+ }
79
55
  return (await funcConfig.func(allServices, data, session));
80
56
  };
@@ -1,5 +1,5 @@
1
- import { PikkuChannel } from '../channel/channel.types.js';
2
- import type { CoreServices, CoreSingletonServices, CoreUserSession } from '../types/core.types.js';
1
+ import { PikkuChannel } from '../events/channel/channel.types.js';
2
+ import type { CoreServices, CoreSingletonServices, CoreUserSession, PikkuFunctionMiddleware } from '../types/core.types.js';
3
3
  /**
4
4
  * Represents a core API function that performs an operation using core services and a user session.
5
5
  *
@@ -39,4 +39,5 @@ export type CorePikkuFunctionConfig<APIFunction extends CoreAPIFunction<any, any
39
39
  func: APIFunction;
40
40
  auth?: boolean;
41
41
  permissions?: CorePermissionGroup<APIPermission>;
42
+ middleware?: PikkuFunctionMiddleware[];
42
43
  };
@@ -1,5 +1,5 @@
1
1
  import { Logger } from './services/logger.js';
2
- import { PikkuHTTP } from './http/http.types.js';
2
+ import { PikkuHTTP } from './events/http/http.types.js';
3
3
  /**
4
4
  * Handle errors that occur during route processing
5
5
  *
@@ -11,4 +11,4 @@ import { PikkuHTTP } from './http/http.types.js';
11
11
  * @param {boolean} respondWith404 - Whether to respond with 404 for NotFoundError
12
12
  * @param {boolean} bubbleError - Whether to throw the error after handling
13
13
  */
14
- export declare const handleError: (e: any, http: PikkuHTTP | undefined, trackerId: string | undefined, logger: Logger, logWarningsForStatusCodes: number[], respondWith404: boolean, bubbleError: boolean) => void;
14
+ export declare const handleHTTPError: (e: any, http: PikkuHTTP | undefined, trackerId: string | undefined, logger: Logger, logWarningsForStatusCodes: number[], respondWith404: boolean, bubbleError: boolean) => void;
@@ -11,7 +11,7 @@ import { NotFoundError } from './errors/errors.js';
11
11
  * @param {boolean} respondWith404 - Whether to respond with 404 for NotFoundError
12
12
  * @param {boolean} bubbleError - Whether to throw the error after handling
13
13
  */
14
- export const handleError = (e, http, trackerId, logger, logWarningsForStatusCodes, respondWith404, bubbleError) => {
14
+ export const handleHTTPError = (e, http, trackerId, logger, logWarningsForStatusCodes, respondWith404, bubbleError) => {
15
15
  // Skip 404 handling if configured to do so
16
16
  if (e instanceof NotFoundError && !respondWith404) {
17
17
  return;
package/dist/index.d.ts CHANGED
@@ -5,16 +5,24 @@ export * from './types/core.types.js';
5
5
  export * from './function/index.js';
6
6
  export * from './pikku-request.js';
7
7
  export * from './pikku-response.js';
8
- export * from './services/index.js';
9
- export * from './http/index.js';
10
- export * from './channel/index.js';
11
- export * from './scheduler/index.js';
8
+ export * from './services/logger.js';
9
+ export * from './services/schema-service.js';
10
+ export * from './services/jwt-service.js';
11
+ export * from './services/secret-service.js';
12
+ export * from './services/user-session-service.js';
13
+ export * from './events/http/index.js';
14
+ export * from './events/channel/index.js';
15
+ export * from './events/scheduler/index.js';
16
+ export * from './events/rpc/index.js';
17
+ export * from './events/queue/index.js';
18
+ export * from './events/mcp/index.js';
12
19
  export * from './errors/index.js';
13
20
  export * from './middleware/index.js';
14
21
  export * from './time-utils.js';
15
22
  export * from './utils.js';
16
23
  export { pikkuState } from './pikku-state.js';
17
24
  export { runMiddleware } from './middleware-runner.js';
18
- export { addHTTPRoute, addMiddleware } from './http/http-runner.js';
19
- export { addChannel } from './channel/channel-runner.js';
20
- export { addScheduledTask } from './scheduler/scheduler-runner.js';
25
+ export { addHTTPRoute, addMiddleware } from './events/http/http-runner.js';
26
+ export { addChannel } from './events/channel/channel-runner.js';
27
+ export { addScheduledTask } from './events/scheduler/scheduler-runner.js';
28
+ export { addMCPResource, addMCPTool, addMCPPrompt, runMCPResource, runMCPTool, runMCPPrompt, getMCPTools, getMCPResources, getMCPPrompts, getMCPResourcesMeta, getMCPToolsMeta, getMCPPromptsMeta, } from './events/mcp/mcp-runner.js';
package/dist/index.js CHANGED
@@ -5,16 +5,24 @@ export * from './types/core.types.js';
5
5
  export * from './function/index.js';
6
6
  export * from './pikku-request.js';
7
7
  export * from './pikku-response.js';
8
- export * from './services/index.js';
9
- export * from './http/index.js';
10
- export * from './channel/index.js';
11
- export * from './scheduler/index.js';
8
+ export * from './services/logger.js';
9
+ export * from './services/schema-service.js';
10
+ export * from './services/jwt-service.js';
11
+ export * from './services/secret-service.js';
12
+ export * from './services/user-session-service.js';
13
+ export * from './events/http/index.js';
14
+ export * from './events/channel/index.js';
15
+ export * from './events/scheduler/index.js';
16
+ export * from './events/rpc/index.js';
17
+ export * from './events/queue/index.js';
18
+ export * from './events/mcp/index.js';
12
19
  export * from './errors/index.js';
13
20
  export * from './middleware/index.js';
14
21
  export * from './time-utils.js';
15
22
  export * from './utils.js';
16
23
  export { pikkuState } from './pikku-state.js';
17
24
  export { runMiddleware } from './middleware-runner.js';
18
- export { addHTTPRoute, addMiddleware } from './http/http-runner.js';
19
- export { addChannel } from './channel/channel-runner.js';
20
- export { addScheduledTask } from './scheduler/scheduler-runner.js';
25
+ export { addHTTPRoute, addMiddleware } from './events/http/http-runner.js';
26
+ export { addChannel } from './events/channel/channel-runner.js';
27
+ export { addScheduledTask } from './events/scheduler/scheduler-runner.js';
28
+ export { addMCPResource, addMCPTool, addMCPPrompt, runMCPResource, runMCPTool, runMCPPrompt, getMCPTools, getMCPResources, getMCPPrompts, getMCPResourcesMeta, getMCPToolsMeta, getMCPPromptsMeta, } from './events/mcp/mcp-runner.js';
@@ -1,5 +1,5 @@
1
1
  import { UserSessionService } from './services/user-session-service.js';
2
- import { CoreSingletonServices, PikkuInteraction, PikkuMiddleware } from './types/core.types.js';
2
+ import { CoreSingletonServices, PikkuFunctionMiddleware, PikkuInteraction, PikkuMiddleware } from './types/core.types.js';
3
3
  /**
4
4
  * Runs a chain of middleware functions in sequence before executing the main function.
5
5
  *
@@ -17,6 +17,6 @@ import { CoreSingletonServices, PikkuInteraction, PikkuMiddleware } from './type
17
17
  * async () => { return await runMain(); }
18
18
  * );
19
19
  */
20
- export declare const runMiddleware: (services: CoreSingletonServices & {
21
- userSession: UserSessionService<any>;
22
- }, interaction: PikkuInteraction, middlewares: PikkuMiddleware[], main?: () => Promise<void>) => Promise<void>;
20
+ export declare const runMiddleware: <Middleware extends PikkuMiddleware | PikkuFunctionMiddleware = PikkuMiddleware>(services: CoreSingletonServices & {
21
+ userSession?: UserSessionService<any>;
22
+ }, interaction: PikkuInteraction, middlewares: Middleware[], main?: () => Promise<unknown>) => Promise<unknown>;
@@ -16,13 +16,15 @@
16
16
  * );
17
17
  */
18
18
  export const runMiddleware = async (services, interaction, middlewares, main) => {
19
+ let result;
19
20
  const dispatch = async (index) => {
20
21
  if (middlewares && index < middlewares.length) {
21
22
  return await middlewares[index](services, interaction, () => dispatch(index + 1));
22
23
  }
23
24
  else if (main) {
24
- await main();
25
+ result = await main();
25
26
  }
26
27
  };
27
28
  await dispatch(0);
29
+ return result;
28
30
  };
@@ -1,10 +1,12 @@
1
- import { ChannelsMeta, CoreAPIChannel } from './channel/channel.types.js';
2
- import { CoreHTTPFunctionRoute, HTTPMethod, HTTPRoutesMeta } from './http/http.types.js';
1
+ import { ChannelsMeta, CoreAPIChannel } from './events/channel/channel.types.js';
2
+ import { CoreHTTPFunctionRoute, HTTPMethod, HTTPRoutesMeta } from './events/http/http.types.js';
3
3
  import { FunctionsMeta, PikkuMiddleware } from './types/core.types.js';
4
- import { CoreScheduledTask, ScheduledTasksMeta } from './scheduler/scheduler.types.js';
4
+ import { CoreScheduledTask, ScheduledTasksMeta } from './events/scheduler/scheduler.types.js';
5
5
  import { ErrorDetails, PikkuError } from './errors/error-handler.js';
6
6
  import { CorePikkuFunctionConfig } from './function/functions.types.js';
7
- import { RPCMeta } from './rpc/rpc-types.js';
7
+ import { RPCMeta } from './events/rpc/rpc-types.js';
8
+ import { queueWorkersMeta, CoreQueueWorker } from './events/queue/queue.types.js';
9
+ import { CoreMCPResource, CoreMCPTool, CoreMCPPrompt, MCPResourceMeta, MCPToolMeta, MCPPromptMeta } from './events/mcp/mcp.types.js';
8
10
  interface PikkuState {
9
11
  function: {
10
12
  meta: FunctionsMeta;
@@ -33,6 +35,18 @@ interface PikkuState {
33
35
  tasks: Map<string, CoreScheduledTask>;
34
36
  meta: ScheduledTasksMeta;
35
37
  };
38
+ queue: {
39
+ registrations: Map<string, CoreQueueWorker>;
40
+ meta: queueWorkersMeta;
41
+ };
42
+ mcp: {
43
+ resources: Map<string, CoreMCPResource>;
44
+ resourcesMeta: MCPResourceMeta;
45
+ tools: Map<string, CoreMCPTool>;
46
+ toolsMeta: MCPToolMeta;
47
+ prompts: Map<string, CoreMCPPrompt>;
48
+ promptsMeta: MCPPromptMeta;
49
+ };
36
50
  misc: {
37
51
  errors: Map<PikkuError, ErrorDetails>;
38
52
  schemas: Map<string, any>;
@@ -21,6 +21,18 @@ export const resetPikkuState = () => {
21
21
  tasks: new Map(),
22
22
  meta: [],
23
23
  },
24
+ queue: {
25
+ registrations: new Map(),
26
+ meta: {},
27
+ },
28
+ mcp: {
29
+ resources: new Map(),
30
+ resourcesMeta: {},
31
+ tools: new Map(),
32
+ toolsMeta: {},
33
+ prompts: new Map(),
34
+ promptsMeta: {},
35
+ },
24
36
  misc: {
25
37
  errors: globalThis.pikkuState?.misc?.errors || new Map(),
26
38
  schemas: globalThis.pikkuState?.misc?.schema || new Map(),
@@ -4,11 +4,11 @@
4
4
  export * from './content-service.js';
5
5
  export * from './jwt-service.js';
6
6
  export * from './logger.js';
7
- export * from './logger-console.js';
8
7
  export * from './secret-service.js';
9
8
  export * from './variables-service.js';
10
9
  export * from './schema-service.js';
11
10
  export * from './user-session-service.js';
12
- export * from './local-content.js';
13
11
  export * from './local-secrets.js';
14
12
  export * from './local-variables.js';
13
+ export * from './logger-console.js';
14
+ export * from './local-content.js';
@@ -5,12 +5,12 @@
5
5
  export * from './content-service.js';
6
6
  export * from './jwt-service.js';
7
7
  export * from './logger.js';
8
- export * from './logger-console.js';
9
8
  export * from './secret-service.js';
10
9
  export * from './variables-service.js';
11
10
  export * from './schema-service.js';
12
11
  export * from './user-session-service.js';
13
- export * from './local-content.js';
14
12
  // Local implementations
15
13
  export * from './local-secrets.js';
16
14
  export * from './local-variables.js';
15
+ export * from './logger-console.js';
16
+ export * from './local-content.js';
@@ -1,4 +1,4 @@
1
- import { RelativeTimeInput } from '../time-utils.js';
1
+ import type { RelativeTimeInput } from '../time-utils.js';
2
2
  /**
3
3
  * Interface for handling JSON Web Tokens (JWT).
4
4
  */
@@ -1,4 +1,4 @@
1
- import { ChannelStore } from '../channel/channel-store.js';
1
+ import { ChannelStore } from '../events/channel/channel-store.js';
2
2
  import { CoreUserSession } from '../types/core.types.js';
3
3
  export interface UserSessionService<UserSession extends CoreUserSession> {
4
4
  sessionChanged: boolean;
@@ -1,18 +1,18 @@
1
1
  import type { Logger, LogLevel } from '../services/logger.js';
2
2
  import { VariablesService } from '../services/variables-service.js';
3
- import { EventHubService } from '../channel/eventhub-service.js';
4
3
  import { SchemaService } from '../services/schema-service.js';
5
- import { PikkuHTTP } from '../http/http.types.js';
4
+ import { PikkuHTTP } from '../events/http/http.types.js';
6
5
  import { UserSessionService } from '../services/user-session-service.js';
7
- import { JWTService } from '../services/jwt-service.js';
8
- import { SecretService } from '../services/secret-service.js';
9
- import { PikkuChannel } from '../channel/channel.types.js';
10
- import { PikkuRPC } from '../rpc/rpc-types.js';
6
+ import { PikkuChannel } from '../events/channel/channel.types.js';
7
+ import { PikkuRPC } from '../events/rpc/rpc-types.js';
8
+ import { PikkuMCP } from '../events/mcp/mcp.types.js';
11
9
  export declare enum PikkuEventTypes {
12
10
  http = "http",
13
- scheduled = "scheduled",
11
+ scheduler = "scheduler",
14
12
  channel = "channel",
15
- rpc = "rpc"
13
+ rpc = "rpc",
14
+ queue = "queue",
15
+ mcp = "mcp"
16
16
  }
17
17
  export interface FunctionServicesMeta {
18
18
  optimized: boolean;
@@ -69,8 +69,6 @@ export interface CoreUserSession {
69
69
  * Interface for core singleton services provided by Pikku.
70
70
  */
71
71
  export interface CoreSingletonServices<Config extends CoreConfig = CoreConfig> {
72
- /** JWT Service */
73
- jwt?: JWTService;
74
72
  /** The schema library used to validate data */
75
73
  schema?: SchemaService;
76
74
  /** The core configuration for the application. */
@@ -79,17 +77,21 @@ export interface CoreSingletonServices<Config extends CoreConfig = CoreConfig> {
79
77
  logger: Logger;
80
78
  /** The variable service to be used */
81
79
  variables: VariablesService;
82
- /** The subscription service that is passed to streams */
83
- eventHub?: EventHubService<unknown>;
84
- /** SecretServce */
85
- secrets?: SecretService;
86
80
  }
87
81
  /**
88
82
  * Represents different forms of interaction within Pikku and the outside world.
89
83
  */
90
84
  export interface PikkuInteraction {
91
85
  http?: PikkuHTTP;
86
+ mcp?: PikkuMCP;
87
+ rpc?: PikkuRPC;
92
88
  }
89
+ /**
90
+ * A function that can wrap an interaction and be called before or after
91
+ */
92
+ export type PikkuFunctionMiddleware<SingletonServices extends CoreSingletonServices = CoreSingletonServices, UserSession extends CoreUserSession = CoreUserSession> = (services: SingletonServices & {
93
+ userSession?: UserSessionService<UserSession>;
94
+ }, interactions: PikkuInteraction, next: () => Promise<void>) => Promise<void>;
93
95
  /**
94
96
  * A function that can wrap an interaction and be called before or after
95
97
  */
@@ -100,6 +102,7 @@ export type PikkuMiddleware<SingletonServices extends CoreSingletonServices = Co
100
102
  * Represents the core services used by Pikku, including singleton services and the request/response interaction.
101
103
  */
102
104
  export type CoreServices<SingletonServices = CoreSingletonServices, UserSession extends CoreUserSession = CoreUserSession, CoreServices extends Record<string, unknown> = {}> = SingletonServices & PikkuInteraction & {
105
+ mcp?: PikkuMCP;
103
106
  rpc?: PikkuRPC;
104
107
  userSession?: UserSessionService<UserSession>;
105
108
  channel?: PikkuChannel<unknown, unknown>;
@@ -1,7 +1,9 @@
1
1
  export var PikkuEventTypes;
2
2
  (function (PikkuEventTypes) {
3
3
  PikkuEventTypes["http"] = "http";
4
- PikkuEventTypes["scheduled"] = "scheduled";
4
+ PikkuEventTypes["scheduler"] = "scheduler";
5
5
  PikkuEventTypes["channel"] = "channel";
6
6
  PikkuEventTypes["rpc"] = "rpc";
7
+ PikkuEventTypes["queue"] = "queue";
8
+ PikkuEventTypes["mcp"] = "mcp";
7
9
  })(PikkuEventTypes || (PikkuEventTypes = {}));