@pikku/core 0.12.0 → 0.12.2

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 (290) hide show
  1. package/CHANGELOG.md +40 -0
  2. package/dist/errors/errors.d.ts +6 -0
  3. package/dist/errors/errors.js +10 -0
  4. package/dist/errors/index.d.ts +1 -0
  5. package/dist/errors/index.js +1 -0
  6. package/dist/function/function-runner.d.ts +3 -3
  7. package/dist/function/function-runner.js +66 -44
  8. package/dist/function/functions.types.d.ts +1 -0
  9. package/dist/handle-error.d.ts +2 -2
  10. package/dist/handle-error.js +2 -2
  11. package/dist/index.d.ts +5 -3
  12. package/dist/index.js +2 -1
  13. package/dist/internal.d.ts +3 -0
  14. package/dist/internal.js +2 -0
  15. package/dist/middleware/auth-bearer.d.ts +1 -1
  16. package/dist/middleware/auth-bearer.js +1 -1
  17. package/dist/middleware/auth-cookie.d.ts +2 -2
  18. package/dist/middleware/auth-cookie.js +1 -1
  19. package/dist/middleware/cors.d.ts +2 -2
  20. package/dist/middleware/cors.js +45 -37
  21. package/dist/middleware-runner.d.ts +1 -1
  22. package/dist/middleware-runner.js +1 -0
  23. package/dist/permissions.d.ts +2 -2
  24. package/dist/permissions.js +1 -0
  25. package/dist/pikku-state.d.ts +9 -8
  26. package/dist/pikku-state.js +34 -17
  27. package/dist/schema.d.ts +4 -4
  28. package/dist/schema.js +9 -5
  29. package/dist/services/ai-agent-runner-service.d.ts +22 -3
  30. package/dist/services/ai-run-state-service.d.ts +1 -1
  31. package/dist/services/ai-storage-service.d.ts +1 -1
  32. package/dist/services/content-service.d.ts +6 -0
  33. package/dist/services/gateway-service.d.ts +19 -0
  34. package/dist/services/gopass-secrets.d.ts +1 -1
  35. package/dist/services/gopass-secrets.js +3 -0
  36. package/dist/services/in-memory-ai-run-state-service.d.ts +15 -0
  37. package/dist/services/in-memory-ai-run-state-service.js +44 -0
  38. package/dist/services/in-memory-trigger-service.d.ts +0 -1
  39. package/dist/services/in-memory-trigger-service.js +6 -8
  40. package/dist/services/index.d.ts +5 -2
  41. package/dist/services/index.js +2 -0
  42. package/dist/services/local-content.d.ts +2 -1
  43. package/dist/services/local-content.js +6 -1
  44. package/dist/services/local-gateway-service.d.ts +22 -0
  45. package/dist/services/local-gateway-service.js +51 -0
  46. package/dist/services/local-secrets.d.ts +2 -2
  47. package/dist/services/local-variables.d.ts +1 -1
  48. package/dist/services/logger-console.d.ts +2 -1
  49. package/dist/services/scheduler-service.d.ts +0 -12
  50. package/dist/services/scheduler-service.js +0 -6
  51. package/dist/services/scoped-secret-service.d.ts +1 -1
  52. package/dist/services/trigger-service.d.ts +0 -7
  53. package/dist/services/user-session-service.d.ts +3 -3
  54. package/dist/services/workflow-service.d.ts +2 -3
  55. package/dist/types/core.types.d.ts +27 -19
  56. package/dist/types/state.types.d.ts +22 -15
  57. package/dist/utils.d.ts +5 -5
  58. package/dist/utils.js +12 -9
  59. package/dist/wirings/ai-agent/ai-agent-assistant-ui.d.ts +5 -0
  60. package/dist/wirings/ai-agent/ai-agent-assistant-ui.js +168 -0
  61. package/dist/wirings/ai-agent/ai-agent-helpers.d.ts +28 -0
  62. package/dist/wirings/ai-agent/ai-agent-helpers.js +40 -0
  63. package/dist/wirings/ai-agent/ai-agent-memory.js +13 -2
  64. package/dist/wirings/ai-agent/ai-agent-prepare.d.ts +4 -5
  65. package/dist/wirings/ai-agent/ai-agent-prepare.js +80 -31
  66. package/dist/wirings/ai-agent/ai-agent-registry.d.ts +1 -1
  67. package/dist/wirings/ai-agent/ai-agent-runner.js +107 -8
  68. package/dist/wirings/ai-agent/ai-agent-stream.d.ts +2 -1
  69. package/dist/wirings/ai-agent/ai-agent-stream.js +263 -89
  70. package/dist/wirings/ai-agent/ai-agent.types.d.ts +96 -4
  71. package/dist/wirings/ai-agent/index.d.ts +3 -1
  72. package/dist/wirings/ai-agent/index.js +2 -0
  73. package/dist/wirings/channel/channel-common.d.ts +2 -2
  74. package/dist/wirings/channel/channel-handler.d.ts +7 -4
  75. package/dist/wirings/channel/channel-handler.js +15 -5
  76. package/dist/wirings/channel/channel-middleware-runner.js +1 -0
  77. package/dist/wirings/channel/channel-runner.d.ts +5 -5
  78. package/dist/wirings/channel/channel-runner.js +3 -2
  79. package/dist/wirings/channel/channel-store.d.ts +1 -1
  80. package/dist/wirings/channel/channel.types.d.ts +10 -6
  81. package/dist/wirings/channel/index.d.ts +1 -1
  82. package/dist/wirings/channel/local/local-channel-handler.d.ts +7 -0
  83. package/dist/wirings/channel/local/local-channel-handler.js +17 -0
  84. package/dist/wirings/channel/local/local-channel-runner.d.ts +7 -2
  85. package/dist/wirings/channel/local/local-channel-runner.js +18 -4
  86. package/dist/wirings/channel/local/local-eventhub-service.d.ts +2 -2
  87. package/dist/wirings/channel/log-channels.d.ts +1 -1
  88. package/dist/wirings/channel/pikku-abstract-channel-handler.d.ts +2 -1
  89. package/dist/wirings/channel/pikku-abstract-channel-handler.js +1 -0
  90. package/dist/wirings/channel/serverless/serverless-channel-runner.d.ts +4 -4
  91. package/dist/wirings/channel/serverless/serverless-channel-runner.js +26 -20
  92. package/dist/wirings/cli/channel/cli-channel-runner.d.ts +1 -1
  93. package/dist/wirings/cli/cli-runner.d.ts +2 -2
  94. package/dist/wirings/cli/cli-runner.js +3 -0
  95. package/dist/wirings/cli/cli.types.d.ts +3 -3
  96. package/dist/wirings/cli/command-parser.d.ts +1 -1
  97. package/dist/wirings/gateway/gateway-runner.d.ts +24 -0
  98. package/dist/wirings/gateway/gateway-runner.js +325 -0
  99. package/dist/wirings/gateway/gateway.types.d.ts +127 -0
  100. package/dist/wirings/gateway/index.d.ts +2 -0
  101. package/dist/wirings/gateway/index.js +1 -0
  102. package/dist/wirings/http/http-runner.d.ts +9 -9
  103. package/dist/wirings/http/http-runner.js +36 -14
  104. package/dist/wirings/http/http.types.d.ts +2 -6
  105. package/dist/wirings/http/log-http-routes.d.ts +1 -1
  106. package/dist/wirings/http/pikku-fetch-http-request.d.ts +1 -1
  107. package/dist/wirings/http/pikku-fetch-http-response.d.ts +2 -2
  108. package/dist/wirings/http/pikku-fetch-http-response.js +6 -1
  109. package/dist/wirings/http/routers/http-router.d.ts +1 -1
  110. package/dist/wirings/http/routers/path-to-regex.d.ts +2 -2
  111. package/dist/wirings/mcp/mcp-endpoint-registry.d.ts +1 -1
  112. package/dist/wirings/mcp/mcp-runner.d.ts +0 -3
  113. package/dist/wirings/mcp/mcp-runner.js +4 -2
  114. package/dist/wirings/mcp/mcp.types.d.ts +2 -2
  115. package/dist/wirings/oauth2/oauth2-client.d.ts +3 -3
  116. package/dist/wirings/oauth2/wire-oauth2-credential.d.ts +1 -1
  117. package/dist/wirings/queue/index.d.ts +1 -1
  118. package/dist/wirings/queue/index.js +1 -1
  119. package/dist/wirings/queue/queue-runner.d.ts +1 -12
  120. package/dist/wirings/queue/queue-runner.js +4 -12
  121. package/dist/wirings/queue/queue.types.d.ts +3 -9
  122. package/dist/wirings/queue/register-queue-helper.d.ts +2 -2
  123. package/dist/wirings/queue/register-queue-helper.js +1 -1
  124. package/dist/wirings/queue/validate-worker-config.d.ts +1 -1
  125. package/dist/wirings/rpc/index.d.ts +2 -0
  126. package/dist/wirings/rpc/index.js +1 -0
  127. package/dist/wirings/rpc/rpc-runner.d.ts +36 -14
  128. package/dist/wirings/rpc/rpc-runner.js +56 -28
  129. package/dist/wirings/rpc/rpc-types.d.ts +14 -2
  130. package/dist/wirings/rpc/wire-addon.d.ts +10 -0
  131. package/dist/wirings/rpc/wire-addon.js +9 -0
  132. package/dist/wirings/scheduler/index.d.ts +1 -1
  133. package/dist/wirings/scheduler/index.js +1 -1
  134. package/dist/wirings/scheduler/log-schedulers.d.ts +1 -1
  135. package/dist/wirings/scheduler/scheduler-runner.d.ts +3 -10
  136. package/dist/wirings/scheduler/scheduler-runner.js +4 -25
  137. package/dist/wirings/scheduler/scheduler.types.d.ts +2 -2
  138. package/dist/wirings/trigger/pikku-trigger-service.d.ts +2 -6
  139. package/dist/wirings/trigger/pikku-trigger-service.js +11 -16
  140. package/dist/wirings/trigger/trigger-runner.d.ts +1 -5
  141. package/dist/wirings/trigger/trigger-runner.js +4 -3
  142. package/dist/wirings/workflow/pikku-workflow-service.d.ts +2 -6
  143. package/dist/wirings/workflow/pikku-workflow-service.js +20 -29
  144. package/dist/wirings/workflow/workflow.types.d.ts +2 -2
  145. package/package.json +4 -2
  146. package/src/crypto-utils.test.ts +116 -0
  147. package/src/errors/error.test.ts +143 -2
  148. package/src/errors/errors.ts +10 -0
  149. package/src/errors/index.ts +1 -0
  150. package/src/function/function-runner.test.ts +2 -2
  151. package/src/function/function-runner.ts +72 -49
  152. package/src/function/functions.types.ts +1 -0
  153. package/src/handle-error.test.ts +361 -0
  154. package/src/handle-error.ts +4 -4
  155. package/src/index.ts +3 -10
  156. package/src/internal.ts +6 -0
  157. package/src/middleware/auth-apikey.test.ts +1 -1
  158. package/src/middleware/auth-bearer.test.ts +1 -1
  159. package/src/middleware/auth-bearer.ts +2 -5
  160. package/src/middleware/auth-cookie.test.ts +1 -1
  161. package/src/middleware/auth-cookie.ts +3 -5
  162. package/src/middleware/cors.test.ts +424 -0
  163. package/src/middleware/cors.ts +14 -6
  164. package/src/middleware/remote-auth.test.ts +488 -0
  165. package/src/middleware-runner.test.ts +1 -1
  166. package/src/middleware-runner.ts +2 -1
  167. package/src/permissions.test.ts +2 -2
  168. package/src/permissions.ts +3 -2
  169. package/src/pikku-state.test.ts +224 -0
  170. package/src/pikku-state.ts +45 -28
  171. package/src/schema.test.ts +198 -6
  172. package/src/schema.ts +11 -7
  173. package/src/services/ai-agent-runner-service.ts +15 -3
  174. package/src/services/ai-run-state-service.ts +1 -1
  175. package/src/services/ai-storage-service.ts +1 -1
  176. package/src/services/content-service.ts +7 -0
  177. package/src/services/gateway-service.ts +20 -0
  178. package/src/services/gopass-secrets.ts +4 -1
  179. package/src/services/in-memory-ai-run-state-service.ts +73 -0
  180. package/src/services/in-memory-trigger-service.ts +6 -10
  181. package/src/services/in-memory-workflow-service.test.ts +351 -0
  182. package/src/services/index.ts +4 -1
  183. package/src/services/local-content.ts +9 -3
  184. package/src/services/local-gateway-service.ts +62 -0
  185. package/src/services/local-secrets.test.ts +80 -0
  186. package/src/services/local-secrets.ts +2 -2
  187. package/src/services/local-variables.test.ts +61 -0
  188. package/src/services/local-variables.ts +1 -1
  189. package/src/services/logger-console.test.ts +118 -0
  190. package/src/services/logger-console.ts +2 -1
  191. package/src/services/scheduler-service.ts +0 -18
  192. package/src/services/scoped-secret-service.test.ts +74 -0
  193. package/src/services/scoped-secret-service.ts +1 -1
  194. package/src/services/trigger-service.ts +0 -21
  195. package/src/services/typed-secret-service.test.ts +93 -0
  196. package/src/services/typed-variables-service.test.ts +73 -0
  197. package/src/services/user-session-service.test.ts +113 -0
  198. package/src/services/user-session-service.ts +3 -3
  199. package/src/services/workflow-service.ts +2 -12
  200. package/src/time-utils.test.ts +1 -1
  201. package/src/types/core.types.ts +28 -19
  202. package/src/types/state.types.ts +32 -15
  203. package/src/utils.test.ts +350 -0
  204. package/src/utils.ts +14 -13
  205. package/src/wirings/ai-agent/ai-agent-assistant-ui.test.ts +363 -0
  206. package/src/wirings/ai-agent/ai-agent-assistant-ui.ts +238 -0
  207. package/src/wirings/ai-agent/ai-agent-helpers.test.ts +152 -0
  208. package/src/wirings/ai-agent/ai-agent-helpers.ts +76 -0
  209. package/src/wirings/ai-agent/ai-agent-memory.ts +10 -1
  210. package/src/wirings/ai-agent/ai-agent-model-config.test.ts +115 -0
  211. package/src/wirings/ai-agent/ai-agent-prepare.ts +98 -46
  212. package/src/wirings/ai-agent/ai-agent-registry.ts +1 -1
  213. package/src/wirings/ai-agent/ai-agent-runner.test.ts +245 -3
  214. package/src/wirings/ai-agent/ai-agent-runner.ts +121 -7
  215. package/src/wirings/ai-agent/ai-agent-stream.test.ts +430 -24
  216. package/src/wirings/ai-agent/ai-agent-stream.ts +390 -104
  217. package/src/wirings/ai-agent/ai-agent.types.ts +91 -4
  218. package/src/wirings/ai-agent/index.ts +13 -0
  219. package/src/wirings/channel/channel-common.ts +2 -2
  220. package/src/wirings/channel/channel-handler.ts +43 -11
  221. package/src/wirings/channel/channel-middleware-runner.ts +1 -0
  222. package/src/wirings/channel/channel-runner.ts +6 -6
  223. package/src/wirings/channel/channel-store.ts +1 -1
  224. package/src/wirings/channel/channel.types.ts +15 -8
  225. package/src/wirings/channel/index.ts +1 -0
  226. package/src/wirings/channel/local/local-channel-handler.ts +26 -0
  227. package/src/wirings/channel/local/local-channel-runner.test.ts +19 -12
  228. package/src/wirings/channel/local/local-channel-runner.ts +33 -14
  229. package/src/wirings/channel/local/local-eventhub-service.test.ts +2 -2
  230. package/src/wirings/channel/local/local-eventhub-service.ts +2 -2
  231. package/src/wirings/channel/log-channels.ts +1 -1
  232. package/src/wirings/channel/pikku-abstract-channel-handler.test.ts +2 -0
  233. package/src/wirings/channel/pikku-abstract-channel-handler.ts +8 -1
  234. package/src/wirings/channel/serverless/serverless-channel-runner.ts +38 -33
  235. package/src/wirings/cli/channel/cli-channel-runner.ts +1 -1
  236. package/src/wirings/cli/cli-runner.test.ts +1 -1
  237. package/src/wirings/cli/cli-runner.ts +14 -4
  238. package/src/wirings/cli/cli.types.ts +3 -3
  239. package/src/wirings/cli/command-parser.test.ts +1 -1
  240. package/src/wirings/cli/command-parser.ts +1 -1
  241. package/src/wirings/gateway/gateway-runner.test.ts +474 -0
  242. package/src/wirings/gateway/gateway-runner.ts +411 -0
  243. package/src/wirings/gateway/gateway.types.ts +149 -0
  244. package/src/wirings/gateway/index.ts +13 -0
  245. package/src/wirings/http/http-routes.test.ts +1 -1
  246. package/src/wirings/http/http-runner.test.ts +9 -17
  247. package/src/wirings/http/http-runner.ts +46 -27
  248. package/src/wirings/http/http.types.ts +1 -14
  249. package/src/wirings/http/log-http-routes.ts +1 -1
  250. package/src/wirings/http/pikku-fetch-http-request.ts +1 -1
  251. package/src/wirings/http/pikku-fetch-http-response.ts +12 -5
  252. package/src/wirings/http/routers/http-router.ts +1 -1
  253. package/src/wirings/http/routers/path-to-regex.test.ts +1 -1
  254. package/src/wirings/http/routers/path-to-regex.ts +4 -3
  255. package/src/wirings/mcp/mcp-endpoint-registry.ts +5 -1
  256. package/src/wirings/mcp/mcp-runner.ts +9 -15
  257. package/src/wirings/mcp/mcp.types.ts +2 -2
  258. package/src/wirings/oauth2/oauth2-client.ts +3 -3
  259. package/src/wirings/oauth2/wire-oauth2-credential.ts +1 -1
  260. package/src/wirings/queue/index.ts +0 -1
  261. package/src/wirings/queue/queue-runner.test.ts +52 -25
  262. package/src/wirings/queue/queue-runner.ts +8 -30
  263. package/src/wirings/queue/queue.types.ts +3 -13
  264. package/src/wirings/queue/register-queue-helper.ts +3 -5
  265. package/src/wirings/queue/validate-worker-config.test.ts +108 -0
  266. package/src/wirings/queue/validate-worker-config.ts +4 -1
  267. package/src/wirings/rpc/index.ts +2 -0
  268. package/src/wirings/rpc/rpc-runner.ts +92 -49
  269. package/src/wirings/rpc/rpc-types.ts +17 -2
  270. package/src/wirings/rpc/wire-addon.ts +20 -0
  271. package/src/wirings/scheduler/index.ts +0 -1
  272. package/src/wirings/scheduler/log-schedulers.ts +1 -1
  273. package/src/wirings/scheduler/scheduler-runner.test.ts +49 -60
  274. package/src/wirings/scheduler/scheduler-runner.ts +9 -56
  275. package/src/wirings/scheduler/scheduler.types.ts +2 -2
  276. package/src/wirings/secret/validate-secret-definitions.test.ts +140 -0
  277. package/src/wirings/trigger/pikku-trigger-service.ts +17 -39
  278. package/src/wirings/trigger/trigger-runner.test.ts +79 -0
  279. package/src/wirings/trigger/trigger-runner.ts +8 -11
  280. package/src/wirings/variable/validate-variable-definitions.test.ts +91 -0
  281. package/src/wirings/workflow/graph/graph-runner.test.ts +14 -22
  282. package/src/wirings/workflow/graph/template.test.ts +49 -0
  283. package/src/wirings/workflow/pikku-workflow-service.test.ts +15 -27
  284. package/src/wirings/workflow/pikku-workflow-service.ts +29 -45
  285. package/src/wirings/workflow/workflow-helpers.test.ts +129 -0
  286. package/src/wirings/workflow/workflow.types.ts +2 -2
  287. package/tsconfig.tsbuildinfo +1 -1
  288. package/src/wirings/workflow/workflow-utils.ts +0 -0
  289. /package/dist/{wirings/workflow/workflow-utils.d.ts → services/gateway-service.js} +0 -0
  290. /package/dist/wirings/{workflow/workflow-utils.js → gateway/gateway.types.js} +0 -0
@@ -1,4 +1,6 @@
1
+ export { agent, agentStream, agentResume, agentApprove, } from './ai-agent-helpers.js';
1
2
  export { runAIAgent } from './ai-agent-runner.js';
2
3
  export { streamAIAgent, resumeAIAgent } from './ai-agent-stream.js';
4
+ export { createAssistantUIChannel, parseAssistantUIInput, } from './ai-agent-assistant-ui.js';
3
5
  export { ToolApprovalRequired, } from './ai-agent-prepare.js';
4
6
  export { addAIAgent, approveAIAgent, getAIAgents, getAIAgentsMeta, } from './ai-agent-registry.js';
@@ -1,5 +1,5 @@
1
- import { CoreSingletonServices, MiddlewareMetadata } from '../../types/core.types.js';
2
- import { CoreChannel, ChannelMessageMeta } from './channel.types.js';
1
+ import type { CoreSingletonServices, MiddlewareMetadata } from '../../types/core.types.js';
2
+ import type { CoreChannel, ChannelMessageMeta } from './channel.types.js';
3
3
  /**
4
4
  * Runs a channel lifecycle function (onConnect or onDisconnect) with proper middleware handling.
5
5
  *
@@ -1,4 +1,7 @@
1
- import { CoreServices, CoreUserSession } from '../../types/core.types.js';
2
- import { CoreChannel, PikkuChannelHandler } from './channel.types.js';
3
- import { SessionService } from '../../services/user-session-service.js';
4
- export declare const processMessageHandlers: (services: CoreServices, channelConfig: CoreChannel<any, any>, channelHandler: PikkuChannelHandler, userSession?: SessionService<CoreUserSession>) => (rawData: any) => Promise<unknown>;
1
+ import type { CoreServices, CoreUserSession } from '../../types/core.types.js';
2
+ import type { BinaryData, CoreChannel, PikkuChannelHandler } from './channel.types.js';
3
+ import type { SessionService } from '../../services/user-session-service.js';
4
+ export declare const processMessageHandlers: (services: CoreServices, channelConfig: CoreChannel<any, any>, channelHandler: PikkuChannelHandler, userSession?: SessionService<CoreUserSession>) => {
5
+ onMessage: (rawData: unknown) => Promise<unknown>;
6
+ onBinaryMessage: ((data: BinaryData) => Promise<BinaryData | void>) | undefined;
7
+ };
@@ -1,6 +1,6 @@
1
1
  import { pikkuState } from '../../pikku-state.js';
2
2
  import { runPikkuFunc } from '../../function/function-runner.js';
3
- import { createMiddlewareSessionWireProps, } from '../../services/user-session-service.js';
3
+ import { createMiddlewareSessionWireProps } from '../../services/user-session-service.js';
4
4
  const getChannelMeta = (channelName) => {
5
5
  return pikkuState(null, 'channel', 'meta')[channelName];
6
6
  };
@@ -39,7 +39,7 @@ export const processMessageHandlers = (services, channelConfig, channelHandler,
39
39
  const logger = services.logger;
40
40
  const requiresSession = channelConfig.auth !== false;
41
41
  const processMessage = async (data, onMessage, routingProperty, routerValue) => {
42
- if (!validateAuth(requiresSession, channelHandler, onMessage)) {
42
+ if (!validateAuth(requiresSession, userSession?.get(), onMessage)) {
43
43
  const routeMessage = routingProperty
44
44
  ? `route '${routingProperty}:${routerValue}'`
45
45
  : 'the default message route';
@@ -91,7 +91,7 @@ export const processMessageHandlers = (services, channelConfig, channelHandler,
91
91
  },
92
92
  });
93
93
  };
94
- return async (rawData) => {
94
+ const onMessage = async (rawData) => {
95
95
  let result;
96
96
  let processed = false;
97
97
  // Route-specific handling
@@ -100,7 +100,7 @@ export const processMessageHandlers = (services, channelConfig, channelHandler,
100
100
  try {
101
101
  messageData = JSON.parse(rawData);
102
102
  }
103
- catch (error) {
103
+ catch {
104
104
  // Most likely a json error.. ignore
105
105
  }
106
106
  if (messageData) {
@@ -130,8 +130,18 @@ export const processMessageHandlers = (services, channelConfig, channelHandler,
130
130
  }
131
131
  if (!processed) {
132
132
  logger.error(`No handler found for message in channel ${channelConfig.name} for ${JSON.stringify(rawData)}`);
133
- logger.error(`Channel ${JSON.stringify(channelConfig)}`);
133
+ logger.error(`Channel config name: ${channelConfig.name}`);
134
134
  }
135
135
  return result;
136
136
  };
137
+ const onBinaryMessage = channelConfig.onBinaryMessage
138
+ ? async (data) => {
139
+ if (!validateAuth(requiresSession, userSession?.get(), channelConfig)) {
140
+ logger.error(`Channel ${channelConfig.name} with id ${channelHandler.getChannel().channelId} requires a session for binary message`);
141
+ return;
142
+ }
143
+ return channelConfig.onBinaryMessage(services, data, channelHandler.getChannel());
144
+ }
145
+ : undefined;
146
+ return { onMessage, onBinaryMessage };
137
147
  };
@@ -68,6 +68,7 @@ export function wrapChannelWithMiddleware(wire, services, middlewares) {
68
68
  channel: {
69
69
  ...channel,
70
70
  send: ((data) => dispatch(0, data)),
71
+ sendBinary: channel.sendBinary,
71
72
  },
72
73
  };
73
74
  }
@@ -1,13 +1,13 @@
1
- import { CorePikkuPermission } from '../../function/functions.types.js';
2
- import { SessionService } from '../../services/user-session-service.js';
3
- import { CorePikkuMiddleware } from '../../types/core.types.js';
4
- import { ChannelMeta, CoreChannel, RunChannelOptions, RunChannelParams } from './channel.types.js';
1
+ import type { CorePikkuPermission } from '../../function/functions.types.js';
2
+ import type { SessionService } from '../../services/user-session-service.js';
3
+ import type { CorePikkuMiddleware } from '../../types/core.types.js';
4
+ import type { ChannelMeta, CoreChannel, RunChannelOptions, RunChannelParams } from './channel.types.js';
5
5
  /**
6
6
  * Adds a channel and registers all functions referenced in it using the
7
7
  * function names already stored in the channel metadata
8
8
  */
9
9
  export declare const wireChannel: <In, Channel extends string, PikkuPermission extends CorePikkuPermission<In>, PikkuMiddleware extends CorePikkuMiddleware, ChannelFunction>(channel: CoreChannel<In, Channel, PikkuPermission, PikkuMiddleware, ChannelFunction>) => void;
10
- export declare const openChannel: ({ route, singletonServices, coerceDataFromSchema, request, }: Pick<CoreChannel<unknown, string>, "route"> & RunChannelParams<unknown> & {
10
+ export declare const openChannel: ({ route, coerceDataFromSchema, request, }: Pick<CoreChannel<unknown, string>, "route"> & RunChannelParams<unknown> & {
11
11
  userSession: SessionService<any>;
12
12
  } & RunChannelOptions) => Promise<{
13
13
  openingData: unknown;
@@ -1,6 +1,6 @@
1
1
  import { NotFoundError, PikkuMissingMetaError } from '../../errors/errors.js';
2
2
  import { addFunction } from '../../function/function-runner.js';
3
- import { pikkuState } from '../../pikku-state.js';
3
+ import { pikkuState, getSingletonServices } from '../../pikku-state.js';
4
4
  import { coerceTopLevelDataFromSchema, validateSchema } from '../../schema.js';
5
5
  import { httpRouter } from '../http/routers/http-router.js';
6
6
  /**
@@ -75,7 +75,8 @@ const getMatchingChannelConfig = (path) => {
75
75
  meta: channelMeta,
76
76
  };
77
77
  };
78
- export const openChannel = async ({ route, singletonServices, coerceDataFromSchema = true, request, }) => {
78
+ export const openChannel = async ({ route, coerceDataFromSchema = true, request, }) => {
79
+ const singletonServices = getSingletonServices();
79
80
  const matchingChannel = getMatchingChannelConfig(route);
80
81
  if (!matchingChannel) {
81
82
  singletonServices.logger.info(`Channel not found: ${route}`);
@@ -1,4 +1,4 @@
1
- import { CoreUserSession } from '../../types/core.types.js';
1
+ import type { CoreUserSession } from '../../types/core.types.js';
2
2
  export type Channel<ChannelType = unknown, OpeningData = unknown> = {
3
3
  channelId: string;
4
4
  channelName: string;
@@ -1,9 +1,10 @@
1
- import { PikkuError } from '../../errors/error-handler.js';
2
- import { HTTPFunctionMetaInputTypes, PikkuHTTPRequest, PikkuHTTPResponse } from '../http/http.types.js';
3
- import { CoreSingletonServices, CreateWireServices, CorePikkuMiddleware, MiddlewareMetadata, PermissionMetadata } from '../../types/core.types.js';
1
+ import type { PikkuError } from '../../errors/error-handler.js';
2
+ import type { HTTPFunctionMetaInputTypes, PikkuHTTPRequest, PikkuHTTPResponse } from '../http/http.types.js';
3
+ import type { CorePikkuMiddleware, MiddlewareMetadata, PermissionMetadata } from '../../types/core.types.js';
4
+ export type BinaryData = ArrayBuffer | Uint8Array;
4
5
  export type CorePikkuChannelMiddleware<Services = any, Event = unknown> = (services: Services, event: Event, next: (event: Event | Event[] | null) => Promise<void> | void) => Promise<void> | void;
5
6
  export type CorePikkuChannelMiddlewareFactory<In = any, Services = any, Event = unknown> = (input: In) => CorePikkuChannelMiddleware<Services, Event>;
6
- import { CorePermissionGroup, CorePikkuFunction, CorePikkuFunctionConfig, CorePikkuFunctionSessionless, CorePikkuPermission } from '../../function/functions.types.js';
7
+ import type { CorePermissionGroup, CorePikkuFunction, CorePikkuFunctionConfig, CorePikkuFunctionSessionless, CorePikkuPermission } from '../../function/functions.types.js';
7
8
  export type RunChannelOptions = Partial<{
8
9
  skipUserSession: boolean;
9
10
  respondWith404: boolean;
@@ -13,10 +14,8 @@ export type RunChannelOptions = Partial<{
13
14
  }>;
14
15
  export type RunChannelParams<ChannelData> = {
15
16
  channelId: string;
16
- singletonServices: CoreSingletonServices;
17
17
  request?: PikkuHTTPRequest<ChannelData>;
18
18
  response?: PikkuHTTPResponse;
19
- createWireServices?: CreateWireServices;
20
19
  };
21
20
  export interface ChannelMessageMeta {
22
21
  pikkuFuncId: string;
@@ -38,6 +37,7 @@ export interface ChannelMeta {
38
37
  disconnect: ChannelMessageMeta | null;
39
38
  message: ChannelMessageMeta | null;
40
39
  messageWirings: Record<string, Record<string, ChannelMessageMeta>>;
40
+ binary?: boolean | null;
41
41
  summary?: string;
42
42
  description?: string;
43
43
  errors?: string[];
@@ -69,6 +69,8 @@ export type CoreChannel<ChannelData, Channel extends string, ChannelConnect = Co
69
69
  channelMiddleware?: Array<CorePikkuChannelMiddleware | CorePikkuChannelMiddlewareFactory>;
70
70
  permissions?: CorePermissionGroup<PikkuPermission>;
71
71
  auth?: boolean;
72
+ binary?: boolean | null;
73
+ onBinaryMessage?: (services: any, data: BinaryData, channel: PikkuChannel<ChannelData, any>) => Promise<BinaryData | void> | BinaryData | void;
72
74
  docs?: Partial<{
73
75
  description: string;
74
76
  response: string;
@@ -81,11 +83,13 @@ export interface PikkuChannel<OpeningData, out Out> {
81
83
  channelId: string;
82
84
  openingData: OpeningData;
83
85
  send(data: Out, isBinary?: boolean): Promise<void> | void;
86
+ sendBinary(data: BinaryData): Promise<void> | void;
84
87
  close(): Promise<void> | void;
85
88
  state: 'initial' | 'open' | 'closed';
86
89
  }
87
90
  export interface PikkuChannelHandler<OpeningData = unknown, Out = unknown> {
88
91
  send(message: Out, isBinary?: boolean): Promise<void> | void;
92
+ sendBinary(data: BinaryData): Promise<void> | void;
89
93
  getChannel(): PikkuChannel<OpeningData, Out>;
90
94
  }
91
95
  export type PikkuChannelHandlerFactory<OpeningData = unknown, Out = unknown> = (channelId: string, channelName: string, openingData: OpeningData) => PikkuChannelHandler<OpeningData, Out>;
@@ -6,5 +6,5 @@ export type { EventHubService } from './eventhub-service.js';
6
6
  export { ChannelStore } from './channel-store.js';
7
7
  export type { Channel } from './channel-store.js';
8
8
  export { EventHubStore } from './eventhub-store.js';
9
- export type { ChannelsMeta, CoreChannel, CorePikkuChannelMiddleware, CorePikkuChannelMiddlewareFactory, ChannelMessageMeta, ChannelMeta, PikkuChannel, PikkuChannelHandlerFactory, } from './channel.types.js';
9
+ export type { BinaryData, ChannelsMeta, CoreChannel, CorePikkuChannelMiddleware, CorePikkuChannelMiddlewareFactory, ChannelMessageMeta, ChannelMeta, PikkuChannel, PikkuChannelHandlerFactory, } from './channel.types.js';
10
10
  export { defineChannelRoutes } from './define-channel-routes.js';
@@ -1,15 +1,22 @@
1
+ import type { BinaryData } from '../channel.types.js';
1
2
  import { PikkuAbstractChannelHandler } from '../pikku-abstract-channel-handler.js';
2
3
  export declare class PikkuLocalChannelHandler<OpeningData = unknown, Out = unknown> extends PikkuAbstractChannelHandler<OpeningData, Out> {
3
4
  private onMessageCallback?;
5
+ private onBinaryMessageCallback?;
4
6
  private openCallBack?;
5
7
  private closeCallback?;
6
8
  private sendCallback?;
9
+ private sendBinaryCallback?;
7
10
  registerOnOpen(callback: () => void): void;
8
11
  open(): void;
9
12
  registerOnMessage(callback: (data: any) => Promise<unknown>): void;
10
13
  message(data: unknown): Promise<unknown>;
14
+ registerOnBinaryMessage(callback: (data: BinaryData) => Promise<BinaryData | void> | BinaryData | void): void;
15
+ binaryMessage(data: BinaryData): Promise<BinaryData | void>;
11
16
  registerOnClose(callback: () => void): void;
12
17
  close(): void;
13
18
  registerOnSend(send: (message: Out) => void): void;
14
19
  send(message: Out, isBinary?: boolean): void;
20
+ registerOnSendBinary(send: (data: BinaryData) => void): void;
21
+ sendBinary(data: BinaryData): void;
15
22
  }
@@ -1,9 +1,11 @@
1
1
  import { PikkuAbstractChannelHandler } from '../pikku-abstract-channel-handler.js';
2
2
  export class PikkuLocalChannelHandler extends PikkuAbstractChannelHandler {
3
3
  onMessageCallback;
4
+ onBinaryMessageCallback;
4
5
  openCallBack;
5
6
  closeCallback;
6
7
  sendCallback;
8
+ sendBinaryCallback;
7
9
  registerOnOpen(callback) {
8
10
  this.openCallBack = callback;
9
11
  }
@@ -19,6 +21,12 @@ export class PikkuLocalChannelHandler extends PikkuAbstractChannelHandler {
19
21
  async message(data) {
20
22
  return this.onMessageCallback?.(data);
21
23
  }
24
+ registerOnBinaryMessage(callback) {
25
+ this.onBinaryMessageCallback = callback;
26
+ }
27
+ async binaryMessage(data) {
28
+ return this.onBinaryMessageCallback?.(data);
29
+ }
22
30
  registerOnClose(callback) {
23
31
  this.closeCallback = callback;
24
32
  }
@@ -38,4 +46,13 @@ export class PikkuLocalChannelHandler extends PikkuAbstractChannelHandler {
38
46
  }
39
47
  return this.sendCallback?.(message, isBinary);
40
48
  }
49
+ registerOnSendBinary(send) {
50
+ this.sendBinaryCallback = send;
51
+ }
52
+ sendBinary(data) {
53
+ if (!this.sendBinaryCallback) {
54
+ throw new Error('No sendBinary callback registered');
55
+ }
56
+ this.sendBinaryCallback(data);
57
+ }
41
58
  }
@@ -1,3 +1,8 @@
1
- import { CoreChannel, RunChannelOptions, RunChannelParams } from '../channel.types.js';
1
+ import type { CoreChannel, RunChannelOptions } from '../channel.types.js';
2
2
  import { PikkuLocalChannelHandler } from './local-channel-handler.js';
3
- export declare const runLocalChannel: ({ singletonServices, channelId, request, response, route, createWireServices, skipUserSession, respondWith404, coerceDataFromSchema, logWarningsForStatusCodes, bubbleErrors, }: Partial<Pick<CoreChannel<unknown, any>, "route">> & RunChannelOptions & RunChannelParams<unknown>) => Promise<PikkuLocalChannelHandler | void>;
3
+ import type { PikkuHTTPRequest, PikkuHTTPResponse } from '../../http/http.types.js';
4
+ export declare const runLocalChannel: ({ channelId, request, response, route, skipUserSession, respondWith404, coerceDataFromSchema, logWarningsForStatusCodes, bubbleErrors, }: Partial<Pick<CoreChannel<unknown, any>, "route">> & RunChannelOptions & {
5
+ channelId: string;
6
+ request?: PikkuHTTPRequest;
7
+ response?: PikkuHTTPResponse;
8
+ }) => Promise<PikkuLocalChannelHandler | void>;
@@ -6,7 +6,10 @@ import { PikkuLocalChannelHandler } from './local-channel-handler.js';
6
6
  import { handleHTTPError } from '../../../handle-error.js';
7
7
  import { PikkuSessionService, createMiddlewareSessionWireProps, } from '../../../services/user-session-service.js';
8
8
  import { runChannelLifecycleWithMiddleware } from '../channel-common.js';
9
- export const runLocalChannel = async ({ singletonServices, channelId, request, response, route, createWireServices, skipUserSession = false, respondWith404 = true, coerceDataFromSchema = true, logWarningsForStatusCodes = [], bubbleErrors = false, }) => {
9
+ import { getSingletonServices, getCreateWireServices, } from '../../../pikku-state.js';
10
+ export const runLocalChannel = async ({ channelId, request, response, route, skipUserSession = false, respondWith404 = true, coerceDataFromSchema = true, logWarningsForStatusCodes = [], bubbleErrors = false, }) => {
11
+ const singletonServices = getSingletonServices();
12
+ const createWireServices = getCreateWireServices();
10
13
  let wireServices;
11
14
  let closedWireServices = false;
12
15
  let channelHandler;
@@ -21,12 +24,10 @@ export const runLocalChannel = async ({ singletonServices, channelId, request, r
21
24
  ;
22
25
  ({ openingData, channelConfig, meta } = await openChannel({
23
26
  channelId,
24
- createWireServices,
25
27
  respondWith404,
26
28
  request,
27
29
  response,
28
30
  route,
29
- singletonServices,
30
31
  skipUserSession,
31
32
  coerceDataFromSchema,
32
33
  userSession,
@@ -98,7 +99,7 @@ export const runLocalChannel = async ({ singletonServices, channelId, request, r
98
99
  }
99
100
  await closeServices();
100
101
  });
101
- const onMessage = processMessageHandlers(services, channelConfig, channelHandler, userSession);
102
+ const { onMessage, onBinaryMessage } = processMessageHandlers(services, channelConfig, channelHandler, userSession);
102
103
  channelHandler.registerOnMessage(async (data) => {
103
104
  try {
104
105
  const result = await onMessage(data);
@@ -109,6 +110,19 @@ export const runLocalChannel = async ({ singletonServices, channelId, request, r
109
110
  channel.send({ error: e.message || 'Unknown error' });
110
111
  }
111
112
  });
113
+ if (onBinaryMessage) {
114
+ channelHandler.registerOnBinaryMessage(async (data) => {
115
+ try {
116
+ const result = await onBinaryMessage(data);
117
+ if (result) {
118
+ await channel.sendBinary(result);
119
+ }
120
+ }
121
+ catch (e) {
122
+ singletonServices.logger.error(`Error handling binary message: ${e.message}`);
123
+ }
124
+ });
125
+ }
112
126
  }
113
127
  catch (e) {
114
128
  handleHTTPError(e, http, channelId, singletonServices.logger, logWarningsForStatusCodes, respondWith404, bubbleErrors);
@@ -1,5 +1,5 @@
1
- import { PikkuChannelHandler } from '../channel.types.js';
2
- import { EventHubService } from '../eventhub-service.js';
1
+ import type { PikkuChannelHandler } from '../channel.types.js';
2
+ import type { EventHubService } from '../eventhub-service.js';
3
3
  /**
4
4
  * Implementation of the SubscriptionService interface.
5
5
  * Manages subscriptions and publishes messages to subscribers.
@@ -1,4 +1,4 @@
1
- import { Logger } from '../../services/index.js';
1
+ import type { Logger } from '../../services/index.js';
2
2
  /**
3
3
  * Logs all the loaded channels.
4
4
  * @param logger - A logger for logging information.
@@ -1,4 +1,4 @@
1
- import { PikkuChannel, PikkuChannelHandler } from './channel.types.js';
1
+ import type { BinaryData, PikkuChannel, PikkuChannelHandler } from './channel.types.js';
2
2
  export declare abstract class PikkuAbstractChannelHandler<OpeningData = unknown, Out = unknown> implements PikkuChannelHandler<OpeningData, Out> {
3
3
  channelId: string;
4
4
  channelName: string;
@@ -6,6 +6,7 @@ export declare abstract class PikkuAbstractChannelHandler<OpeningData = unknown,
6
6
  protected channel?: PikkuChannel<OpeningData, Out>;
7
7
  constructor(channelId: string, channelName: string, openingData: OpeningData);
8
8
  abstract send(message: Out, isBinary?: boolean): Promise<void> | void;
9
+ abstract sendBinary(data: BinaryData): Promise<void> | void;
9
10
  getChannel(): PikkuChannel<OpeningData, Out>;
10
11
  open(): void;
11
12
  close(): Promise<void> | void;
@@ -14,6 +14,7 @@ export class PikkuAbstractChannelHandler {
14
14
  channelId: this.channelId,
15
15
  openingData: this.openingData,
16
16
  send: this.send.bind(this),
17
+ sendBinary: this.sendBinary.bind(this),
17
18
  close: this.close.bind(this),
18
19
  state: 'initial',
19
20
  };
@@ -1,10 +1,10 @@
1
1
  import type { CoreChannel, RunChannelOptions, RunChannelParams, PikkuChannelHandlerFactory } from '../channel.types.js';
2
- import { ChannelStore } from '../channel-store.js';
2
+ import type { ChannelStore } from '../channel-store.js';
3
3
  export interface RunServerlessChannelParams<ChannelData> extends RunChannelParams<ChannelData> {
4
4
  channelStore: ChannelStore;
5
5
  channelHandlerFactory: PikkuChannelHandlerFactory;
6
6
  channelObject?: unknown;
7
7
  }
8
- export declare const runChannelConnect: ({ singletonServices, channelId, channelObject, request, response, route, createWireServices, channelStore, channelHandlerFactory, coerceDataFromSchema, logWarningsForStatusCodes, respondWith404, bubbleErrors, }: Pick<CoreChannel<unknown, any>, "route"> & RunChannelOptions & RunServerlessChannelParams<unknown>) => Promise<void>;
9
- export declare const runChannelDisconnect: ({ singletonServices, ...params }: RunServerlessChannelParams<unknown>) => Promise<void>;
10
- export declare const runChannelMessage: ({ singletonServices, ...params }: RunServerlessChannelParams<unknown>, data: unknown) => Promise<unknown>;
8
+ export declare const runChannelConnect: ({ channelId, channelObject, request, response, route, channelStore, channelHandlerFactory, coerceDataFromSchema, logWarningsForStatusCodes, respondWith404, bubbleErrors, }: Pick<CoreChannel<unknown, any>, "route"> & RunChannelOptions & RunServerlessChannelParams<unknown>) => Promise<void>;
9
+ export declare const runChannelDisconnect: ({ channelId, channelStore, channelHandlerFactory, }: RunServerlessChannelParams<unknown>) => Promise<void>;
10
+ export declare const runChannelMessage: ({ channelId, channelStore, channelHandlerFactory, }: RunServerlessChannelParams<unknown>, data: unknown) => Promise<unknown>;
@@ -4,7 +4,7 @@ import { openChannel } from '../channel-runner.js';
4
4
  import { createHTTPWire } from '../../http/http-runner.js';
5
5
  import { handleHTTPError } from '../../../handle-error.js';
6
6
  import { PikkuSessionService, createMiddlewareSessionWireProps, } from '../../../services/user-session-service.js';
7
- import { pikkuState } from '../../../pikku-state.js';
7
+ import { getSingletonServices, getCreateWireServices, pikkuState, } from '../../../pikku-state.js';
8
8
  import { PikkuFetchHTTPRequest } from '../../http/pikku-fetch-http-request.js';
9
9
  import { runChannelLifecycleWithMiddleware } from '../channel-common.js';
10
10
  const getVariablesForChannel = ({ channelId, channelName, channelHandlerFactory, openingData, }) => {
@@ -26,7 +26,9 @@ const getVariablesForChannel = ({ channelId, channelName, channelHandlerFactory,
26
26
  meta,
27
27
  };
28
28
  };
29
- export const runChannelConnect = async ({ singletonServices, channelId, channelObject, request, response, route, createWireServices, channelStore, channelHandlerFactory, coerceDataFromSchema = true, logWarningsForStatusCodes = [], respondWith404 = true, bubbleErrors = false, }) => {
29
+ export const runChannelConnect = async ({ channelId, channelObject, request, response, route, channelStore, channelHandlerFactory, coerceDataFromSchema = true, logWarningsForStatusCodes = [], respondWith404 = true, bubbleErrors = false, }) => {
30
+ const singletonServices = getSingletonServices();
31
+ const createWireServices = getCreateWireServices();
30
32
  let wireServices;
31
33
  let http;
32
34
  if (request instanceof Request) {
@@ -35,10 +37,8 @@ export const runChannelConnect = async ({ singletonServices, channelId, channelO
35
37
  const userSession = new PikkuSessionService(channelStore, channelId);
36
38
  const { channelConfig, openingData, meta } = await openChannel({
37
39
  channelId,
38
- createWireServices,
39
40
  request,
40
41
  route,
41
- singletonServices,
42
42
  coerceDataFromSchema,
43
43
  userSession,
44
44
  });
@@ -88,7 +88,9 @@ export const runChannelConnect = async ({ singletonServices, channelId, channelO
88
88
  }
89
89
  }
90
90
  };
91
- export const runChannelDisconnect = async ({ singletonServices, ...params }) => {
91
+ export const runChannelDisconnect = async ({ channelId, channelStore, channelHandlerFactory, }) => {
92
+ const singletonServices = getSingletonServices();
93
+ const createWireServices = getCreateWireServices();
92
94
  let wireServices;
93
95
  // Try to get channel from store. In serverless environments (especially with
94
96
  // serverless-offline or worker threads), disconnect can be called multiple times
@@ -96,26 +98,27 @@ export const runChannelDisconnect = async ({ singletonServices, ...params }) =>
96
98
  // there's nothing to disconnect, so we can return early.
97
99
  let channelData;
98
100
  try {
99
- channelData = await params.channelStore.getChannelAndSession(params.channelId);
101
+ channelData = await channelStore.getChannelAndSession(channelId);
100
102
  }
101
- catch (error) {
102
- singletonServices.logger.info(`Channel ${params.channelId} not found during disconnect - already cleaned up`);
103
+ catch {
104
+ singletonServices.logger.info(`Channel ${channelId} not found during disconnect - already cleaned up`);
103
105
  return;
104
106
  }
105
107
  const { openingData, channelName, session } = channelData;
106
108
  const { channel, channelConfig, meta } = getVariablesForChannel({
107
- ...params,
109
+ channelId,
110
+ channelHandlerFactory,
108
111
  openingData,
109
112
  channelName,
110
113
  });
111
- const userSession = new PikkuSessionService(params.channelStore, params.channelId);
114
+ const userSession = new PikkuSessionService(channelStore, channelId);
112
115
  userSession.setInitial(session);
113
116
  const wire = {
114
117
  channel,
115
118
  ...createMiddlewareSessionWireProps(userSession),
116
119
  };
117
- if (!wireServices && params.createWireServices) {
118
- wireServices = await params.createWireServices(singletonServices, wire);
120
+ if (createWireServices) {
121
+ wireServices = await createWireServices(singletonServices, wire);
119
122
  }
120
123
  const services = {
121
124
  ...singletonServices,
@@ -137,27 +140,30 @@ export const runChannelDisconnect = async ({ singletonServices, ...params }) =>
137
140
  singletonServices.logger.error(`Error handling onDisconnect: ${e.message || e}`);
138
141
  }
139
142
  }
140
- await params.channelStore.removeChannels([channel.channelId]);
143
+ await channelStore.removeChannels([channel.channelId]);
141
144
  if (wireServices) {
142
145
  await closeWireServices(singletonServices.logger, wireServices);
143
146
  }
144
147
  };
145
- export const runChannelMessage = async ({ singletonServices, ...params }, data) => {
148
+ export const runChannelMessage = async ({ channelId, channelStore, channelHandlerFactory, }, data) => {
149
+ const singletonServices = getSingletonServices();
150
+ const createWireServices = getCreateWireServices();
146
151
  let wireServices;
147
- const { openingData, channelName, session } = await params.channelStore.getChannelAndSession(params.channelId);
152
+ const { openingData, channelName, session } = await channelStore.getChannelAndSession(channelId);
148
153
  const { channel, channelHandler, channelConfig } = getVariablesForChannel({
149
- ...params,
154
+ channelId,
155
+ channelHandlerFactory,
150
156
  openingData,
151
157
  channelName,
152
158
  });
153
- const userSession = new PikkuSessionService(params.channelStore, params.channelId);
159
+ const userSession = new PikkuSessionService(channelStore, channelId);
154
160
  userSession.setInitial(session);
155
161
  const wire = {
156
162
  channel,
157
163
  ...createMiddlewareSessionWireProps(userSession),
158
164
  };
159
- if (params.createWireServices) {
160
- wireServices = await params.createWireServices(singletonServices, wire);
165
+ if (createWireServices) {
166
+ wireServices = await createWireServices(singletonServices, wire);
161
167
  }
162
168
  const services = {
163
169
  ...singletonServices,
@@ -165,7 +171,7 @@ export const runChannelMessage = async ({ singletonServices, ...params }, data)
165
171
  };
166
172
  let response;
167
173
  try {
168
- const onMessage = processMessageHandlers(services, channelConfig, channelHandler, userSession);
174
+ const { onMessage } = processMessageHandlers(services, channelConfig, channelHandler, userSession);
169
175
  response = await onMessage(data);
170
176
  }
171
177
  catch (e) {
@@ -1,4 +1,4 @@
1
- import { CorePikkuCLIRender } from '../cli.types.js';
1
+ import type { CorePikkuCLIRender } from '../cli.types.js';
2
2
  /**
3
3
  * Execute a CLI program via WebSocket channel
4
4
  * This is the main entry point for CLI-over-Channel clients
@@ -1,5 +1,5 @@
1
- import { CorePikkuMiddleware, CoreUserSession } from '../../types/core.types.js';
2
- import { CoreCLI, CorePikkuCLIRender, CoreCLICommandConfig } from './cli.types.js';
1
+ import type { CorePikkuMiddleware, CoreUserSession } from '../../types/core.types.js';
2
+ import type { CoreCLI, CorePikkuCLIRender, CoreCLICommandConfig } from './cli.types.js';
3
3
  import type { CoreSingletonServices, CoreServices, CreateWireServices, CreateConfig, CreateSingletonServices } from '../../types/core.types.js';
4
4
  /**
5
5
  * CLI command execution error - thrown when CLI execution fails
@@ -207,6 +207,9 @@ export async function runCLICommand({ program, commandPath, data, singletonServi
207
207
  await Promise.resolve(renderer(singletonServices, data, undefined));
208
208
  }
209
209
  },
210
+ sendBinary: () => {
211
+ throw new Error('Binary data is not supported on CLI channels');
212
+ },
210
213
  close: () => {
211
214
  if (channel) {
212
215
  channel.state = 'closed';
@@ -1,6 +1,6 @@
1
- import { CorePikkuMiddleware, CoreSingletonServices, CoreUserSession, CoreServices, MiddlewareMetadata, PermissionMetadata } from '../../types/core.types.js';
2
- import { CorePikkuFunctionConfig, CorePikkuPermission, CorePikkuFunction, CorePikkuFunctionSessionless } from '../../function/functions.types.js';
3
- import { PikkuChannel } from '../channel/channel.types.js';
1
+ import type { CorePikkuMiddleware, CoreSingletonServices, CoreUserSession, CoreServices, MiddlewareMetadata, PermissionMetadata } from '../../types/core.types.js';
2
+ import type { CorePikkuFunctionConfig, CorePikkuPermission, CorePikkuFunction, CorePikkuFunctionSessionless } from '../../function/functions.types.js';
3
+ import type { PikkuChannel } from '../channel/channel.types.js';
4
4
  /**
5
5
  * CLI option definition
6
6
  */
@@ -1,4 +1,4 @@
1
- import { CLIMeta } from './cli.types.js';
1
+ import type { CLIMeta } from './cli.types.js';
2
2
  /**
3
3
  * Result of parsing CLI arguments
4
4
  */
@@ -0,0 +1,24 @@
1
+ import type { CoreGateway } from './gateway.types.js';
2
+ import type { CoreSingletonServices } from '../../types/core.types.js';
3
+ /**
4
+ * Register a messaging gateway.
5
+ *
6
+ * `wireGateway` is a meta-wiring that composes existing primitives
7
+ * (`wireHTTP`, `wireChannel`) under the hood. It does not replace them;
8
+ * it layers on top.
9
+ *
10
+ * @param config - Gateway configuration (name, type, adapter, func, middleware, etc.)
11
+ */
12
+ export declare const wireGateway: (config: CoreGateway) => void;
13
+ /**
14
+ * Create the message handler callback for a listener gateway.
15
+ *
16
+ * Returns a function `(rawData: unknown) => Promise<void>` that can be
17
+ * passed to `adapter.init()`. Used by `LocalGatewayService` (and any
18
+ * other GatewayService implementation) to wire up listener gateways.
19
+ *
20
+ * @param name - Gateway name (for wire.gateway metadata)
21
+ * @param config - The gateway configuration (adapter, func, middleware)
22
+ * @param singletonServices - Singleton services to pass to handler/middleware
23
+ */
24
+ export declare const createListenerMessageHandler: (name: string, config: CoreGateway, singletonServices: CoreSingletonServices) => ((rawData: unknown) => Promise<void>);