@pikku/core 0.10.2 → 0.11.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.
- package/CHANGELOG.md +19 -0
- package/dist/errors/errors.d.ts +1 -1
- package/dist/errors/errors.js +3 -3
- package/dist/function/function-runner.d.ts +6 -7
- package/dist/function/function-runner.js +35 -16
- package/dist/function/functions.types.d.ts +23 -30
- package/dist/function/functions.types.js +9 -6
- package/dist/handle-error.d.ts +1 -1
- package/dist/handle-error.js +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.js +2 -0
- package/dist/middleware/auth-apikey.d.ts +1 -0
- package/dist/middleware/auth-apikey.js +3 -3
- package/dist/middleware/auth-bearer.d.ts +1 -0
- package/dist/middleware/auth-bearer.js +3 -3
- package/dist/middleware/auth-cookie.d.ts +1 -0
- package/dist/middleware/auth-cookie.js +5 -5
- package/dist/middleware/timeout.d.ts +1 -0
- package/dist/middleware/timeout.js +3 -2
- package/dist/middleware-runner.d.ts +3 -6
- package/dist/middleware-runner.js +11 -11
- package/dist/permissions.d.ts +6 -6
- package/dist/permissions.js +15 -15
- package/dist/pikku-state.d.ts +7 -2
- package/dist/pikku-state.js +4 -0
- package/dist/services/index.d.ts +1 -0
- package/dist/services/index.js +1 -0
- package/dist/services/scheduler-service.d.ts +63 -0
- package/dist/services/scheduler-service.js +6 -0
- package/dist/services/user-session-service.d.ts +7 -3
- package/dist/services/user-session-service.js +8 -1
- package/dist/time-utils.d.ts +14 -0
- package/dist/time-utils.js +62 -0
- package/dist/types/core.types.d.ts +48 -35
- package/dist/types/core.types.js +3 -13
- package/dist/utils.d.ts +1 -1
- package/dist/utils.js +3 -3
- package/dist/wirings/channel/channel-common.js +2 -3
- package/dist/wirings/channel/channel-handler.d.ts +3 -2
- package/dist/wirings/channel/channel-handler.js +6 -9
- package/dist/wirings/channel/channel-runner.d.ts +2 -2
- package/dist/wirings/channel/channel.types.d.ts +10 -5
- package/dist/wirings/channel/local/local-channel-runner.d.ts +1 -1
- package/dist/wirings/channel/local/local-channel-runner.js +19 -26
- package/dist/wirings/channel/serverless/serverless-channel-runner.d.ts +1 -1
- package/dist/wirings/channel/serverless/serverless-channel-runner.js +41 -46
- package/dist/wirings/cli/channel/cli-channel-runner.js +1 -1
- package/dist/wirings/cli/cli-runner.d.ts +5 -5
- package/dist/wirings/cli/cli-runner.js +11 -29
- package/dist/wirings/cli/cli.types.d.ts +15 -11
- package/dist/wirings/http/http-runner.d.ts +6 -6
- package/dist/wirings/http/http-runner.js +25 -39
- package/dist/wirings/http/http.types.d.ts +5 -10
- package/dist/wirings/mcp/mcp-runner.d.ts +2 -2
- package/dist/wirings/mcp/mcp-runner.js +12 -19
- package/dist/wirings/mcp/mcp.types.d.ts +6 -0
- package/dist/wirings/queue/queue-runner.d.ts +3 -3
- package/dist/wirings/queue/queue-runner.js +7 -14
- package/dist/wirings/queue/queue.types.d.ts +4 -13
- package/dist/wirings/rpc/index.d.ts +1 -1
- package/dist/wirings/rpc/index.js +1 -1
- package/dist/wirings/rpc/rpc-runner.d.ts +13 -7
- package/dist/wirings/rpc/rpc-runner.js +50 -26
- package/dist/wirings/rpc/rpc-types.d.ts +1 -0
- package/dist/wirings/scheduler/scheduler-runner.d.ts +3 -3
- package/dist/wirings/scheduler/scheduler-runner.js +13 -24
- package/dist/wirings/scheduler/scheduler.types.d.ts +3 -8
- package/dist/wirings/workflow/index.d.ts +15 -0
- package/dist/wirings/workflow/index.js +14 -0
- package/dist/wirings/workflow/pikku-workflow-service.d.ts +160 -0
- package/dist/wirings/workflow/pikku-workflow-service.js +430 -0
- package/dist/wirings/workflow/workflow-runner.d.ts +34 -0
- package/dist/wirings/workflow/workflow-runner.js +65 -0
- package/dist/wirings/workflow/workflow.types.d.ts +332 -0
- package/dist/wirings/workflow/workflow.types.js +1 -0
- package/package.json +3 -4
- package/src/errors/errors.ts +3 -3
- package/src/factory-functions.test.ts +9 -36
- package/src/function/function-runner.test.ts +57 -68
- package/src/function/function-runner.ts +51 -28
- package/src/function/function-runner.ts.bak +188 -0
- package/src/function/functions.types.ts +69 -51
- package/src/handle-error.ts +1 -1
- package/src/index.ts +2 -0
- package/src/middleware/auth-apikey.test.ts +360 -0
- package/src/middleware/auth-apikey.ts +3 -7
- package/src/middleware/auth-bearer.test.ts +447 -0
- package/src/middleware/auth-bearer.ts +27 -33
- package/src/middleware/auth-cookie.test.ts +525 -0
- package/src/middleware/auth-cookie.ts +6 -6
- package/src/middleware/timeout.ts +4 -2
- package/src/middleware-runner.test.ts +58 -127
- package/src/middleware-runner.ts +13 -15
- package/src/permissions.test.ts +41 -45
- package/src/permissions.ts +21 -20
- package/src/pikku-state.ts +14 -2
- package/src/services/index.ts +1 -0
- package/src/services/scheduler-service.ts +76 -0
- package/src/services/user-session-service.ts +14 -4
- package/src/time-utils.ts +75 -0
- package/src/types/core.types.ts +92 -51
- package/src/utils.ts +4 -4
- package/src/wirings/channel/channel-common.ts +4 -7
- package/src/wirings/channel/channel-handler.ts +16 -22
- package/src/wirings/channel/channel-runner.ts +2 -2
- package/src/wirings/channel/channel.types.ts +14 -11
- package/src/wirings/channel/local/local-channel-runner.test.ts +5 -3
- package/src/wirings/channel/local/local-channel-runner.ts +23 -38
- package/src/wirings/channel/serverless/serverless-channel-runner.ts +51 -77
- package/src/wirings/cli/channel/cli-channel-runner.ts +1 -1
- package/src/wirings/cli/cli-runner.test.ts +7 -7
- package/src/wirings/cli/cli-runner.ts +25 -63
- package/src/wirings/cli/cli.types.ts +22 -16
- package/src/wirings/http/http-runner.test.ts +8 -8
- package/src/wirings/http/http-runner.ts +29 -56
- package/src/wirings/http/http.types.ts +5 -14
- package/src/wirings/mcp/mcp-runner.ts +23 -48
- package/src/wirings/mcp/mcp.types.ts +6 -0
- package/src/wirings/queue/queue-runner.test.ts +641 -0
- package/src/wirings/queue/queue-runner.ts +10 -24
- package/src/wirings/queue/queue.types.ts +5 -15
- package/src/wirings/rpc/index.ts +1 -1
- package/src/wirings/rpc/rpc-runner.ts +71 -32
- package/src/wirings/rpc/rpc-types.ts +1 -0
- package/src/wirings/scheduler/scheduler-runner.test.ts +627 -0
- package/src/wirings/scheduler/scheduler-runner.ts +24 -50
- package/src/wirings/scheduler/scheduler.types.ts +3 -9
- package/src/wirings/workflow/index.ts +43 -0
- package/src/wirings/workflow/pikku-workflow-service.ts +746 -0
- package/src/wirings/workflow/workflow-runner.ts +72 -0
- package/src/wirings/workflow/workflow.types.ts +422 -0
- package/tsconfig.tsbuildinfo +1 -1
- package/dist/services/file-channel-store.d.ts +0 -19
- package/dist/services/file-channel-store.js +0 -69
- package/dist/services/file-eventhub-store.d.ts +0 -17
- package/dist/services/file-eventhub-store.js +0 -71
- package/src/services/file-channel-store.ts +0 -86
- package/src/services/file-eventhub-store.ts +0 -90
|
@@ -2,7 +2,6 @@ import {
|
|
|
2
2
|
CoreServices,
|
|
3
3
|
JSONValue,
|
|
4
4
|
CoreUserSession,
|
|
5
|
-
PikkuWiringTypes,
|
|
6
5
|
} from '../../types/core.types.js'
|
|
7
6
|
import {
|
|
8
7
|
ChannelMessageMeta,
|
|
@@ -11,6 +10,7 @@ import {
|
|
|
11
10
|
} from './channel.types.js'
|
|
12
11
|
import { pikkuState } from '../../pikku-state.js'
|
|
13
12
|
import { runPikkuFunc } from '../../function/function-runner.js'
|
|
13
|
+
import { SessionService } from '../../services/user-session-service.js'
|
|
14
14
|
|
|
15
15
|
const getRouteMeta = (
|
|
16
16
|
channelName: string,
|
|
@@ -62,7 +62,8 @@ const validateAuth = (
|
|
|
62
62
|
export const processMessageHandlers = (
|
|
63
63
|
services: CoreServices,
|
|
64
64
|
channelConfig: CoreChannel<any, any>,
|
|
65
|
-
channelHandler: PikkuChannelHandler
|
|
65
|
+
channelHandler: PikkuChannelHandler,
|
|
66
|
+
userSession?: SessionService<CoreUserSession>
|
|
66
67
|
) => {
|
|
67
68
|
const logger = services.logger
|
|
68
69
|
const requiresSession = channelConfig.auth !== false
|
|
@@ -121,26 +122,19 @@ export const processMessageHandlers = (
|
|
|
121
122
|
? `${channelConfig.name}:${routingProperty}:${routerValue}`
|
|
122
123
|
: `${channelConfig.name}:default`
|
|
123
124
|
|
|
124
|
-
return await runPikkuFunc(
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
wireMiddleware,
|
|
138
|
-
inheritedPermissions,
|
|
139
|
-
wirePermissions,
|
|
140
|
-
tags: channelConfig.tags,
|
|
141
|
-
interaction: { channel: channelHandler.getChannel() },
|
|
142
|
-
}
|
|
143
|
-
)
|
|
125
|
+
return await runPikkuFunc('channel', cacheKey, pikkuFuncName, {
|
|
126
|
+
singletonServices: services,
|
|
127
|
+
data: () => data,
|
|
128
|
+
inheritedMiddleware,
|
|
129
|
+
wireMiddleware,
|
|
130
|
+
inheritedPermissions,
|
|
131
|
+
wirePermissions,
|
|
132
|
+
tags: channelConfig.tags,
|
|
133
|
+
wire: {
|
|
134
|
+
channel: channelHandler.getChannel(),
|
|
135
|
+
session: userSession,
|
|
136
|
+
},
|
|
137
|
+
})
|
|
144
138
|
}
|
|
145
139
|
|
|
146
140
|
return async (rawData): Promise<unknown> => {
|
|
@@ -3,7 +3,7 @@ import { addFunction } from '../../function/function-runner.js'
|
|
|
3
3
|
import { CorePikkuPermission } from '../../function/functions.types.js'
|
|
4
4
|
import { pikkuState } from '../../pikku-state.js'
|
|
5
5
|
import { coerceTopLevelDataFromSchema, validateSchema } from '../../schema.js'
|
|
6
|
-
import {
|
|
6
|
+
import { SessionService } from '../../services/user-session-service.js'
|
|
7
7
|
import { CorePikkuMiddleware } from '../../types/core.types.js'
|
|
8
8
|
import { httpRouter } from '../http/routers/http-router.js'
|
|
9
9
|
import {
|
|
@@ -128,7 +128,7 @@ export const openChannel = async ({
|
|
|
128
128
|
request,
|
|
129
129
|
}: Pick<CoreChannel<unknown, string>, 'route'> &
|
|
130
130
|
RunChannelParams<unknown> & {
|
|
131
|
-
userSession:
|
|
131
|
+
userSession: SessionService<any>
|
|
132
132
|
} & RunChannelOptions): Promise<{
|
|
133
133
|
openingData: unknown
|
|
134
134
|
channelConfig: CoreChannel<unknown, any>
|
|
@@ -5,9 +5,8 @@ import {
|
|
|
5
5
|
PikkuHTTPResponse,
|
|
6
6
|
} from '../http/http.types.js'
|
|
7
7
|
import {
|
|
8
|
-
PikkuDocs,
|
|
9
8
|
CoreSingletonServices,
|
|
10
|
-
|
|
9
|
+
CreateWireServices,
|
|
11
10
|
CorePikkuMiddleware,
|
|
12
11
|
MiddlewareMetadata,
|
|
13
12
|
PermissionMetadata,
|
|
@@ -33,12 +32,15 @@ export type RunChannelParams<ChannelData> = {
|
|
|
33
32
|
singletonServices: CoreSingletonServices
|
|
34
33
|
request?: PikkuHTTPRequest<ChannelData>
|
|
35
34
|
response?: PikkuHTTPResponse
|
|
36
|
-
|
|
35
|
+
createWireServices?: CreateWireServices
|
|
37
36
|
}
|
|
38
37
|
|
|
39
38
|
export interface ChannelMessageMeta {
|
|
40
39
|
pikkuFuncName: string
|
|
41
|
-
|
|
40
|
+
summary?: string
|
|
41
|
+
description?: string
|
|
42
|
+
errors?: string[]
|
|
43
|
+
tags?: string[]
|
|
42
44
|
middleware?: MiddlewareMetadata[]
|
|
43
45
|
permissions?: PermissionMetadata[]
|
|
44
46
|
}
|
|
@@ -54,7 +56,9 @@ export interface ChannelMeta {
|
|
|
54
56
|
disconnect: ChannelMessageMeta | null
|
|
55
57
|
message: ChannelMessageMeta | null
|
|
56
58
|
messageWirings: Record<string, Record<string, ChannelMessageMeta>>
|
|
57
|
-
|
|
59
|
+
summary?: string
|
|
60
|
+
description?: string
|
|
61
|
+
errors?: string[]
|
|
58
62
|
tags?: string[]
|
|
59
63
|
middleware?: MiddlewareMetadata[] // Pre-resolved middleware chain (tag + explicit)
|
|
60
64
|
permissions?: PermissionMetadata[] // Pre-resolved permission chain (tag + explicit)
|
|
@@ -66,20 +70,19 @@ export type CoreChannel<
|
|
|
66
70
|
ChannelData,
|
|
67
71
|
Channel extends string,
|
|
68
72
|
ChannelConnect = CorePikkuFunctionConfig<
|
|
69
|
-
| CorePikkuFunction<void, unknown
|
|
70
|
-
| CorePikkuFunctionSessionless<void, unknown
|
|
73
|
+
| CorePikkuFunction<void, unknown>
|
|
74
|
+
| CorePikkuFunctionSessionless<void, unknown>,
|
|
71
75
|
CorePikkuPermission<void>,
|
|
72
76
|
CorePikkuMiddleware
|
|
73
77
|
>,
|
|
74
78
|
ChannelDisconnect = CorePikkuFunctionConfig<
|
|
75
|
-
|
|
76
|
-
| CorePikkuFunctionSessionless<void, void, ChannelData>,
|
|
79
|
+
CorePikkuFunction<void, void> | CorePikkuFunctionSessionless<void, void>,
|
|
77
80
|
CorePikkuPermission<void>,
|
|
78
81
|
CorePikkuMiddleware
|
|
79
82
|
>,
|
|
80
83
|
ChannelFunctionMessage = CorePikkuFunctionConfig<
|
|
81
|
-
| CorePikkuFunction<unknown, unknown
|
|
82
|
-
| CorePikkuFunctionSessionless<unknown, unknown
|
|
84
|
+
| CorePikkuFunction<unknown, unknown>
|
|
85
|
+
| CorePikkuFunctionSessionless<unknown, unknown>,
|
|
83
86
|
CorePikkuPermission<unknown>,
|
|
84
87
|
CorePikkuMiddleware
|
|
85
88
|
>,
|
|
@@ -95,7 +95,9 @@ export class PikkuMockResponse implements PikkuHTTPResponse {
|
|
|
95
95
|
}
|
|
96
96
|
}
|
|
97
97
|
|
|
98
|
-
const
|
|
98
|
+
const mockCreateWireServices = async () => ({
|
|
99
|
+
wireServiceMock: true,
|
|
100
|
+
})
|
|
99
101
|
|
|
100
102
|
beforeEach(() => {
|
|
101
103
|
resetPikkuState()
|
|
@@ -113,7 +115,7 @@ test('runChannel should return undefined and 404 if no matching channel is found
|
|
|
113
115
|
channelId: 'test-channel-id',
|
|
114
116
|
request: new PikkuMockRequest('/non-existent-channel', 'get'),
|
|
115
117
|
response: mockResponse,
|
|
116
|
-
|
|
118
|
+
createWireServices: mockCreateWireServices,
|
|
117
119
|
})
|
|
118
120
|
|
|
119
121
|
assert.equal(
|
|
@@ -149,7 +151,7 @@ test('runChannel should return a channel handler if channel matches and no auth
|
|
|
149
151
|
request: new PikkuMockRequest('/test-channel', 'get'),
|
|
150
152
|
response: new PikkuMockResponse(),
|
|
151
153
|
route: '/test-channel',
|
|
152
|
-
|
|
154
|
+
createWireServices: mockCreateWireServices,
|
|
153
155
|
})
|
|
154
156
|
|
|
155
157
|
assert.ok(result, 'Should return a PikkuChannelHandler instance')
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { openChannel } from '../channel-runner.js'
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { createHTTPWire } from '../../http/http-runner.js'
|
|
3
|
+
import { closeWireServices } from '../../../utils.js'
|
|
4
4
|
import { processMessageHandlers } from '../channel-handler.js'
|
|
5
5
|
import {
|
|
6
6
|
CoreChannel,
|
|
@@ -8,11 +8,10 @@ import {
|
|
|
8
8
|
RunChannelParams,
|
|
9
9
|
} from '../channel.types.js'
|
|
10
10
|
import { PikkuLocalChannelHandler } from './local-channel-handler.js'
|
|
11
|
-
import {
|
|
11
|
+
import { PikkuWire, WireServices } from '../../../types/core.types.js'
|
|
12
12
|
import { handleHTTPError } from '../../../handle-error.js'
|
|
13
|
-
import {
|
|
13
|
+
import { PikkuSessionService } from '../../../services/user-session-service.js'
|
|
14
14
|
import { PikkuHTTP } from '../../http/http.types.js'
|
|
15
|
-
import { rpcService } from '../../rpc/rpc-runner.js'
|
|
16
15
|
import { runChannelLifecycleWithMiddleware } from '../channel-common.js'
|
|
17
16
|
|
|
18
17
|
export const runLocalChannel = async ({
|
|
@@ -21,7 +20,7 @@ export const runLocalChannel = async ({
|
|
|
21
20
|
request,
|
|
22
21
|
response,
|
|
23
22
|
route,
|
|
24
|
-
|
|
23
|
+
createWireServices,
|
|
25
24
|
skipUserSession = false,
|
|
26
25
|
respondWith404 = true,
|
|
27
26
|
coerceDataFromSchema = true,
|
|
@@ -30,14 +29,14 @@ export const runLocalChannel = async ({
|
|
|
30
29
|
}: Partial<Pick<CoreChannel<unknown, any>, 'route'>> &
|
|
31
30
|
RunChannelOptions &
|
|
32
31
|
RunChannelParams<unknown>): Promise<PikkuLocalChannelHandler | void> => {
|
|
33
|
-
let
|
|
32
|
+
let wireServices: WireServices<typeof singletonServices> | undefined
|
|
34
33
|
|
|
35
34
|
let channelHandler: PikkuLocalChannelHandler | undefined
|
|
36
|
-
const userSession = new
|
|
35
|
+
const userSession = new PikkuSessionService()
|
|
37
36
|
|
|
38
37
|
let http: PikkuHTTP | undefined
|
|
39
38
|
if (request) {
|
|
40
|
-
http =
|
|
39
|
+
http = createHTTPWire(request, response)
|
|
41
40
|
route = http?.request?.path()
|
|
42
41
|
}
|
|
43
42
|
|
|
@@ -45,7 +44,7 @@ export const runLocalChannel = async ({
|
|
|
45
44
|
try {
|
|
46
45
|
;({ openingData, channelConfig, meta } = await openChannel({
|
|
47
46
|
channelId,
|
|
48
|
-
|
|
47
|
+
createWireServices,
|
|
49
48
|
respondWith404,
|
|
50
49
|
request,
|
|
51
50
|
response,
|
|
@@ -76,28 +75,13 @@ export const runLocalChannel = async ({
|
|
|
76
75
|
openingData
|
|
77
76
|
)
|
|
78
77
|
const channel = channelHandler.getChannel()
|
|
79
|
-
const
|
|
80
|
-
if (createSessionServices) {
|
|
81
|
-
sessionServices = await createSessionServices(
|
|
82
|
-
singletonServices,
|
|
83
|
-
{ http, channel },
|
|
84
|
-
session
|
|
85
|
-
)
|
|
86
|
-
}
|
|
78
|
+
const wire: PikkuWire = { channel, session: userSession }
|
|
87
79
|
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
...singletonServices,
|
|
92
|
-
...sessionServices,
|
|
93
|
-
channel,
|
|
94
|
-
userSession,
|
|
95
|
-
},
|
|
96
|
-
interaction,
|
|
97
|
-
requiresAuth
|
|
98
|
-
)
|
|
80
|
+
if (createWireServices) {
|
|
81
|
+
wireServices = await createWireServices(singletonServices, wire)
|
|
82
|
+
}
|
|
99
83
|
|
|
100
|
-
const
|
|
84
|
+
const services = { ...singletonServices, ...wireServices }
|
|
101
85
|
|
|
102
86
|
channelHandler.registerOnOpen(async () => {
|
|
103
87
|
if (channelConfig.onConnect && meta.connect) {
|
|
@@ -107,7 +91,7 @@ export const runLocalChannel = async ({
|
|
|
107
91
|
meta: meta.connect,
|
|
108
92
|
lifecycleConfig: channelConfig.onConnect,
|
|
109
93
|
lifecycleType: 'connect',
|
|
110
|
-
services
|
|
94
|
+
services,
|
|
111
95
|
channel,
|
|
112
96
|
data: openingData,
|
|
113
97
|
})
|
|
@@ -129,7 +113,7 @@ export const runLocalChannel = async ({
|
|
|
129
113
|
meta: meta.disconnect,
|
|
130
114
|
lifecycleConfig: channelConfig.onDisconnect,
|
|
131
115
|
lifecycleType: 'disconnect',
|
|
132
|
-
services
|
|
116
|
+
services,
|
|
133
117
|
channel,
|
|
134
118
|
})
|
|
135
119
|
} catch (e) {
|
|
@@ -138,15 +122,16 @@ export const runLocalChannel = async ({
|
|
|
138
122
|
}
|
|
139
123
|
}
|
|
140
124
|
|
|
141
|
-
if (
|
|
142
|
-
await
|
|
125
|
+
if (wireServices) {
|
|
126
|
+
await closeWireServices(singletonServices.logger, wireServices)
|
|
143
127
|
}
|
|
144
128
|
})
|
|
145
129
|
|
|
146
130
|
const onMessage = processMessageHandlers(
|
|
147
|
-
|
|
131
|
+
services,
|
|
148
132
|
channelConfig as any,
|
|
149
|
-
channelHandler
|
|
133
|
+
channelHandler,
|
|
134
|
+
userSession
|
|
150
135
|
)
|
|
151
136
|
channelHandler.registerOnMessage(async (data) => {
|
|
152
137
|
try {
|
|
@@ -168,8 +153,8 @@ export const runLocalChannel = async ({
|
|
|
168
153
|
bubbleErrors
|
|
169
154
|
)
|
|
170
155
|
} finally {
|
|
171
|
-
if (
|
|
172
|
-
await
|
|
156
|
+
if (wireServices) {
|
|
157
|
+
await closeWireServices(singletonServices.logger, wireServices)
|
|
173
158
|
}
|
|
174
159
|
}
|
|
175
160
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { PikkuWire, WireServices } from '../../../types/core.types.js'
|
|
2
|
+
import { closeWireServices } from '../../../utils.js'
|
|
3
3
|
import { processMessageHandlers } from '../channel-handler.js'
|
|
4
4
|
import { openChannel } from '../channel-runner.js'
|
|
5
5
|
import type {
|
|
@@ -8,15 +8,14 @@ import type {
|
|
|
8
8
|
RunChannelParams,
|
|
9
9
|
PikkuChannelHandlerFactory,
|
|
10
10
|
} from '../channel.types.js'
|
|
11
|
-
import {
|
|
11
|
+
import { createHTTPWire } from '../../http/http-runner.js'
|
|
12
12
|
import { ChannelStore } from '../channel-store.js'
|
|
13
13
|
import { handleHTTPError } from '../../../handle-error.js'
|
|
14
|
-
import {
|
|
14
|
+
import { PikkuSessionService } from '../../../services/user-session-service.js'
|
|
15
15
|
import { pikkuState } from '../../../pikku-state.js'
|
|
16
16
|
import { PikkuFetchHTTPRequest } from '../../http/pikku-fetch-http-request.js'
|
|
17
17
|
import { PikkuHTTP } from '../../http/http.types.js'
|
|
18
18
|
import { runChannelLifecycleWithMiddleware } from '../channel-common.js'
|
|
19
|
-
import { rpcService } from '../../rpc/rpc-runner.js'
|
|
20
19
|
|
|
21
20
|
export interface RunServerlessChannelParams<ChannelData>
|
|
22
21
|
extends RunChannelParams<ChannelData> {
|
|
@@ -66,7 +65,7 @@ export const runChannelConnect = async ({
|
|
|
66
65
|
request,
|
|
67
66
|
response,
|
|
68
67
|
route,
|
|
69
|
-
|
|
68
|
+
createWireServices,
|
|
70
69
|
channelStore,
|
|
71
70
|
channelHandlerFactory,
|
|
72
71
|
coerceDataFromSchema = true,
|
|
@@ -76,18 +75,18 @@ export const runChannelConnect = async ({
|
|
|
76
75
|
}: Pick<CoreChannel<unknown, any>, 'route'> &
|
|
77
76
|
RunChannelOptions &
|
|
78
77
|
RunServerlessChannelParams<unknown>) => {
|
|
79
|
-
let
|
|
78
|
+
let wireServices: WireServices | undefined
|
|
80
79
|
|
|
81
80
|
let http: PikkuHTTP | undefined
|
|
82
81
|
if (request instanceof Request) {
|
|
83
|
-
http =
|
|
82
|
+
http = createHTTPWire(new PikkuFetchHTTPRequest(request), response)
|
|
84
83
|
}
|
|
85
84
|
|
|
86
|
-
const userSession = new
|
|
85
|
+
const userSession = new PikkuSessionService(channelStore, channelId)
|
|
87
86
|
|
|
88
87
|
const { channelConfig, openingData, meta } = await openChannel({
|
|
89
88
|
channelId,
|
|
90
|
-
|
|
89
|
+
createWireServices,
|
|
91
90
|
request,
|
|
92
91
|
route,
|
|
93
92
|
singletonServices,
|
|
@@ -107,26 +106,17 @@ export const runChannelConnect = async ({
|
|
|
107
106
|
channelHandlerFactory,
|
|
108
107
|
channelName: channelConfig.name,
|
|
109
108
|
})
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
)
|
|
109
|
+
|
|
110
|
+
const wire: PikkuWire = { channel, session: userSession }
|
|
111
|
+
|
|
112
|
+
if (createWireServices) {
|
|
113
|
+
wireServices = await createWireServices(singletonServices, wire)
|
|
116
114
|
}
|
|
117
115
|
|
|
118
|
-
const
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
...singletonServices,
|
|
123
|
-
...sessionServices,
|
|
124
|
-
channel,
|
|
125
|
-
userSession,
|
|
126
|
-
},
|
|
127
|
-
interaction,
|
|
128
|
-
requiresAuth
|
|
129
|
-
)
|
|
116
|
+
const services = {
|
|
117
|
+
...singletonServices,
|
|
118
|
+
...wireServices,
|
|
119
|
+
}
|
|
130
120
|
|
|
131
121
|
if (channelConfig.onConnect && meta.connect) {
|
|
132
122
|
await runChannelLifecycleWithMiddleware({
|
|
@@ -134,7 +124,7 @@ export const runChannelConnect = async ({
|
|
|
134
124
|
meta: meta.connect,
|
|
135
125
|
lifecycleConfig: channelConfig.onConnect,
|
|
136
126
|
lifecycleType: 'connect',
|
|
137
|
-
services
|
|
127
|
+
services,
|
|
138
128
|
channel,
|
|
139
129
|
data: openingData,
|
|
140
130
|
})
|
|
@@ -151,8 +141,8 @@ export const runChannelConnect = async ({
|
|
|
151
141
|
bubbleErrors
|
|
152
142
|
)
|
|
153
143
|
} finally {
|
|
154
|
-
if (
|
|
155
|
-
await
|
|
144
|
+
if (wireServices) {
|
|
145
|
+
await closeWireServices(singletonServices.logger, wireServices)
|
|
156
146
|
}
|
|
157
147
|
}
|
|
158
148
|
}
|
|
@@ -161,7 +151,7 @@ export const runChannelDisconnect = async ({
|
|
|
161
151
|
singletonServices,
|
|
162
152
|
...params
|
|
163
153
|
}: RunServerlessChannelParams<unknown>): Promise<void> => {
|
|
164
|
-
let
|
|
154
|
+
let wireServices: WireServices | undefined
|
|
165
155
|
|
|
166
156
|
// Try to get channel from store. In serverless environments (especially with
|
|
167
157
|
// serverless-offline or worker threads), disconnect can be called multiple times
|
|
@@ -185,30 +175,21 @@ export const runChannelDisconnect = async ({
|
|
|
185
175
|
openingData,
|
|
186
176
|
channelName,
|
|
187
177
|
})
|
|
188
|
-
const userSession = new
|
|
178
|
+
const userSession = new PikkuSessionService(
|
|
189
179
|
params.channelStore,
|
|
190
180
|
params.channelId
|
|
191
181
|
)
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
)
|
|
182
|
+
userSession.setInitial(session)
|
|
183
|
+
const wire: PikkuWire = { channel, session: userSession }
|
|
184
|
+
|
|
185
|
+
if (!wireServices && params.createWireServices) {
|
|
186
|
+
wireServices = await params.createWireServices(singletonServices, wire)
|
|
198
187
|
}
|
|
199
188
|
|
|
200
|
-
const
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
...singletonServices,
|
|
205
|
-
...sessionServices,
|
|
206
|
-
channel,
|
|
207
|
-
userSession,
|
|
208
|
-
},
|
|
209
|
-
interaction,
|
|
210
|
-
requiresAuth
|
|
211
|
-
)
|
|
189
|
+
const services = {
|
|
190
|
+
...singletonServices,
|
|
191
|
+
...wireServices,
|
|
192
|
+
}
|
|
212
193
|
|
|
213
194
|
if (channelConfig.onDisconnect && meta.disconnect) {
|
|
214
195
|
try {
|
|
@@ -217,7 +198,7 @@ export const runChannelDisconnect = async ({
|
|
|
217
198
|
meta: meta.disconnect,
|
|
218
199
|
lifecycleConfig: channelConfig.onDisconnect,
|
|
219
200
|
lifecycleType: 'disconnect',
|
|
220
|
-
services
|
|
201
|
+
services,
|
|
221
202
|
channel,
|
|
222
203
|
})
|
|
223
204
|
} catch (e: any) {
|
|
@@ -227,8 +208,8 @@ export const runChannelDisconnect = async ({
|
|
|
227
208
|
}
|
|
228
209
|
}
|
|
229
210
|
await params.channelStore.removeChannels([channel.channelId])
|
|
230
|
-
if (
|
|
231
|
-
await
|
|
211
|
+
if (wireServices) {
|
|
212
|
+
await closeWireServices(singletonServices.logger, wireServices)
|
|
232
213
|
}
|
|
233
214
|
}
|
|
234
215
|
|
|
@@ -236,7 +217,7 @@ export const runChannelMessage = async (
|
|
|
236
217
|
{ singletonServices, ...params }: RunServerlessChannelParams<unknown>,
|
|
237
218
|
data: unknown
|
|
238
219
|
): Promise<unknown> => {
|
|
239
|
-
let
|
|
220
|
+
let wireServices: WireServices | undefined
|
|
240
221
|
const { openingData, channelName, session } =
|
|
241
222
|
await params.channelStore.getChannelAndSession(params.channelId)
|
|
242
223
|
|
|
@@ -245,36 +226,29 @@ export const runChannelMessage = async (
|
|
|
245
226
|
openingData,
|
|
246
227
|
channelName,
|
|
247
228
|
})
|
|
248
|
-
const userSession = new
|
|
229
|
+
const userSession = new PikkuSessionService(
|
|
249
230
|
params.channelStore,
|
|
250
231
|
params.channelId
|
|
251
232
|
)
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
)
|
|
233
|
+
userSession.setInitial(session)
|
|
234
|
+
const wire: PikkuWire = { channel, session: userSession }
|
|
235
|
+
|
|
236
|
+
if (params.createWireServices) {
|
|
237
|
+
wireServices = await params.createWireServices(singletonServices, wire)
|
|
258
238
|
}
|
|
259
239
|
|
|
260
|
-
const
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
...singletonServices,
|
|
265
|
-
...sessionServices,
|
|
266
|
-
channel,
|
|
267
|
-
userSession,
|
|
268
|
-
},
|
|
269
|
-
interaction
|
|
270
|
-
)
|
|
240
|
+
const services = {
|
|
241
|
+
...singletonServices,
|
|
242
|
+
...wireServices,
|
|
243
|
+
}
|
|
271
244
|
|
|
272
245
|
let response: unknown
|
|
273
246
|
try {
|
|
274
247
|
const onMessage = processMessageHandlers(
|
|
275
|
-
|
|
248
|
+
services,
|
|
276
249
|
channelConfig,
|
|
277
|
-
channelHandler
|
|
250
|
+
channelHandler,
|
|
251
|
+
userSession
|
|
278
252
|
)
|
|
279
253
|
response = await onMessage(data)
|
|
280
254
|
} catch (e: any) {
|
|
@@ -283,8 +257,8 @@ export const runChannelMessage = async (
|
|
|
283
257
|
)
|
|
284
258
|
return { error: e.message || 'Unknown error' }
|
|
285
259
|
} finally {
|
|
286
|
-
if (
|
|
287
|
-
await
|
|
260
|
+
if (wireServices) {
|
|
261
|
+
await closeWireServices(singletonServices.logger, wireServices)
|
|
288
262
|
}
|
|
289
263
|
}
|
|
290
264
|
return response
|
|
@@ -30,7 +30,7 @@ export async function executeCLIViaChannel({
|
|
|
30
30
|
const allCLIMeta = pikkuState('cli', 'meta') as unknown as CLIMeta | undefined
|
|
31
31
|
if (!allCLIMeta) {
|
|
32
32
|
throw new Error(
|
|
33
|
-
'[PKU342] CLI metadata not found. No CLI wirings were registered. See https://pikku.dev/errors/pku342 for more information.'
|
|
33
|
+
'[PKU342] CLI metadata not found. No CLI wirings were registered. See https://pikku.dev/docs/pikku-cli/errors/pku342 for more information.'
|
|
34
34
|
)
|
|
35
35
|
}
|
|
36
36
|
const programMeta = allCLIMeta.programs[programName]
|
|
@@ -8,7 +8,7 @@ import { addFunction } from '../../function/function-runner.js'
|
|
|
8
8
|
|
|
9
9
|
describe('CLI Runner', () => {
|
|
10
10
|
let singletonServices: any
|
|
11
|
-
let
|
|
11
|
+
let createWireServices: any
|
|
12
12
|
|
|
13
13
|
beforeEach(() => {
|
|
14
14
|
resetPikkuState()
|
|
@@ -21,7 +21,7 @@ describe('CLI Runner', () => {
|
|
|
21
21
|
},
|
|
22
22
|
}
|
|
23
23
|
|
|
24
|
-
|
|
24
|
+
createWireServices = async () => ({})
|
|
25
25
|
})
|
|
26
26
|
|
|
27
27
|
afterEach(() => {
|
|
@@ -78,7 +78,7 @@ describe('CLI Runner', () => {
|
|
|
78
78
|
|
|
79
79
|
test('should execute command function with merged data', async () => {
|
|
80
80
|
let receivedData: any
|
|
81
|
-
const testFunc = async (_services: any, data: any) => {
|
|
81
|
+
const testFunc = async (_services: any, data: any, _wire: any) => {
|
|
82
82
|
receivedData = data
|
|
83
83
|
return { success: true }
|
|
84
84
|
}
|
|
@@ -136,7 +136,7 @@ describe('CLI Runner', () => {
|
|
|
136
136
|
|
|
137
137
|
const testMiddleware: CorePikkuMiddleware = async (
|
|
138
138
|
_services,
|
|
139
|
-
|
|
139
|
+
_wire,
|
|
140
140
|
next
|
|
141
141
|
) => {
|
|
142
142
|
executionOrder.push('middleware')
|
|
@@ -199,10 +199,10 @@ describe('CLI Runner', () => {
|
|
|
199
199
|
|
|
200
200
|
const testMiddleware: CorePikkuMiddleware = async (
|
|
201
201
|
_services,
|
|
202
|
-
|
|
202
|
+
wire,
|
|
203
203
|
next
|
|
204
204
|
) => {
|
|
205
|
-
cliContext =
|
|
205
|
+
cliContext = wire.cli
|
|
206
206
|
await next()
|
|
207
207
|
}
|
|
208
208
|
|
|
@@ -295,7 +295,7 @@ describe('CLI Runner', () => {
|
|
|
295
295
|
commandPath: ['secure'],
|
|
296
296
|
data: {},
|
|
297
297
|
singletonServices,
|
|
298
|
-
|
|
298
|
+
createWireServices,
|
|
299
299
|
}),
|
|
300
300
|
/Authentication required/
|
|
301
301
|
)
|