@agentuity/runtime 1.0.0 → 1.0.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.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,mBAAmB;AACnB,OAAO,EAUN,qBAAqB,EACrB,eAAe,EAGf,aAAa,EACb,cAAc,EACd,cAAc,EAEd,WAAW,EACX,sBAAsB,EACtB,qBAAqB,EACrB,SAAS,EACT,cAAc,EACd,iBAAiB,EACjB,iBAAiB,GACjB,MAAM,SAAS,CAAC;AAEjB,iDAAiD;AACjD,OAAO,EAUN,SAAS,EACT,MAAM,EACN,WAAW,EACX,YAAY,EACZ,WAAW,EACX,oBAAoB,EACpB,SAAS,GACT,MAAM,OAAO,CAAC;AAEf,2CAA2C;AAC3C,OAAO,EAAE,uBAAuB,EAAiC,MAAM,QAAQ,CAAC;AAChF,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAElE,sCAAsC;AACtC,OAAO,EACN,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,EACpB,2BAA2B,EAC3B,0BAA0B,EAC1B,gBAAgB,GAChB,MAAM,cAAc,CAAC;AAEtB,mDAAmD;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,2BAA2B,EAAE,MAAM,uBAAuB,CAAC;AAEpE,wDAAwD;AACxD,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAE1E,6DAA6D;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAErD,qBAAqB;AACrB,OAAO,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAElD,oBAAoB;AACpB,OAAO,EAA0C,YAAY,EAAE,MAAM,UAAU,CAAC;AAEhF,0DAA0D;AAC1D,OAAO,EACN,SAAS,EAET,GAAG,EAIH,MAAM,EAEN,IAAI,GAGJ,MAAM,YAAY,CAAC;AAEpB,kBAAkB;AAClB,OAAO,EACN,uBAAuB,GAYvB,MAAM,QAAQ,CAAC;AAEhB,qBAAqB;AACrB,OAAO,EAUN,UAAU,EACV,uBAAuB,EACvB,aAAa,EACb,eAAe,GACf,MAAM,WAAW,CAAC;AAEnB,gCAAgC;AAChC,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAE9D,uBAAuB;AACvB,OAAO,EACN,6BAA6B,EAC7B,qBAAqB,EACrB,4BAA4B,EAC5B,6BAA6B,GAC7B,MAAM,aAAa,CAAC;AAErB,iBAAiB;AACjB,OAAO,EAAE,eAAe,EAAE,MAAM,OAAO,CAAC;AAExC,uBAAuB;AACvB,OAAO,EAAuB,SAAS,EAAE,MAAM,aAAa,CAAC;AAK7D,qBAAqB;AACrB,OAAO,EACN,SAAS,EACT,eAAe,EACf,YAAY,EACZ,SAAS,EACT,eAAe,EACf,SAAS,EACT,eAAe,EACf,gBAAgB,EAChB,iBAAiB,EACjB,cAAc,EACd,WAAW,EACX,SAAS,EACT,wBAAwB,GACxB,MAAM,WAAW,CAAC;AAEnB,wBAAwB;AACxB,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAEnD,6CAA6C;AAC7C,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE5F,yBAAyB;AACzB,OAAO,EACN,kBAAkB,EAClB,sBAAsB,GAGtB,MAAM,eAAe,CAAC;AAEvB,2BAA2B;AAC3B,OAAO,EACN,wBAAwB,EACxB,yBAAyB,EACzB,wBAAwB,EACxB,6BAA6B,GAC7B,MAAM,oBAAoB,CAAC;AAE5B,uBAAuB;AACvB,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,iEAAiE;AACjE,OAAO,EACN,iBAAiB,EACjB,YAAY,EACZ,eAAe,EACf,SAAS,EACT,YAAY,EACZ,oBAAoB,GACpB,MAAM,WAAW,CAAC;AAEnB,uBAAuB;AACvB,OAAO,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AA6C7F,uEAAuE;AACvE,iFAAiF;AACjF,2CAA2C;AAC3C,OAAO,EAAE,mBAAmB,EAAgC,MAAM,mBAAmB,CAAC;AAEtF,0BAA0B;AAC1B,OAAO,EAAE,uBAAuB,EAAE,0BAA0B,EAAE,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/router.d.ts CHANGED
@@ -66,6 +66,7 @@ declare module 'hono' {
66
66
  * - **sse()** - Server-Sent Events (import { sse } from '@agentuity/runtime')
67
67
  * - **stream()** - Streaming responses (import { stream } from '@agentuity/runtime')
68
68
  * - **cron()** - Scheduled tasks (import { cron } from '@agentuity/runtime')
69
+ * - **webrtc()** - WebRTC signaling (import { webrtc } from '@agentuity/runtime')
69
70
  *
70
71
  * @template E - Environment type (Hono Env)
71
72
  * @template S - Schema type for route definitions
@@ -1 +1 @@
1
- {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,IAAI,EAAE,KAAK,MAAM,EAAE,KAAK,GAAG,IAAI,OAAO,EAAE,MAAM,MAAM,CAAC;AAE5E,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAIjC,YAAY,EAAE,GAAG,EAAE,CAAC;AACpB,YAAY,EAAE,OAAO,EAAE,CAAC;AAGxB,YAAY,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAGhE,OAAO,QAAQ,MAAM,CAAC;IAGrB,UAAU,OAAO;QAChB;;;;;;;;;;;;;WAaG;QACH,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC;KACxE;IAGD,UAAU,IAAI;QACb;;;;;;WAMG;QACH,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;QAE9C;;;;;;WAMG;QACH,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;QAExC;;;;;;WAMG;QACH,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;QAE3C;;;;;;WAMG;QACH,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;KAC7C;CACD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwDG;AACH,eAAO,MAAM,YAAY,GAAI,CAAC,SAAS,GAAG,GAAG,GAAG,EAAE,CAAC,SAAS,MAAM,GAAG,MAAM,OAAK,IAAI,CAAC,CAAC,EAAE,CAAC,CAkJxF,CAAC"}
1
+ {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,IAAI,EAAE,KAAK,MAAM,EAAE,KAAK,GAAG,IAAI,OAAO,EAAE,MAAM,MAAM,CAAC;AAE5E,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAIjC,YAAY,EAAE,GAAG,EAAE,CAAC;AACpB,YAAY,EAAE,OAAO,EAAE,CAAC;AAGxB,YAAY,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAGhE,OAAO,QAAQ,MAAM,CAAC;IAGrB,UAAU,OAAO;QAChB;;;;;;;;;;;;;WAaG;QACH,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC;KACxE;IAGD,UAAU,IAAI;QACb;;;;;;WAMG;QACH,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;QAE9C;;;;;;WAMG;QACH,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;QAExC;;;;;;WAMG;QACH,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;QAE3C;;;;;;WAMG;QACH,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;KAC7C;CACD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyDG;AACH,eAAO,MAAM,YAAY,GAAI,CAAC,SAAS,GAAG,GAAG,GAAG,EAAE,CAAC,SAAS,MAAM,GAAG,MAAM,OAAK,IAAI,CAAC,CAAC,EAAE,CAAC,CAkJxF,CAAC"}
package/dist/router.js CHANGED
@@ -12,6 +12,7 @@ import { loadBuildMetadata } from './_metadata';
12
12
  * - **sse()** - Server-Sent Events (import { sse } from '@agentuity/runtime')
13
13
  * - **stream()** - Streaming responses (import { stream } from '@agentuity/runtime')
14
14
  * - **cron()** - Scheduled tasks (import { cron } from '@agentuity/runtime')
15
+ * - **webrtc()** - WebRTC signaling (import { webrtc } from '@agentuity/runtime')
15
16
  *
16
17
  * @template E - Environment type (Hono Env)
17
18
  * @template S - Schema type for route definitions
@@ -1 +1 @@
1
- {"version":3,"file":"router.js","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"router.js","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,80 @@
1
+ import type { WebSocketConnection } from './handlers/websocket';
2
+ import type { SDPDescription, ICECandidate, SignalMessage, WebRTCSignalingCallbacks } from '@agentuity/core';
3
+ export type { SDPDescription, ICECandidate, SignalMessage, WebRTCSignalingCallbacks };
4
+ /**
5
+ * Configuration options for WebRTC signaling.
6
+ */
7
+ export interface WebRTCOptions {
8
+ /** Maximum number of peers per room (default: 2) */
9
+ maxPeers?: number;
10
+ /** Callbacks for signaling events */
11
+ callbacks?: WebRTCSignalingCallbacks;
12
+ }
13
+ /**
14
+ * In-memory room manager for WebRTC signaling.
15
+ * Tracks rooms and their connected peers.
16
+ *
17
+ * @example
18
+ * ```ts
19
+ * import { createRouter, webrtc } from '@agentuity/runtime';
20
+ *
21
+ * const router = createRouter();
22
+ *
23
+ * // Basic usage
24
+ * router.get('/call/signal', webrtc());
25
+ *
26
+ * // With callbacks for monitoring
27
+ * router.get('/call/signal', webrtc({
28
+ * maxPeers: 2,
29
+ * callbacks: {
30
+ * onRoomCreated: (roomId) => console.log(`Room ${roomId} created`),
31
+ * onPeerJoin: (peerId, roomId) => console.log(`${peerId} joined ${roomId}`),
32
+ * onPeerLeave: (peerId, roomId, reason) => {
33
+ * analytics.track('peer_left', { peerId, roomId, reason });
34
+ * },
35
+ * onMessage: (type, from, to, roomId) => {
36
+ * metrics.increment(`webrtc.${type}`);
37
+ * },
38
+ * },
39
+ * }));
40
+ * ```
41
+ */
42
+ export declare class WebRTCRoomManager {
43
+ private rooms;
44
+ private wsToPeer;
45
+ private maxPeers;
46
+ private peerIdCounter;
47
+ private callbacks;
48
+ constructor(options?: WebRTCOptions);
49
+ private generatePeerId;
50
+ private send;
51
+ private broadcast;
52
+ /**
53
+ * Handle a peer joining a room
54
+ */
55
+ handleJoin(ws: WebSocketConnection, roomId: string): void;
56
+ /**
57
+ * Handle a peer disconnecting
58
+ */
59
+ handleDisconnect(ws: WebSocketConnection): void;
60
+ /**
61
+ * Relay SDP message to target peer(s)
62
+ */
63
+ handleSDP(ws: WebSocketConnection, to: string | undefined, description: SDPDescription): void;
64
+ /**
65
+ * Relay ICE candidate to target peer(s)
66
+ */
67
+ handleICE(ws: WebSocketConnection, to: string | undefined, candidate: ICECandidate): void;
68
+ /**
69
+ * Handle incoming signaling message
70
+ */
71
+ handleMessage(ws: WebSocketConnection, data: string): void;
72
+ /**
73
+ * Get room stats for debugging
74
+ */
75
+ getRoomStats(): {
76
+ roomCount: number;
77
+ totalPeers: number;
78
+ };
79
+ }
80
+ //# sourceMappingURL=webrtc-signaling.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webrtc-signaling.d.ts","sourceRoot":"","sources":["../src/webrtc-signaling.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,KAAK,EACX,cAAc,EACd,YAAY,EACZ,aAAa,EACb,wBAAwB,EACxB,MAAM,iBAAiB,CAAC;AAEzB,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,aAAa,EAAE,wBAAwB,EAAE,CAAC;AAEtF;;GAEG;AACH,MAAM,WAAW,aAAa;IAC7B,oDAAoD;IACpD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qCAAqC;IACrC,SAAS,CAAC,EAAE,wBAAwB,CAAC;CACrC;AAOD;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,qBAAa,iBAAiB;IAE7B,OAAO,CAAC,KAAK,CAAkD;IAE/D,OAAO,CAAC,QAAQ,CAAsE;IACtF,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,SAAS,CAA2B;gBAEhC,OAAO,CAAC,EAAE,aAAa;IAKnC,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,IAAI;IAIZ,OAAO,CAAC,SAAS;IAWjB;;OAEG;IACH,UAAU,CAAC,EAAE,EAAE,mBAAmB,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAsCzD;;OAEG;IACH,gBAAgB,CAAC,EAAE,EAAE,mBAAmB,GAAG,IAAI;IA0B/C;;OAEG;IACH,SAAS,CAAC,EAAE,EAAE,mBAAmB,EAAE,EAAE,EAAE,MAAM,GAAG,SAAS,EAAE,WAAW,EAAE,cAAc,GAAG,IAAI;IA+B7F;;OAEG;IACH,SAAS,CAAC,EAAE,EAAE,mBAAmB,EAAE,EAAE,EAAE,MAAM,GAAG,SAAS,EAAE,SAAS,EAAE,YAAY,GAAG,IAAI;IA+BzF;;OAEG;IACH,aAAa,CAAC,EAAE,EAAE,mBAAmB,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAiD1D;;OAEG;IACH,YAAY,IAAI;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE;CAOzD"}
@@ -0,0 +1,237 @@
1
+ /**
2
+ * In-memory room manager for WebRTC signaling.
3
+ * Tracks rooms and their connected peers.
4
+ *
5
+ * @example
6
+ * ```ts
7
+ * import { createRouter, webrtc } from '@agentuity/runtime';
8
+ *
9
+ * const router = createRouter();
10
+ *
11
+ * // Basic usage
12
+ * router.get('/call/signal', webrtc());
13
+ *
14
+ * // With callbacks for monitoring
15
+ * router.get('/call/signal', webrtc({
16
+ * maxPeers: 2,
17
+ * callbacks: {
18
+ * onRoomCreated: (roomId) => console.log(`Room ${roomId} created`),
19
+ * onPeerJoin: (peerId, roomId) => console.log(`${peerId} joined ${roomId}`),
20
+ * onPeerLeave: (peerId, roomId, reason) => {
21
+ * analytics.track('peer_left', { peerId, roomId, reason });
22
+ * },
23
+ * onMessage: (type, from, to, roomId) => {
24
+ * metrics.increment(`webrtc.${type}`);
25
+ * },
26
+ * },
27
+ * }));
28
+ * ```
29
+ */
30
+ export class WebRTCRoomManager {
31
+ // roomId -> Map<peerId, PeerConnection>
32
+ rooms = new Map();
33
+ // ws -> peerId (reverse lookup for cleanup)
34
+ wsToPeer = new Map();
35
+ maxPeers;
36
+ peerIdCounter = 0;
37
+ callbacks;
38
+ constructor(options) {
39
+ this.maxPeers = options?.maxPeers ?? 2;
40
+ this.callbacks = options?.callbacks ?? {};
41
+ }
42
+ generatePeerId() {
43
+ return `peer-${Date.now()}-${++this.peerIdCounter}`;
44
+ }
45
+ send(ws, msg) {
46
+ ws.send(JSON.stringify(msg));
47
+ }
48
+ broadcast(roomId, msg, excludePeerId) {
49
+ const room = this.rooms.get(roomId);
50
+ if (!room)
51
+ return;
52
+ for (const [peerId, peer] of room) {
53
+ if (peerId !== excludePeerId) {
54
+ this.send(peer.ws, msg);
55
+ }
56
+ }
57
+ }
58
+ /**
59
+ * Handle a peer joining a room
60
+ */
61
+ handleJoin(ws, roomId) {
62
+ let room = this.rooms.get(roomId);
63
+ const isNewRoom = !room;
64
+ // Create room if it doesn't exist
65
+ if (!room) {
66
+ room = new Map();
67
+ this.rooms.set(roomId, room);
68
+ }
69
+ // Check room capacity
70
+ if (room.size >= this.maxPeers) {
71
+ const error = new Error(`Room is full (max ${this.maxPeers} peers)`);
72
+ this.callbacks.onError?.(error, undefined, roomId);
73
+ this.send(ws, { t: 'error', message: error.message });
74
+ return;
75
+ }
76
+ const peerId = this.generatePeerId();
77
+ const existingPeers = Array.from(room.keys());
78
+ // Add peer to room
79
+ room.set(peerId, { ws, roomId });
80
+ this.wsToPeer.set(ws, { peerId, roomId });
81
+ // Fire callbacks
82
+ if (isNewRoom) {
83
+ this.callbacks.onRoomCreated?.(roomId);
84
+ }
85
+ this.callbacks.onPeerJoin?.(peerId, roomId);
86
+ // Send joined confirmation with list of existing peers
87
+ this.send(ws, { t: 'joined', peerId, roomId, peers: existingPeers });
88
+ // Notify existing peers about new peer
89
+ this.broadcast(roomId, { t: 'peer-joined', peerId }, peerId);
90
+ }
91
+ /**
92
+ * Handle a peer disconnecting
93
+ */
94
+ handleDisconnect(ws) {
95
+ const peerInfo = this.wsToPeer.get(ws);
96
+ if (!peerInfo)
97
+ return;
98
+ const { peerId, roomId } = peerInfo;
99
+ const room = this.rooms.get(roomId);
100
+ if (room) {
101
+ room.delete(peerId);
102
+ // Fire callback
103
+ this.callbacks.onPeerLeave?.(peerId, roomId, 'disconnect');
104
+ // Notify remaining peers
105
+ this.broadcast(roomId, { t: 'peer-left', peerId });
106
+ // Clean up empty room
107
+ if (room.size === 0) {
108
+ this.rooms.delete(roomId);
109
+ this.callbacks.onRoomDestroyed?.(roomId);
110
+ }
111
+ }
112
+ this.wsToPeer.delete(ws);
113
+ }
114
+ /**
115
+ * Relay SDP message to target peer(s)
116
+ */
117
+ handleSDP(ws, to, description) {
118
+ const peerInfo = this.wsToPeer.get(ws);
119
+ if (!peerInfo) {
120
+ const error = new Error('Not in a room');
121
+ this.callbacks.onError?.(error);
122
+ this.send(ws, { t: 'error', message: error.message });
123
+ return;
124
+ }
125
+ const { peerId, roomId } = peerInfo;
126
+ const room = this.rooms.get(roomId);
127
+ if (!room)
128
+ return;
129
+ // Fire callback
130
+ this.callbacks.onMessage?.('sdp', peerId, to, roomId);
131
+ // Server injects 'from' to prevent spoofing
132
+ const msg = { t: 'sdp', from: peerId, description };
133
+ if (to) {
134
+ // Send to specific peer
135
+ const targetPeer = room.get(to);
136
+ if (targetPeer) {
137
+ this.send(targetPeer.ws, msg);
138
+ }
139
+ }
140
+ else {
141
+ // Broadcast to all peers in room
142
+ this.broadcast(roomId, msg, peerId);
143
+ }
144
+ }
145
+ /**
146
+ * Relay ICE candidate to target peer(s)
147
+ */
148
+ handleICE(ws, to, candidate) {
149
+ const peerInfo = this.wsToPeer.get(ws);
150
+ if (!peerInfo) {
151
+ const error = new Error('Not in a room');
152
+ this.callbacks.onError?.(error);
153
+ this.send(ws, { t: 'error', message: error.message });
154
+ return;
155
+ }
156
+ const { peerId, roomId } = peerInfo;
157
+ const room = this.rooms.get(roomId);
158
+ if (!room)
159
+ return;
160
+ // Fire callback
161
+ this.callbacks.onMessage?.('ice', peerId, to, roomId);
162
+ // Server injects 'from' to prevent spoofing
163
+ const msg = { t: 'ice', from: peerId, candidate };
164
+ if (to) {
165
+ // Send to specific peer
166
+ const targetPeer = room.get(to);
167
+ if (targetPeer) {
168
+ this.send(targetPeer.ws, msg);
169
+ }
170
+ }
171
+ else {
172
+ // Broadcast to all peers in room
173
+ this.broadcast(roomId, msg, peerId);
174
+ }
175
+ }
176
+ /**
177
+ * Handle incoming signaling message
178
+ */
179
+ handleMessage(ws, data) {
180
+ let msg;
181
+ try {
182
+ msg = JSON.parse(data);
183
+ }
184
+ catch {
185
+ const error = new Error('Invalid JSON');
186
+ this.callbacks.onError?.(error);
187
+ this.send(ws, { t: 'error', message: error.message });
188
+ return;
189
+ }
190
+ // Validate message format
191
+ if (!msg || typeof msg.t !== 'string') {
192
+ const error = new Error('Invalid message format');
193
+ this.callbacks.onError?.(error);
194
+ this.send(ws, { t: 'error', message: error.message });
195
+ return;
196
+ }
197
+ switch (msg.t) {
198
+ case 'join':
199
+ if (!msg.roomId || typeof msg.roomId !== 'string') {
200
+ this.send(ws, { t: 'error', message: 'Missing or invalid roomId' });
201
+ return;
202
+ }
203
+ this.handleJoin(ws, msg.roomId);
204
+ break;
205
+ case 'sdp':
206
+ if (!msg.description || typeof msg.description !== 'object') {
207
+ this.send(ws, { t: 'error', message: 'Missing or invalid description' });
208
+ return;
209
+ }
210
+ this.handleSDP(ws, msg.to, msg.description);
211
+ break;
212
+ case 'ice':
213
+ if (!msg.candidate || typeof msg.candidate !== 'object') {
214
+ this.send(ws, { t: 'error', message: 'Missing or invalid candidate' });
215
+ return;
216
+ }
217
+ this.handleICE(ws, msg.to, msg.candidate);
218
+ break;
219
+ default:
220
+ this.send(ws, {
221
+ t: 'error',
222
+ message: `Unknown message type: ${msg.t}`,
223
+ });
224
+ }
225
+ }
226
+ /**
227
+ * Get room stats for debugging
228
+ */
229
+ getRoomStats() {
230
+ let totalPeers = 0;
231
+ for (const room of this.rooms.values()) {
232
+ totalPeers += room.size;
233
+ }
234
+ return { roomCount: this.rooms.size, totalPeers };
235
+ }
236
+ }
237
+ //# sourceMappingURL=webrtc-signaling.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webrtc-signaling.js","sourceRoot":"","sources":["../src/webrtc-signaling.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agentuity/runtime",
3
- "version": "1.0.0",
3
+ "version": "1.0.2",
4
4
  "license": "Apache-2.0",
5
5
  "author": "Agentuity employees and contributors",
6
6
  "type": "module",
@@ -26,11 +26,11 @@
26
26
  "prepublishOnly": "bun run clean && bun run build"
27
27
  },
28
28
  "dependencies": {
29
- "@agentuity/auth": "1.0.0",
30
- "@agentuity/core": "1.0.0",
31
- "@agentuity/frontend": "1.0.0",
32
- "@agentuity/schema": "1.0.0",
33
- "@agentuity/server": "1.0.0",
29
+ "@agentuity/auth": "1.0.2",
30
+ "@agentuity/core": "1.0.2",
31
+ "@agentuity/frontend": "1.0.2",
32
+ "@agentuity/schema": "1.0.2",
33
+ "@agentuity/server": "1.0.2",
34
34
  "@opentelemetry/api": "^1.9.0",
35
35
  "@opentelemetry/api-logs": "^0.207.0",
36
36
  "@opentelemetry/auto-instrumentations-node": "^0.66.0",
@@ -50,7 +50,7 @@
50
50
  "zod": "^4.3.5"
51
51
  },
52
52
  "devDependencies": {
53
- "@agentuity/test-utils": "1.0.0",
53
+ "@agentuity/test-utils": "1.0.2",
54
54
  "@types/bun": "latest",
55
55
  "@types/react": "^19.2.2",
56
56
  "@types/react-dom": "^19.2.2",
@@ -8,38 +8,148 @@ import type { Env } from '../app';
8
8
  */
9
9
  export type CronHandler<E extends Env = Env> = (c: Context<E>) => unknown | Promise<unknown>;
10
10
 
11
+ /**
12
+ * Options for the cron middleware.
13
+ */
14
+ export interface CronOptions {
15
+ /**
16
+ * Whether to require signature authentication for cron requests.
17
+ * When true, requests must include valid X-Agentuity-Cron-Signature
18
+ * and X-Agentuity-Cron-Timestamp headers signed with the project's SDK key.
19
+ * Signatures are valid for 5 minutes.
20
+ */
21
+ auth: boolean;
22
+ }
23
+
24
+ // Maximum age for cron signatures (5 minutes)
25
+ const MAX_SIGNATURE_AGE_SECONDS = 300;
26
+
27
+ /**
28
+ * Verifies the cron request signature from Catalyst.
29
+ * Returns true if signature is valid or if running in local dev mode (no SDK key).
30
+ */
31
+ async function verifyCronSignature(c: Context, body: string): Promise<boolean> {
32
+ const sdkKey = process.env.AGENTUITY_SDK_KEY;
33
+
34
+ // In local dev mode (no SDK key), allow all requests
35
+ if (!sdkKey) {
36
+ return true;
37
+ }
38
+
39
+ const signature = c.req.header('X-Agentuity-Cron-Signature');
40
+ const timestampStr = c.req.header('X-Agentuity-Cron-Timestamp');
41
+
42
+ // If no signature headers, reject the request
43
+ if (!signature || !timestampStr) {
44
+ return false;
45
+ }
46
+
47
+ // Verify timestamp is within acceptable range (prevent replay attacks)
48
+ const timestamp = parseInt(timestampStr, 10);
49
+ const now = Math.floor(Date.now() / 1000);
50
+ if (isNaN(timestamp) || Math.abs(now - timestamp) > MAX_SIGNATURE_AGE_SECONDS) {
51
+ return false;
52
+ }
53
+
54
+ // Validate signature format: must be 'v1=' followed by valid hex (64 chars for SHA-256)
55
+ if (!signature.startsWith('v1=')) {
56
+ return false;
57
+ }
58
+ const hexPayload = signature.slice(3);
59
+ if (!/^[0-9a-f]{64}$/i.test(hexPayload)) {
60
+ return false;
61
+ }
62
+
63
+ // Decode hex payload into Uint8Array
64
+ const incomingSigBytes = new Uint8Array(32);
65
+ for (let i = 0; i < 32; i++) {
66
+ incomingSigBytes[i] = parseInt(hexPayload.slice(i * 2, i * 2 + 2), 16);
67
+ }
68
+
69
+ // Verify the signature using constant-time comparison
70
+ const message = `${timestamp}.${body}`;
71
+ const encoder = new TextEncoder();
72
+ const key = await crypto.subtle.importKey(
73
+ 'raw',
74
+ encoder.encode(sdkKey),
75
+ { name: 'HMAC', hash: 'SHA-256' },
76
+ false,
77
+ ['verify']
78
+ );
79
+
80
+ return crypto.subtle.verify('HMAC', key, incomingSigBytes, encoder.encode(message));
81
+ }
82
+
11
83
  /**
12
84
  * Creates a cron middleware for scheduled task endpoints.
13
85
  *
14
86
  * **Important:** Cron endpoints must use POST method. The middleware will throw
15
87
  * an error if called with any other HTTP method.
16
88
  *
17
- * Use with router.post() to create a cron endpoint:
18
- *
19
89
  * @example
20
90
  * ```typescript
21
91
  * import { createRouter, cron } from '@agentuity/runtime';
22
92
  *
23
93
  * const router = createRouter();
24
94
  *
25
- * // Daily cleanup at midnight
26
- * router.post('/daily-cleanup', cron('0 0 * * *', (c) => {
95
+ * // With authentication (recommended)
96
+ * router.post('/daily-cleanup', cron('0 0 * * *', { auth: true }, (c) => {
27
97
  * c.var.logger.info('Running daily cleanup');
28
98
  * return { status: 'cleanup complete' };
29
99
  * }));
30
100
  *
31
- * // Hourly health check
32
- * router.post('/health-check', cron('0 * * * *', (c) => {
101
+ * // Without authentication (not recommended for production)
102
+ * router.post('/health-check', cron('0 * * * *', { auth: false }, (c) => {
33
103
  * c.var.logger.info('Running hourly health check');
34
104
  * return c.text('OK');
35
105
  * }));
36
106
  * ```
37
107
  *
38
108
  * @param schedule - Cron expression (e.g., '0 0 * * *' for daily at midnight)
109
+ * @param options - Configuration options including auth requirement
39
110
  * @param handler - Handler function to run on schedule
40
111
  * @returns Hono handler for cron endpoint
41
112
  */
42
- export function cron<E extends Env = Env>(schedule: string, handler: CronHandler<E>): Handler<E> {
113
+ export function cron<E extends Env = Env>(
114
+ schedule: string,
115
+ options: CronOptions,
116
+ handler: CronHandler<E>
117
+ ): Handler<E>;
118
+
119
+ /**
120
+ * Creates a cron middleware for scheduled task endpoints.
121
+ *
122
+ * @deprecated Use the overload with explicit `options` parameter: `cron(schedule, { auth: true }, handler)`
123
+ *
124
+ * **Important:** Cron endpoints must use POST method. The middleware will throw
125
+ * an error if called with any other HTTP method.
126
+ *
127
+ * This deprecated overload defaults to `auth: false` for backwards compatibility.
128
+ *
129
+ * @param schedule - Cron expression (e.g., '0 0 * * *' for daily at midnight)
130
+ * @param handler - Handler function to run on schedule
131
+ * @returns Hono handler for cron endpoint
132
+ */
133
+ export function cron<E extends Env = Env>(schedule: string, handler: CronHandler<E>): Handler<E>;
134
+
135
+ export function cron<E extends Env = Env>(
136
+ schedule: string,
137
+ optionsOrHandler: CronOptions | CronHandler<E>,
138
+ maybeHandler?: CronHandler<E>
139
+ ): Handler<E> {
140
+ let options: CronOptions;
141
+ let handler: CronHandler<E>;
142
+
143
+ if (typeof optionsOrHandler === 'function') {
144
+ // Deprecated: cron(schedule, handler) - defaults to auth: false
145
+ options = { auth: false };
146
+ handler = optionsOrHandler;
147
+ } else {
148
+ // New: cron(schedule, options, handler)
149
+ options = optionsOrHandler;
150
+ handler = maybeHandler!;
151
+ }
152
+
43
153
  return async (c: Context<E>) => {
44
154
  if (c.req.method !== 'POST') {
45
155
  throw new Error(
@@ -48,6 +158,18 @@ export function cron<E extends Env = Env>(schedule: string, handler: CronHandler
48
158
  );
49
159
  }
50
160
 
161
+ if (options.auth) {
162
+ // Clone the request to read body for signature verification without consuming it
163
+ const clonedReq = c.req.raw.clone();
164
+ const body = await clonedReq.text();
165
+
166
+ // Verify the cron signature
167
+ const isValid = await verifyCronSignature(c, body);
168
+ if (!isValid) {
169
+ return c.json({ error: 'Unauthorized' }, 401);
170
+ }
171
+ }
172
+
51
173
  let result = handler(c);
52
174
  if (result instanceof Promise) {
53
175
  result = await result;
@@ -4,8 +4,10 @@ export {
4
4
  type SSEMessage,
5
5
  type SSEStream,
6
6
  type SSEHandler,
7
+ type SSEOptions,
7
8
  STREAM_DONE_PROMISE_KEY,
8
9
  IS_STREAMING_RESPONSE_KEY,
9
10
  } from './sse';
10
11
  export { stream, type StreamHandler } from './stream';
11
12
  export { cron, type CronHandler, type CronMetadata } from './cron';
13
+ export { webrtc, type WebRTCHandler, type WebRTCOptions } from './webrtc';