@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.
Files changed (138) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/dist/errors/errors.d.ts +1 -1
  3. package/dist/errors/errors.js +3 -3
  4. package/dist/function/function-runner.d.ts +6 -7
  5. package/dist/function/function-runner.js +35 -16
  6. package/dist/function/functions.types.d.ts +23 -30
  7. package/dist/function/functions.types.js +9 -6
  8. package/dist/handle-error.d.ts +1 -1
  9. package/dist/handle-error.js +1 -1
  10. package/dist/index.d.ts +2 -0
  11. package/dist/index.js +2 -0
  12. package/dist/middleware/auth-apikey.d.ts +1 -0
  13. package/dist/middleware/auth-apikey.js +3 -3
  14. package/dist/middleware/auth-bearer.d.ts +1 -0
  15. package/dist/middleware/auth-bearer.js +3 -3
  16. package/dist/middleware/auth-cookie.d.ts +1 -0
  17. package/dist/middleware/auth-cookie.js +5 -5
  18. package/dist/middleware/timeout.d.ts +1 -0
  19. package/dist/middleware/timeout.js +3 -2
  20. package/dist/middleware-runner.d.ts +3 -6
  21. package/dist/middleware-runner.js +11 -11
  22. package/dist/permissions.d.ts +6 -6
  23. package/dist/permissions.js +15 -15
  24. package/dist/pikku-state.d.ts +7 -2
  25. package/dist/pikku-state.js +4 -0
  26. package/dist/services/index.d.ts +1 -0
  27. package/dist/services/index.js +1 -0
  28. package/dist/services/scheduler-service.d.ts +63 -0
  29. package/dist/services/scheduler-service.js +6 -0
  30. package/dist/services/user-session-service.d.ts +7 -3
  31. package/dist/services/user-session-service.js +8 -1
  32. package/dist/time-utils.d.ts +14 -0
  33. package/dist/time-utils.js +62 -0
  34. package/dist/types/core.types.d.ts +48 -35
  35. package/dist/types/core.types.js +3 -13
  36. package/dist/utils.d.ts +1 -1
  37. package/dist/utils.js +3 -3
  38. package/dist/wirings/channel/channel-common.js +2 -3
  39. package/dist/wirings/channel/channel-handler.d.ts +3 -2
  40. package/dist/wirings/channel/channel-handler.js +6 -9
  41. package/dist/wirings/channel/channel-runner.d.ts +2 -2
  42. package/dist/wirings/channel/channel.types.d.ts +10 -5
  43. package/dist/wirings/channel/local/local-channel-runner.d.ts +1 -1
  44. package/dist/wirings/channel/local/local-channel-runner.js +19 -26
  45. package/dist/wirings/channel/serverless/serverless-channel-runner.d.ts +1 -1
  46. package/dist/wirings/channel/serverless/serverless-channel-runner.js +41 -46
  47. package/dist/wirings/cli/channel/cli-channel-runner.js +1 -1
  48. package/dist/wirings/cli/cli-runner.d.ts +5 -5
  49. package/dist/wirings/cli/cli-runner.js +11 -29
  50. package/dist/wirings/cli/cli.types.d.ts +15 -11
  51. package/dist/wirings/http/http-runner.d.ts +6 -6
  52. package/dist/wirings/http/http-runner.js +25 -39
  53. package/dist/wirings/http/http.types.d.ts +5 -10
  54. package/dist/wirings/mcp/mcp-runner.d.ts +2 -2
  55. package/dist/wirings/mcp/mcp-runner.js +12 -19
  56. package/dist/wirings/mcp/mcp.types.d.ts +6 -0
  57. package/dist/wirings/queue/queue-runner.d.ts +3 -3
  58. package/dist/wirings/queue/queue-runner.js +7 -14
  59. package/dist/wirings/queue/queue.types.d.ts +4 -13
  60. package/dist/wirings/rpc/index.d.ts +1 -1
  61. package/dist/wirings/rpc/index.js +1 -1
  62. package/dist/wirings/rpc/rpc-runner.d.ts +13 -7
  63. package/dist/wirings/rpc/rpc-runner.js +50 -26
  64. package/dist/wirings/rpc/rpc-types.d.ts +1 -0
  65. package/dist/wirings/scheduler/scheduler-runner.d.ts +3 -3
  66. package/dist/wirings/scheduler/scheduler-runner.js +13 -24
  67. package/dist/wirings/scheduler/scheduler.types.d.ts +3 -8
  68. package/dist/wirings/workflow/index.d.ts +15 -0
  69. package/dist/wirings/workflow/index.js +14 -0
  70. package/dist/wirings/workflow/pikku-workflow-service.d.ts +160 -0
  71. package/dist/wirings/workflow/pikku-workflow-service.js +430 -0
  72. package/dist/wirings/workflow/workflow-runner.d.ts +34 -0
  73. package/dist/wirings/workflow/workflow-runner.js +65 -0
  74. package/dist/wirings/workflow/workflow.types.d.ts +332 -0
  75. package/dist/wirings/workflow/workflow.types.js +1 -0
  76. package/package.json +3 -4
  77. package/src/errors/errors.ts +3 -3
  78. package/src/factory-functions.test.ts +9 -36
  79. package/src/function/function-runner.test.ts +57 -68
  80. package/src/function/function-runner.ts +51 -28
  81. package/src/function/function-runner.ts.bak +188 -0
  82. package/src/function/functions.types.ts +69 -51
  83. package/src/handle-error.ts +1 -1
  84. package/src/index.ts +2 -0
  85. package/src/middleware/auth-apikey.test.ts +360 -0
  86. package/src/middleware/auth-apikey.ts +3 -7
  87. package/src/middleware/auth-bearer.test.ts +447 -0
  88. package/src/middleware/auth-bearer.ts +27 -33
  89. package/src/middleware/auth-cookie.test.ts +525 -0
  90. package/src/middleware/auth-cookie.ts +6 -6
  91. package/src/middleware/timeout.ts +4 -2
  92. package/src/middleware-runner.test.ts +58 -127
  93. package/src/middleware-runner.ts +13 -15
  94. package/src/permissions.test.ts +41 -45
  95. package/src/permissions.ts +21 -20
  96. package/src/pikku-state.ts +14 -2
  97. package/src/services/index.ts +1 -0
  98. package/src/services/scheduler-service.ts +76 -0
  99. package/src/services/user-session-service.ts +14 -4
  100. package/src/time-utils.ts +75 -0
  101. package/src/types/core.types.ts +92 -51
  102. package/src/utils.ts +4 -4
  103. package/src/wirings/channel/channel-common.ts +4 -7
  104. package/src/wirings/channel/channel-handler.ts +16 -22
  105. package/src/wirings/channel/channel-runner.ts +2 -2
  106. package/src/wirings/channel/channel.types.ts +14 -11
  107. package/src/wirings/channel/local/local-channel-runner.test.ts +5 -3
  108. package/src/wirings/channel/local/local-channel-runner.ts +23 -38
  109. package/src/wirings/channel/serverless/serverless-channel-runner.ts +51 -77
  110. package/src/wirings/cli/channel/cli-channel-runner.ts +1 -1
  111. package/src/wirings/cli/cli-runner.test.ts +7 -7
  112. package/src/wirings/cli/cli-runner.ts +25 -63
  113. package/src/wirings/cli/cli.types.ts +22 -16
  114. package/src/wirings/http/http-runner.test.ts +8 -8
  115. package/src/wirings/http/http-runner.ts +29 -56
  116. package/src/wirings/http/http.types.ts +5 -14
  117. package/src/wirings/mcp/mcp-runner.ts +23 -48
  118. package/src/wirings/mcp/mcp.types.ts +6 -0
  119. package/src/wirings/queue/queue-runner.test.ts +641 -0
  120. package/src/wirings/queue/queue-runner.ts +10 -24
  121. package/src/wirings/queue/queue.types.ts +5 -15
  122. package/src/wirings/rpc/index.ts +1 -1
  123. package/src/wirings/rpc/rpc-runner.ts +71 -32
  124. package/src/wirings/rpc/rpc-types.ts +1 -0
  125. package/src/wirings/scheduler/scheduler-runner.test.ts +627 -0
  126. package/src/wirings/scheduler/scheduler-runner.ts +24 -50
  127. package/src/wirings/scheduler/scheduler.types.ts +3 -9
  128. package/src/wirings/workflow/index.ts +43 -0
  129. package/src/wirings/workflow/pikku-workflow-service.ts +746 -0
  130. package/src/wirings/workflow/workflow-runner.ts +72 -0
  131. package/src/wirings/workflow/workflow.types.ts +422 -0
  132. package/tsconfig.tsbuildinfo +1 -1
  133. package/dist/services/file-channel-store.d.ts +0 -19
  134. package/dist/services/file-channel-store.js +0 -69
  135. package/dist/services/file-eventhub-store.d.ts +0 -17
  136. package/dist/services/file-eventhub-store.js +0 -71
  137. package/src/services/file-channel-store.ts +0 -86
  138. 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
- PikkuWiringTypes.channel,
126
- cacheKey,
127
- pikkuFuncName,
128
- {
129
- singletonServices: services,
130
- getAllServices: () => ({
131
- ...services,
132
- channel: channelHandler.getChannel(),
133
- }),
134
- data: () => data,
135
- userSession: services.userSession,
136
- inheritedMiddleware,
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 { UserSessionService } from '../../services/user-session-service.js'
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: UserSessionService<any>
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
- CreateSessionServices,
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
- createSessionServices?: CreateSessionServices
35
+ createWireServices?: CreateWireServices
37
36
  }
38
37
 
39
38
  export interface ChannelMessageMeta {
40
39
  pikkuFuncName: string
41
- docs?: PikkuDocs
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
- docs?: PikkuDocs
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, ChannelData>
70
- | CorePikkuFunctionSessionless<void, unknown, ChannelData>,
73
+ | CorePikkuFunction<void, unknown>
74
+ | CorePikkuFunctionSessionless<void, unknown>,
71
75
  CorePikkuPermission<void>,
72
76
  CorePikkuMiddleware
73
77
  >,
74
78
  ChannelDisconnect = CorePikkuFunctionConfig<
75
- | CorePikkuFunction<void, void, ChannelData>
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, ChannelData>
82
- | CorePikkuFunctionSessionless<unknown, unknown, ChannelData>,
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 mockCreateSessionServices = async () => ({ sessionServiceMock: true })
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
- createSessionServices: mockCreateSessionServices,
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
- createSessionServices: mockCreateSessionServices,
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 { createHTTPInteraction } from '../../http/http-runner.js'
3
- import { closeSessionServices } from '../../../utils.js'
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 { PikkuInteraction, SessionServices } from '../../../types/core.types.js'
11
+ import { PikkuWire, WireServices } from '../../../types/core.types.js'
12
12
  import { handleHTTPError } from '../../../handle-error.js'
13
- import { PikkuUserSessionService } from '../../../services/user-session-service.js'
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
- createSessionServices,
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 sessionServices: SessionServices<typeof singletonServices> | undefined
32
+ let wireServices: WireServices<typeof singletonServices> | undefined
34
33
 
35
34
  let channelHandler: PikkuLocalChannelHandler | undefined
36
- const userSession = new PikkuUserSessionService()
35
+ const userSession = new PikkuSessionService()
37
36
 
38
37
  let http: PikkuHTTP | undefined
39
38
  if (request) {
40
- http = createHTTPInteraction(request, response)
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
- createSessionServices,
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 session = await userSession.get()
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
- const getAllServices = (channel: any, requiresAuth?: boolean) =>
89
- rpcService.injectRPCService(
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 interaction: PikkuInteraction = { channel }
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: getAllServices(channel, false),
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: getAllServices(channel, false),
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 (sessionServices) {
142
- await closeSessionServices(singletonServices.logger, sessionServices)
125
+ if (wireServices) {
126
+ await closeWireServices(singletonServices.logger, wireServices)
143
127
  }
144
128
  })
145
129
 
146
130
  const onMessage = processMessageHandlers(
147
- getAllServices(channel),
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 (sessionServices) {
172
- await closeSessionServices(singletonServices.logger, sessionServices)
156
+ if (wireServices) {
157
+ await closeWireServices(singletonServices.logger, wireServices)
173
158
  }
174
159
  }
175
160
  }
@@ -1,5 +1,5 @@
1
- import { PikkuInteraction, SessionServices } from '../../../types/core.types.js'
2
- import { closeSessionServices } from '../../../utils.js'
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 { createHTTPInteraction } from '../../http/http-runner.js'
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 { PikkuUserSessionService } from '../../../services/user-session-service.js'
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
- createSessionServices,
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 sessionServices: SessionServices | undefined
78
+ let wireServices: WireServices | undefined
80
79
 
81
80
  let http: PikkuHTTP | undefined
82
81
  if (request instanceof Request) {
83
- http = createHTTPInteraction(new PikkuFetchHTTPRequest(request), response)
82
+ http = createHTTPWire(new PikkuFetchHTTPRequest(request), response)
84
83
  }
85
84
 
86
- const userSession = new PikkuUserSessionService(channelStore, channelId)
85
+ const userSession = new PikkuSessionService(channelStore, channelId)
87
86
 
88
87
  const { channelConfig, openingData, meta } = await openChannel({
89
88
  channelId,
90
- createSessionServices,
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
- if (createSessionServices) {
111
- sessionServices = await createSessionServices(
112
- singletonServices,
113
- { http },
114
- await userSession.get()
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 interaction: PikkuInteraction = { channel }
119
- const getAllServices = (requiresAuth?: boolean) =>
120
- rpcService.injectRPCService(
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: getAllServices(false),
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 (sessionServices) {
155
- await closeSessionServices(singletonServices.logger, sessionServices)
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 sessionServices: SessionServices | undefined
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 PikkuUserSessionService(
178
+ const userSession = new PikkuSessionService(
189
179
  params.channelStore,
190
180
  params.channelId
191
181
  )
192
- if (!sessionServices && params.createSessionServices) {
193
- sessionServices = await params.createSessionServices(
194
- singletonServices,
195
- { channel },
196
- session
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 interaction: PikkuInteraction = { channel }
201
- const getAllServices = (requiresAuth?: boolean) =>
202
- rpcService.injectRPCService(
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: getAllServices(false),
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 (sessionServices) {
231
- await closeSessionServices(singletonServices.logger, sessionServices)
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 sessionServices: SessionServices | undefined
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 PikkuUserSessionService(
229
+ const userSession = new PikkuSessionService(
249
230
  params.channelStore,
250
231
  params.channelId
251
232
  )
252
- if (params.createSessionServices) {
253
- sessionServices = await params.createSessionServices(
254
- singletonServices,
255
- { channel },
256
- session
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 interaction: PikkuInteraction = { channel }
261
- const getAllServices = () =>
262
- rpcService.injectRPCService(
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
- getAllServices(),
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 (sessionServices) {
287
- await closeSessionServices(singletonServices.logger, sessionServices)
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 createSessionServices: any
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
- createSessionServices = async () => ({})
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
- _interaction,
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
- interaction,
202
+ wire,
203
203
  next
204
204
  ) => {
205
- cliContext = interaction.cli
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
- createSessionServices,
298
+ createWireServices,
299
299
  }),
300
300
  /Authentication required/
301
301
  )