@agentuity/runtime 1.0.1 → 1.0.3
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/handlers/cron.d.ts +32 -6
- package/dist/handlers/cron.d.ts.map +1 -1
- package/dist/handlers/cron.js +64 -30
- package/dist/handlers/cron.js.map +1 -1
- package/dist/handlers/index.d.ts +2 -1
- package/dist/handlers/index.d.ts.map +1 -1
- package/dist/handlers/index.js +1 -0
- package/dist/handlers/index.js.map +1 -1
- package/dist/handlers/sse.d.ts +73 -1
- package/dist/handlers/sse.d.ts.map +1 -1
- package/dist/handlers/sse.js +14 -40
- package/dist/handlers/sse.js.map +1 -1
- package/dist/handlers/webrtc.d.ts +49 -0
- package/dist/handlers/webrtc.d.ts.map +1 -0
- package/dist/handlers/webrtc.js +109 -0
- package/dist/handlers/webrtc.js.map +1 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/router.d.ts +1 -0
- package/dist/router.d.ts.map +1 -1
- package/dist/router.js +1 -0
- package/dist/router.js.map +1 -1
- package/dist/webrtc-signaling.d.ts +80 -0
- package/dist/webrtc-signaling.d.ts.map +1 -0
- package/dist/webrtc-signaling.js +237 -0
- package/dist/webrtc-signaling.js.map +1 -0
- package/package.json +7 -7
- package/src/handlers/cron.ts +129 -7
- package/src/handlers/index.ts +2 -0
- package/src/handlers/sse.ts +102 -2
- package/src/handlers/webrtc.ts +125 -0
- package/src/index.ts +14 -1
- package/src/router.ts +1 -0
- package/src/webrtc-signaling.ts +288 -0
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,
|
|
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
|
package/dist/router.d.ts.map
CHANGED
|
@@ -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
|
|
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
|
package/dist/router.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router.js","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"AAAA,uDAAuD;AACvD,OAAO,EAAgB,IAAI,EAAoC,MAAM,MAAM,CAAC;AAC5E,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAEzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAuEhD
|
|
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.
|
|
3
|
+
"version": "1.0.3",
|
|
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.
|
|
30
|
-
"@agentuity/core": "1.0.
|
|
31
|
-
"@agentuity/frontend": "1.0.
|
|
32
|
-
"@agentuity/schema": "1.0.
|
|
33
|
-
"@agentuity/server": "1.0.
|
|
29
|
+
"@agentuity/auth": "1.0.3",
|
|
30
|
+
"@agentuity/core": "1.0.3",
|
|
31
|
+
"@agentuity/frontend": "1.0.3",
|
|
32
|
+
"@agentuity/schema": "1.0.3",
|
|
33
|
+
"@agentuity/server": "1.0.3",
|
|
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.
|
|
53
|
+
"@agentuity/test-utils": "1.0.3",
|
|
54
54
|
"@types/bun": "latest",
|
|
55
55
|
"@types/react": "^19.2.2",
|
|
56
56
|
"@types/react-dom": "^19.2.2",
|
package/src/handlers/cron.ts
CHANGED
|
@@ -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
|
-
* //
|
|
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
|
-
* //
|
|
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>(
|
|
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;
|
package/src/handlers/index.ts
CHANGED
|
@@ -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';
|