@pikku/core 0.6.13 → 0.6.15

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 (82) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/dist/channel/channel-handler.d.ts +2 -2
  3. package/dist/channel/channel-handler.js +4 -4
  4. package/dist/channel/channel-runner.d.ts +5 -4
  5. package/dist/channel/channel-runner.js +8 -14
  6. package/dist/channel/channel.types.d.ts +11 -18
  7. package/dist/channel/local/local-channel-handler.d.ts +1 -3
  8. package/dist/channel/local/local-channel-handler.js +0 -3
  9. package/dist/channel/local/local-channel-runner.js +49 -33
  10. package/dist/channel/pikku-abstract-channel-handler.d.ts +4 -7
  11. package/dist/channel/pikku-abstract-channel-handler.js +1 -5
  12. package/dist/channel/serverless/serverless-channel-runner.js +45 -38
  13. package/dist/handle-error.d.ts +14 -0
  14. package/dist/handle-error.js +53 -0
  15. package/dist/http/http-route-runner.d.ts +34 -11
  16. package/dist/http/http-route-runner.js +177 -106
  17. package/dist/http/http-routes.types.d.ts +15 -9
  18. package/dist/http/index.d.ts +0 -1
  19. package/dist/http/index.js +0 -1
  20. package/dist/http/pikku-http-abstract-request.d.ts +4 -1
  21. package/dist/http/pikku-http-abstract-request.js +7 -0
  22. package/dist/index.d.ts +2 -0
  23. package/dist/index.js +2 -0
  24. package/dist/middleware/auth-api-key.d.ts +9 -0
  25. package/dist/middleware/auth-api-key.js +23 -0
  26. package/dist/middleware/auth-cookie-middleware.d.ts +11 -0
  27. package/dist/middleware/auth-cookie-middleware.js +36 -0
  28. package/dist/middleware/auth-jwt-middleware.d.ts +10 -0
  29. package/dist/middleware/auth-jwt-middleware.js +32 -0
  30. package/dist/middleware/auth-query-middleware.d.ts +10 -0
  31. package/dist/middleware/auth-query-middleware.js +21 -0
  32. package/dist/middleware/index.d.ts +4 -0
  33. package/dist/middleware/index.js +4 -0
  34. package/dist/middleware-runner.d.ts +22 -0
  35. package/dist/middleware-runner.js +28 -0
  36. package/dist/scheduler/scheduler.types.d.ts +2 -0
  37. package/dist/schema.d.ts +1 -1
  38. package/dist/schema.js +3 -6
  39. package/dist/services/index.d.ts +1 -0
  40. package/dist/services/index.js +1 -0
  41. package/dist/services/user-session-service.d.ts +20 -3
  42. package/dist/services/user-session-service.js +35 -1
  43. package/dist/types/core.types.d.ts +11 -15
  44. package/dist/types/functions.types.d.ts +4 -4
  45. package/lcov.info +1572 -1729
  46. package/package.json +1 -2
  47. package/src/channel/channel-handler.ts +6 -11
  48. package/src/channel/channel-runner.ts +13 -32
  49. package/src/channel/channel.types.ts +13 -39
  50. package/src/channel/local/local-channel-handler.ts +1 -7
  51. package/src/channel/local/local-channel-runner.test.ts +2 -5
  52. package/src/channel/local/local-channel-runner.ts +72 -54
  53. package/src/channel/pikku-abstract-channel-handler.test.ts +3 -28
  54. package/src/channel/pikku-abstract-channel-handler.ts +3 -9
  55. package/src/channel/serverless/serverless-channel-runner.ts +68 -56
  56. package/src/handle-error.ts +67 -0
  57. package/src/http/http-route-runner.test.ts +12 -45
  58. package/src/http/http-route-runner.ts +256 -182
  59. package/src/http/http-routes.types.ts +15 -10
  60. package/src/http/index.ts +0 -2
  61. package/src/http/pikku-http-abstract-request.ts +8 -1
  62. package/src/index.ts +2 -0
  63. package/src/middleware/auth-api-key.ts +32 -0
  64. package/src/middleware/auth-cookie-middleware.ts +54 -0
  65. package/src/middleware/auth-jwt-middleware.ts +47 -0
  66. package/src/middleware/auth-query-middleware.ts +33 -0
  67. package/src/middleware/index.ts +4 -0
  68. package/src/middleware-runner.ts +43 -0
  69. package/src/scheduler/scheduler.types.ts +2 -0
  70. package/src/schema.ts +4 -8
  71. package/src/services/index.ts +1 -0
  72. package/src/services/user-session-service.ts +45 -3
  73. package/src/types/core.types.ts +19 -18
  74. package/src/types/functions.types.ts +11 -7
  75. package/tsconfig.tsbuildinfo +1 -1
  76. package/dist/http/http-session-service.d.ts +0 -15
  77. package/dist/http/http-session-service.js +0 -1
  78. package/dist/http/pikku-http-session-service.d.ts +0 -45
  79. package/dist/http/pikku-http-session-service.js +0 -92
  80. package/src/http/http-session-service.ts +0 -19
  81. package/src/http/pikku-http-session-service.test.ts +0 -106
  82. package/src/http/pikku-http-session-service.ts +0 -135
@@ -0,0 +1,4 @@
1
+ export * from './auth-api-key.js';
2
+ export * from './auth-cookie-middleware.js';
3
+ export * from './auth-jwt-middleware.js';
4
+ export * from './auth-query-middleware.js';
@@ -0,0 +1,4 @@
1
+ export * from './auth-api-key.js';
2
+ export * from './auth-cookie-middleware.js';
3
+ export * from './auth-jwt-middleware.js';
4
+ export * from './auth-query-middleware.js';
@@ -0,0 +1,22 @@
1
+ import { UserSessionService } from './services/user-session-service.js';
2
+ import { CoreSingletonServices, PikkuInteraction, PikkuMiddleware } from './types/core.types.js';
3
+ /**
4
+ * Runs a chain of middleware functions in sequence before executing the main function.
5
+ *
6
+ * @param services - An object containing services (e.g., singletonServices, userSessionService, etc.)
7
+ * @param interaction - The interaction context, e.g., { http }.
8
+ * @param middlewares - An array of middleware functions to run.
9
+ * @param main - The main function to execute after all middleware have run.
10
+ * @returns A promise resolving to the result of the main function.
11
+ *
12
+ * @example
13
+ * runMiddleware(
14
+ * { ...services, userSessionService },
15
+ * { http },
16
+ * [middleware1, middleware2, middleware3],
17
+ * async () => { return await runMain(); }
18
+ * );
19
+ */
20
+ export declare const runMiddleware: (services: CoreSingletonServices & {
21
+ userSessionService: UserSessionService<any>;
22
+ }, interaction: PikkuInteraction, middlewares: PikkuMiddleware[], main?: () => Promise<void>) => Promise<void>;
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Runs a chain of middleware functions in sequence before executing the main function.
3
+ *
4
+ * @param services - An object containing services (e.g., singletonServices, userSessionService, etc.)
5
+ * @param interaction - The interaction context, e.g., { http }.
6
+ * @param middlewares - An array of middleware functions to run.
7
+ * @param main - The main function to execute after all middleware have run.
8
+ * @returns A promise resolving to the result of the main function.
9
+ *
10
+ * @example
11
+ * runMiddleware(
12
+ * { ...services, userSessionService },
13
+ * { http },
14
+ * [middleware1, middleware2, middleware3],
15
+ * async () => { return await runMain(); }
16
+ * );
17
+ */
18
+ export const runMiddleware = async (services, interaction, middlewares, main) => {
19
+ const dispatch = async (index) => {
20
+ if (middlewares && index < middlewares.length) {
21
+ await middlewares[index](services, interaction, () => dispatch(index + 1));
22
+ }
23
+ else if (main) {
24
+ return await main();
25
+ }
26
+ };
27
+ await dispatch(0);
28
+ };
@@ -8,6 +8,7 @@ export type ScheduledTasksMeta<UserSession extends CoreUserSession = any> = Arra
8
8
  schedule: string;
9
9
  session?: UserSession;
10
10
  docs?: APIDocs;
11
+ tags?: string[];
11
12
  }>;
12
13
  /**
13
14
  * Represents a core scheduled task.
@@ -18,4 +19,5 @@ export type CoreScheduledTask<APIFunction = CoreAPIFunctionSessionless<void, voi
18
19
  func: APIFunction;
19
20
  docs?: APIDocs;
20
21
  session?: UserSession;
22
+ tags?: string[];
21
23
  };
package/dist/schema.d.ts CHANGED
@@ -23,4 +23,4 @@ export declare const addSchema: (name: string, value: any) => void;
23
23
  */
24
24
  export declare const compileAllSchemas: (logger: Logger, schemaService?: SchemaService) => void;
25
25
  export declare const coerceQueryStringToArray: (schemaName: string, data: any) => void;
26
- export declare const validateAndCoerce: (logger: Logger, schemaService: SchemaService | undefined, schemaName: string | undefined | null, data: any, coerceToArray: boolean) => void;
26
+ export declare const validateSchema: (logger: Logger, schemaService: SchemaService | undefined, schemaName: string | undefined | null, data: any) => Promise<void>;
package/dist/schema.js CHANGED
@@ -79,7 +79,7 @@ export const coerceQueryStringToArray = (schemaName, data) => {
79
79
  }
80
80
  }
81
81
  };
82
- export const validateAndCoerce = (logger, schemaService, schemaName, data, coerceToArray) => {
82
+ export const validateSchema = async (logger, schemaService, schemaName, data) => {
83
83
  if (schemaService) {
84
84
  if (!schemaName) {
85
85
  if (data && (data.length > 0 || Object.keys(data).length > 0)) {
@@ -91,10 +91,7 @@ export const validateAndCoerce = (logger, schemaService, schemaName, data, coerc
91
91
  }
92
92
  }
93
93
  const schema = getSchema(schemaName);
94
- schemaService.compileSchema(schemaName, schema);
95
- if (coerceToArray) {
96
- coerceQueryStringToArray(schemaName, data);
97
- }
98
- schemaService.validateSchema(schemaName, data);
94
+ await schemaService.compileSchema(schemaName, schema);
95
+ await schemaService.validateSchema(schemaName, data);
99
96
  }
100
97
  };
@@ -8,5 +8,6 @@ export * from './logger-console.js';
8
8
  export * from './secret-service.js';
9
9
  export * from './variables-service.js';
10
10
  export * from './schema-service.js';
11
+ export * from './user-session-service.js';
11
12
  export * from './local-secrets.js';
12
13
  export * from './local-variables.js';
@@ -9,6 +9,7 @@ export * from './logger-console.js';
9
9
  export * from './secret-service.js';
10
10
  export * from './variables-service.js';
11
11
  export * from './schema-service.js';
12
+ export * from './user-session-service.js';
12
13
  // Local implementations
13
14
  export * from './local-secrets.js';
14
15
  export * from './local-variables.js';
@@ -1,6 +1,23 @@
1
+ import { ChannelStore } from '../channel/channel-store.js';
1
2
  import { CoreUserSession } from '../types/core.types.js';
2
3
  export interface UserSessionService<UserSession extends CoreUserSession> {
3
- setSession: (session: UserSession) => Promise<void> | void;
4
- deleteSession: () => Promise<void> | void;
5
- getSession: () => Promise<UserSession | void> | UserSession | void;
4
+ set(session: UserSession): Promise<void> | void;
5
+ clear(): Promise<void> | void;
6
+ get(): Promise<UserSession | undefined> | UserSession | undefined;
7
+ }
8
+ export declare class LocalUserSessionService<UserSession extends CoreUserSession> implements UserSessionService<UserSession> {
9
+ private session;
10
+ constructor(session?: UserSession | undefined);
11
+ set(session: UserSession): void;
12
+ clear(): void;
13
+ get(): UserSession | undefined;
14
+ }
15
+ export declare class RemoteUserSessionService<UserSession extends CoreUserSession> implements UserSessionService<UserSession> {
16
+ private channelStore;
17
+ private channelId;
18
+ session: UserSession | undefined;
19
+ constructor(channelStore: ChannelStore<unknown, unknown, UserSession>, channelId: string, session?: UserSession | undefined);
20
+ set(session: UserSession): Promise<void>;
21
+ clear(): Promise<void>;
22
+ get(): Promise<UserSession | undefined>;
6
23
  }
@@ -1 +1,35 @@
1
- export {};
1
+ export class LocalUserSessionService {
2
+ session;
3
+ constructor(session = undefined) {
4
+ this.session = session;
5
+ }
6
+ set(session) {
7
+ this.session = session;
8
+ }
9
+ clear() {
10
+ this.session = undefined;
11
+ }
12
+ get() {
13
+ return this.session;
14
+ }
15
+ }
16
+ export class RemoteUserSessionService {
17
+ channelStore;
18
+ channelId;
19
+ session;
20
+ constructor(channelStore, channelId, session = undefined) {
21
+ this.channelStore = channelStore;
22
+ this.channelId = channelId;
23
+ this.session = session;
24
+ }
25
+ async set(session) {
26
+ await this.channelStore.setUserSession(this.channelId, session);
27
+ }
28
+ async clear() {
29
+ await this.channelStore.setUserSession(this.channelId, undefined);
30
+ }
31
+ async get() {
32
+ const channel = await this.channelStore.getChannel(this.channelId);
33
+ return channel.userSession;
34
+ }
35
+ }
@@ -1,10 +1,8 @@
1
1
  import type { Logger, LogLevel } from '../services/logger.js';
2
- import type { HTTPSessionService } from '../http/http-session-service.js';
3
2
  import { VariablesService } from '../services/variables-service.js';
4
3
  import { EventHubService } from '../channel/eventhub-service.js';
5
4
  import { SchemaService } from '../services/schema-service.js';
6
- import { enforceChannelAccess } from '../channel/channel.types.js';
7
- import { enforceHTTPAccess, PikkuHTTP } from '../http/http-routes.types.js';
5
+ import { PikkuHTTP } from '../http/http-routes.types.js';
8
6
  import { UserSessionService } from '../services/user-session-service.js';
9
7
  import { JWTService } from '../services/jwt-service.js';
10
8
  import { SecretService } from '../services/secret-service.js';
@@ -39,8 +37,6 @@ export type RequireAtLeastOne<T> = {
39
37
  export type CoreConfig<Config extends Record<string, unknown> = {}> = {
40
38
  /** The log level for the application. */
41
39
  logLevel?: LogLevel;
42
- /** The maximum compute time allowed, in milliseconds (optional). */
43
- maximumComputeTime?: number;
44
40
  /** Secrets used by the application (optional). */
45
41
  secrets?: {};
46
42
  } & Config;
@@ -53,14 +49,8 @@ export interface CoreUserSession {
53
49
  * Interface for core singleton services provided by Pikku.
54
50
  */
55
51
  export interface CoreSingletonServices<Config extends CoreConfig = CoreConfig, UserSession extends CoreUserSession = CoreUserSession> {
56
- /** The http permission service used for authorization (optional). */
57
- enforceHTTPAccess?: enforceHTTPAccess;
58
- /** The channel permission service used by the application (optional). */
59
- enforceChannelAccess?: enforceChannelAccess;
60
52
  /** JWT Service */
61
53
  jwt?: JWTService<UserSession>;
62
- /** The session service used by the application (optional). */
63
- httpSessionService?: HTTPSessionService;
64
54
  /** The schema library used to validate data */
65
55
  schemaService?: SchemaService;
66
56
  /** The core configuration for the application. */
@@ -77,16 +67,22 @@ export interface CoreSingletonServices<Config extends CoreConfig = CoreConfig, U
77
67
  /**
78
68
  * Represents different forms of interaction within Pikku and the outside world.
79
69
  */
80
- export interface PikkuInteractions {
70
+ export interface PikkuInteraction {
81
71
  http?: PikkuHTTP;
82
72
  }
73
+ /**
74
+ * A function that can wrap an interaction and be called before or after
75
+ */
76
+ export type PikkuMiddleware<SingletonServices extends CoreSingletonServices = CoreSingletonServices, UserSession extends CoreUserSession = CoreUserSession> = (services: SingletonServices & {
77
+ userSessionService: UserSessionService<UserSession>;
78
+ }, interactions: PikkuInteraction, next: () => Promise<void>) => Promise<void>;
83
79
  /**
84
80
  * Represents the core services used by Pikku, including singleton services and the request/response interaction.
85
81
  */
86
- export type CoreServices<SingletonServices = CoreSingletonServices, UserSession extends CoreUserSession = CoreUserSession, CoreServices extends Record<string, unknown> = {}> = SingletonServices & PikkuInteractions & {
82
+ export type CoreServices<SingletonServices = CoreSingletonServices, UserSession extends CoreUserSession = CoreUserSession, CoreServices extends Record<string, unknown> = {}> = SingletonServices & PikkuInteraction & {
87
83
  userSession?: UserSessionService<UserSession>;
88
84
  } & CoreServices;
89
- export type SessionServices<SingletonServices extends CoreSingletonServices = CoreSingletonServices, Services = CoreServices<SingletonServices>> = Omit<Services, keyof SingletonServices | keyof PikkuInteractions | 'session'>;
85
+ export type SessionServices<SingletonServices extends CoreSingletonServices = CoreSingletonServices, Services = CoreServices<SingletonServices>> = Omit<Services, keyof SingletonServices | keyof PikkuInteraction | 'session'>;
90
86
  /**
91
87
  * Defines a function type for creating singleton services from the given configuration.
92
88
  */
@@ -94,7 +90,7 @@ export type CreateSingletonServices<Config extends CoreConfig, SingletonServices
94
90
  /**
95
91
  * Defines a function type for creating session-specific services.
96
92
  */
97
- export type CreateSessionServices<SingletonServices extends CoreSingletonServices = CoreSingletonServices, Services extends CoreServices<SingletonServices> = CoreServices<SingletonServices>, UserSession extends CoreUserSession = CoreUserSession> = (services: SingletonServices, interaction: PikkuInteractions, session: UserSession | undefined) => Promise<SessionServices<Services, SingletonServices>>;
93
+ export type CreateSessionServices<SingletonServices extends CoreSingletonServices = CoreSingletonServices, Services extends CoreServices<SingletonServices> = CoreServices<SingletonServices>, UserSession extends CoreUserSession = CoreUserSession> = (services: SingletonServices, interaction: PikkuInteraction, session: UserSession | undefined) => Promise<SessionServices<Services, SingletonServices>>;
98
94
  /**
99
95
  * Defines a function type for creating config.
100
96
  */
@@ -1,4 +1,4 @@
1
- import type { CoreServices, CoreUserSession } from './core.types.js';
1
+ import type { CoreServices, CoreSingletonServices, CoreUserSession } from './core.types.js';
2
2
  /**
3
3
  * Represents a core API function that performs an operation using core services and a user session.
4
4
  *
@@ -7,7 +7,7 @@ import type { CoreServices, CoreUserSession } from './core.types.js';
7
7
  * @template Services - The services type, defaults to `CoreServices`.
8
8
  * @template Session - The session type, defaults to `CoreUserSession`.
9
9
  */
10
- export type CoreAPIFunction<In, Out, Services = CoreServices, Session = CoreUserSession> = (services: Services, data: In, session: Session) => Promise<Out>;
10
+ export type CoreAPIFunction<In, Out, Services extends CoreSingletonServices = CoreServices, Session extends CoreUserSession = CoreUserSession> = (services: Services, data: In, session: Session) => Promise<Out>;
11
11
  /**
12
12
  * Represents a core API function that can be used without a session.
13
13
  *
@@ -16,7 +16,7 @@ export type CoreAPIFunction<In, Out, Services = CoreServices, Session = CoreUser
16
16
  * @template Services - The services type, defaults to `CoreServices`.
17
17
  * @template Session - The session type, defaults to `CoreUserSession`.
18
18
  */
19
- export type CoreAPIFunctionSessionless<In, Out, Services = CoreServices, Session = CoreUserSession> = (services: Services, data: In, session?: Session) => Promise<Out>;
19
+ export type CoreAPIFunctionSessionless<In, Out, Services extends CoreSingletonServices = CoreServices, Session extends CoreUserSession = CoreUserSession> = (services: Services, data: In, session?: Session) => Promise<Out>;
20
20
  /**
21
21
  * Represents a function that checks permissions for a given API operation.
22
22
  *
@@ -24,4 +24,4 @@ export type CoreAPIFunctionSessionless<In, Out, Services = CoreServices, Session
24
24
  * @template Services - The services type, defaults to `CoreServices`.
25
25
  * @template Session - The session type, defaults to `CoreUserSession`.
26
26
  */
27
- export type CoreAPIPermission<In = any, Services = CoreServices, Session = CoreUserSession> = (services: Services, data: In, session?: Session) => Promise<boolean>;
27
+ export type CoreAPIPermission<In = any, Services extends CoreSingletonServices = CoreServices, Session extends CoreUserSession = CoreUserSession> = (services: Services, data: In, session?: Session) => Promise<boolean>;