@agentuity/runtime 0.1.13 → 0.1.14

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 (272) hide show
  1. package/package.json +8 -8
  2. package/src/_config.ts +13 -0
  3. package/src/_standalone.ts +167 -19
  4. package/src/index.ts +1 -0
  5. package/dist/_config.d.ts +0 -90
  6. package/dist/_config.d.ts.map +0 -1
  7. package/dist/_config.js +0 -135
  8. package/dist/_config.js.map +0 -1
  9. package/dist/_context.d.ts +0 -76
  10. package/dist/_context.d.ts.map +0 -1
  11. package/dist/_context.js +0 -147
  12. package/dist/_context.js.map +0 -1
  13. package/dist/_events.d.ts +0 -64
  14. package/dist/_events.d.ts.map +0 -1
  15. package/dist/_events.js +0 -92
  16. package/dist/_events.js.map +0 -1
  17. package/dist/_idle.d.ts +0 -7
  18. package/dist/_idle.d.ts.map +0 -1
  19. package/dist/_idle.js +0 -10
  20. package/dist/_idle.js.map +0 -1
  21. package/dist/_metadata.d.ts +0 -117
  22. package/dist/_metadata.d.ts.map +0 -1
  23. package/dist/_metadata.js +0 -246
  24. package/dist/_metadata.js.map +0 -1
  25. package/dist/_process-protection.d.ts +0 -25
  26. package/dist/_process-protection.d.ts.map +0 -1
  27. package/dist/_process-protection.js +0 -65
  28. package/dist/_process-protection.js.map +0 -1
  29. package/dist/_server.d.ts +0 -46
  30. package/dist/_server.d.ts.map +0 -1
  31. package/dist/_server.js +0 -85
  32. package/dist/_server.js.map +0 -1
  33. package/dist/_services.d.ts +0 -21
  34. package/dist/_services.d.ts.map +0 -1
  35. package/dist/_services.js +0 -248
  36. package/dist/_services.js.map +0 -1
  37. package/dist/_standalone.d.ts +0 -168
  38. package/dist/_standalone.d.ts.map +0 -1
  39. package/dist/_standalone.js +0 -441
  40. package/dist/_standalone.js.map +0 -1
  41. package/dist/_tokens.d.ts +0 -12
  42. package/dist/_tokens.d.ts.map +0 -1
  43. package/dist/_tokens.js +0 -96
  44. package/dist/_tokens.js.map +0 -1
  45. package/dist/_util.d.ts +0 -16
  46. package/dist/_util.d.ts.map +0 -1
  47. package/dist/_util.js +0 -54
  48. package/dist/_util.js.map +0 -1
  49. package/dist/_validation.d.ts +0 -89
  50. package/dist/_validation.d.ts.map +0 -1
  51. package/dist/_validation.js +0 -29
  52. package/dist/_validation.js.map +0 -1
  53. package/dist/_waituntil.d.ts +0 -18
  54. package/dist/_waituntil.d.ts.map +0 -1
  55. package/dist/_waituntil.js +0 -97
  56. package/dist/_waituntil.js.map +0 -1
  57. package/dist/agent.d.ts +0 -1210
  58. package/dist/agent.d.ts.map +0 -1
  59. package/dist/agent.js +0 -903
  60. package/dist/agent.js.map +0 -1
  61. package/dist/app.d.ts +0 -322
  62. package/dist/app.d.ts.map +0 -1
  63. package/dist/app.js +0 -160
  64. package/dist/app.js.map +0 -1
  65. package/dist/bun-s3-patch.d.ts +0 -37
  66. package/dist/bun-s3-patch.d.ts.map +0 -1
  67. package/dist/bun-s3-patch.js +0 -139
  68. package/dist/bun-s3-patch.js.map +0 -1
  69. package/dist/cors.d.ts +0 -42
  70. package/dist/cors.d.ts.map +0 -1
  71. package/dist/cors.js +0 -117
  72. package/dist/cors.js.map +0 -1
  73. package/dist/devmode.d.ts +0 -3
  74. package/dist/devmode.d.ts.map +0 -1
  75. package/dist/devmode.js +0 -167
  76. package/dist/devmode.js.map +0 -1
  77. package/dist/eval.d.ts +0 -91
  78. package/dist/eval.d.ts.map +0 -1
  79. package/dist/eval.js +0 -16
  80. package/dist/eval.js.map +0 -1
  81. package/dist/handlers/cron.d.ts +0 -47
  82. package/dist/handlers/cron.d.ts.map +0 -1
  83. package/dist/handlers/cron.js +0 -49
  84. package/dist/handlers/cron.js.map +0 -1
  85. package/dist/handlers/index.d.ts +0 -5
  86. package/dist/handlers/index.d.ts.map +0 -1
  87. package/dist/handlers/index.js +0 -5
  88. package/dist/handlers/index.js.map +0 -1
  89. package/dist/handlers/sse.d.ts +0 -91
  90. package/dist/handlers/sse.d.ts.map +0 -1
  91. package/dist/handlers/sse.js +0 -213
  92. package/dist/handlers/sse.js.map +0 -1
  93. package/dist/handlers/stream.d.ts +0 -52
  94. package/dist/handlers/stream.d.ts.map +0 -1
  95. package/dist/handlers/stream.js +0 -116
  96. package/dist/handlers/stream.js.map +0 -1
  97. package/dist/handlers/websocket.d.ts +0 -49
  98. package/dist/handlers/websocket.d.ts.map +0 -1
  99. package/dist/handlers/websocket.js +0 -143
  100. package/dist/handlers/websocket.js.map +0 -1
  101. package/dist/index.d.ts +0 -71
  102. package/dist/index.d.ts.map +0 -1
  103. package/dist/index.js +0 -58
  104. package/dist/index.js.map +0 -1
  105. package/dist/logger/console.d.ts +0 -70
  106. package/dist/logger/console.d.ts.map +0 -1
  107. package/dist/logger/console.js +0 -274
  108. package/dist/logger/console.js.map +0 -1
  109. package/dist/logger/index.d.ts +0 -3
  110. package/dist/logger/index.d.ts.map +0 -1
  111. package/dist/logger/index.js +0 -3
  112. package/dist/logger/index.js.map +0 -1
  113. package/dist/logger/internal.d.ts +0 -79
  114. package/dist/logger/internal.d.ts.map +0 -1
  115. package/dist/logger/internal.js +0 -133
  116. package/dist/logger/internal.js.map +0 -1
  117. package/dist/logger/logger.d.ts +0 -41
  118. package/dist/logger/logger.d.ts.map +0 -1
  119. package/dist/logger/logger.js +0 -2
  120. package/dist/logger/logger.js.map +0 -1
  121. package/dist/logger/user.d.ts +0 -8
  122. package/dist/logger/user.d.ts.map +0 -1
  123. package/dist/logger/user.js +0 -7
  124. package/dist/logger/user.js.map +0 -1
  125. package/dist/logger/util.d.ts +0 -11
  126. package/dist/logger/util.d.ts.map +0 -1
  127. package/dist/logger/util.js +0 -77
  128. package/dist/logger/util.js.map +0 -1
  129. package/dist/middleware.d.ts +0 -112
  130. package/dist/middleware.d.ts.map +0 -1
  131. package/dist/middleware.js +0 -507
  132. package/dist/middleware.js.map +0 -1
  133. package/dist/otel/config.d.ts +0 -19
  134. package/dist/otel/config.d.ts.map +0 -1
  135. package/dist/otel/config.js +0 -26
  136. package/dist/otel/config.js.map +0 -1
  137. package/dist/otel/console.d.ts +0 -33
  138. package/dist/otel/console.d.ts.map +0 -1
  139. package/dist/otel/console.js +0 -86
  140. package/dist/otel/console.js.map +0 -1
  141. package/dist/otel/exporters/index.d.ts +0 -4
  142. package/dist/otel/exporters/index.d.ts.map +0 -1
  143. package/dist/otel/exporters/index.js +0 -4
  144. package/dist/otel/exporters/index.js.map +0 -1
  145. package/dist/otel/exporters/jsonl-log-exporter.d.ts +0 -36
  146. package/dist/otel/exporters/jsonl-log-exporter.d.ts.map +0 -1
  147. package/dist/otel/exporters/jsonl-log-exporter.js +0 -103
  148. package/dist/otel/exporters/jsonl-log-exporter.js.map +0 -1
  149. package/dist/otel/exporters/jsonl-metric-exporter.d.ts +0 -40
  150. package/dist/otel/exporters/jsonl-metric-exporter.d.ts.map +0 -1
  151. package/dist/otel/exporters/jsonl-metric-exporter.js +0 -104
  152. package/dist/otel/exporters/jsonl-metric-exporter.js.map +0 -1
  153. package/dist/otel/exporters/jsonl-trace-exporter.d.ts +0 -36
  154. package/dist/otel/exporters/jsonl-trace-exporter.d.ts.map +0 -1
  155. package/dist/otel/exporters/jsonl-trace-exporter.js +0 -111
  156. package/dist/otel/exporters/jsonl-trace-exporter.js.map +0 -1
  157. package/dist/otel/fetch.d.ts +0 -12
  158. package/dist/otel/fetch.d.ts.map +0 -1
  159. package/dist/otel/fetch.js +0 -82
  160. package/dist/otel/fetch.js.map +0 -1
  161. package/dist/otel/http.d.ts +0 -16
  162. package/dist/otel/http.d.ts.map +0 -1
  163. package/dist/otel/http.js +0 -44
  164. package/dist/otel/http.js.map +0 -1
  165. package/dist/otel/logger.d.ts +0 -37
  166. package/dist/otel/logger.d.ts.map +0 -1
  167. package/dist/otel/logger.js +0 -268
  168. package/dist/otel/logger.js.map +0 -1
  169. package/dist/otel/otel.d.ts +0 -65
  170. package/dist/otel/otel.d.ts.map +0 -1
  171. package/dist/otel/otel.js +0 -261
  172. package/dist/otel/otel.js.map +0 -1
  173. package/dist/router.d.ts +0 -100
  174. package/dist/router.d.ts.map +0 -1
  175. package/dist/router.js +0 -163
  176. package/dist/router.js.map +0 -1
  177. package/dist/services/evalrun/composite.d.ts +0 -21
  178. package/dist/services/evalrun/composite.d.ts.map +0 -1
  179. package/dist/services/evalrun/composite.js +0 -26
  180. package/dist/services/evalrun/composite.js.map +0 -1
  181. package/dist/services/evalrun/http.d.ts +0 -24
  182. package/dist/services/evalrun/http.d.ts.map +0 -1
  183. package/dist/services/evalrun/http.js +0 -86
  184. package/dist/services/evalrun/http.js.map +0 -1
  185. package/dist/services/evalrun/index.d.ts +0 -5
  186. package/dist/services/evalrun/index.d.ts.map +0 -1
  187. package/dist/services/evalrun/index.js +0 -5
  188. package/dist/services/evalrun/index.js.map +0 -1
  189. package/dist/services/evalrun/json.d.ts +0 -21
  190. package/dist/services/evalrun/json.d.ts.map +0 -1
  191. package/dist/services/evalrun/json.js +0 -38
  192. package/dist/services/evalrun/json.js.map +0 -1
  193. package/dist/services/evalrun/local.d.ts +0 -19
  194. package/dist/services/evalrun/local.d.ts.map +0 -1
  195. package/dist/services/evalrun/local.js +0 -22
  196. package/dist/services/evalrun/local.js.map +0 -1
  197. package/dist/services/local/_db.d.ts +0 -4
  198. package/dist/services/local/_db.d.ts.map +0 -1
  199. package/dist/services/local/_db.js +0 -123
  200. package/dist/services/local/_db.js.map +0 -1
  201. package/dist/services/local/_router.d.ts +0 -3
  202. package/dist/services/local/_router.d.ts.map +0 -1
  203. package/dist/services/local/_router.js +0 -28
  204. package/dist/services/local/_router.js.map +0 -1
  205. package/dist/services/local/_util.d.ts +0 -18
  206. package/dist/services/local/_util.d.ts.map +0 -1
  207. package/dist/services/local/_util.js +0 -44
  208. package/dist/services/local/_util.js.map +0 -1
  209. package/dist/services/local/index.d.ts +0 -7
  210. package/dist/services/local/index.d.ts.map +0 -1
  211. package/dist/services/local/index.js +0 -7
  212. package/dist/services/local/index.js.map +0 -1
  213. package/dist/services/local/keyvalue.d.ts +0 -17
  214. package/dist/services/local/keyvalue.d.ts.map +0 -1
  215. package/dist/services/local/keyvalue.js +0 -125
  216. package/dist/services/local/keyvalue.js.map +0 -1
  217. package/dist/services/local/stream.d.ts +0 -12
  218. package/dist/services/local/stream.d.ts.map +0 -1
  219. package/dist/services/local/stream.js +0 -262
  220. package/dist/services/local/stream.js.map +0 -1
  221. package/dist/services/local/vector.d.ts +0 -17
  222. package/dist/services/local/vector.d.ts.map +0 -1
  223. package/dist/services/local/vector.js +0 -303
  224. package/dist/services/local/vector.js.map +0 -1
  225. package/dist/services/sandbox/http.d.ts +0 -13
  226. package/dist/services/sandbox/http.d.ts.map +0 -1
  227. package/dist/services/sandbox/http.js +0 -130
  228. package/dist/services/sandbox/http.js.map +0 -1
  229. package/dist/services/sandbox/index.d.ts +0 -2
  230. package/dist/services/sandbox/index.d.ts.map +0 -1
  231. package/dist/services/sandbox/index.js +0 -2
  232. package/dist/services/sandbox/index.js.map +0 -1
  233. package/dist/services/session/composite.d.ts +0 -21
  234. package/dist/services/session/composite.d.ts.map +0 -1
  235. package/dist/services/session/composite.js +0 -26
  236. package/dist/services/session/composite.js.map +0 -1
  237. package/dist/services/session/http.d.ts +0 -34
  238. package/dist/services/session/http.d.ts.map +0 -1
  239. package/dist/services/session/http.js +0 -80
  240. package/dist/services/session/http.js.map +0 -1
  241. package/dist/services/session/index.d.ts +0 -5
  242. package/dist/services/session/index.d.ts.map +0 -1
  243. package/dist/services/session/index.js +0 -5
  244. package/dist/services/session/index.js.map +0 -1
  245. package/dist/services/session/json.d.ts +0 -22
  246. package/dist/services/session/json.d.ts.map +0 -1
  247. package/dist/services/session/json.js +0 -35
  248. package/dist/services/session/json.js.map +0 -1
  249. package/dist/services/session/local.d.ts +0 -19
  250. package/dist/services/session/local.d.ts.map +0 -1
  251. package/dist/services/session/local.js +0 -23
  252. package/dist/services/session/local.js.map +0 -1
  253. package/dist/services/thread/local.d.ts +0 -20
  254. package/dist/services/thread/local.d.ts.map +0 -1
  255. package/dist/services/thread/local.js +0 -158
  256. package/dist/services/thread/local.js.map +0 -1
  257. package/dist/session.d.ts +0 -734
  258. package/dist/session.d.ts.map +0 -1
  259. package/dist/session.js +0 -1139
  260. package/dist/session.js.map +0 -1
  261. package/dist/validator.d.ts +0 -142
  262. package/dist/validator.d.ts.map +0 -1
  263. package/dist/validator.js +0 -149
  264. package/dist/validator.js.map +0 -1
  265. package/dist/web.d.ts +0 -8
  266. package/dist/web.d.ts.map +0 -1
  267. package/dist/web.js +0 -66
  268. package/dist/web.js.map +0 -1
  269. package/dist/workbench.d.ts +0 -17
  270. package/dist/workbench.d.ts.map +0 -1
  271. package/dist/workbench.js +0 -507
  272. package/dist/workbench.js.map +0 -1
@@ -1,49 +0,0 @@
1
- import { returnResponse } from '../_util';
2
- /**
3
- * Creates a cron middleware for scheduled task endpoints.
4
- *
5
- * **Important:** Cron endpoints must use POST method. The middleware will throw
6
- * an error if called with any other HTTP method.
7
- *
8
- * Use with router.post() to create a cron endpoint:
9
- *
10
- * @example
11
- * ```typescript
12
- * import { createRouter, cron } from '@agentuity/runtime';
13
- *
14
- * const router = createRouter();
15
- *
16
- * // Daily cleanup at midnight
17
- * router.post('/daily-cleanup', cron('0 0 * * *', (c) => {
18
- * c.var.logger.info('Running daily cleanup');
19
- * return { status: 'cleanup complete' };
20
- * }));
21
- *
22
- * // Hourly health check
23
- * router.post('/health-check', cron('0 * * * *', (c) => {
24
- * c.var.logger.info('Running hourly health check');
25
- * return c.text('OK');
26
- * }));
27
- * ```
28
- *
29
- * @param schedule - Cron expression (e.g., '0 0 * * *' for daily at midnight)
30
- * @param handler - Handler function to run on schedule
31
- * @returns Hono handler for cron endpoint
32
- */
33
- export function cron(schedule, handler) {
34
- return async (c) => {
35
- if (c.req.method !== 'POST') {
36
- throw new Error(`Cron endpoint must use POST method, but received ${c.req.method}. ` +
37
- `Use router.post() instead of router.${c.req.method.toLowerCase()}().`);
38
- }
39
- let result = handler(c);
40
- if (result instanceof Promise) {
41
- result = await result;
42
- }
43
- if (result instanceof Response) {
44
- return result;
45
- }
46
- return returnResponse(c, result);
47
- };
48
- }
49
- //# sourceMappingURL=cron.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cron.js","sourceRoot":"","sources":["../../src/handlers/cron.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAS1C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,MAAM,UAAU,IAAI,CAAsB,QAAgB,EAAE,OAAuB;IAClF,OAAO,KAAK,EAAE,CAAa,EAAE,EAAE;QAC9B,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CACd,oDAAoD,CAAC,CAAC,GAAG,CAAC,MAAM,IAAI;gBACnE,uCAAuC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,CACvE,CAAC;QACH,CAAC;QAED,IAAI,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QACxB,IAAI,MAAM,YAAY,OAAO,EAAE,CAAC;YAC/B,MAAM,GAAG,MAAM,MAAM,CAAC;QACvB,CAAC;QAED,IAAI,MAAM,YAAY,QAAQ,EAAE,CAAC;YAChC,OAAO,MAAM,CAAC;QACf,CAAC;QAED,OAAO,cAAc,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IAClC,CAAC,CAAC;AACH,CAAC"}
@@ -1,5 +0,0 @@
1
- export { websocket, type WebSocketConnection, type WebSocketHandler } from './websocket';
2
- export { sse, type SSEMessage, type SSEStream, type SSEHandler, STREAM_DONE_PROMISE_KEY, IS_STREAMING_RESPONSE_KEY, } from './sse';
3
- export { stream, type StreamHandler } from './stream';
4
- export { cron, type CronHandler, type CronMetadata } from './cron';
5
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/handlers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,mBAAmB,EAAE,KAAK,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACzF,OAAO,EACN,GAAG,EACH,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,UAAU,EACf,uBAAuB,EACvB,yBAAyB,GACzB,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,MAAM,EAAE,KAAK,aAAa,EAAE,MAAM,UAAU,CAAC;AACtD,OAAO,EAAE,IAAI,EAAE,KAAK,WAAW,EAAE,KAAK,YAAY,EAAE,MAAM,QAAQ,CAAC"}
@@ -1,5 +0,0 @@
1
- export { websocket } from './websocket';
2
- export { sse, STREAM_DONE_PROMISE_KEY, IS_STREAMING_RESPONSE_KEY, } from './sse';
3
- export { stream } from './stream';
4
- export { cron } from './cron';
5
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/handlers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAmD,MAAM,aAAa,CAAC;AACzF,OAAO,EACN,GAAG,EAIH,uBAAuB,EACvB,yBAAyB,GACzB,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,MAAM,EAAsB,MAAM,UAAU,CAAC;AACtD,OAAO,EAAE,IAAI,EAAuC,MAAM,QAAQ,CAAC"}
@@ -1,91 +0,0 @@
1
- import type { Context, Handler } from 'hono';
2
- import type { Env } from '../app';
3
- /**
4
- * Context variable key for stream completion promise.
5
- * Used by middleware to defer session/thread saving until stream completes.
6
- * @internal
7
- */
8
- export declare const STREAM_DONE_PROMISE_KEY = "_streamDonePromise";
9
- /**
10
- * Context variable key to indicate this is a streaming response.
11
- * @internal
12
- */
13
- export declare const IS_STREAMING_RESPONSE_KEY = "_isStreamingResponse";
14
- /**
15
- * SSE message format for Server-Sent Events.
16
- */
17
- export interface SSEMessage {
18
- data: string;
19
- event?: string;
20
- id?: string;
21
- retry?: number;
22
- }
23
- /**
24
- * SSE stream interface for writing Server-Sent Events.
25
- */
26
- export interface SSEStream {
27
- /**
28
- * Write a simple value as SSE data.
29
- * Strings, numbers, and booleans are converted to string data.
30
- * Objects are passed through as SSE message format.
31
- */
32
- write: (data: string | number | boolean | SSEMessage) => Promise<void>;
33
- /**
34
- * Write a properly formatted SSE message.
35
- */
36
- writeSSE: (message: SSEMessage) => Promise<void>;
37
- /**
38
- * Register a callback for when the client aborts the connection.
39
- */
40
- onAbort: (callback: () => void) => void;
41
- /**
42
- * Close the SSE stream.
43
- */
44
- close: () => void;
45
- }
46
- /**
47
- * Handler function for SSE connections.
48
- * Receives the Hono context and SSE stream with a flattened signature.
49
- */
50
- export type SSEHandler<E extends Env = Env> = (c: Context<E>, stream: SSEStream) => void | Promise<void>;
51
- /**
52
- * Creates an SSE (Server-Sent Events) middleware for streaming updates to clients.
53
- *
54
- * This implementation uses Hono's stream() helper instead of streamSSE() to ensure
55
- * compatibility with async operations that consume ReadableStreams internally
56
- * (like AI SDK's generateText/generateObject). The stream() helper uses a fire-and-forget
57
- * pattern that avoids "ReadableStream has already been used" errors.
58
- *
59
- * Use with router.get() to create an SSE endpoint:
60
- *
61
- * @example
62
- * ```typescript
63
- * import { createRouter, sse } from '@agentuity/runtime';
64
- *
65
- * const router = createRouter();
66
- *
67
- * router.get('/events', sse((c, stream) => {
68
- * let count = 0;
69
- * const interval = setInterval(() => {
70
- * stream.writeSSE({
71
- * data: `Event ${++count}`,
72
- * event: 'update'
73
- * });
74
- * if (count >= 10) {
75
- * clearInterval(interval);
76
- * stream.close();
77
- * }
78
- * }, 1000);
79
- *
80
- * stream.onAbort(() => {
81
- * clearInterval(interval);
82
- * });
83
- * }));
84
- * ```
85
- *
86
- * @param handler - Handler function receiving context and SSE stream
87
- * @returns Hono handler for SSE streaming
88
- * @see https://github.com/agentuity/sdk/issues/471
89
- */
90
- export declare function sse<E extends Env = Env>(handler: SSEHandler<E>): Handler<E>;
91
- //# sourceMappingURL=sse.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sse.d.ts","sourceRoot":"","sources":["../../src/handlers/sse.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAI7C,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAC;AAElC;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,uBAAuB,CAAC;AAE5D;;;GAGG;AACH,eAAO,MAAM,yBAAyB,yBAAyB,CAAC;AAEhE;;GAEG;AACH,MAAM,WAAW,UAAU;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACzB;;;;OAIG;IACH,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,UAAU,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACvE;;OAEG;IACH,QAAQ,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD;;OAEG;IACH,OAAO,EAAE,CAAC,QAAQ,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC;IACxC;;OAEG;IACH,KAAK,EAAE,MAAM,IAAI,CAAC;CAClB;AAED;;;GAGG;AACH,MAAM,MAAM,UAAU,CAAC,CAAC,SAAS,GAAG,GAAG,GAAG,IAAI,CAC7C,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,EACb,MAAM,EAAE,SAAS,KACb,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AA2B1B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,wBAAgB,GAAG,CAAC,CAAC,SAAS,GAAG,GAAG,GAAG,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CA8I3E"}
@@ -1,213 +0,0 @@
1
- import { stream as honoStream } from 'hono/streaming';
2
- import { context as otelContext, ROOT_CONTEXT } from '@opentelemetry/api';
3
- import { getAgentAsyncLocalStorage } from '../_context';
4
- /**
5
- * Context variable key for stream completion promise.
6
- * Used by middleware to defer session/thread saving until stream completes.
7
- * @internal
8
- */
9
- export const STREAM_DONE_PROMISE_KEY = '_streamDonePromise';
10
- /**
11
- * Context variable key to indicate this is a streaming response.
12
- * @internal
13
- */
14
- export const IS_STREAMING_RESPONSE_KEY = '_isStreamingResponse';
15
- /**
16
- * Format an SSE message according to the SSE specification.
17
- * @see https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events
18
- */
19
- function formatSSEMessage(message) {
20
- let text = '';
21
- if (message.event) {
22
- text += `event: ${message.event}\n`;
23
- }
24
- if (message.id) {
25
- text += `id: ${message.id}\n`;
26
- }
27
- if (typeof message.retry === 'number') {
28
- text += `retry: ${message.retry}\n`;
29
- }
30
- // Data can be multiline - each line needs its own "data:" prefix
31
- const dataLines = message.data.split(/\r?\n/);
32
- for (const line of dataLines) {
33
- text += `data: ${line}\n`;
34
- }
35
- // SSE messages are terminated by a blank line
36
- text += '\n';
37
- return text;
38
- }
39
- /**
40
- * Creates an SSE (Server-Sent Events) middleware for streaming updates to clients.
41
- *
42
- * This implementation uses Hono's stream() helper instead of streamSSE() to ensure
43
- * compatibility with async operations that consume ReadableStreams internally
44
- * (like AI SDK's generateText/generateObject). The stream() helper uses a fire-and-forget
45
- * pattern that avoids "ReadableStream has already been used" errors.
46
- *
47
- * Use with router.get() to create an SSE endpoint:
48
- *
49
- * @example
50
- * ```typescript
51
- * import { createRouter, sse } from '@agentuity/runtime';
52
- *
53
- * const router = createRouter();
54
- *
55
- * router.get('/events', sse((c, stream) => {
56
- * let count = 0;
57
- * const interval = setInterval(() => {
58
- * stream.writeSSE({
59
- * data: `Event ${++count}`,
60
- * event: 'update'
61
- * });
62
- * if (count >= 10) {
63
- * clearInterval(interval);
64
- * stream.close();
65
- * }
66
- * }, 1000);
67
- *
68
- * stream.onAbort(() => {
69
- * clearInterval(interval);
70
- * });
71
- * }));
72
- * ```
73
- *
74
- * @param handler - Handler function receiving context and SSE stream
75
- * @returns Hono handler for SSE streaming
76
- * @see https://github.com/agentuity/sdk/issues/471
77
- */
78
- export function sse(handler) {
79
- return (c) => {
80
- const asyncLocalStorage = getAgentAsyncLocalStorage();
81
- const capturedContext = asyncLocalStorage.getStore();
82
- // Track stream completion for deferred session/thread saving
83
- // This promise resolves when the stream closes (normally or via abort)
84
- let resolveDone;
85
- let rejectDone;
86
- const donePromise = new Promise((resolve, reject) => {
87
- resolveDone = resolve;
88
- rejectDone = reject;
89
- });
90
- // Prevent unhandled rejection warnings if no middleware consumes donePromise.
91
- // The error is still propagated via the rejection for middleware that awaits it.
92
- donePromise.catch(() => {
93
- // Intentionally empty - error is logged in runInContext catch block
94
- });
95
- // Idempotent function to mark stream as completed
96
- let isDone = false;
97
- const markDone = (error) => {
98
- if (isDone)
99
- return;
100
- isDone = true;
101
- if (error && rejectDone) {
102
- rejectDone(error);
103
- }
104
- else if (resolveDone) {
105
- resolveDone();
106
- }
107
- };
108
- // Expose completion tracking to middleware
109
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
110
- c.set(STREAM_DONE_PROMISE_KEY, donePromise);
111
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
112
- c.set(IS_STREAMING_RESPONSE_KEY, true);
113
- // Set SSE-specific headers
114
- c.header('Content-Type', 'text/event-stream');
115
- c.header('Cache-Control', 'no-cache');
116
- c.header('Connection', 'keep-alive');
117
- // Use honoStream instead of honoStreamSSE.
118
- // honoStream uses a fire-and-forget async IIFE pattern that returns the Response
119
- // immediately while the handler runs in the background. This is critical for
120
- // compatibility with AI SDK's generateText/generateObject which use fetch()
121
- // internally. With honoStreamSSE, the callback is awaited before returning,
122
- // which causes "ReadableStream has already been used" errors when fetch
123
- // response streams are consumed in the same async chain.
124
- // See: https://github.com/agentuity/sdk/issues/471
125
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
126
- return honoStream(c, async (s) => {
127
- const encoder = new TextEncoder();
128
- // Track if user registered an onAbort callback
129
- let userAbortCallback;
130
- // Internal function to write an SSE message
131
- const writeSSEInternal = async (message) => {
132
- const formatted = formatSSEMessage(message);
133
- await s.write(encoder.encode(formatted));
134
- };
135
- const wrappedStream = {
136
- write: async (data) => {
137
- if (typeof data === 'string' ||
138
- typeof data === 'number' ||
139
- typeof data === 'boolean') {
140
- return writeSSEInternal({ data: String(data) });
141
- }
142
- else if (typeof data === 'object' && data !== null) {
143
- return writeSSEInternal(data);
144
- }
145
- return writeSSEInternal({ data: String(data) });
146
- },
147
- writeSSE: writeSSEInternal,
148
- onAbort: (callback) => {
149
- userAbortCallback = callback;
150
- s.onAbort(() => {
151
- try {
152
- callback();
153
- }
154
- finally {
155
- // Mark stream as done on abort
156
- markDone();
157
- }
158
- });
159
- },
160
- close: () => {
161
- try {
162
- s.close?.();
163
- }
164
- finally {
165
- // Mark stream as done on close
166
- markDone();
167
- }
168
- },
169
- };
170
- // Always register internal abort handler if user doesn't register one
171
- // This ensures we track completion even if user doesn't call onAbort
172
- s.onAbort(() => {
173
- if (!userAbortCallback) {
174
- // Only mark done if user didn't register their own handler
175
- // (their handler wrapper already calls markDone)
176
- markDone();
177
- }
178
- });
179
- const runInContext = async () => {
180
- try {
181
- await handler(c, wrappedStream);
182
- markDone();
183
- }
184
- catch (err) {
185
- // Log error but don't rethrow - would be unhandled rejection
186
- c.var.logger?.error?.('SSE handler error:', err);
187
- markDone(err);
188
- }
189
- };
190
- // Run handler with AsyncLocalStorage context propagation.
191
- // honoStream already uses a fire-and-forget pattern internally,
192
- // so we can safely await here - the response is already being sent.
193
- //
194
- // IMPORTANT: We run in ROOT_CONTEXT (no active OTEL span) to avoid a Bun bug
195
- // where OTEL-instrumented fetch conflicts with streaming responses.
196
- // This causes "ReadableStream has already been used" errors when AI SDK's
197
- // generateText/generateObject (which use fetch + stream.tee() internally)
198
- // are called inside SSE handlers. Running without an active span makes
199
- // our OTEL fetch wrapper use the original unpatched fetch.
200
- // See: https://github.com/agentuity/sdk/issues/471
201
- // See: https://github.com/oven-sh/bun/issues/24766
202
- await otelContext.with(ROOT_CONTEXT, async () => {
203
- if (capturedContext) {
204
- await asyncLocalStorage.run(capturedContext, runInContext);
205
- }
206
- else {
207
- await runInContext();
208
- }
209
- });
210
- });
211
- };
212
- }
213
- //# sourceMappingURL=sse.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sse.js","sourceRoot":"","sources":["../../src/handlers/sse.ts"],"names":[],"mappings":"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"}
@@ -1,52 +0,0 @@
1
- import type { Context, Handler } from 'hono';
2
- import type { Env } from '../app';
3
- /**
4
- * Handler function for streaming responses.
5
- * Returns a ReadableStream that will be piped to the response.
6
- */
7
- export type StreamHandler<E extends Env = Env> = (c: Context<E>) => ReadableStream<Uint8Array | string> | Promise<ReadableStream<Uint8Array | string>>;
8
- /**
9
- * Creates a streaming middleware for returning ReadableStream responses.
10
- *
11
- * Use with router.post() (or any HTTP method) to create a streaming endpoint:
12
- *
13
- * @example
14
- * ```typescript
15
- * import { createRouter, stream } from '@agentuity/runtime';
16
- *
17
- * const router = createRouter();
18
- *
19
- * router.post('/events', stream((c) => {
20
- * return new ReadableStream({
21
- * start(controller) {
22
- * controller.enqueue('event 1\n');
23
- * controller.enqueue('event 2\n');
24
- * controller.close();
25
- * }
26
- * });
27
- * }));
28
- * ```
29
- *
30
- * @example
31
- * ```typescript
32
- * // Async stream with data from request body
33
- * router.post('/process', stream(async (c) => {
34
- * const body = await c.req.json();
35
- *
36
- * return new ReadableStream({
37
- * async start(controller) {
38
- * for (const item of body.items) {
39
- * controller.enqueue(`Processing: ${item}\n`);
40
- * await new Promise(r => setTimeout(r, 100));
41
- * }
42
- * controller.close();
43
- * }
44
- * });
45
- * }));
46
- * ```
47
- *
48
- * @param handler - Handler function returning a ReadableStream
49
- * @returns Hono handler for streaming response
50
- */
51
- export declare function stream<E extends Env = Env>(handler: StreamHandler<E>): Handler<E>;
52
- //# sourceMappingURL=stream.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"stream.d.ts","sourceRoot":"","sources":["../../src/handlers/stream.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAI7C,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAC;AAGlC;;;GAGG;AACH,MAAM,MAAM,aAAa,CAAC,CAAC,SAAS,GAAG,GAAG,GAAG,IAAI,CAChD,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,KACT,cAAc,CAAC,UAAU,GAAG,MAAM,CAAC,GAAG,OAAO,CAAC,cAAc,CAAC,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC;AAExF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AACH,wBAAgB,MAAM,CAAC,CAAC,SAAS,GAAG,GAAG,GAAG,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAqEjF"}
@@ -1,116 +0,0 @@
1
- import { stream as honoStream } from 'hono/streaming';
2
- import { context as otelContext, ROOT_CONTEXT } from '@opentelemetry/api';
3
- import { getAgentAsyncLocalStorage } from '../_context';
4
- import { STREAM_DONE_PROMISE_KEY, IS_STREAMING_RESPONSE_KEY } from './sse';
5
- /**
6
- * Creates a streaming middleware for returning ReadableStream responses.
7
- *
8
- * Use with router.post() (or any HTTP method) to create a streaming endpoint:
9
- *
10
- * @example
11
- * ```typescript
12
- * import { createRouter, stream } from '@agentuity/runtime';
13
- *
14
- * const router = createRouter();
15
- *
16
- * router.post('/events', stream((c) => {
17
- * return new ReadableStream({
18
- * start(controller) {
19
- * controller.enqueue('event 1\n');
20
- * controller.enqueue('event 2\n');
21
- * controller.close();
22
- * }
23
- * });
24
- * }));
25
- * ```
26
- *
27
- * @example
28
- * ```typescript
29
- * // Async stream with data from request body
30
- * router.post('/process', stream(async (c) => {
31
- * const body = await c.req.json();
32
- *
33
- * return new ReadableStream({
34
- * async start(controller) {
35
- * for (const item of body.items) {
36
- * controller.enqueue(`Processing: ${item}\n`);
37
- * await new Promise(r => setTimeout(r, 100));
38
- * }
39
- * controller.close();
40
- * }
41
- * });
42
- * }));
43
- * ```
44
- *
45
- * @param handler - Handler function returning a ReadableStream
46
- * @returns Hono handler for streaming response
47
- */
48
- export function stream(handler) {
49
- return (c) => {
50
- const asyncLocalStorage = getAgentAsyncLocalStorage();
51
- const capturedContext = asyncLocalStorage.getStore();
52
- // Track stream completion for deferred session/thread saving
53
- // This promise resolves when the stream completes (pipe finishes or errors)
54
- let resolveDone;
55
- let rejectDone;
56
- const donePromise = new Promise((resolve, reject) => {
57
- resolveDone = resolve;
58
- rejectDone = reject;
59
- });
60
- // Idempotent function to mark stream as completed
61
- let isDone = false;
62
- const markDone = (error) => {
63
- if (isDone)
64
- return;
65
- isDone = true;
66
- if (error && rejectDone) {
67
- rejectDone(error);
68
- }
69
- else if (resolveDone) {
70
- resolveDone();
71
- }
72
- };
73
- // Expose completion tracking to middleware
74
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
75
- c.set(STREAM_DONE_PROMISE_KEY, donePromise);
76
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
77
- c.set(IS_STREAMING_RESPONSE_KEY, true);
78
- c.header('Content-Type', 'application/octet-stream');
79
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
80
- return honoStream(c, async (s) => {
81
- const runInContext = async () => {
82
- try {
83
- let streamResult = handler(c);
84
- if (streamResult instanceof Promise) {
85
- streamResult = await streamResult;
86
- }
87
- await s.pipe(streamResult);
88
- // Stream completed successfully
89
- markDone();
90
- }
91
- catch (err) {
92
- c.var.logger?.error('Stream error:', err);
93
- markDone(err);
94
- throw err;
95
- }
96
- };
97
- // IMPORTANT: We run in ROOT_CONTEXT (no active OTEL span) to avoid a Bun bug
98
- // where OTEL-instrumented fetch conflicts with streaming responses.
99
- // This causes "ReadableStream has already been used" errors when AI SDK's
100
- // generateText/generateObject (which use fetch + stream.tee() internally)
101
- // are called inside stream handlers. Running without an active span makes
102
- // our OTEL fetch wrapper use the original unpatched fetch.
103
- // See: https://github.com/agentuity/sdk/issues/471
104
- // See: https://github.com/oven-sh/bun/issues/24766
105
- await otelContext.with(ROOT_CONTEXT, async () => {
106
- if (capturedContext) {
107
- await asyncLocalStorage.run(capturedContext, runInContext);
108
- }
109
- else {
110
- await runInContext();
111
- }
112
- });
113
- });
114
- };
115
- }
116
- //# sourceMappingURL=stream.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"stream.js","sourceRoot":"","sources":["../../src/handlers/stream.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC1E,OAAO,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAExD,OAAO,EAAE,uBAAuB,EAAE,yBAAyB,EAAE,MAAM,OAAO,CAAC;AAU3E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AACH,MAAM,UAAU,MAAM,CAAsB,OAAyB;IACpE,OAAO,CAAC,CAAa,EAAE,EAAE;QACxB,MAAM,iBAAiB,GAAG,yBAAyB,EAAE,CAAC;QACtD,MAAM,eAAe,GAAG,iBAAiB,CAAC,QAAQ,EAAE,CAAC;QAErD,6DAA6D;QAC7D,4EAA4E;QAC5E,IAAI,WAAqC,CAAC;QAC1C,IAAI,UAAoD,CAAC;QACzD,MAAM,WAAW,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACzD,WAAW,GAAG,OAAO,CAAC;YACtB,UAAU,GAAG,MAAM,CAAC;QACrB,CAAC,CAAC,CAAC;QAEH,kDAAkD;QAClD,IAAI,MAAM,GAAG,KAAK,CAAC;QACnB,MAAM,QAAQ,GAAG,CAAC,KAAe,EAAE,EAAE;YACpC,IAAI,MAAM;gBAAE,OAAO;YACnB,MAAM,GAAG,IAAI,CAAC;YACd,IAAI,KAAK,IAAI,UAAU,EAAE,CAAC;gBACzB,UAAU,CAAC,KAAK,CAAC,CAAC;YACnB,CAAC;iBAAM,IAAI,WAAW,EAAE,CAAC;gBACxB,WAAW,EAAE,CAAC;YACf,CAAC;QACF,CAAC,CAAC;QAEF,2CAA2C;QAC3C,8DAA8D;QAC7D,CAAS,CAAC,GAAG,CAAC,uBAAuB,EAAE,WAAW,CAAC,CAAC;QACrD,8DAA8D;QAC7D,CAAS,CAAC,GAAG,CAAC,yBAAyB,EAAE,IAAI,CAAC,CAAC;QAEhD,CAAC,CAAC,MAAM,CAAC,cAAc,EAAE,0BAA0B,CAAC,CAAC;QAErD,8DAA8D;QAC9D,OAAO,UAAU,CAAC,CAAC,EAAE,KAAK,EAAE,CAAM,EAAE,EAAE;YACrC,MAAM,YAAY,GAAG,KAAK,IAAI,EAAE;gBAC/B,IAAI,CAAC;oBACJ,IAAI,YAAY,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;oBAC9B,IAAI,YAAY,YAAY,OAAO,EAAE,CAAC;wBACrC,YAAY,GAAG,MAAM,YAAY,CAAC;oBACnC,CAAC;oBACD,MAAM,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;oBAC3B,gCAAgC;oBAChC,QAAQ,EAAE,CAAC;gBACZ,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACd,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC;oBAC1C,QAAQ,CAAC,GAAG,CAAC,CAAC;oBACd,MAAM,GAAG,CAAC;gBACX,CAAC;YACF,CAAC,CAAC;YAEF,6EAA6E;YAC7E,oEAAoE;YACpE,0EAA0E;YAC1E,0EAA0E;YAC1E,0EAA0E;YAC1E,2DAA2D;YAC3D,mDAAmD;YACnD,mDAAmD;YACnD,MAAM,WAAW,CAAC,IAAI,CAAC,YAAY,EAAE,KAAK,IAAI,EAAE;gBAC/C,IAAI,eAAe,EAAE,CAAC;oBACrB,MAAM,iBAAiB,CAAC,GAAG,CAAC,eAAe,EAAE,YAAY,CAAC,CAAC;gBAC5D,CAAC;qBAAM,CAAC;oBACP,MAAM,YAAY,EAAE,CAAC;gBACtB,CAAC;YACF,CAAC,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC;AACH,CAAC"}
@@ -1,49 +0,0 @@
1
- import type { Context, MiddlewareHandler } from 'hono';
2
- import type { Env } from '../app';
3
- /**
4
- * WebSocket connection interface for handling WebSocket events.
5
- */
6
- export interface WebSocketConnection {
7
- onOpen: (handler: (event: Event) => void | Promise<void>) => void;
8
- onMessage: (handler: (event: MessageEvent) => void | Promise<void>) => void;
9
- onClose: (handler: (event: CloseEvent) => void | Promise<void>) => void;
10
- send: (data: string | ArrayBuffer | Uint8Array) => void;
11
- }
12
- /**
13
- * Handler function for WebSocket connections.
14
- * Receives the Hono context and WebSocket connection with a flattened signature.
15
- */
16
- export type WebSocketHandler<E extends Env = Env> = (c: Context<E>, ws: WebSocketConnection) => void | Promise<void>;
17
- /**
18
- * Creates a WebSocket middleware for handling WebSocket connections.
19
- *
20
- * Use with router.get() to create a WebSocket endpoint:
21
- *
22
- * @example
23
- * ```typescript
24
- * import { createRouter, websocket } from '@agentuity/runtime';
25
- *
26
- * const router = createRouter();
27
- *
28
- * router.get('/ws', websocket((c, ws) => {
29
- * ws.onOpen(() => {
30
- * c.var.logger.info('WebSocket opened');
31
- * ws.send('Welcome!');
32
- * });
33
- *
34
- * ws.onMessage((event) => {
35
- * c.var.logger.info('Received:', event.data);
36
- * ws.send('Echo: ' + event.data);
37
- * });
38
- *
39
- * ws.onClose(() => {
40
- * c.var.logger.info('WebSocket closed');
41
- * });
42
- * }));
43
- * ```
44
- *
45
- * @param handler - Handler function receiving context and WebSocket connection
46
- * @returns Hono middleware handler for WebSocket upgrade
47
- */
48
- export declare function websocket<E extends Env = Env>(handler: WebSocketHandler<E>): MiddlewareHandler<E>;
49
- //# sourceMappingURL=websocket.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"websocket.d.ts","sourceRoot":"","sources":["../../src/handlers/websocket.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,MAAM,CAAC;AAIvD,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAC;AAElC;;GAEG;AACH,MAAM,WAAW,mBAAmB;IACnC,MAAM,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC;IAClE,SAAS,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC;IAC5E,OAAO,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC;IACxE,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,UAAU,KAAK,IAAI,CAAC;CACxD;AAED;;;GAGG;AACH,MAAM,MAAM,gBAAgB,CAAC,CAAC,SAAS,GAAG,GAAG,GAAG,IAAI,CACnD,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,EACb,EAAE,EAAE,mBAAmB,KACnB,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAE1B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,wBAAgB,SAAS,CAAC,CAAC,SAAS,GAAG,GAAG,GAAG,EAAE,OAAO,EAAE,gBAAgB,CAAC,CAAC,CAAC,GAAG,iBAAiB,CAAC,CAAC,CAAC,CA6GjG"}