@soulcraft/sdk 2.0.0 → 2.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/client/index.d.ts +5 -38
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +5 -47
- package/dist/client/index.js.map +1 -1
- package/dist/client/namespace-proxy.d.ts +3 -4
- package/dist/client/namespace-proxy.d.ts.map +1 -1
- package/dist/client/namespace-proxy.js +3 -4
- package/dist/client/namespace-proxy.js.map +1 -1
- package/dist/index.d.ts +6 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -4
- package/dist/index.js.map +1 -1
- package/dist/modules/hall/browser.d.ts +83 -27
- package/dist/modules/hall/browser.d.ts.map +1 -1
- package/dist/modules/hall/browser.js +238 -49
- package/dist/modules/hall/browser.js.map +1 -1
- package/dist/modules/hall/media.d.ts +164 -0
- package/dist/modules/hall/media.d.ts.map +1 -0
- package/dist/modules/hall/media.js +182 -0
- package/dist/modules/hall/media.js.map +1 -0
- package/dist/modules/hall/server.d.ts +83 -6
- package/dist/modules/hall/server.d.ts.map +1 -1
- package/dist/modules/hall/server.js +206 -9
- package/dist/modules/hall/server.js.map +1 -1
- package/dist/modules/hall/types.d.ts +548 -25
- package/dist/modules/hall/types.d.ts.map +1 -1
- package/dist/modules/hall/types.js +12 -7
- package/dist/modules/hall/types.js.map +1 -1
- package/dist/server/hall-handlers.d.ts +40 -12
- package/dist/server/hall-handlers.d.ts.map +1 -1
- package/dist/server/hall-handlers.js +40 -12
- package/dist/server/hall-handlers.js.map +1 -1
- package/dist/server/handlers/chat/engine.d.ts.map +1 -1
- package/dist/server/handlers/chat/engine.js +5 -1
- package/dist/server/handlers/chat/engine.js.map +1 -1
- package/dist/server/handlers/chat/types.d.ts +17 -2
- package/dist/server/handlers/chat/types.d.ts.map +1 -1
- package/dist/server/hono-router.d.ts +2 -9
- package/dist/server/hono-router.d.ts.map +1 -1
- package/dist/server/hono-router.js +2 -46
- package/dist/server/hono-router.js.map +1 -1
- package/dist/server/index.d.ts +4 -19
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +10 -29
- package/dist/server/index.js.map +1 -1
- package/dist/types.d.ts +2 -41
- package/dist/types.d.ts.map +1 -1
- package/docs/ADR-005-hall-integration.md +449 -0
- package/package.json +1 -1
- package/dist/client/create-client-sdk.d.ts +0 -113
- package/dist/client/create-client-sdk.d.ts.map +0 -1
- package/dist/client/create-client-sdk.js +0 -169
- package/dist/client/create-client-sdk.js.map +0 -1
- package/dist/modules/app-context/index.d.ts +0 -214
- package/dist/modules/app-context/index.d.ts.map +0 -1
- package/dist/modules/app-context/index.js +0 -569
- package/dist/modules/app-context/index.js.map +0 -1
- package/dist/modules/billing/firestore-provider.d.ts +0 -60
- package/dist/modules/billing/firestore-provider.d.ts.map +0 -1
- package/dist/modules/billing/firestore-provider.js +0 -315
- package/dist/modules/billing/firestore-provider.js.map +0 -1
- package/dist/modules/brainy/proxy.d.ts +0 -48
- package/dist/modules/brainy/proxy.d.ts.map +0 -1
- package/dist/modules/brainy/proxy.js +0 -95
- package/dist/modules/brainy/proxy.js.map +0 -1
- package/dist/server/create-sdk.d.ts +0 -74
- package/dist/server/create-sdk.d.ts.map +0 -1
- package/dist/server/create-sdk.js +0 -104
- package/dist/server/create-sdk.js.map +0 -1
- package/dist/server/from-license.d.ts +0 -252
- package/dist/server/from-license.d.ts.map +0 -1
- package/dist/server/from-license.js +0 -349
- package/dist/server/from-license.js.map +0 -1
- package/dist/server/handlers.d.ts +0 -312
- package/dist/server/handlers.d.ts.map +0 -1
- package/dist/server/handlers.js +0 -376
- package/dist/server/handlers.js.map +0 -1
- package/dist/server/postmessage-handler.d.ts +0 -152
- package/dist/server/postmessage-handler.d.ts.map +0 -1
- package/dist/server/postmessage-handler.js +0 -138
- package/dist/server/postmessage-handler.js.map +0 -1
- package/dist/transports/http.d.ts +0 -86
- package/dist/transports/http.d.ts.map +0 -1
- package/dist/transports/http.js +0 -137
- package/dist/transports/http.js.map +0 -1
- package/dist/transports/postmessage.d.ts +0 -159
- package/dist/transports/postmessage.d.ts.map +0 -1
- package/dist/transports/postmessage.js +0 -207
- package/dist/transports/postmessage.js.map +0 -1
- package/dist/transports/workshop.d.ts +0 -173
- package/dist/transports/workshop.d.ts.map +0 -1
- package/dist/transports/workshop.js +0 -307
- package/dist/transports/workshop.js.map +0 -1
|
@@ -1,55 +1,56 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @module modules/hall/browser
|
|
3
|
-
* @description Browser-side Hall
|
|
3
|
+
* @description Browser-side Hall clients — join WebRTC rooms and pub/sub topics via session tokens.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
5
|
+
* This module provides two browser entry points:
|
|
6
|
+
*
|
|
7
|
+
* - `joinHallRoom` — joins a WebRTC room for real-time audio/video/data communication.
|
|
8
|
+
* Handles SDP offer/answer, ICE negotiation, track events, and AI events (transcripts,
|
|
9
|
+
* concept mentions). In broadcast rooms, handles role changes (promotion/demotion)
|
|
10
|
+
* transparently.
|
|
11
|
+
*
|
|
12
|
+
* - `joinHallPubsub` — connects to the Hall pub/sub system for topic-based messaging
|
|
13
|
+
* with presence tracking. Uses msgpack over WebSocket, same binary format as the
|
|
14
|
+
* product connection.
|
|
9
15
|
*
|
|
10
16
|
* **Auth model:** The browser never sees the product's shared secret. The product
|
|
11
|
-
* backend mints
|
|
12
|
-
* and passes
|
|
13
|
-
* is the only browser credential.
|
|
17
|
+
* backend mints short-lived tokens (via `sdk.hall.createSessionToken` or
|
|
18
|
+
* `sdk.hall.createPubsubToken`) and passes them to the browser.
|
|
14
19
|
*
|
|
15
20
|
* This module has no server-only dependencies and is safe to bundle for the browser.
|
|
16
|
-
* It does require `RTCPeerConnection` and `WebSocket` to be available (standard in
|
|
17
|
-
* all modern browsers; not available in Node.js without polyfills).
|
|
18
21
|
*
|
|
19
|
-
* @example
|
|
22
|
+
* @example WebRTC room
|
|
20
23
|
* ```typescript
|
|
21
24
|
* import { joinHallRoom } from '@soulcraft/sdk/client'
|
|
22
25
|
*
|
|
23
|
-
* // 1. Get token from product backend:
|
|
24
26
|
* const { token, hallUrl } = await fetch('/api/session/join').then(r => r.json())
|
|
25
|
-
*
|
|
26
|
-
* // 2. Get camera + mic:
|
|
27
27
|
* const stream = await navigator.mediaDevices.getUserMedia({ video: true, audio: true })
|
|
28
|
-
*
|
|
29
|
-
* // 3. Join room:
|
|
30
28
|
* const room = await joinHallRoom({ token, hallUrl })
|
|
31
29
|
* room.addStream(stream)
|
|
30
|
+
* room.on('trackAdded', ({ peerId, streams }) => renderVideo(peerId, streams[0]))
|
|
31
|
+
* room.on('transcript', ({ text, isFinal }) => { if (isFinal) showCaption(text) })
|
|
32
|
+
* room.on('roleChanged', ({ role, canPublish }) => updateUI(role, canPublish))
|
|
33
|
+
* room.close()
|
|
34
|
+
* ```
|
|
32
35
|
*
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
* })
|
|
37
|
-
* room.on('transcript', ({ peerId, text, isFinal }) => {
|
|
38
|
-
* if (isFinal) appendCaption(peerId, text)
|
|
39
|
-
* })
|
|
40
|
-
* room.on('conceptMention', ({ nodeId, confidence }) => pulseGraphNode(nodeId, confidence))
|
|
36
|
+
* @example Pub/Sub
|
|
37
|
+
* ```typescript
|
|
38
|
+
* import { joinHallPubsub } from '@soulcraft/sdk/client'
|
|
41
39
|
*
|
|
42
|
-
*
|
|
43
|
-
*
|
|
40
|
+
* const { token, hallUrl } = await fetch('/api/pubsub/token').then(r => r.json())
|
|
41
|
+
* const pubsub = await joinHallPubsub({ token, hallUrl })
|
|
42
|
+
* pubsub.subscribe('room:abc:chat', { username: 'Alice' })
|
|
43
|
+
* pubsub.on('topicMessage', ({ senderId, payload }) => showMessage(senderId, payload))
|
|
44
|
+
* pubsub.broadcast('room:abc:chat', { text: 'Hello!' })
|
|
45
|
+
* pubsub.close()
|
|
44
46
|
* ```
|
|
45
47
|
*/
|
|
48
|
+
import { encode, decode } from '@msgpack/msgpack';
|
|
46
49
|
class HallRoomHandleImpl {
|
|
47
|
-
// roomId and peerId are set by the server's first 'peerJoined' message after
|
|
48
|
-
// the WebRTC connection reaches 'connected'. They start empty and are populated
|
|
49
|
-
// via _setIdentifiers() before any application code can read them (the promise
|
|
50
|
-
// returned by joinHallRoom does not resolve until they are set).
|
|
51
50
|
roomId;
|
|
52
51
|
peerId;
|
|
52
|
+
role;
|
|
53
|
+
canPublish;
|
|
53
54
|
#listeners = {
|
|
54
55
|
transcript: new Set(),
|
|
55
56
|
conceptMention: new Set(),
|
|
@@ -59,29 +60,38 @@ class HallRoomHandleImpl {
|
|
|
59
60
|
peerLeft: new Set(),
|
|
60
61
|
trackAdded: new Set(),
|
|
61
62
|
trackRemoved: new Set(),
|
|
63
|
+
roleChanged: new Set(),
|
|
62
64
|
closed: new Set(),
|
|
63
65
|
error: new Set(),
|
|
64
66
|
};
|
|
65
67
|
#pc;
|
|
66
68
|
#ws;
|
|
67
|
-
constructor(roomId, peerId, pc, ws) {
|
|
69
|
+
constructor(roomId, peerId, role, canPublish, pc, ws) {
|
|
68
70
|
this.roomId = roomId;
|
|
69
71
|
this.peerId = peerId;
|
|
72
|
+
this.role = role;
|
|
73
|
+
this.canPublish = canPublish;
|
|
70
74
|
this.#pc = pc;
|
|
71
75
|
this.#ws = ws;
|
|
72
76
|
}
|
|
73
77
|
/**
|
|
74
78
|
* Set the room and peer identifiers decoded from the server's first peerJoined message.
|
|
75
79
|
*
|
|
76
|
-
* Called by the signaling event router once the server confirms the room assignment.
|
|
77
|
-
* Must be called before the `joinHallRoom` promise resolves.
|
|
78
|
-
*
|
|
79
80
|
* @internal
|
|
80
81
|
*/
|
|
81
82
|
_setIdentifiers(roomId, peerId) {
|
|
82
83
|
this.roomId = roomId;
|
|
83
84
|
this.peerId = peerId;
|
|
84
85
|
}
|
|
86
|
+
/**
|
|
87
|
+
* Update role and canPublish after a roleChanged event.
|
|
88
|
+
*
|
|
89
|
+
* @internal
|
|
90
|
+
*/
|
|
91
|
+
_setRole(role, canPublish) {
|
|
92
|
+
this.role = role;
|
|
93
|
+
this.canPublish = canPublish;
|
|
94
|
+
}
|
|
85
95
|
on(event, listener) {
|
|
86
96
|
;
|
|
87
97
|
this.#listeners[event].add(listener);
|
|
@@ -121,6 +131,9 @@ class HallRoomHandleImpl {
|
|
|
121
131
|
* performs the offer/answer/ICE exchange, and resolves once the peer connection reaches
|
|
122
132
|
* `connected` state. Returns a {@link HallRoomHandle} with typed events.
|
|
123
133
|
*
|
|
134
|
+
* In broadcast rooms, the handle also emits `roleChanged` when the peer is promoted
|
|
135
|
+
* or demoted. The `role` and `canPublish` properties are updated automatically.
|
|
136
|
+
*
|
|
124
137
|
* @param options - Token, Hall URL, and optional ICE server overrides.
|
|
125
138
|
* @returns A connected `HallRoomHandle`.
|
|
126
139
|
* @throws {Error} If the signaling handshake fails or the connection times out.
|
|
@@ -131,13 +144,12 @@ class HallRoomHandleImpl {
|
|
|
131
144
|
* room.addStream(localStream)
|
|
132
145
|
* room.on('trackAdded', ({ peerId, streams }) => renderVideo(peerId, streams[0]))
|
|
133
146
|
* room.on('transcript', ({ text, isFinal }) => { if (isFinal) showCaption(text) })
|
|
147
|
+
* room.on('roleChanged', ({ role, canPublish }) => updateUI(role, canPublish))
|
|
134
148
|
* ```
|
|
135
149
|
*/
|
|
136
150
|
export async function joinHallRoom(options) {
|
|
137
151
|
const { token, hallUrl, iceServers = [] } = options;
|
|
138
152
|
const signalingUrl = `${hallUrl}/ws/session/${encodeURIComponent(token)}`;
|
|
139
|
-
// The Hall server sends TURN credentials in the first message after the WebSocket opens.
|
|
140
|
-
// We resolve ICE servers from that before creating the RTCPeerConnection.
|
|
141
153
|
const ws = new WebSocket(signalingUrl);
|
|
142
154
|
const handle = await new Promise((resolve, reject) => {
|
|
143
155
|
const timeout = setTimeout(() => {
|
|
@@ -149,23 +161,17 @@ export async function joinHallRoom(options) {
|
|
|
149
161
|
reject(new Error('Hall: WebSocket error during signaling'));
|
|
150
162
|
};
|
|
151
163
|
ws.onopen = async () => {
|
|
152
|
-
// Create the peer connection. Hall's TURN server handles NAT traversal —
|
|
153
|
-
// the signaling 'answer' message from Hall includes ICE candidates.
|
|
154
164
|
const pc = new RTCPeerConnection({
|
|
155
165
|
iceServers: [
|
|
156
|
-
// Hall's in-process TURN is always available.
|
|
157
|
-
// The session token encodes the TURN credentials — Hall provides them via the ws.
|
|
158
166
|
{ urls: `${hallUrl.replace('wss://', 'turn:').replace('ws://', 'turn:')}:3478` },
|
|
159
167
|
...iceServers,
|
|
160
168
|
],
|
|
161
169
|
});
|
|
162
|
-
// Send ICE candidates to Hall as they are gathered.
|
|
163
170
|
pc.onicecandidate = (ev) => {
|
|
164
171
|
if (ev.candidate) {
|
|
165
172
|
ws.send(JSON.stringify({ type: 'ice', candidate: JSON.stringify(ev.candidate) }));
|
|
166
173
|
}
|
|
167
174
|
};
|
|
168
|
-
// Create and send SDP offer.
|
|
169
175
|
const offer = await pc.createOffer();
|
|
170
176
|
await pc.setLocalDescription(offer);
|
|
171
177
|
ws.send(JSON.stringify({ type: 'offer', sdp: offer.sdp }));
|
|
@@ -198,15 +204,11 @@ export async function joinHallRoom(options) {
|
|
|
198
204
|
return;
|
|
199
205
|
}
|
|
200
206
|
// roomId and peerId arrive in the server's first 'peerJoined' message.
|
|
201
|
-
// Resolve the joinHallRoom promise only once we have both identifiers,
|
|
202
|
-
// so callers always get a fully-populated HallRoomHandle.
|
|
203
207
|
if (msg.type === 'peerJoined' && !roomHandleRef) {
|
|
204
|
-
const h = new HallRoomHandleImpl(msg.roomId, msg.peerId, pc, ws);
|
|
208
|
+
const h = new HallRoomHandleImpl(msg.roomId, msg.peerId, 'participant', true, pc, ws);
|
|
205
209
|
roomHandleRef = h;
|
|
206
210
|
clearTimeout(timeout);
|
|
207
211
|
resolve(h);
|
|
208
|
-
// Also dispatch peerJoined so listeners attached immediately after
|
|
209
|
-
// joinHallRoom() resolves can observe the local peer's own join event.
|
|
210
212
|
routeSignalingEvent(roomHandleRef, msg);
|
|
211
213
|
return;
|
|
212
214
|
}
|
|
@@ -214,7 +216,6 @@ export async function joinHallRoom(options) {
|
|
|
214
216
|
return;
|
|
215
217
|
routeSignalingEvent(roomHandleRef, msg);
|
|
216
218
|
};
|
|
217
|
-
// Detect hard WebRTC failures before the first peerJoined arrives.
|
|
218
219
|
pc.onconnectionstatechange = () => {
|
|
219
220
|
if (pc.connectionState === 'failed' || pc.connectionState === 'closed') {
|
|
220
221
|
if (!roomHandleRef) {
|
|
@@ -223,7 +224,6 @@ export async function joinHallRoom(options) {
|
|
|
223
224
|
}
|
|
224
225
|
}
|
|
225
226
|
};
|
|
226
|
-
// Wire track events. peerId is populated once the peerJoined message arrives.
|
|
227
227
|
pc.ontrack = (ev) => {
|
|
228
228
|
if (!roomHandleRef)
|
|
229
229
|
return;
|
|
@@ -270,6 +270,12 @@ function routeSignalingEvent(handle, msg) {
|
|
|
270
270
|
case 'peerLeft':
|
|
271
271
|
handle._dispatch('peerLeft', msg);
|
|
272
272
|
break;
|
|
273
|
+
case 'roleChanged': {
|
|
274
|
+
const role = (msg.role === 'viewer' ? 'viewer' : 'participant');
|
|
275
|
+
handle._setRole(role, msg.canPublish);
|
|
276
|
+
handle._dispatch('roleChanged', { role, canPublish: msg.canPublish });
|
|
277
|
+
break;
|
|
278
|
+
}
|
|
273
279
|
case 'roomClosed':
|
|
274
280
|
handle._dispatch('closed', { roomId: msg.roomId });
|
|
275
281
|
break;
|
|
@@ -278,4 +284,187 @@ function routeSignalingEvent(handle, msg) {
|
|
|
278
284
|
break;
|
|
279
285
|
}
|
|
280
286
|
}
|
|
287
|
+
class HallPubsubHandleImpl {
|
|
288
|
+
peerId;
|
|
289
|
+
#ws;
|
|
290
|
+
#listeners = {
|
|
291
|
+
topicSubscribed: new Set(),
|
|
292
|
+
topicUnsubscribed: new Set(),
|
|
293
|
+
topicMessage: new Set(),
|
|
294
|
+
presenceUpdate: new Set(),
|
|
295
|
+
presenceSnapshot: new Set(),
|
|
296
|
+
error: new Set(),
|
|
297
|
+
closed: new Set(),
|
|
298
|
+
};
|
|
299
|
+
constructor(peerId, ws) {
|
|
300
|
+
this.peerId = peerId;
|
|
301
|
+
this.#ws = ws;
|
|
302
|
+
}
|
|
303
|
+
subscribe(topic, metadata) {
|
|
304
|
+
this.#send({ t: 'subscribeTopic', d: { topic, metadata } });
|
|
305
|
+
}
|
|
306
|
+
unsubscribe(topic) {
|
|
307
|
+
this.#send({ t: 'unsubscribeTopic', d: { topic } });
|
|
308
|
+
}
|
|
309
|
+
broadcast(topic, payload) {
|
|
310
|
+
this.#send({ t: 'broadcastTopic', d: { topic, payload } });
|
|
311
|
+
}
|
|
312
|
+
getPresence(topic) {
|
|
313
|
+
this.#send({ t: 'getPresence', d: { topic } });
|
|
314
|
+
}
|
|
315
|
+
on(event, listener) {
|
|
316
|
+
;
|
|
317
|
+
this.#listeners[event].add(listener);
|
|
318
|
+
return this;
|
|
319
|
+
}
|
|
320
|
+
off(event, listener) {
|
|
321
|
+
;
|
|
322
|
+
this.#listeners[event].delete(listener);
|
|
323
|
+
return this;
|
|
324
|
+
}
|
|
325
|
+
close() {
|
|
326
|
+
this.#ws.close(1000, 'client closing');
|
|
327
|
+
}
|
|
328
|
+
/** @internal */
|
|
329
|
+
_dispatch(event, payload) {
|
|
330
|
+
for (const listener of this.#listeners[event]) {
|
|
331
|
+
try {
|
|
332
|
+
listener(payload);
|
|
333
|
+
}
|
|
334
|
+
catch (e) {
|
|
335
|
+
console.error(`[Hall] uncaught error in pubsub ${String(event)} listener:`, e);
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
#send(msg) {
|
|
340
|
+
if (this.#ws.readyState !== WebSocket.OPEN) {
|
|
341
|
+
throw new Error('Hall pubsub: not connected');
|
|
342
|
+
}
|
|
343
|
+
this.#ws.send(encode(msg));
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
// ─── joinHallPubsub ──────────────────────────────────────────────────────────
|
|
347
|
+
/**
|
|
348
|
+
* Connect to the Hall pub/sub system from the browser using a pub/sub token.
|
|
349
|
+
*
|
|
350
|
+
* Opens a WebSocket to `{hallUrl}/ws/pubsub/{token}` using msgpack wire format.
|
|
351
|
+
* Resolves once `authOk` is received from the server, confirming the token is valid.
|
|
352
|
+
*
|
|
353
|
+
* @param options - Token and Hall URL.
|
|
354
|
+
* @returns A connected `HallPubsubHandle`.
|
|
355
|
+
* @throws {Error} If authentication fails or the connection times out.
|
|
356
|
+
*
|
|
357
|
+
* @example
|
|
358
|
+
* ```typescript
|
|
359
|
+
* const pubsub = await joinHallPubsub({ token, hallUrl: 'wss://hall.soulcraft.com' })
|
|
360
|
+
* pubsub.subscribe('room:abc:chat', { username: 'Alice' })
|
|
361
|
+
* pubsub.on('topicMessage', ({ topic, senderId, payload }) => showMessage(senderId, payload))
|
|
362
|
+
* pubsub.broadcast('room:abc:chat', { text: 'Hello!' })
|
|
363
|
+
* pubsub.close()
|
|
364
|
+
* ```
|
|
365
|
+
*/
|
|
366
|
+
export async function joinHallPubsub(options) {
|
|
367
|
+
const { token, hallUrl } = options;
|
|
368
|
+
const url = `${hallUrl}/ws/pubsub/${encodeURIComponent(token)}`;
|
|
369
|
+
const ws = new WebSocket(url);
|
|
370
|
+
ws.binaryType = 'arraybuffer';
|
|
371
|
+
const handle = await new Promise((resolve, reject) => {
|
|
372
|
+
const timeout = setTimeout(() => {
|
|
373
|
+
ws.close();
|
|
374
|
+
reject(new Error('Hall pubsub: connection timed out after 30s'));
|
|
375
|
+
}, 30_000);
|
|
376
|
+
ws.onerror = () => {
|
|
377
|
+
clearTimeout(timeout);
|
|
378
|
+
reject(new Error('Hall pubsub: WebSocket error'));
|
|
379
|
+
};
|
|
380
|
+
let pubsubHandle = null;
|
|
381
|
+
ws.onmessage = (ev) => {
|
|
382
|
+
let msg;
|
|
383
|
+
try {
|
|
384
|
+
msg = decode(new Uint8Array(ev.data));
|
|
385
|
+
}
|
|
386
|
+
catch {
|
|
387
|
+
return;
|
|
388
|
+
}
|
|
389
|
+
// Before auth is confirmed, only handle authOk/authFailed.
|
|
390
|
+
if (!pubsubHandle) {
|
|
391
|
+
if (msg.t === 'authOk') {
|
|
392
|
+
clearTimeout(timeout);
|
|
393
|
+
const h = new HallPubsubHandleImpl(msg.d.peerId, ws);
|
|
394
|
+
pubsubHandle = h;
|
|
395
|
+
resolve(h);
|
|
396
|
+
return;
|
|
397
|
+
}
|
|
398
|
+
if (msg.t === 'authFailed') {
|
|
399
|
+
clearTimeout(timeout);
|
|
400
|
+
ws.close();
|
|
401
|
+
reject(new Error(`Hall pubsub auth failed: ${msg.d.reason}`));
|
|
402
|
+
return;
|
|
403
|
+
}
|
|
404
|
+
return;
|
|
405
|
+
}
|
|
406
|
+
// Route post-auth messages.
|
|
407
|
+
routePubsubEvent(pubsubHandle, msg);
|
|
408
|
+
};
|
|
409
|
+
ws.onclose = (ev) => {
|
|
410
|
+
if (pubsubHandle) {
|
|
411
|
+
if (ev.code !== 1000) {
|
|
412
|
+
pubsubHandle._dispatch('error', {
|
|
413
|
+
code: String(ev.code),
|
|
414
|
+
message: ev.reason || `WebSocket closed: ${ev.code}`,
|
|
415
|
+
});
|
|
416
|
+
}
|
|
417
|
+
pubsubHandle._dispatch('closed', undefined);
|
|
418
|
+
}
|
|
419
|
+
};
|
|
420
|
+
});
|
|
421
|
+
return handle;
|
|
422
|
+
}
|
|
423
|
+
// ─── Pub/sub event router ────────────────────────────────────────────────────
|
|
424
|
+
function routePubsubEvent(handle, msg) {
|
|
425
|
+
switch (msg.t) {
|
|
426
|
+
case 'topicSubscribed':
|
|
427
|
+
handle._dispatch('topicSubscribed', msg.d);
|
|
428
|
+
break;
|
|
429
|
+
case 'topicUnsubscribed':
|
|
430
|
+
handle._dispatch('topicUnsubscribed', msg.d);
|
|
431
|
+
break;
|
|
432
|
+
case 'topicMessage':
|
|
433
|
+
handle._dispatch('topicMessage', msg.d);
|
|
434
|
+
break;
|
|
435
|
+
case 'presenceUpdate':
|
|
436
|
+
handle._dispatch('presenceUpdate', msg.d);
|
|
437
|
+
break;
|
|
438
|
+
case 'presenceSnapshot':
|
|
439
|
+
handle._dispatch('presenceSnapshot', msg.d);
|
|
440
|
+
break;
|
|
441
|
+
case 'error':
|
|
442
|
+
handle._dispatch('error', msg.d);
|
|
443
|
+
break;
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
// ─── URL helpers ─────────────────────────────────────────────────────────────
|
|
447
|
+
/**
|
|
448
|
+
* Build the WHEP endpoint URL for receive-only WebRTC viewing of a broadcast room.
|
|
449
|
+
* The browser POSTs an SDP offer to this URL with `Authorization: Bearer <sessionToken>`.
|
|
450
|
+
*
|
|
451
|
+
* @param hallUrl - Hall server base URL (e.g. `"https://hall.soulcraft.com"`).
|
|
452
|
+
* @param roomId - The room to view.
|
|
453
|
+
* @returns The WHEP endpoint URL.
|
|
454
|
+
*/
|
|
455
|
+
export function getWhepUrl(hallUrl, roomId) {
|
|
456
|
+
const base = hallUrl.replace(/^wss:/, 'https:').replace(/^ws:/, 'http:');
|
|
457
|
+
return `${base}/whep/${encodeURIComponent(roomId)}`;
|
|
458
|
+
}
|
|
459
|
+
/**
|
|
460
|
+
* Build the LL-HLS master playlist URL for scalable HLS viewing of a broadcast room.
|
|
461
|
+
*
|
|
462
|
+
* @param hallUrl - Hall server base URL (e.g. `"https://hall.soulcraft.com"`).
|
|
463
|
+
* @param roomId - The room to view.
|
|
464
|
+
* @returns The HLS playlist URL.
|
|
465
|
+
*/
|
|
466
|
+
export function getHlsUrl(hallUrl, roomId) {
|
|
467
|
+
const base = hallUrl.replace(/^wss:/, 'https:').replace(/^ws:/, 'http:');
|
|
468
|
+
return `${base}/hls/${encodeURIComponent(roomId)}/playlist.m3u8`;
|
|
469
|
+
}
|
|
281
470
|
//# sourceMappingURL=browser.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser.js","sourceRoot":"","sources":["../../../src/modules/hall/browser.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"browser.js","sourceRoot":"","sources":["../../../src/modules/hall/browser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module modules/hall/media
|
|
3
|
+
* @description HTTP client for the Hall media pipeline — upload, transcode, retrieve, and delete media.
|
|
4
|
+
*
|
|
5
|
+
* Hall provides a media pipeline for processing audio, video, and image files. This module
|
|
6
|
+
* wraps the HTTP endpoints (not WebSocket) with a typed client. Async notifications for
|
|
7
|
+
* transcoding completion arrive via the product WebSocket (`mediaReady` / `mediaError` events
|
|
8
|
+
* on the `HallRoom` handle).
|
|
9
|
+
*
|
|
10
|
+
* **Auth model:** All media HTTP requests use `Authorization: Hall <productName>:<secret>`.
|
|
11
|
+
* This client is server-only — never expose the product secret to browsers. Browser clients
|
|
12
|
+
* access processed media via the public `GET /media/{mediaId}` endpoint (no auth required
|
|
13
|
+
* for read access).
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```typescript
|
|
17
|
+
* import { createHallMediaClient } from '@soulcraft/sdk/server'
|
|
18
|
+
*
|
|
19
|
+
* const media = createHallMediaClient({
|
|
20
|
+
* baseUrl: 'https://hall.soulcraft.com',
|
|
21
|
+
* productName: 'workshop',
|
|
22
|
+
* secret: process.env.HALL_WORKSHOP_SECRET!,
|
|
23
|
+
* })
|
|
24
|
+
*
|
|
25
|
+
* // Upload a file with transcoding
|
|
26
|
+
* const result = await media.upload(file, { transcode: 'video/mp4' })
|
|
27
|
+
* console.log(result.mediaId) // listen for 'mediaReady' event on the room
|
|
28
|
+
*
|
|
29
|
+
* // Get media info
|
|
30
|
+
* const info = await media.getInfo(result.mediaId)
|
|
31
|
+
*
|
|
32
|
+
* // Delete media
|
|
33
|
+
* await media.delete(result.mediaId)
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
36
|
+
import type { MediaInfo, TranscodeTarget } from './types.js';
|
|
37
|
+
/**
|
|
38
|
+
* Options for creating a Hall media client.
|
|
39
|
+
*/
|
|
40
|
+
export interface HallMediaClientOptions {
|
|
41
|
+
/**
|
|
42
|
+
* Hall server HTTP base URL (e.g. `"https://hall.soulcraft.com"`).
|
|
43
|
+
* Note: use `https://` not `wss://` — media endpoints are HTTP, not WebSocket.
|
|
44
|
+
*/
|
|
45
|
+
baseUrl: string;
|
|
46
|
+
/**
|
|
47
|
+
* Product name as configured in `[auth.products]` in `hall.toml`.
|
|
48
|
+
*/
|
|
49
|
+
productName: string;
|
|
50
|
+
/**
|
|
51
|
+
* Shared secret for this product. Same as used for the WebSocket connection.
|
|
52
|
+
* Must match the value in `[auth.products.<productName>]` in `hall.toml`.
|
|
53
|
+
*/
|
|
54
|
+
secret: string;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Options for uploading a media file.
|
|
58
|
+
*/
|
|
59
|
+
export interface MediaUploadOptions {
|
|
60
|
+
/**
|
|
61
|
+
* Target transcode format. If omitted, the file is stored as-is.
|
|
62
|
+
* Supported targets: `"audio/mp3"`, `"video/mp4"`, `"image/webp"`.
|
|
63
|
+
*/
|
|
64
|
+
transcode?: TranscodeTarget;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Result of a media upload.
|
|
68
|
+
*/
|
|
69
|
+
export interface MediaUploadResult {
|
|
70
|
+
/** Unique media identifier assigned by Hall. */
|
|
71
|
+
mediaId: string;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Server-side HTTP client for the Hall media pipeline.
|
|
75
|
+
*
|
|
76
|
+
* Handles upload, info retrieval, thumbnail access, and deletion.
|
|
77
|
+
* All requests are authenticated with the product shared secret.
|
|
78
|
+
*
|
|
79
|
+
* Async transcoding notifications arrive via the product WebSocket, not this client.
|
|
80
|
+
* Listen for `mediaReady` / `mediaError` events on the `HallRoom` handle.
|
|
81
|
+
*/
|
|
82
|
+
export declare class HallMediaClient {
|
|
83
|
+
#private;
|
|
84
|
+
/**
|
|
85
|
+
* @param options - Hall server URL, product name, and shared secret.
|
|
86
|
+
*/
|
|
87
|
+
constructor(options: HallMediaClientOptions);
|
|
88
|
+
/**
|
|
89
|
+
* Upload a media file to Hall for processing.
|
|
90
|
+
*
|
|
91
|
+
* @param file - The file to upload. Can be a `Blob`, `File`, or `Buffer`.
|
|
92
|
+
* @param options - Optional transcode target.
|
|
93
|
+
* @returns The assigned media ID. Listen for `mediaReady` on the room for completion.
|
|
94
|
+
*
|
|
95
|
+
* @example
|
|
96
|
+
* ```typescript
|
|
97
|
+
* const file = new Blob([audioBuffer], { type: 'audio/wav' })
|
|
98
|
+
* const { mediaId } = await media.upload(file, { transcode: 'audio/mp3' })
|
|
99
|
+
* ```
|
|
100
|
+
*/
|
|
101
|
+
upload(file: Blob | File, options?: MediaUploadOptions): Promise<MediaUploadResult>;
|
|
102
|
+
/**
|
|
103
|
+
* Get metadata for a processed media file.
|
|
104
|
+
*
|
|
105
|
+
* @param mediaId - The media identifier from the upload result.
|
|
106
|
+
* @returns Media metadata including MIME type, size, duration, dimensions, and status.
|
|
107
|
+
*/
|
|
108
|
+
getInfo(mediaId: string): Promise<MediaInfo>;
|
|
109
|
+
/**
|
|
110
|
+
* Get the URL for streaming a media file.
|
|
111
|
+
* Supports HTTP range requests (206 Partial Content).
|
|
112
|
+
*
|
|
113
|
+
* @param mediaId - The media identifier.
|
|
114
|
+
* @returns The full URL to the media file.
|
|
115
|
+
*/
|
|
116
|
+
getStreamUrl(mediaId: string): string;
|
|
117
|
+
/**
|
|
118
|
+
* Get the URL for an auto-generated thumbnail (WebP).
|
|
119
|
+
*
|
|
120
|
+
* @param mediaId - The media identifier.
|
|
121
|
+
* @returns The full URL to the thumbnail image.
|
|
122
|
+
*/
|
|
123
|
+
getThumbnailUrl(mediaId: string): string;
|
|
124
|
+
/**
|
|
125
|
+
* Delete a media file. Only the uploading product can delete its own media.
|
|
126
|
+
*
|
|
127
|
+
* @param mediaId - The media identifier to delete.
|
|
128
|
+
*/
|
|
129
|
+
delete(mediaId: string): Promise<void>;
|
|
130
|
+
/**
|
|
131
|
+
* Build the WHEP endpoint URL for receive-only WebRTC viewing.
|
|
132
|
+
* Browser viewers POST an SDP offer to this URL with a session token.
|
|
133
|
+
*
|
|
134
|
+
* @param roomId - The room to view.
|
|
135
|
+
* @returns The WHEP endpoint URL.
|
|
136
|
+
*/
|
|
137
|
+
getWhepUrl(roomId: string): string;
|
|
138
|
+
/**
|
|
139
|
+
* Build the LL-HLS master playlist URL for scalable HLS viewing.
|
|
140
|
+
*
|
|
141
|
+
* @param roomId - The room to view.
|
|
142
|
+
* @returns The HLS playlist URL.
|
|
143
|
+
*/
|
|
144
|
+
getHlsUrl(roomId: string): string;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Create a server-side Hall media client for upload, transcode, and retrieval.
|
|
148
|
+
*
|
|
149
|
+
* @param options - Hall server URL, product name, and shared secret.
|
|
150
|
+
* @returns A `HallMediaClient` instance ready for use.
|
|
151
|
+
*
|
|
152
|
+
* @example
|
|
153
|
+
* ```typescript
|
|
154
|
+
* import { createHallMediaClient } from '@soulcraft/sdk/server'
|
|
155
|
+
*
|
|
156
|
+
* const media = createHallMediaClient({
|
|
157
|
+
* baseUrl: 'https://hall.soulcraft.com',
|
|
158
|
+
* productName: 'workshop',
|
|
159
|
+
* secret: process.env.HALL_WORKSHOP_SECRET!,
|
|
160
|
+
* })
|
|
161
|
+
* ```
|
|
162
|
+
*/
|
|
163
|
+
export declare function createHallMediaClient(options: HallMediaClientOptions): HallMediaClient;
|
|
164
|
+
//# sourceMappingURL=media.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media.d.ts","sourceRoot":"","sources":["../../../src/modules/hall/media.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAI5D;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC;;;OAGG;IACH,OAAO,EAAE,MAAM,CAAA;IACf;;OAEG;IACH,WAAW,EAAE,MAAM,CAAA;IACnB;;;OAGG;IACH,MAAM,EAAE,MAAM,CAAA;CACf;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC;;;OAGG;IACH,SAAS,CAAC,EAAE,eAAe,CAAA;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,gDAAgD;IAChD,OAAO,EAAE,MAAM,CAAA;CAChB;AAID;;;;;;;;GAQG;AACH,qBAAa,eAAe;;IAK1B;;OAEG;gBACS,OAAO,EAAE,sBAAsB;IAM3C;;;;;;;;;;;;OAYG;IACG,MAAM,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAqB7F;;;;;OAKG;IACG,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAalD;;;;;;OAMG;IACH,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAIrC;;;;;OAKG;IACH,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAIxC;;;;OAIG;IACG,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAY5C;;;;;;OAMG;IACH,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAIlC;;;;;OAKG;IACH,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;CAOlC;AAID;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,sBAAsB,GAAG,eAAe,CAEtF"}
|