@pikku/core 0.7.7 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +18 -1
- package/dist/errors/error-handler.d.ts +2 -0
- package/dist/errors/errors.js +2 -0
- package/dist/{channel → events/channel}/channel-handler.d.ts +1 -1
- package/dist/{channel → events/channel}/channel-handler.js +2 -2
- package/dist/{channel → events/channel}/channel-runner.d.ts +1 -1
- package/dist/{channel → events/channel}/channel-runner.js +8 -8
- package/dist/{channel → events/channel}/channel-store.d.ts +1 -1
- package/dist/{channel → events/channel}/channel.types.d.ts +5 -9
- package/dist/{channel → events/channel}/local/local-channel-runner.js +10 -10
- package/dist/{channel → events/channel}/log-channels.d.ts +1 -1
- package/dist/{channel → events/channel}/log-channels.js +1 -1
- package/dist/{channel → events/channel}/serverless/serverless-channel-runner.js +11 -11
- package/dist/{http → events/http}/http-runner.d.ts +2 -2
- package/dist/{http → events/http}/http-runner.js +30 -19
- package/dist/{http → events/http}/http.types.d.ts +4 -3
- package/dist/{http → events/http}/index.d.ts +0 -1
- package/dist/{http → events/http}/index.js +0 -1
- package/dist/{http → events/http}/log-http-routes.d.ts +1 -1
- package/dist/{http → events/http}/log-http-routes.js +1 -1
- package/dist/{http → events/http}/pikku-fetch-http-request.js +1 -1
- package/dist/events/mcp/index.d.ts +2 -0
- package/dist/events/mcp/index.js +2 -0
- package/dist/events/mcp/mcp-runner.d.ts +30 -0
- package/dist/events/mcp/mcp-runner.js +192 -0
- package/dist/events/mcp/mcp.types.d.ts +117 -0
- package/dist/events/queue/index.d.ts +6 -0
- package/dist/events/queue/index.js +6 -0
- package/dist/events/queue/queue-runner.d.ts +24 -0
- package/dist/events/queue/queue-runner.js +83 -0
- package/dist/events/queue/queue.types.d.ts +154 -0
- package/dist/events/queue/register-queue-helper.d.ts +17 -0
- package/dist/events/queue/register-queue-helper.js +34 -0
- package/dist/events/queue/validate-worker-config.d.ts +41 -0
- package/dist/events/queue/validate-worker-config.js +50 -0
- package/dist/events/rpc/index.d.ts +2 -0
- package/dist/events/rpc/rpc-runner.d.ts +28 -0
- package/dist/{rpc → events/rpc}/rpc-runner.js +2 -2
- package/dist/events/scheduler/index.d.ts +3 -0
- package/dist/events/scheduler/index.js +3 -0
- package/dist/{scheduler → events/scheduler}/log-schedulers.d.ts +1 -1
- package/dist/{scheduler → events/scheduler}/log-schedulers.js +1 -1
- package/dist/{scheduler → events/scheduler}/scheduler-runner.d.ts +4 -3
- package/dist/{scheduler → events/scheduler}/scheduler-runner.js +7 -4
- package/dist/{scheduler → events/scheduler}/scheduler.types.d.ts +3 -4
- package/dist/function/function-runner.js +8 -0
- package/dist/function/functions.types.d.ts +3 -2
- package/dist/handle-error.d.ts +2 -2
- package/dist/handle-error.js +1 -1
- package/dist/index.d.ts +10 -6
- package/dist/index.js +10 -6
- package/dist/middleware-runner.d.ts +4 -4
- package/dist/middleware-runner.js +4 -2
- package/dist/pikku-state.d.ts +18 -4
- package/dist/pikku-state.js +12 -0
- package/dist/services/user-session-service.d.ts +1 -1
- package/dist/types/core.types.d.ts +22 -4
- package/dist/types/core.types.js +9 -1
- package/lcov.info +3557 -3476
- package/package.json +8 -7
- package/src/errors/error-handler.ts +2 -1
- package/src/errors/errors.ts +2 -0
- package/src/{channel → events/channel}/channel-handler.ts +3 -3
- package/src/{channel → events/channel}/channel-runner.ts +9 -9
- package/src/{channel → events/channel}/channel-store.ts +1 -1
- package/src/{channel → events/channel}/channel.types.ts +5 -9
- package/src/{channel → events/channel}/local/local-channel-runner.test.ts +1 -1
- package/src/{channel → events/channel}/local/local-channel-runner.ts +11 -11
- package/src/{channel → events/channel}/local/local-eventhub-service.test.ts +1 -1
- package/src/{channel → events/channel}/log-channels.ts +2 -2
- package/src/{channel → events/channel}/serverless/serverless-channel-runner.ts +12 -12
- package/src/{http → events/http}/http-runner.test.ts +4 -4
- package/src/{http → events/http}/http-runner.ts +39 -20
- package/src/{http → events/http}/http.types.ts +4 -3
- package/src/{http → events/http}/index.ts +0 -1
- package/src/{http → events/http}/log-http-routes.ts +2 -2
- package/src/{http → events/http}/pikku-fetch-http-request.ts +1 -1
- package/src/events/mcp/index.ts +2 -0
- package/src/events/mcp/mcp-runner.ts +321 -0
- package/src/events/mcp/mcp.types.ts +150 -0
- package/src/events/queue/index.ts +18 -0
- package/src/events/queue/queue-runner.ts +125 -0
- package/src/events/queue/queue.types.ts +176 -0
- package/src/events/queue/register-queue-helper.ts +62 -0
- package/src/events/queue/validate-worker-config.ts +113 -0
- package/src/events/rpc/index.ts +2 -0
- package/src/{rpc → events/rpc}/rpc-runner.ts +3 -3
- package/src/events/scheduler/index.ts +9 -0
- package/src/{scheduler → events/scheduler}/log-schedulers.ts +2 -2
- package/src/{scheduler → events/scheduler}/scheduler-runner.ts +11 -10
- package/src/{scheduler → events/scheduler}/scheduler.types.ts +2 -4
- package/src/function/function-runner.ts +19 -1
- package/src/function/functions.types.ts +3 -1
- package/src/handle-error.ts +2 -2
- package/src/index.ts +23 -6
- package/src/middleware-runner.ts +14 -7
- package/src/pikku-state.ts +40 -4
- package/src/services/user-session-service.ts +1 -1
- package/src/types/core.types.ts +31 -4
- package/tsconfig.json +3 -2
- package/tsconfig.tsbuildinfo +1 -1
- package/dist/rpc/index.d.ts +0 -2
- package/dist/rpc/rpc-runner.d.ts +0 -27
- package/dist/scheduler/index.d.ts +0 -3
- package/dist/scheduler/index.js +0 -3
- package/src/http/incomingmessage-to-request-convertor.ts +0 -0
- package/src/rpc/index.ts +0 -2
- package/src/scheduler/index.ts +0 -5
- /package/dist/{channel → events/channel}/channel-store.js +0 -0
- /package/dist/{channel → events/channel}/channel.types.js +0 -0
- /package/dist/{channel → events/channel}/eventhub-service.d.ts +0 -0
- /package/dist/{channel → events/channel}/eventhub-service.js +0 -0
- /package/dist/{channel → events/channel}/eventhub-store.d.ts +0 -0
- /package/dist/{channel → events/channel}/eventhub-store.js +0 -0
- /package/dist/{channel → events/channel}/index.d.ts +0 -0
- /package/dist/{channel → events/channel}/index.js +0 -0
- /package/dist/{channel → events/channel}/local/index.d.ts +0 -0
- /package/dist/{channel → events/channel}/local/index.js +0 -0
- /package/dist/{channel → events/channel}/local/local-channel-handler.d.ts +0 -0
- /package/dist/{channel → events/channel}/local/local-channel-handler.js +0 -0
- /package/dist/{channel → events/channel}/local/local-channel-runner.d.ts +0 -0
- /package/dist/{channel → events/channel}/local/local-eventhub-service.d.ts +0 -0
- /package/dist/{channel → events/channel}/local/local-eventhub-service.js +0 -0
- /package/dist/{channel → events/channel}/pikku-abstract-channel-handler.d.ts +0 -0
- /package/dist/{channel → events/channel}/pikku-abstract-channel-handler.js +0 -0
- /package/dist/{channel → events/channel}/serverless/index.d.ts +0 -0
- /package/dist/{channel → events/channel}/serverless/index.js +0 -0
- /package/dist/{channel → events/channel}/serverless/serverless-channel-runner.d.ts +0 -0
- /package/dist/{http → events/http}/http.types.js +0 -0
- /package/dist/{http → events/http}/pikku-fetch-http-request.d.ts +0 -0
- /package/dist/{http → events/http}/pikku-fetch-http-response.d.ts +0 -0
- /package/dist/{http → events/http}/pikku-fetch-http-response.js +0 -0
- /package/dist/{http/incomingmessage-to-request-convertor.d.ts → events/mcp/mcp.types.js} +0 -0
- /package/dist/{http/incomingmessage-to-request-convertor.js → events/queue/queue.types.js} +0 -0
- /package/dist/{rpc → events/rpc}/index.js +0 -0
- /package/dist/{rpc → events/rpc}/rpc-types.d.ts +0 -0
- /package/dist/{rpc → events/rpc}/rpc-types.js +0 -0
- /package/dist/{scheduler → events/scheduler}/scheduler.types.js +0 -0
- /package/src/{channel → events/channel}/eventhub-service.ts +0 -0
- /package/src/{channel → events/channel}/eventhub-store.ts +0 -0
- /package/src/{channel → events/channel}/index.ts +0 -0
- /package/src/{channel → events/channel}/local/index.ts +0 -0
- /package/src/{channel → events/channel}/local/local-channel-handler.ts +0 -0
- /package/src/{channel → events/channel}/local/local-eventhub-service.ts +0 -0
- /package/src/{channel → events/channel}/pikku-abstract-channel-handler.test.ts +0 -0
- /package/src/{channel → events/channel}/pikku-abstract-channel-handler.ts +0 -0
- /package/src/{channel → events/channel}/serverless/index.ts +0 -0
- /package/src/{http → events/http}/pikku-fetch-http-request.test.ts +0 -0
- /package/src/{http → events/http}/pikku-fetch-http-response.test.ts +0 -0
- /package/src/{http → events/http}/pikku-fetch-http-response.ts +0 -0
- /package/src/{rpc → events/rpc}/rpc-types.ts +0 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pikku/core",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.8.0",
|
|
4
4
|
"author": "yasser.fadl@gmail.com",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"module": "dist/index.js",
|
|
@@ -20,13 +20,14 @@
|
|
|
20
20
|
".": "./dist/index.js",
|
|
21
21
|
"./middleware": "./dist/middleware/index.js",
|
|
22
22
|
"./function": "./dist/function/index.js",
|
|
23
|
-
"./channel": "./dist/channel/index.js",
|
|
24
|
-
"./channel/local": "./dist/channel/local/index.js",
|
|
25
|
-
"./channel/serverless": "./dist/channel/serverless/index.js",
|
|
26
|
-
"./http": "./dist/http/index.js",
|
|
27
|
-
"./
|
|
23
|
+
"./channel": "./dist/events/channel/index.js",
|
|
24
|
+
"./channel/local": "./dist/events/channel/local/index.js",
|
|
25
|
+
"./channel/serverless": "./dist/events/channel/serverless/index.js",
|
|
26
|
+
"./http": "./dist/events/http/index.js",
|
|
27
|
+
"./queue": "./dist/events/queue/index.js",
|
|
28
|
+
"./scheduler": "./dist/events/scheduler/index.js",
|
|
29
|
+
"./rpc": "./dist/events/rpc/index.js",
|
|
28
30
|
"./errors": "./dist/errors/index.js",
|
|
29
|
-
"./scheduler": "./dist/scheduler/index.js",
|
|
30
31
|
"./services": "./dist/services/index.js",
|
|
31
32
|
"./schema": "./dist/schema.js",
|
|
32
33
|
"./types": "./dist/types/index.d.ts"
|
|
@@ -21,6 +21,7 @@ export class PikkuError extends Error {
|
|
|
21
21
|
export interface ErrorDetails {
|
|
22
22
|
status: number
|
|
23
23
|
message: string
|
|
24
|
+
mcpCode?: number
|
|
24
25
|
}
|
|
25
26
|
|
|
26
27
|
/**
|
|
@@ -51,7 +52,7 @@ export const addErrors = (
|
|
|
51
52
|
*/
|
|
52
53
|
export const getErrorResponse = (
|
|
53
54
|
error: Error
|
|
54
|
-
): { status: number; message: string } | undefined => {
|
|
55
|
+
): { status: number; message: string; mcpCode?: number } | undefined => {
|
|
55
56
|
const errors = Array.from(pikkuState('misc', 'errors').entries())
|
|
56
57
|
const foundError = errors.find(([e]) => e.name === error.constructor.name)
|
|
57
58
|
if (foundError) {
|
package/src/errors/errors.ts
CHANGED
|
@@ -10,6 +10,7 @@ import { addError, PikkuError } from './error-handler.js'
|
|
|
10
10
|
export class BadRequestError extends PikkuError {}
|
|
11
11
|
addError(BadRequestError, {
|
|
12
12
|
status: 400,
|
|
13
|
+
mcpCode: -32600,
|
|
13
14
|
message:
|
|
14
15
|
'The server cannot or will not process the request due to client error (e.g., malformed request syntax).',
|
|
15
16
|
})
|
|
@@ -85,6 +86,7 @@ export class NotFoundError extends PikkuError {}
|
|
|
85
86
|
*/
|
|
86
87
|
addError(NotFoundError, {
|
|
87
88
|
status: 404,
|
|
89
|
+
mcpCode: -32601,
|
|
88
90
|
message: 'The server cannot find the requested resource.',
|
|
89
91
|
})
|
|
90
92
|
|
|
@@ -2,14 +2,14 @@ import {
|
|
|
2
2
|
CoreServices,
|
|
3
3
|
JSONValue,
|
|
4
4
|
CoreUserSession,
|
|
5
|
-
} from '
|
|
5
|
+
} from '../../types/core.types.js'
|
|
6
6
|
import {
|
|
7
7
|
ChannelMessageMeta,
|
|
8
8
|
CoreAPIChannel,
|
|
9
9
|
PikkuChannelHandler,
|
|
10
10
|
} from './channel.types.js'
|
|
11
|
-
import { pikkuState } from '
|
|
12
|
-
import { runPikkuFunc } from '
|
|
11
|
+
import { pikkuState } from '../../pikku-state.js'
|
|
12
|
+
import { runPikkuFunc } from '../../function/function-runner.js'
|
|
13
13
|
|
|
14
14
|
const getRouteMeta = (
|
|
15
15
|
channelName: string,
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { NotFoundError } from '
|
|
2
|
-
import { addFunction } from '
|
|
3
|
-
import { pikkuState } from '
|
|
4
|
-
import { coerceTopLevelDataFromSchema, validateSchema } from '
|
|
5
|
-
import { UserSessionService } from '
|
|
1
|
+
import { NotFoundError } from '../../errors/errors.js'
|
|
2
|
+
import { addFunction } from '../../function/function-runner.js'
|
|
3
|
+
import { pikkuState } from '../../pikku-state.js'
|
|
4
|
+
import { coerceTopLevelDataFromSchema, validateSchema } from '../../schema.js'
|
|
5
|
+
import { UserSessionService } from '../../services/user-session-service.js'
|
|
6
6
|
import {
|
|
7
7
|
ChannelMeta,
|
|
8
8
|
CoreAPIChannel,
|
|
@@ -34,15 +34,15 @@ export const addChannel = <
|
|
|
34
34
|
pikkuState('channel', 'channels').set(channel.name, channel as any)
|
|
35
35
|
|
|
36
36
|
// Register onConnect function if provided
|
|
37
|
-
if (channel.onConnect && channelMeta.
|
|
38
|
-
addFunction(channelMeta.
|
|
37
|
+
if (channel.onConnect && channelMeta.connect) {
|
|
38
|
+
addFunction(channelMeta.connect.pikkuFuncName, {
|
|
39
39
|
func: channel.onConnect as any,
|
|
40
40
|
})
|
|
41
41
|
}
|
|
42
42
|
|
|
43
43
|
// Register onDisconnect function if provided
|
|
44
|
-
if (channel.onDisconnect && channelMeta.
|
|
45
|
-
addFunction(channelMeta.
|
|
44
|
+
if (channel.onDisconnect && channelMeta.disconnect) {
|
|
45
|
+
addFunction(channelMeta.disconnect.pikkuFuncName, {
|
|
46
46
|
func: channel.onDisconnect,
|
|
47
47
|
})
|
|
48
48
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { PikkuError } from '
|
|
1
|
+
import { PikkuError } from '../../errors/error-handler.js'
|
|
2
2
|
import {
|
|
3
3
|
HTTPFunctionMetaInputTypes,
|
|
4
4
|
PikkuHTTPRequest,
|
|
@@ -9,12 +9,12 @@ import {
|
|
|
9
9
|
CoreSingletonServices,
|
|
10
10
|
CreateSessionServices,
|
|
11
11
|
PikkuMiddleware,
|
|
12
|
-
} from '
|
|
12
|
+
} from '../../types/core.types.js'
|
|
13
13
|
import {
|
|
14
14
|
CoreAPIFunction,
|
|
15
15
|
CoreAPIFunctionSessionless,
|
|
16
16
|
CoreAPIPermission,
|
|
17
|
-
} from '
|
|
17
|
+
} from '../../function/functions.types.js'
|
|
18
18
|
|
|
19
19
|
export type RunChannelOptions = Partial<{
|
|
20
20
|
skipUserSession: boolean
|
|
@@ -34,8 +34,6 @@ export type RunChannelParams<ChannelData> = {
|
|
|
34
34
|
|
|
35
35
|
export interface ChannelMessageMeta {
|
|
36
36
|
pikkuFuncName: string
|
|
37
|
-
inputs: string[] | null
|
|
38
|
-
outputs: string[] | null
|
|
39
37
|
docs?: APIDocs
|
|
40
38
|
}
|
|
41
39
|
|
|
@@ -46,10 +44,8 @@ export interface ChannelMeta {
|
|
|
46
44
|
query?: string[]
|
|
47
45
|
input: string | null
|
|
48
46
|
inputTypes?: HTTPFunctionMetaInputTypes
|
|
49
|
-
connect:
|
|
50
|
-
|
|
51
|
-
disconnect: boolean
|
|
52
|
-
disconnectPikkuFuncName: string | null
|
|
47
|
+
connect: ChannelMessageMeta | null
|
|
48
|
+
disconnect: ChannelMessageMeta | null
|
|
53
49
|
message: ChannelMessageMeta | null
|
|
54
50
|
messageRoutes: Record<string, Record<string, ChannelMessageMeta>>
|
|
55
51
|
docs?: APIDocs
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { test, beforeEach, afterEach } from 'node:test'
|
|
2
2
|
import * as assert from 'node:assert/strict'
|
|
3
3
|
import { runLocalChannel } from './local-channel-runner.js'
|
|
4
|
-
import { pikkuState, resetPikkuState } from '
|
|
4
|
+
import { pikkuState, resetPikkuState } from '../../../pikku-state.js'
|
|
5
5
|
import { addChannel } from '../channel-runner.js'
|
|
6
6
|
import {
|
|
7
7
|
HTTPMethod,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { openChannel } from '../channel-runner.js'
|
|
2
2
|
import { createHTTPInteraction } from '../../http/http-runner.js'
|
|
3
|
-
import { closeSessionServices } from '
|
|
3
|
+
import { closeSessionServices } from '../../../utils.js'
|
|
4
4
|
import { processMessageHandlers } from '../channel-handler.js'
|
|
5
5
|
import {
|
|
6
6
|
CoreAPIChannel,
|
|
@@ -8,12 +8,12 @@ import {
|
|
|
8
8
|
RunChannelParams,
|
|
9
9
|
} from '../channel.types.js'
|
|
10
10
|
import { PikkuLocalChannelHandler } from './local-channel-handler.js'
|
|
11
|
-
import { SessionServices } from '
|
|
12
|
-
import {
|
|
13
|
-
import { runMiddleware } from '
|
|
14
|
-
import { PikkuUserSessionService } from '
|
|
11
|
+
import { SessionServices } from '../../../types/core.types.js'
|
|
12
|
+
import { handleHTTPError } from '../../../handle-error.js'
|
|
13
|
+
import { runMiddleware } from '../../../middleware-runner.js'
|
|
14
|
+
import { PikkuUserSessionService } from '../../../services/user-session-service.js'
|
|
15
15
|
import { PikkuHTTP } from '../../http/http.types.js'
|
|
16
|
-
import { runPikkuFuncDirectly } from '
|
|
16
|
+
import { runPikkuFuncDirectly } from '../../../function/function-runner.js'
|
|
17
17
|
import { rpcService } from '../../rpc/rpc-runner.js'
|
|
18
18
|
|
|
19
19
|
export const runLocalChannel = async ({
|
|
@@ -79,9 +79,9 @@ export const runLocalChannel = async ({
|
|
|
79
79
|
})
|
|
80
80
|
|
|
81
81
|
channelHandler.registerOnOpen(() => {
|
|
82
|
-
if (channelConfig.onConnect && meta.
|
|
82
|
+
if (channelConfig.onConnect && meta.connect) {
|
|
83
83
|
runPikkuFuncDirectly(
|
|
84
|
-
meta.
|
|
84
|
+
meta.connect.pikkuFuncName,
|
|
85
85
|
{ ...allServices, channel },
|
|
86
86
|
openingData
|
|
87
87
|
)
|
|
@@ -89,9 +89,9 @@ export const runLocalChannel = async ({
|
|
|
89
89
|
})
|
|
90
90
|
|
|
91
91
|
channelHandler.registerOnClose(async () => {
|
|
92
|
-
if (channelConfig.onDisconnect && meta.
|
|
92
|
+
if (channelConfig.onDisconnect && meta.disconnect) {
|
|
93
93
|
runPikkuFuncDirectly(
|
|
94
|
-
meta.
|
|
94
|
+
meta.disconnect.pikkuFuncName,
|
|
95
95
|
{ ...allServices, channel },
|
|
96
96
|
openingData
|
|
97
97
|
)
|
|
@@ -110,7 +110,7 @@ export const runLocalChannel = async ({
|
|
|
110
110
|
)
|
|
111
111
|
)
|
|
112
112
|
} catch (e: any) {
|
|
113
|
-
|
|
113
|
+
handleHTTPError(
|
|
114
114
|
e,
|
|
115
115
|
http,
|
|
116
116
|
channelId,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as assert from 'assert'
|
|
2
2
|
import { test } from 'node:test'
|
|
3
3
|
import { PikkuChannelHandler } from '../channel.types.js'
|
|
4
|
-
import { CoreUserSession } from '
|
|
4
|
+
import { CoreUserSession } from '../../../types/core.types.js'
|
|
5
5
|
import { LocalEventHubService } from './local-eventhub-service.js'
|
|
6
6
|
|
|
7
7
|
class MockChannelHandler implements PikkuChannelHandler {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { SessionServices } from '
|
|
2
|
-
import { closeSessionServices } from '
|
|
1
|
+
import { SessionServices } from '../../../types/core.types.js'
|
|
2
|
+
import { closeSessionServices } from '../../../utils.js'
|
|
3
3
|
import { processMessageHandlers } from '../channel-handler.js'
|
|
4
4
|
import { openChannel } from '../channel-runner.js'
|
|
5
5
|
import type {
|
|
@@ -10,13 +10,13 @@ import type {
|
|
|
10
10
|
} from '../channel.types.js'
|
|
11
11
|
import { createHTTPInteraction } from '../../http/http-runner.js'
|
|
12
12
|
import { ChannelStore } from '../channel-store.js'
|
|
13
|
-
import {
|
|
14
|
-
import { PikkuUserSessionService } from '
|
|
15
|
-
import { runMiddleware } from '
|
|
16
|
-
import { pikkuState } from '
|
|
13
|
+
import { handleHTTPError } from '../../../handle-error.js'
|
|
14
|
+
import { PikkuUserSessionService } from '../../../services/user-session-service.js'
|
|
15
|
+
import { runMiddleware } from '../../../middleware-runner.js'
|
|
16
|
+
import { pikkuState } from '../../../pikku-state.js'
|
|
17
17
|
import { PikkuFetchHTTPRequest } from '../../http/pikku-fetch-http-request.js'
|
|
18
18
|
import { PikkuHTTP } from '../../http/http.types.js'
|
|
19
|
-
import { runPikkuFuncDirectly } from '
|
|
19
|
+
import { runPikkuFuncDirectly } from '../../../function/function-runner.js'
|
|
20
20
|
|
|
21
21
|
export interface RunServerlessChannelParams<ChannelData>
|
|
22
22
|
extends RunChannelParams<ChannelData> {
|
|
@@ -115,16 +115,16 @@ export const runChannelConnect = async ({
|
|
|
115
115
|
await userSession.get()
|
|
116
116
|
)
|
|
117
117
|
}
|
|
118
|
-
if (channelConfig.onConnect && meta.
|
|
118
|
+
if (channelConfig.onConnect && meta.connect) {
|
|
119
119
|
await runPikkuFuncDirectly(
|
|
120
|
-
meta.
|
|
120
|
+
meta.connect.pikkuFuncName,
|
|
121
121
|
{ ...singletonServices, ...sessionServices, channel },
|
|
122
122
|
openingData
|
|
123
123
|
)
|
|
124
124
|
}
|
|
125
125
|
http?.response?.status(101)
|
|
126
126
|
} catch (e: any) {
|
|
127
|
-
|
|
127
|
+
handleHTTPError(
|
|
128
128
|
e,
|
|
129
129
|
http,
|
|
130
130
|
channelId,
|
|
@@ -170,9 +170,9 @@ export const runChannelDisconnect = async ({
|
|
|
170
170
|
session
|
|
171
171
|
)
|
|
172
172
|
}
|
|
173
|
-
if (channelConfig.onDisconnect && meta.
|
|
173
|
+
if (channelConfig.onDisconnect && meta.disconnect) {
|
|
174
174
|
await runPikkuFuncDirectly(
|
|
175
|
-
meta.
|
|
175
|
+
meta.disconnect.pikkuFuncName,
|
|
176
176
|
{ ...singletonServices, ...sessionServices, channel },
|
|
177
177
|
undefined
|
|
178
178
|
)
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import { test, describe, beforeEach, afterEach } from 'node:test'
|
|
2
2
|
import * as assert from 'assert'
|
|
3
|
-
import { NotFoundError } from '
|
|
4
|
-
import { JSONValue, PikkuMiddleware } from '
|
|
3
|
+
import { NotFoundError } from '../../errors/errors.js'
|
|
4
|
+
import { JSONValue, PikkuMiddleware } from '../../types/core.types.js'
|
|
5
5
|
import { fetch, addHTTPRoute } from './http-runner.js'
|
|
6
|
-
import { pikkuState, resetPikkuState } from '
|
|
6
|
+
import { pikkuState, resetPikkuState } from '../../pikku-state.js'
|
|
7
7
|
import {
|
|
8
8
|
PikkuMockRequest,
|
|
9
9
|
PikkuMockResponse,
|
|
10
10
|
} from '../channel/local/local-channel-runner.test.js'
|
|
11
|
-
import { addFunction } from '
|
|
11
|
+
import { addFunction } from '../../function/function-runner.js'
|
|
12
12
|
|
|
13
13
|
const sessionMiddleware: PikkuMiddleware = async (services, _, next) => {
|
|
14
14
|
services.userSession.set({ userId: 'test' } as any)
|
|
@@ -12,25 +12,25 @@ import {
|
|
|
12
12
|
CoreUserSession,
|
|
13
13
|
PikkuMiddleware,
|
|
14
14
|
SessionServices,
|
|
15
|
-
} from '
|
|
15
|
+
} from '../../types/core.types.js'
|
|
16
16
|
import { match } from 'path-to-regexp'
|
|
17
|
-
import { MissingSessionError, NotFoundError } from '
|
|
17
|
+
import { MissingSessionError, NotFoundError } from '../../errors/errors.js'
|
|
18
18
|
import {
|
|
19
19
|
closeSessionServices,
|
|
20
20
|
createWeakUID,
|
|
21
21
|
isSerializable,
|
|
22
|
-
} from '
|
|
22
|
+
} from '../../utils.js'
|
|
23
23
|
import {
|
|
24
24
|
PikkuUserSessionService,
|
|
25
25
|
UserSessionService,
|
|
26
|
-
} from '
|
|
27
|
-
import { runMiddleware } from '
|
|
28
|
-
import {
|
|
29
|
-
import { pikkuState } from '
|
|
26
|
+
} from '../../services/user-session-service.js'
|
|
27
|
+
import { runMiddleware } from '../../middleware-runner.js'
|
|
28
|
+
import { handleHTTPError } from '../../handle-error.js'
|
|
29
|
+
import { pikkuState } from '../../pikku-state.js'
|
|
30
30
|
import { PikkuFetchHTTPResponse } from './pikku-fetch-http-response.js'
|
|
31
31
|
import { PikkuFetchHTTPRequest } from './pikku-fetch-http-request.js'
|
|
32
32
|
import { PikkuChannel } from '../channel/channel.types.js'
|
|
33
|
-
import { addFunction, runPikkuFunc } from '
|
|
33
|
+
import { addFunction, runPikkuFunc } from '../../function/function-runner.js'
|
|
34
34
|
import { rpcService } from '../rpc/rpc-runner.js'
|
|
35
35
|
|
|
36
36
|
/**
|
|
@@ -48,13 +48,30 @@ export const addMiddleware = <APIMiddleware extends PikkuMiddleware>(
|
|
|
48
48
|
routeOrMiddleware: APIMiddleware[] | string,
|
|
49
49
|
middleware?: APIMiddleware[]
|
|
50
50
|
) => {
|
|
51
|
+
const middlewareStore = pikkuState('http', 'middleware')
|
|
52
|
+
|
|
51
53
|
if (typeof routeOrMiddleware === 'string' && middleware) {
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
54
|
+
const route = routeOrMiddleware
|
|
55
|
+
|
|
56
|
+
// Remove existing entry for this route if it exists
|
|
57
|
+
const existingIndex = middlewareStore.findIndex(
|
|
58
|
+
(item) => item.route === route
|
|
59
|
+
)
|
|
60
|
+
if (existingIndex !== -1) {
|
|
61
|
+
middlewareStore.splice(existingIndex, 1)
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
middlewareStore.push({ route, middleware })
|
|
56
65
|
} else {
|
|
57
|
-
|
|
66
|
+
// Handle global middleware
|
|
67
|
+
const existingIndex = middlewareStore.findIndex(
|
|
68
|
+
(item) => item.route === '*'
|
|
69
|
+
)
|
|
70
|
+
if (existingIndex !== -1) {
|
|
71
|
+
middlewareStore.splice(existingIndex, 1)
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
middlewareStore.push({
|
|
58
75
|
route: '*',
|
|
59
76
|
middleware: routeOrMiddleware as any,
|
|
60
77
|
})
|
|
@@ -104,8 +121,6 @@ export const addHTTPRoute = <
|
|
|
104
121
|
}
|
|
105
122
|
addFunction(routeMeta.pikkuFuncName, {
|
|
106
123
|
func: httpRoute.func,
|
|
107
|
-
auth: httpRoute.auth,
|
|
108
|
-
permissions: httpRoute.permissions,
|
|
109
124
|
})
|
|
110
125
|
const routes = pikkuState('http', 'routes')
|
|
111
126
|
if (!routes.has(httpRoute.method)) {
|
|
@@ -324,7 +339,7 @@ const executeRouteWithMiddleware = async (
|
|
|
324
339
|
})
|
|
325
340
|
}
|
|
326
341
|
|
|
327
|
-
|
|
342
|
+
result = await runPikkuFunc(meta.pikkuFuncName, {
|
|
328
343
|
getAllServices,
|
|
329
344
|
session,
|
|
330
345
|
data,
|
|
@@ -342,8 +357,6 @@ const executeRouteWithMiddleware = async (
|
|
|
342
357
|
http?.response?.status(200)
|
|
343
358
|
// TODO: Evaluate if the response stream should be explicitly ended.
|
|
344
359
|
// http?.response?.end()
|
|
345
|
-
|
|
346
|
-
return result
|
|
347
360
|
}
|
|
348
361
|
|
|
349
362
|
// Execute middleware, then run the main logic
|
|
@@ -432,6 +445,7 @@ export const fetchData = async <In, Out>(
|
|
|
432
445
|
coerceDataFromSchema = true,
|
|
433
446
|
bubbleErrors = false,
|
|
434
447
|
generateRequestId,
|
|
448
|
+
ignoreMiddleware = false,
|
|
435
449
|
}: RunRouteOptions & RunRouteParams
|
|
436
450
|
): Promise<Out | void> => {
|
|
437
451
|
const requestId =
|
|
@@ -472,7 +486,12 @@ export const fetchData = async <In, Out>(
|
|
|
472
486
|
skipUserSession,
|
|
473
487
|
requestId,
|
|
474
488
|
},
|
|
475
|
-
|
|
489
|
+
ignoreMiddleware
|
|
490
|
+
? {
|
|
491
|
+
...matchedRoute,
|
|
492
|
+
middleware: [],
|
|
493
|
+
}
|
|
494
|
+
: matchedRoute,
|
|
476
495
|
http!,
|
|
477
496
|
{ coerceDataFromSchema }
|
|
478
497
|
))
|
|
@@ -480,7 +499,7 @@ export const fetchData = async <In, Out>(
|
|
|
480
499
|
return result
|
|
481
500
|
} catch (e: any) {
|
|
482
501
|
// Handle errors and, depending on configuration, bubble them up or respond with an error
|
|
483
|
-
|
|
502
|
+
handleHTTPError(
|
|
484
503
|
e,
|
|
485
504
|
http,
|
|
486
505
|
requestId,
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { SerializeOptions } from 'cookie'
|
|
2
|
-
import type { PikkuError } from '
|
|
2
|
+
import type { PikkuError } from '../../errors/error-handler.js'
|
|
3
3
|
import type {
|
|
4
4
|
APIDocs,
|
|
5
5
|
CoreServices,
|
|
@@ -7,13 +7,13 @@ import type {
|
|
|
7
7
|
CoreUserSession,
|
|
8
8
|
CreateSessionServices,
|
|
9
9
|
PikkuMiddleware,
|
|
10
|
-
} from '
|
|
10
|
+
} from '../../types/core.types.js'
|
|
11
11
|
import type {
|
|
12
12
|
CoreAPIFunction,
|
|
13
13
|
CoreAPIFunctionSessionless,
|
|
14
14
|
CoreAPIPermission,
|
|
15
15
|
CorePermissionGroup,
|
|
16
|
-
} from '
|
|
16
|
+
} from '../../function/functions.types.js'
|
|
17
17
|
|
|
18
18
|
type ExtractRouteParams<S extends string> =
|
|
19
19
|
S extends `${string}:${infer Param}/${infer Rest}`
|
|
@@ -34,6 +34,7 @@ export type RunRouteOptions = Partial<{
|
|
|
34
34
|
coerceDataFromSchema: boolean
|
|
35
35
|
bubbleErrors: boolean
|
|
36
36
|
generateRequestId: () => string
|
|
37
|
+
ignoreMiddleware: boolean
|
|
37
38
|
}>
|
|
38
39
|
|
|
39
40
|
export type RunRouteParams = {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { parse as parseQuery } from 'picoquery'
|
|
2
2
|
import { parse as parseCookie } from 'cookie'
|
|
3
3
|
import { HTTPMethod, PikkuHTTPRequest, PikkuQuery } from './http.types.js'
|
|
4
|
-
import { UnprocessableContentError } from '
|
|
4
|
+
import { UnprocessableContentError } from '../../errors/errors.js'
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
7
|
* Abstract class representing a pikku request.
|