@agentuity/runtime 2.0.11 → 3.0.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +37 -65
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +59 -61
- package/dist/index.js.map +1 -1
- package/package.json +9 -38
- package/src/index.ts +58 -259
- package/AGENTS.md +0 -116
- package/dist/_config.d.ts +0 -100
- package/dist/_config.d.ts.map +0 -1
- package/dist/_config.js +0 -147
- package/dist/_config.js.map +0 -1
- package/dist/_context.d.ts +0 -80
- package/dist/_context.d.ts.map +0 -1
- package/dist/_context.js +0 -160
- package/dist/_context.js.map +0 -1
- package/dist/_events.d.ts +0 -64
- package/dist/_events.d.ts.map +0 -1
- package/dist/_events.js +0 -92
- package/dist/_events.js.map +0 -1
- package/dist/_globals.d.ts +0 -58
- package/dist/_globals.d.ts.map +0 -1
- package/dist/_globals.js +0 -71
- package/dist/_globals.js.map +0 -1
- package/dist/_idle.d.ts +0 -7
- package/dist/_idle.d.ts.map +0 -1
- package/dist/_idle.js +0 -10
- package/dist/_idle.js.map +0 -1
- package/dist/_metadata.d.ts +0 -117
- package/dist/_metadata.d.ts.map +0 -1
- package/dist/_metadata.js +0 -268
- package/dist/_metadata.js.map +0 -1
- package/dist/_process-protection.d.ts +0 -27
- package/dist/_process-protection.d.ts.map +0 -1
- package/dist/_process-protection.js +0 -56
- package/dist/_process-protection.js.map +0 -1
- package/dist/_server.d.ts +0 -50
- package/dist/_server.d.ts.map +0 -1
- package/dist/_server.js +0 -89
- package/dist/_server.js.map +0 -1
- package/dist/_services.d.ts +0 -25
- package/dist/_services.d.ts.map +0 -1
- package/dist/_services.js +0 -286
- package/dist/_services.js.map +0 -1
- package/dist/_standalone.d.ts +0 -212
- package/dist/_standalone.d.ts.map +0 -1
- package/dist/_standalone.js +0 -556
- package/dist/_standalone.js.map +0 -1
- package/dist/_tokens.d.ts +0 -12
- package/dist/_tokens.d.ts.map +0 -1
- package/dist/_tokens.js +0 -97
- package/dist/_tokens.js.map +0 -1
- package/dist/_util.d.ts +0 -16
- package/dist/_util.d.ts.map +0 -1
- package/dist/_util.js +0 -54
- package/dist/_util.js.map +0 -1
- package/dist/_validation.d.ts +0 -89
- package/dist/_validation.d.ts.map +0 -1
- package/dist/_validation.js +0 -29
- package/dist/_validation.js.map +0 -1
- package/dist/_waituntil.d.ts +0 -32
- package/dist/_waituntil.d.ts.map +0 -1
- package/dist/_waituntil.js +0 -156
- package/dist/_waituntil.js.map +0 -1
- package/dist/agent.d.ts +0 -1262
- package/dist/agent.d.ts.map +0 -1
- package/dist/agent.js +0 -981
- package/dist/agent.js.map +0 -1
- package/dist/app.d.ts +0 -514
- package/dist/app.d.ts.map +0 -1
- package/dist/app.js +0 -228
- package/dist/app.js.map +0 -1
- package/dist/bootstrap.d.ts +0 -44
- package/dist/bootstrap.d.ts.map +0 -1
- package/dist/bootstrap.js +0 -259
- package/dist/bootstrap.js.map +0 -1
- package/dist/bun-s3-patch.d.ts +0 -37
- package/dist/bun-s3-patch.d.ts.map +0 -1
- package/dist/bun-s3-patch.js +0 -142
- package/dist/bun-s3-patch.js.map +0 -1
- package/dist/cors.d.ts +0 -42
- package/dist/cors.d.ts.map +0 -1
- package/dist/cors.js +0 -117
- package/dist/cors.js.map +0 -1
- package/dist/dev-patches/aisdk.d.ts +0 -17
- package/dist/dev-patches/aisdk.d.ts.map +0 -1
- package/dist/dev-patches/aisdk.js +0 -160
- package/dist/dev-patches/aisdk.js.map +0 -1
- package/dist/dev-patches/gateway.d.ts +0 -16
- package/dist/dev-patches/gateway.d.ts.map +0 -1
- package/dist/dev-patches/gateway.js +0 -54
- package/dist/dev-patches/gateway.js.map +0 -1
- package/dist/dev-patches/index.d.ts +0 -21
- package/dist/dev-patches/index.d.ts.map +0 -1
- package/dist/dev-patches/index.js +0 -33
- package/dist/dev-patches/index.js.map +0 -1
- package/dist/dev-patches/otel-llm.d.ts +0 -12
- package/dist/dev-patches/otel-llm.d.ts.map +0 -1
- package/dist/dev-patches/otel-llm.js +0 -352
- package/dist/dev-patches/otel-llm.js.map +0 -1
- package/dist/devmode.d.ts +0 -3
- package/dist/devmode.d.ts.map +0 -1
- package/dist/devmode.js +0 -167
- package/dist/devmode.js.map +0 -1
- package/dist/eval.d.ts +0 -91
- package/dist/eval.d.ts.map +0 -1
- package/dist/eval.js +0 -16
- package/dist/eval.js.map +0 -1
- package/dist/handlers/_route-meta.d.ts +0 -22
- package/dist/handlers/_route-meta.d.ts.map +0 -1
- package/dist/handlers/_route-meta.js +0 -25
- package/dist/handlers/_route-meta.js.map +0 -1
- package/dist/handlers/cron.d.ts +0 -73
- package/dist/handlers/cron.d.ts.map +0 -1
- package/dist/handlers/cron.js +0 -43
- package/dist/handlers/cron.js.map +0 -1
- package/dist/handlers/index.d.ts +0 -6
- package/dist/handlers/index.d.ts.map +0 -1
- package/dist/handlers/index.js +0 -6
- package/dist/handlers/index.js.map +0 -1
- package/dist/handlers/sse.d.ts +0 -163
- package/dist/handlers/sse.d.ts.map +0 -1
- package/dist/handlers/sse.js +0 -175
- package/dist/handlers/sse.js.map +0 -1
- package/dist/handlers/stream.d.ts +0 -52
- package/dist/handlers/stream.d.ts.map +0 -1
- package/dist/handlers/stream.js +0 -108
- package/dist/handlers/stream.js.map +0 -1
- package/dist/handlers/webrtc.d.ts +0 -49
- package/dist/handlers/webrtc.d.ts.map +0 -1
- package/dist/handlers/webrtc.js +0 -109
- package/dist/handlers/webrtc.js.map +0 -1
- package/dist/handlers/websocket.d.ts +0 -88
- package/dist/handlers/websocket.d.ts.map +0 -1
- package/dist/handlers/websocket.js +0 -161
- package/dist/handlers/websocket.js.map +0 -1
- package/dist/logger/console.d.ts +0 -70
- package/dist/logger/console.d.ts.map +0 -1
- package/dist/logger/console.js +0 -278
- package/dist/logger/console.js.map +0 -1
- package/dist/logger/index.d.ts +0 -3
- package/dist/logger/index.d.ts.map +0 -1
- package/dist/logger/index.js +0 -3
- package/dist/logger/index.js.map +0 -1
- package/dist/logger/internal.d.ts +0 -79
- package/dist/logger/internal.d.ts.map +0 -1
- package/dist/logger/internal.js +0 -133
- package/dist/logger/internal.js.map +0 -1
- package/dist/logger/logger.d.ts +0 -41
- package/dist/logger/logger.d.ts.map +0 -1
- package/dist/logger/logger.js +0 -2
- package/dist/logger/logger.js.map +0 -1
- package/dist/logger/user.d.ts +0 -8
- package/dist/logger/user.d.ts.map +0 -1
- package/dist/logger/user.js +0 -7
- package/dist/logger/user.js.map +0 -1
- package/dist/logger/util.d.ts +0 -11
- package/dist/logger/util.d.ts.map +0 -1
- package/dist/logger/util.js +0 -77
- package/dist/logger/util.js.map +0 -1
- package/dist/middleware.d.ts +0 -105
- package/dist/middleware.d.ts.map +0 -1
- package/dist/middleware.js +0 -763
- package/dist/middleware.js.map +0 -1
- package/dist/otel/config.d.ts +0 -19
- package/dist/otel/config.d.ts.map +0 -1
- package/dist/otel/config.js +0 -26
- package/dist/otel/config.js.map +0 -1
- package/dist/otel/console.d.ts +0 -33
- package/dist/otel/console.d.ts.map +0 -1
- package/dist/otel/console.js +0 -86
- package/dist/otel/console.js.map +0 -1
- package/dist/otel/exporters/index.d.ts +0 -4
- package/dist/otel/exporters/index.d.ts.map +0 -1
- package/dist/otel/exporters/index.js +0 -4
- package/dist/otel/exporters/index.js.map +0 -1
- package/dist/otel/exporters/jsonl-log-exporter.d.ts +0 -36
- package/dist/otel/exporters/jsonl-log-exporter.d.ts.map +0 -1
- package/dist/otel/exporters/jsonl-log-exporter.js +0 -103
- package/dist/otel/exporters/jsonl-log-exporter.js.map +0 -1
- package/dist/otel/exporters/jsonl-metric-exporter.d.ts +0 -40
- package/dist/otel/exporters/jsonl-metric-exporter.d.ts.map +0 -1
- package/dist/otel/exporters/jsonl-metric-exporter.js +0 -104
- package/dist/otel/exporters/jsonl-metric-exporter.js.map +0 -1
- package/dist/otel/exporters/jsonl-trace-exporter.d.ts +0 -36
- package/dist/otel/exporters/jsonl-trace-exporter.d.ts.map +0 -1
- package/dist/otel/exporters/jsonl-trace-exporter.js +0 -111
- package/dist/otel/exporters/jsonl-trace-exporter.js.map +0 -1
- package/dist/otel/fetch.d.ts +0 -12
- package/dist/otel/fetch.d.ts.map +0 -1
- package/dist/otel/fetch.js +0 -82
- package/dist/otel/fetch.js.map +0 -1
- package/dist/otel/http.d.ts +0 -16
- package/dist/otel/http.d.ts.map +0 -1
- package/dist/otel/http.js +0 -44
- package/dist/otel/http.js.map +0 -1
- package/dist/otel/logger.d.ts +0 -37
- package/dist/otel/logger.d.ts.map +0 -1
- package/dist/otel/logger.js +0 -265
- package/dist/otel/logger.js.map +0 -1
- package/dist/otel/otel.d.ts +0 -68
- package/dist/otel/otel.d.ts.map +0 -1
- package/dist/otel/otel.js +0 -245
- package/dist/otel/otel.js.map +0 -1
- package/dist/otel/tracestate.d.ts +0 -44
- package/dist/otel/tracestate.d.ts.map +0 -1
- package/dist/otel/tracestate.js +0 -84
- package/dist/otel/tracestate.js.map +0 -1
- package/dist/router.d.ts +0 -66
- package/dist/router.d.ts.map +0 -1
- package/dist/router.js +0 -44
- package/dist/router.js.map +0 -1
- package/dist/services/evalrun/composite.d.ts +0 -21
- package/dist/services/evalrun/composite.d.ts.map +0 -1
- package/dist/services/evalrun/composite.js +0 -26
- package/dist/services/evalrun/composite.js.map +0 -1
- package/dist/services/evalrun/http.d.ts +0 -24
- package/dist/services/evalrun/http.d.ts.map +0 -1
- package/dist/services/evalrun/http.js +0 -115
- package/dist/services/evalrun/http.js.map +0 -1
- package/dist/services/evalrun/index.d.ts +0 -5
- package/dist/services/evalrun/index.d.ts.map +0 -1
- package/dist/services/evalrun/index.js +0 -5
- package/dist/services/evalrun/index.js.map +0 -1
- package/dist/services/evalrun/json.d.ts +0 -21
- package/dist/services/evalrun/json.d.ts.map +0 -1
- package/dist/services/evalrun/json.js +0 -38
- package/dist/services/evalrun/json.js.map +0 -1
- package/dist/services/evalrun/local.d.ts +0 -19
- package/dist/services/evalrun/local.d.ts.map +0 -1
- package/dist/services/evalrun/local.js +0 -22
- package/dist/services/evalrun/local.js.map +0 -1
- package/dist/services/local/_db.d.ts +0 -4
- package/dist/services/local/_db.d.ts.map +0 -1
- package/dist/services/local/_db.js +0 -281
- package/dist/services/local/_db.js.map +0 -1
- package/dist/services/local/_router.d.ts +0 -3
- package/dist/services/local/_router.d.ts.map +0 -1
- package/dist/services/local/_router.js +0 -28
- package/dist/services/local/_router.js.map +0 -1
- package/dist/services/local/_util.d.ts +0 -18
- package/dist/services/local/_util.d.ts.map +0 -1
- package/dist/services/local/_util.js +0 -44
- package/dist/services/local/_util.js.map +0 -1
- package/dist/services/local/email.d.ts +0 -24
- package/dist/services/local/email.d.ts.map +0 -1
- package/dist/services/local/email.js +0 -58
- package/dist/services/local/email.js.map +0 -1
- package/dist/services/local/index.d.ts +0 -10
- package/dist/services/local/index.d.ts.map +0 -1
- package/dist/services/local/index.js +0 -10
- package/dist/services/local/index.js.map +0 -1
- package/dist/services/local/keyvalue.d.ts +0 -17
- package/dist/services/local/keyvalue.d.ts.map +0 -1
- package/dist/services/local/keyvalue.js +0 -133
- package/dist/services/local/keyvalue.js.map +0 -1
- package/dist/services/local/queue.d.ts +0 -10
- package/dist/services/local/queue.d.ts.map +0 -1
- package/dist/services/local/queue.js +0 -96
- package/dist/services/local/queue.js.map +0 -1
- package/dist/services/local/stream.d.ts +0 -12
- package/dist/services/local/stream.d.ts.map +0 -1
- package/dist/services/local/stream.js +0 -266
- package/dist/services/local/stream.js.map +0 -1
- package/dist/services/local/task.d.ts +0 -55
- package/dist/services/local/task.d.ts.map +0 -1
- package/dist/services/local/task.js +0 -1248
- package/dist/services/local/task.js.map +0 -1
- package/dist/services/local/vector.d.ts +0 -17
- package/dist/services/local/vector.d.ts.map +0 -1
- package/dist/services/local/vector.js +0 -303
- package/dist/services/local/vector.js.map +0 -1
- package/dist/services/sandbox/http.d.ts +0 -23
- package/dist/services/sandbox/http.d.ts.map +0 -1
- package/dist/services/sandbox/http.js +0 -327
- package/dist/services/sandbox/http.js.map +0 -1
- package/dist/services/sandbox/index.d.ts +0 -2
- package/dist/services/sandbox/index.d.ts.map +0 -1
- package/dist/services/sandbox/index.js +0 -2
- package/dist/services/sandbox/index.js.map +0 -1
- package/dist/services/session/composite.d.ts +0 -21
- package/dist/services/session/composite.d.ts.map +0 -1
- package/dist/services/session/composite.js +0 -26
- package/dist/services/session/composite.js.map +0 -1
- package/dist/services/session/http.d.ts +0 -34
- package/dist/services/session/http.d.ts.map +0 -1
- package/dist/services/session/http.js +0 -124
- package/dist/services/session/http.js.map +0 -1
- package/dist/services/session/index.d.ts +0 -5
- package/dist/services/session/index.d.ts.map +0 -1
- package/dist/services/session/index.js +0 -5
- package/dist/services/session/index.js.map +0 -1
- package/dist/services/session/json.d.ts +0 -22
- package/dist/services/session/json.d.ts.map +0 -1
- package/dist/services/session/json.js +0 -35
- package/dist/services/session/json.js.map +0 -1
- package/dist/services/session/local.d.ts +0 -19
- package/dist/services/session/local.d.ts.map +0 -1
- package/dist/services/session/local.js +0 -23
- package/dist/services/session/local.js.map +0 -1
- package/dist/services/thread/local.d.ts +0 -20
- package/dist/services/thread/local.d.ts.map +0 -1
- package/dist/services/thread/local.js +0 -158
- package/dist/services/thread/local.js.map +0 -1
- package/dist/session.d.ts +0 -734
- package/dist/session.d.ts.map +0 -1
- package/dist/session.js +0 -1140
- package/dist/session.js.map +0 -1
- package/dist/signature.d.ts +0 -22
- package/dist/signature.d.ts.map +0 -1
- package/dist/signature.js +0 -63
- package/dist/signature.js.map +0 -1
- package/dist/validator.d.ts +0 -142
- package/dist/validator.d.ts.map +0 -1
- package/dist/validator.js +0 -149
- package/dist/validator.js.map +0 -1
- package/dist/version-check.d.ts +0 -20
- package/dist/version-check.d.ts.map +0 -1
- package/dist/version-check.js +0 -157
- package/dist/version-check.js.map +0 -1
- package/dist/web.d.ts +0 -8
- package/dist/web.d.ts.map +0 -1
- package/dist/web.js +0 -67
- package/dist/web.js.map +0 -1
- package/dist/webrtc-signaling.d.ts +0 -80
- package/dist/webrtc-signaling.d.ts.map +0 -1
- package/dist/webrtc-signaling.js +0 -237
- package/dist/webrtc-signaling.js.map +0 -1
- package/dist/workbench.d.ts +0 -17
- package/dist/workbench.d.ts.map +0 -1
- package/dist/workbench.js +0 -605
- package/dist/workbench.js.map +0 -1
- package/src/_config.ts +0 -163
- package/src/_context.ts +0 -240
- package/src/_events.ts +0 -142
- package/src/_globals.ts +0 -92
- package/src/_idle.ts +0 -10
- package/src/_metadata.ts +0 -407
- package/src/_process-protection.ts +0 -71
- package/src/_server.ts +0 -109
- package/src/_services.ts +0 -379
- package/src/_standalone.ts +0 -710
- package/src/_tokens.ts +0 -114
- package/src/_util.ts +0 -62
- package/src/_validation.ts +0 -119
- package/src/_waituntil.ts +0 -188
- package/src/agent.ts +0 -2739
- package/src/app.ts +0 -769
- package/src/bootstrap.ts +0 -321
- package/src/bun-s3-patch.ts +0 -224
- package/src/cors.ts +0 -137
- package/src/dev-patches/aisdk.ts +0 -169
- package/src/dev-patches/gateway.ts +0 -68
- package/src/dev-patches/index.ts +0 -37
- package/src/dev-patches/otel-llm.ts +0 -405
- package/src/devmode.ts +0 -171
- package/src/eval.ts +0 -109
- package/src/globals.d.ts +0 -28
- package/src/handlers/_route-meta.ts +0 -33
- package/src/handlers/cron.ts +0 -141
- package/src/handlers/index.ts +0 -18
- package/src/handlers/sse.ts +0 -358
- package/src/handlers/stream.ts +0 -121
- package/src/handlers/webrtc.ts +0 -125
- package/src/handlers/websocket.ts +0 -203
- package/src/logger/console.ts +0 -323
- package/src/logger/index.ts +0 -2
- package/src/logger/internal.ts +0 -165
- package/src/logger/logger.ts +0 -44
- package/src/logger/user.ts +0 -15
- package/src/logger/util.ts +0 -80
- package/src/middleware.ts +0 -1095
- package/src/otel/config.ts +0 -47
- package/src/otel/console.ts +0 -91
- package/src/otel/exporters/README.md +0 -217
- package/src/otel/exporters/index.ts +0 -3
- package/src/otel/exporters/jsonl-log-exporter.ts +0 -113
- package/src/otel/exporters/jsonl-metric-exporter.ts +0 -120
- package/src/otel/exporters/jsonl-trace-exporter.ts +0 -121
- package/src/otel/fetch.ts +0 -105
- package/src/otel/http.ts +0 -53
- package/src/otel/logger.ts +0 -293
- package/src/otel/otel.ts +0 -354
- package/src/otel/tracestate.ts +0 -108
- package/src/router.ts +0 -75
- package/src/services/evalrun/composite.ts +0 -34
- package/src/services/evalrun/http.ts +0 -167
- package/src/services/evalrun/index.ts +0 -4
- package/src/services/evalrun/json.ts +0 -46
- package/src/services/evalrun/local.ts +0 -28
- package/src/services/local/README.md +0 -1576
- package/src/services/local/_db.ts +0 -353
- package/src/services/local/_router.ts +0 -40
- package/src/services/local/_util.ts +0 -55
- package/src/services/local/email.ts +0 -91
- package/src/services/local/index.ts +0 -9
- package/src/services/local/keyvalue.ts +0 -174
- package/src/services/local/queue.ts +0 -145
- package/src/services/local/stream.ts +0 -358
- package/src/services/local/task.ts +0 -1711
- package/src/services/local/vector.ts +0 -438
- package/src/services/sandbox/http.ts +0 -522
- package/src/services/sandbox/index.ts +0 -1
- package/src/services/session/composite.ts +0 -33
- package/src/services/session/http.ts +0 -167
- package/src/services/session/index.ts +0 -4
- package/src/services/session/json.ts +0 -42
- package/src/services/session/local.ts +0 -33
- package/src/services/thread/local.ts +0 -199
- package/src/session.ts +0 -1960
- package/src/signature.ts +0 -82
- package/src/validator.ts +0 -283
- package/src/version-check.ts +0 -184
- package/src/web.ts +0 -76
- package/src/webrtc-signaling.ts +0 -288
- package/src/workbench.ts +0 -725
package/src/handlers/sse.ts
DELETED
|
@@ -1,358 +0,0 @@
|
|
|
1
|
-
import type { Context, Handler } from 'hono';
|
|
2
|
-
import { stream as honoStream } from 'hono/streaming';
|
|
3
|
-
import { context as otelContext, ROOT_CONTEXT } from '@opentelemetry/api';
|
|
4
|
-
import { StructuredError } from '@agentuity/core';
|
|
5
|
-
import type { Schema } from '@agentuity/schema';
|
|
6
|
-
import type { Env } from '../app';
|
|
7
|
-
import { tagRoute } from './_route-meta';
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* Error thrown when sse() is called without a handler function.
|
|
11
|
-
*/
|
|
12
|
-
const SSEHandlerMissingError = StructuredError(
|
|
13
|
-
'SSEHandlerMissingError',
|
|
14
|
-
'An SSE handler function is required. Use sse(handler) or sse({ output: schema }, handler).'
|
|
15
|
-
);
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
* Context variable key for stream completion promise.
|
|
19
|
-
* Used by middleware to defer session/thread saving until stream completes.
|
|
20
|
-
* @internal
|
|
21
|
-
*/
|
|
22
|
-
export const STREAM_DONE_PROMISE_KEY = '_streamDonePromise';
|
|
23
|
-
|
|
24
|
-
/**
|
|
25
|
-
* Context variable key to indicate this is a streaming response.
|
|
26
|
-
* @internal
|
|
27
|
-
*/
|
|
28
|
-
export const IS_STREAMING_RESPONSE_KEY = '_isStreamingResponse';
|
|
29
|
-
|
|
30
|
-
/**
|
|
31
|
-
* SSE message format for Server-Sent Events.
|
|
32
|
-
*/
|
|
33
|
-
export interface SSEMessage {
|
|
34
|
-
data: string;
|
|
35
|
-
event?: string;
|
|
36
|
-
id?: string;
|
|
37
|
-
retry?: number;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
/**
|
|
41
|
-
* SSE stream interface for writing Server-Sent Events.
|
|
42
|
-
*/
|
|
43
|
-
export interface SSEStream {
|
|
44
|
-
/**
|
|
45
|
-
* Write a simple value as SSE data.
|
|
46
|
-
* Strings, numbers, and booleans are converted to string data.
|
|
47
|
-
* Objects are passed through as SSE message format.
|
|
48
|
-
*/
|
|
49
|
-
write: (data: string | number | boolean | SSEMessage) => Promise<void>;
|
|
50
|
-
/**
|
|
51
|
-
* Write a properly formatted SSE message.
|
|
52
|
-
*/
|
|
53
|
-
writeSSE: (message: SSEMessage) => Promise<void>;
|
|
54
|
-
/**
|
|
55
|
-
* Register a callback for when the client aborts the connection.
|
|
56
|
-
*/
|
|
57
|
-
onAbort: (callback: () => void) => void;
|
|
58
|
-
/**
|
|
59
|
-
* Close the SSE stream.
|
|
60
|
-
*/
|
|
61
|
-
close: () => void;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
/**
|
|
65
|
-
* Handler function for SSE connections.
|
|
66
|
-
* Receives the Hono context and SSE stream with a flattened signature.
|
|
67
|
-
*/
|
|
68
|
-
export type SSEHandler<E extends Env = Env> = (
|
|
69
|
-
c: Context<E>,
|
|
70
|
-
stream: SSEStream
|
|
71
|
-
) => void | Promise<void>;
|
|
72
|
-
|
|
73
|
-
/**
|
|
74
|
-
* Options for configuring SSE middleware.
|
|
75
|
-
*
|
|
76
|
-
* @template TOutput - The type of data that will be sent through the SSE stream.
|
|
77
|
-
* This is used for type inference in generated route registries and does not
|
|
78
|
-
* perform runtime validation (SSE data is serialized via JSON.stringify).
|
|
79
|
-
*/
|
|
80
|
-
export interface SSEOptions<TOutput = unknown> {
|
|
81
|
-
/**
|
|
82
|
-
* Schema defining the output type for SSE events.
|
|
83
|
-
*
|
|
84
|
-
* This schema is used for:
|
|
85
|
-
* - Type inference in generated `routes.ts` registry
|
|
86
|
-
* - Automatic typing of `EventSource/EventStreamManager` hook's `data` property
|
|
87
|
-
*
|
|
88
|
-
* The schema is NOT used for runtime validation - SSE messages are sent
|
|
89
|
-
* as-is through the stream. Use this for TypeScript type safety only.
|
|
90
|
-
*
|
|
91
|
-
* @example
|
|
92
|
-
* ```typescript
|
|
93
|
-
* import { s } from '@agentuity/schema';
|
|
94
|
-
*
|
|
95
|
-
* const StreamEventSchema = s.object({
|
|
96
|
-
* type: s.enum(['token', 'complete', 'error']),
|
|
97
|
-
* content: s.optional(s.string()),
|
|
98
|
-
* });
|
|
99
|
-
*
|
|
100
|
-
* router.get('/stream', sse({ output: StreamEventSchema }, async (c, stream) => {
|
|
101
|
-
* await stream.writeSSE({ data: JSON.stringify({ type: 'token', content: 'Hello' }) });
|
|
102
|
-
* await stream.writeSSE({ data: JSON.stringify({ type: 'complete' }) });
|
|
103
|
-
* stream.close();
|
|
104
|
-
* }));
|
|
105
|
-
* ```
|
|
106
|
-
*/
|
|
107
|
-
output: Schema<TOutput, TOutput>;
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
/**
|
|
111
|
-
* Format an SSE message according to the SSE specification.
|
|
112
|
-
* @see https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events
|
|
113
|
-
*/
|
|
114
|
-
function formatSSEMessage(message: SSEMessage): string {
|
|
115
|
-
let text = '';
|
|
116
|
-
if (message.event) {
|
|
117
|
-
text += `event: ${message.event}\n`;
|
|
118
|
-
}
|
|
119
|
-
if (message.id) {
|
|
120
|
-
text += `id: ${message.id}\n`;
|
|
121
|
-
}
|
|
122
|
-
if (typeof message.retry === 'number') {
|
|
123
|
-
text += `retry: ${message.retry}\n`;
|
|
124
|
-
}
|
|
125
|
-
// Data can be multiline - each line needs its own "data:" prefix
|
|
126
|
-
const dataLines = message.data.split(/\r?\n/);
|
|
127
|
-
for (const line of dataLines) {
|
|
128
|
-
text += `data: ${line}\n`;
|
|
129
|
-
}
|
|
130
|
-
// SSE messages are terminated by a blank line
|
|
131
|
-
text += '\n';
|
|
132
|
-
return text;
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
/**
|
|
136
|
-
* Creates an SSE (Server-Sent Events) middleware for streaming updates to clients.
|
|
137
|
-
*
|
|
138
|
-
* This implementation uses Hono's stream() helper instead of streamSSE() to ensure
|
|
139
|
-
* compatibility with async operations that consume ReadableStreams internally
|
|
140
|
-
* (like AI SDK's generateText/generateObject). The stream() helper uses a fire-and-forget
|
|
141
|
-
* pattern that avoids "ReadableStream has already been used" errors.
|
|
142
|
-
*
|
|
143
|
-
* Use with router.get() to create an SSE endpoint:
|
|
144
|
-
*
|
|
145
|
-
* @example Basic SSE without typed output
|
|
146
|
-
* ```typescript
|
|
147
|
-
* import { createRouter, sse } from '@agentuity/runtime';
|
|
148
|
-
*
|
|
149
|
-
* const router = createRouter();
|
|
150
|
-
*
|
|
151
|
-
* router.get('/events', sse((c, stream) => {
|
|
152
|
-
* let count = 0;
|
|
153
|
-
* const interval = setInterval(() => {
|
|
154
|
-
* stream.writeSSE({
|
|
155
|
-
* data: `Event ${++count}`,
|
|
156
|
-
* event: 'update'
|
|
157
|
-
* });
|
|
158
|
-
* if (count >= 10) {
|
|
159
|
-
* clearInterval(interval);
|
|
160
|
-
* stream.close();
|
|
161
|
-
* }
|
|
162
|
-
* }, 1000);
|
|
163
|
-
*
|
|
164
|
-
* stream.onAbort(() => {
|
|
165
|
-
* clearInterval(interval);
|
|
166
|
-
* });
|
|
167
|
-
* }));
|
|
168
|
-
* ```
|
|
169
|
-
*
|
|
170
|
-
* @example SSE with typed output schema
|
|
171
|
-
* ```typescript
|
|
172
|
-
* import { createRouter, sse } from '@agentuity/runtime';
|
|
173
|
-
* import { s } from '@agentuity/schema';
|
|
174
|
-
*
|
|
175
|
-
* // Define your SSE event schema
|
|
176
|
-
* export const outputSchema = s.object({
|
|
177
|
-
* type: s.enum(['token', 'complete', 'error']),
|
|
178
|
-
* content: s.optional(s.string()),
|
|
179
|
-
* });
|
|
180
|
-
*
|
|
181
|
-
* const router = createRouter();
|
|
182
|
-
*
|
|
183
|
-
* // Pass schema as first argument for typed SSE routes
|
|
184
|
-
* router.get('/stream', sse({ output: outputSchema }, async (c, stream) => {
|
|
185
|
-
* await stream.writeSSE({ data: JSON.stringify({ type: 'token', content: 'Hello' }) });
|
|
186
|
-
* await stream.writeSSE({ data: JSON.stringify({ type: 'complete' }) });
|
|
187
|
-
* stream.close();
|
|
188
|
-
* }));
|
|
189
|
-
*
|
|
190
|
-
* // On the frontend, EventSource/EventStreamManager will now have typed data:
|
|
191
|
-
* // const { data } = EventSource/EventStreamManager('/api/stream');
|
|
192
|
-
* // data.type is 'token' | 'complete' | 'error'
|
|
193
|
-
* ```
|
|
194
|
-
*
|
|
195
|
-
* @param handler - Handler function receiving context and SSE stream
|
|
196
|
-
* @param options - Optional configuration with output schema for type inference
|
|
197
|
-
* @returns Hono handler for SSE streaming
|
|
198
|
-
* @see https://github.com/agentuity/sdk/issues/471
|
|
199
|
-
* @see https://github.com/agentuity/sdk/issues/855
|
|
200
|
-
*/
|
|
201
|
-
export function sse<E extends Env = Env>(handler: SSEHandler<E>): Handler<E>;
|
|
202
|
-
/**
|
|
203
|
-
* Creates an SSE middleware with typed output schema.
|
|
204
|
-
*
|
|
205
|
-
* @param options - Configuration object containing the output schema
|
|
206
|
-
* @param handler - Handler function receiving context and SSE stream
|
|
207
|
-
* @returns Hono handler for SSE streaming
|
|
208
|
-
*/
|
|
209
|
-
export function sse<E extends Env = Env, TOutput = unknown>(
|
|
210
|
-
options: SSEOptions<TOutput>,
|
|
211
|
-
handler: SSEHandler<E>
|
|
212
|
-
): Handler<E>;
|
|
213
|
-
export function sse<E extends Env = Env, TOutput = unknown>(
|
|
214
|
-
handlerOrOptions: SSEHandler<E> | SSEOptions<TOutput>,
|
|
215
|
-
maybeHandler?: SSEHandler<E>
|
|
216
|
-
): Handler<E> {
|
|
217
|
-
// Determine if first arg is options or handler
|
|
218
|
-
const handler: SSEHandler<E> | undefined =
|
|
219
|
-
typeof handlerOrOptions === 'function' ? handlerOrOptions : maybeHandler;
|
|
220
|
-
|
|
221
|
-
// Validate handler is provided - catches sse({ output }) without handler
|
|
222
|
-
if (!handler) {
|
|
223
|
-
throw new SSEHandlerMissingError();
|
|
224
|
-
}
|
|
225
|
-
|
|
226
|
-
// Note: options.output is captured for type inference but not used at runtime
|
|
227
|
-
// The CLI extracts this during build to generate typed route registries
|
|
228
|
-
const sseHandler: Handler<E> = (c: Context<E>) => {
|
|
229
|
-
// Track stream completion for deferred session/thread saving
|
|
230
|
-
// This promise resolves when the stream closes (normally or via abort)
|
|
231
|
-
let resolveDone: (() => void) | undefined;
|
|
232
|
-
let rejectDone: ((reason?: unknown) => void) | undefined;
|
|
233
|
-
const donePromise = new Promise<void>((resolve, reject) => {
|
|
234
|
-
resolveDone = resolve;
|
|
235
|
-
rejectDone = reject;
|
|
236
|
-
});
|
|
237
|
-
|
|
238
|
-
// Prevent unhandled rejection warnings if no middleware consumes donePromise.
|
|
239
|
-
// The error is still propagated via the rejection for middleware that awaits it.
|
|
240
|
-
donePromise.catch(() => {
|
|
241
|
-
// Intentionally empty - error is logged in runInContext catch block
|
|
242
|
-
});
|
|
243
|
-
|
|
244
|
-
// Idempotent function to mark stream as completed
|
|
245
|
-
let isDone = false;
|
|
246
|
-
const markDone = (error?: unknown) => {
|
|
247
|
-
if (isDone) return;
|
|
248
|
-
isDone = true;
|
|
249
|
-
if (error && rejectDone) {
|
|
250
|
-
rejectDone(error);
|
|
251
|
-
} else if (resolveDone) {
|
|
252
|
-
resolveDone();
|
|
253
|
-
}
|
|
254
|
-
};
|
|
255
|
-
|
|
256
|
-
// Expose completion tracking to middleware
|
|
257
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
258
|
-
(c as any).set(STREAM_DONE_PROMISE_KEY, donePromise);
|
|
259
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
260
|
-
(c as any).set(IS_STREAMING_RESPONSE_KEY, true);
|
|
261
|
-
|
|
262
|
-
// Set SSE-specific headers
|
|
263
|
-
c.header('Content-Type', 'text/event-stream');
|
|
264
|
-
c.header('Cache-Control', 'no-cache');
|
|
265
|
-
c.header('Connection', 'keep-alive');
|
|
266
|
-
|
|
267
|
-
// Use honoStream instead of honoStreamSSE.
|
|
268
|
-
// honoStream uses a fire-and-forget async IIFE pattern that returns the Response
|
|
269
|
-
// immediately while the handler runs in the background. This is critical for
|
|
270
|
-
// compatibility with AI SDK's generateText/generateObject which use fetch()
|
|
271
|
-
// internally. With honoStreamSSE, the callback is awaited before returning,
|
|
272
|
-
// which causes "ReadableStream has already been used" errors when fetch
|
|
273
|
-
// response streams are consumed in the same async chain.
|
|
274
|
-
// See: https://github.com/agentuity/sdk/issues/471
|
|
275
|
-
|
|
276
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
277
|
-
return honoStream(c, async (s: any) => {
|
|
278
|
-
const encoder = new TextEncoder();
|
|
279
|
-
|
|
280
|
-
// Track if user registered an onAbort callback
|
|
281
|
-
let userAbortCallback: (() => void) | undefined;
|
|
282
|
-
|
|
283
|
-
// Internal function to write an SSE message
|
|
284
|
-
const writeSSEInternal = async (message: SSEMessage): Promise<void> => {
|
|
285
|
-
const formatted = formatSSEMessage(message);
|
|
286
|
-
await s.write(encoder.encode(formatted));
|
|
287
|
-
};
|
|
288
|
-
|
|
289
|
-
const wrappedStream: SSEStream = {
|
|
290
|
-
write: async (data) => {
|
|
291
|
-
if (
|
|
292
|
-
typeof data === 'string' ||
|
|
293
|
-
typeof data === 'number' ||
|
|
294
|
-
typeof data === 'boolean'
|
|
295
|
-
) {
|
|
296
|
-
return writeSSEInternal({ data: String(data) });
|
|
297
|
-
} else if (typeof data === 'object' && data !== null) {
|
|
298
|
-
return writeSSEInternal(data as SSEMessage);
|
|
299
|
-
}
|
|
300
|
-
return writeSSEInternal({ data: String(data) });
|
|
301
|
-
},
|
|
302
|
-
writeSSE: writeSSEInternal,
|
|
303
|
-
onAbort: (callback: () => void) => {
|
|
304
|
-
userAbortCallback = callback;
|
|
305
|
-
s.onAbort(() => {
|
|
306
|
-
try {
|
|
307
|
-
callback();
|
|
308
|
-
} finally {
|
|
309
|
-
// Mark stream as done on abort
|
|
310
|
-
markDone();
|
|
311
|
-
}
|
|
312
|
-
});
|
|
313
|
-
},
|
|
314
|
-
close: () => {
|
|
315
|
-
try {
|
|
316
|
-
s.close?.();
|
|
317
|
-
} finally {
|
|
318
|
-
// Mark stream as done on close
|
|
319
|
-
markDone();
|
|
320
|
-
}
|
|
321
|
-
},
|
|
322
|
-
};
|
|
323
|
-
|
|
324
|
-
// Always register internal abort handler if user doesn't register one
|
|
325
|
-
// This ensures we track completion even if user doesn't call onAbort
|
|
326
|
-
s.onAbort(() => {
|
|
327
|
-
if (!userAbortCallback) {
|
|
328
|
-
// Only mark done if user didn't register their own handler
|
|
329
|
-
// (their handler wrapper already calls markDone)
|
|
330
|
-
markDone();
|
|
331
|
-
}
|
|
332
|
-
});
|
|
333
|
-
|
|
334
|
-
const runInContext = async () => {
|
|
335
|
-
try {
|
|
336
|
-
await handler(c, wrappedStream);
|
|
337
|
-
markDone();
|
|
338
|
-
} catch (err) {
|
|
339
|
-
// Log error but don't rethrow - would be unhandled rejection
|
|
340
|
-
c.var.logger?.error?.('SSE handler error:', err);
|
|
341
|
-
markDone(err);
|
|
342
|
-
}
|
|
343
|
-
};
|
|
344
|
-
|
|
345
|
-
// IMPORTANT: We run in ROOT_CONTEXT (no active OTEL span) to avoid a Bun bug
|
|
346
|
-
// where OTEL-instrumented fetch conflicts with streaming responses.
|
|
347
|
-
// This causes "ReadableStream has already been used" errors when AI SDK's
|
|
348
|
-
// generateText/generateObject (which use fetch + stream.tee() internally)
|
|
349
|
-
// are called inside SSE handlers. Running without an active span makes
|
|
350
|
-
// our OTEL fetch wrapper use the original unpatched fetch.
|
|
351
|
-
// See: https://github.com/agentuity/sdk/issues/471
|
|
352
|
-
// See: https://github.com/oven-sh/bun/issues/24766
|
|
353
|
-
await otelContext.with(ROOT_CONTEXT, runInContext);
|
|
354
|
-
});
|
|
355
|
-
};
|
|
356
|
-
|
|
357
|
-
return tagRoute(sseHandler, { type: 'sse' });
|
|
358
|
-
}
|
package/src/handlers/stream.ts
DELETED
|
@@ -1,121 +0,0 @@
|
|
|
1
|
-
import type { Context, Handler } from 'hono';
|
|
2
|
-
import { stream as honoStream } from 'hono/streaming';
|
|
3
|
-
import { context as otelContext, ROOT_CONTEXT } from '@opentelemetry/api';
|
|
4
|
-
import type { Env } from '../app';
|
|
5
|
-
import { STREAM_DONE_PROMISE_KEY, IS_STREAMING_RESPONSE_KEY } from './sse';
|
|
6
|
-
import { tagRoute } from './_route-meta';
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* Handler function for streaming responses.
|
|
10
|
-
* Returns a ReadableStream that will be piped to the response.
|
|
11
|
-
*/
|
|
12
|
-
export type StreamHandler<E extends Env = Env> = (
|
|
13
|
-
c: Context<E>
|
|
14
|
-
) => ReadableStream<Uint8Array | string> | Promise<ReadableStream<Uint8Array | string>>;
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* Creates a streaming middleware for returning ReadableStream responses.
|
|
18
|
-
*
|
|
19
|
-
* Use with router.post() (or any HTTP method) to create a streaming endpoint:
|
|
20
|
-
*
|
|
21
|
-
* @example
|
|
22
|
-
* ```typescript
|
|
23
|
-
* import { createRouter, stream } from '@agentuity/runtime';
|
|
24
|
-
*
|
|
25
|
-
* const router = createRouter();
|
|
26
|
-
*
|
|
27
|
-
* router.post('/events', stream((c) => {
|
|
28
|
-
* return new ReadableStream({
|
|
29
|
-
* start(controller) {
|
|
30
|
-
* controller.enqueue('event 1\n');
|
|
31
|
-
* controller.enqueue('event 2\n');
|
|
32
|
-
* controller.close();
|
|
33
|
-
* }
|
|
34
|
-
* });
|
|
35
|
-
* }));
|
|
36
|
-
* ```
|
|
37
|
-
*
|
|
38
|
-
* @example
|
|
39
|
-
* ```typescript
|
|
40
|
-
* // Async stream with data from request body
|
|
41
|
-
* router.post('/process', stream(async (c) => {
|
|
42
|
-
* const body = await c.req.json();
|
|
43
|
-
*
|
|
44
|
-
* return new ReadableStream({
|
|
45
|
-
* async start(controller) {
|
|
46
|
-
* for (const item of body.items) {
|
|
47
|
-
* controller.enqueue(`Processing: ${item}\n`);
|
|
48
|
-
* await new Promise(r => setTimeout(r, 100));
|
|
49
|
-
* }
|
|
50
|
-
* controller.close();
|
|
51
|
-
* }
|
|
52
|
-
* });
|
|
53
|
-
* }));
|
|
54
|
-
* ```
|
|
55
|
-
*
|
|
56
|
-
* @param handler - Handler function returning a ReadableStream
|
|
57
|
-
* @returns Hono handler for streaming response
|
|
58
|
-
*/
|
|
59
|
-
export function stream<E extends Env = Env>(handler: StreamHandler<E>): Handler<E> {
|
|
60
|
-
const streamHandler: Handler<E> = (c: Context<E>) => {
|
|
61
|
-
// Track stream completion for deferred session/thread saving
|
|
62
|
-
// This promise resolves when the stream completes (pipe finishes or errors)
|
|
63
|
-
let resolveDone: (() => void) | undefined;
|
|
64
|
-
let rejectDone: ((reason?: unknown) => void) | undefined;
|
|
65
|
-
const donePromise = new Promise<void>((resolve, reject) => {
|
|
66
|
-
resolveDone = resolve;
|
|
67
|
-
rejectDone = reject;
|
|
68
|
-
});
|
|
69
|
-
|
|
70
|
-
// Idempotent function to mark stream as completed
|
|
71
|
-
let isDone = false;
|
|
72
|
-
const markDone = (error?: unknown) => {
|
|
73
|
-
if (isDone) return;
|
|
74
|
-
isDone = true;
|
|
75
|
-
if (error && rejectDone) {
|
|
76
|
-
rejectDone(error);
|
|
77
|
-
} else if (resolveDone) {
|
|
78
|
-
resolveDone();
|
|
79
|
-
}
|
|
80
|
-
};
|
|
81
|
-
|
|
82
|
-
// Expose completion tracking to middleware
|
|
83
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
84
|
-
(c as any).set(STREAM_DONE_PROMISE_KEY, donePromise);
|
|
85
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
86
|
-
(c as any).set(IS_STREAMING_RESPONSE_KEY, true);
|
|
87
|
-
|
|
88
|
-
c.header('Content-Type', 'application/octet-stream');
|
|
89
|
-
|
|
90
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
91
|
-
return honoStream(c, async (s: any) => {
|
|
92
|
-
const runInContext = async () => {
|
|
93
|
-
try {
|
|
94
|
-
let streamResult = handler(c);
|
|
95
|
-
if (streamResult instanceof Promise) {
|
|
96
|
-
streamResult = await streamResult;
|
|
97
|
-
}
|
|
98
|
-
await s.pipe(streamResult);
|
|
99
|
-
// Stream completed successfully
|
|
100
|
-
markDone();
|
|
101
|
-
} catch (err) {
|
|
102
|
-
c.var.logger?.error('Stream error:', err);
|
|
103
|
-
markDone(err);
|
|
104
|
-
throw err;
|
|
105
|
-
}
|
|
106
|
-
};
|
|
107
|
-
|
|
108
|
-
// IMPORTANT: We run in ROOT_CONTEXT (no active OTEL span) to avoid a Bun bug
|
|
109
|
-
// where OTEL-instrumented fetch conflicts with streaming responses.
|
|
110
|
-
// This causes "ReadableStream has already been used" errors when AI SDK's
|
|
111
|
-
// generateText/generateObject (which use fetch + stream.tee() internally)
|
|
112
|
-
// are called inside stream handlers. Running without an active span makes
|
|
113
|
-
// our OTEL fetch wrapper use the original unpatched fetch.
|
|
114
|
-
// See: https://github.com/agentuity/sdk/issues/471
|
|
115
|
-
// See: https://github.com/oven-sh/bun/issues/24766
|
|
116
|
-
await otelContext.with(ROOT_CONTEXT, runInContext);
|
|
117
|
-
});
|
|
118
|
-
};
|
|
119
|
-
|
|
120
|
-
return tagRoute(streamHandler, { type: 'stream' });
|
|
121
|
-
}
|
package/src/handlers/webrtc.ts
DELETED
|
@@ -1,125 +0,0 @@
|
|
|
1
|
-
import type { Context, MiddlewareHandler } from 'hono';
|
|
2
|
-
import { upgradeWebSocket } from 'hono/bun';
|
|
3
|
-
import { context as otelContext, ROOT_CONTEXT } from '@opentelemetry/api';
|
|
4
|
-
import { getAgentAsyncLocalStorage } from '../_context';
|
|
5
|
-
import type { Env } from '../app';
|
|
6
|
-
import { WebRTCRoomManager, type WebRTCOptions } from '../webrtc-signaling';
|
|
7
|
-
import type { WebSocketConnection } from './websocket';
|
|
8
|
-
|
|
9
|
-
export type { WebRTCOptions };
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* Handler function for WebRTC signaling connections.
|
|
13
|
-
* Receives the Hono context and WebRTCRoomManager.
|
|
14
|
-
*/
|
|
15
|
-
export type WebRTCHandler<E extends Env = Env> = (
|
|
16
|
-
c: Context<E>,
|
|
17
|
-
roomManager: WebRTCRoomManager
|
|
18
|
-
) => void | Promise<void>;
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* Creates a WebRTC signaling middleware for peer-to-peer communication.
|
|
22
|
-
*
|
|
23
|
-
* This middleware sets up a WebSocket-based signaling server that handles:
|
|
24
|
-
* - Room membership and peer discovery
|
|
25
|
-
* - SDP offer/answer relay
|
|
26
|
-
* - ICE candidate relay
|
|
27
|
-
*
|
|
28
|
-
* Use with router.get() to create a WebRTC signaling endpoint:
|
|
29
|
-
*
|
|
30
|
-
* @example
|
|
31
|
-
* ```typescript
|
|
32
|
-
* import { createRouter, webrtc } from '@agentuity/runtime';
|
|
33
|
-
*
|
|
34
|
-
* const router = createRouter();
|
|
35
|
-
*
|
|
36
|
-
* // Basic signaling endpoint
|
|
37
|
-
* router.get('/call/signal', webrtc());
|
|
38
|
-
*
|
|
39
|
-
* // With options
|
|
40
|
-
* router.get('/call/signal', webrtc({ maxPeers: 4 }));
|
|
41
|
-
*
|
|
42
|
-
* // With callbacks for monitoring
|
|
43
|
-
* router.get('/call/signal', webrtc({
|
|
44
|
-
* maxPeers: 2,
|
|
45
|
-
* callbacks: {
|
|
46
|
-
* onRoomCreated: (roomId) => console.log(`Room ${roomId} created`),
|
|
47
|
-
* onPeerJoin: (peerId, roomId) => console.log(`${peerId} joined ${roomId}`),
|
|
48
|
-
* onPeerLeave: (peerId, roomId, reason) => {
|
|
49
|
-
* console.log(`${peerId} left ${roomId}: ${reason}`);
|
|
50
|
-
* },
|
|
51
|
-
* },
|
|
52
|
-
* }));
|
|
53
|
-
* ```
|
|
54
|
-
*
|
|
55
|
-
* @param options - Configuration options for WebRTC signaling
|
|
56
|
-
* @returns Hono middleware handler for WebSocket upgrade
|
|
57
|
-
*/
|
|
58
|
-
export function webrtc<E extends Env = Env>(options?: WebRTCOptions): MiddlewareHandler<E> {
|
|
59
|
-
const roomManager = new WebRTCRoomManager(options);
|
|
60
|
-
|
|
61
|
-
const wsHandler = upgradeWebSocket((_c: Context<E>) => {
|
|
62
|
-
let currentWs: WebSocketConnection | undefined;
|
|
63
|
-
// we need a Privder interface here with AsyncLocalStorage and KV
|
|
64
|
-
const asyncLocalStorage = getAgentAsyncLocalStorage();
|
|
65
|
-
const capturedContext = asyncLocalStorage.getStore();
|
|
66
|
-
|
|
67
|
-
return {
|
|
68
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
69
|
-
onOpen: (_event: Event, ws: any) => {
|
|
70
|
-
otelContext.with(ROOT_CONTEXT, () => {
|
|
71
|
-
if (capturedContext) {
|
|
72
|
-
asyncLocalStorage.run(capturedContext, () => {
|
|
73
|
-
currentWs = {
|
|
74
|
-
onOpen: () => {},
|
|
75
|
-
onMessage: () => {},
|
|
76
|
-
onClose: () => {},
|
|
77
|
-
send: (data) => ws.send(data),
|
|
78
|
-
};
|
|
79
|
-
});
|
|
80
|
-
} else {
|
|
81
|
-
currentWs = {
|
|
82
|
-
onOpen: () => {},
|
|
83
|
-
onMessage: () => {},
|
|
84
|
-
onClose: () => {},
|
|
85
|
-
send: (data) => ws.send(data),
|
|
86
|
-
};
|
|
87
|
-
}
|
|
88
|
-
});
|
|
89
|
-
},
|
|
90
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
91
|
-
onMessage: (event: MessageEvent, _ws: any) => {
|
|
92
|
-
if (currentWs) {
|
|
93
|
-
otelContext.with(ROOT_CONTEXT, () => {
|
|
94
|
-
if (capturedContext) {
|
|
95
|
-
asyncLocalStorage.run(capturedContext, () => {
|
|
96
|
-
roomManager.handleMessage(currentWs!, String(event.data));
|
|
97
|
-
});
|
|
98
|
-
} else {
|
|
99
|
-
roomManager.handleMessage(currentWs!, String(event.data));
|
|
100
|
-
}
|
|
101
|
-
});
|
|
102
|
-
}
|
|
103
|
-
},
|
|
104
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
105
|
-
onClose: (_event: CloseEvent, _ws: any) => {
|
|
106
|
-
if (currentWs) {
|
|
107
|
-
otelContext.with(ROOT_CONTEXT, () => {
|
|
108
|
-
if (capturedContext) {
|
|
109
|
-
asyncLocalStorage.run(capturedContext, () => {
|
|
110
|
-
roomManager.handleDisconnect(currentWs!);
|
|
111
|
-
});
|
|
112
|
-
} else {
|
|
113
|
-
roomManager.handleDisconnect(currentWs!);
|
|
114
|
-
}
|
|
115
|
-
});
|
|
116
|
-
}
|
|
117
|
-
},
|
|
118
|
-
};
|
|
119
|
-
});
|
|
120
|
-
|
|
121
|
-
const middleware: MiddlewareHandler<E> = (c, next) =>
|
|
122
|
-
(wsHandler as unknown as MiddlewareHandler<E>)(c, next);
|
|
123
|
-
|
|
124
|
-
return middleware;
|
|
125
|
-
}
|