openrtc 0.1.0
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/README.md +106 -0
- package/dist/OpenRTC.d.ts +71 -0
- package/dist/OpenRTC.js +130 -0
- package/dist/api/MediaTransport.d.ts +7 -0
- package/dist/api/MediaTransport.js +262 -0
- package/dist/api/PlutoPeerConnection.d.ts +50 -0
- package/dist/api/PlutoPeerConnection.js +434 -0
- package/dist/api/PlutoWebSocket.d.ts +24 -0
- package/dist/api/PlutoWebSocket.js +113 -0
- package/dist/api/PlutoWebTransport.d.ts +29 -0
- package/dist/api/PlutoWebTransport.js +105 -0
- package/dist/auth/host.d.ts +73 -0
- package/dist/auth/host.js +513 -0
- package/dist/auth/index.d.ts +1 -0
- package/dist/auth/index.js +1 -0
- package/dist/auth/internal.d.ts +1 -0
- package/dist/auth/internal.js +1 -0
- package/dist/compat/index.d.ts +20 -0
- package/dist/compat/index.js +20 -0
- package/dist/core/Client.d.ts +352 -0
- package/dist/core/Client.js +3689 -0
- package/dist/core/Connection.d.ts +67 -0
- package/dist/core/Connection.js +404 -0
- package/dist/core/IEngineBridge.d.ts +18 -0
- package/dist/core/IEngineBridge.js +1 -0
- package/dist/core/ISignalingTransport.d.ts +13 -0
- package/dist/core/ISignalingTransport.js +1 -0
- package/dist/core/PeerLifecycleManager.d.ts +43 -0
- package/dist/core/PeerLifecycleManager.js +330 -0
- package/dist/core/PeerProjectionStore.d.ts +43 -0
- package/dist/core/PeerProjectionStore.js +327 -0
- package/dist/core/PlutoRTC.d.ts +13 -0
- package/dist/core/PlutoRTC.js +26 -0
- package/dist/core/Room.d.ts +47 -0
- package/dist/core/Room.js +376 -0
- package/dist/core/Signaling.d.ts +39 -0
- package/dist/core/Signaling.js +147 -0
- package/dist/core/bridges/BridgeCodecs.d.ts +19 -0
- package/dist/core/bridges/BridgeCodecs.js +317 -0
- package/dist/core/bridges/BrowserFirestoreRooms.d.ts +36 -0
- package/dist/core/bridges/BrowserFirestoreRooms.js +169 -0
- package/dist/core/bridges/BrowserFirestoreSignaling.d.ts +111 -0
- package/dist/core/bridges/BrowserFirestoreSignaling.js +1010 -0
- package/dist/core/bridges/NativeIpcBridge.d.ts +156 -0
- package/dist/core/bridges/NativeIpcBridge.js +1472 -0
- package/dist/core/bridges/RtdbPresence.d.ts +122 -0
- package/dist/core/bridges/RtdbPresence.js +201 -0
- package/dist/core/bridges/TauriBridge.d.ts +8 -0
- package/dist/core/bridges/TauriBridge.js +7 -0
- package/dist/core/bridges/WasmBridge.d.ts +233 -0
- package/dist/core/bridges/WasmBridge.js +1811 -0
- package/dist/core/config.d.ts +31 -0
- package/dist/core/config.js +138 -0
- package/dist/core/transports/ITransport.d.ts +12 -0
- package/dist/core/transports/ITransport.js +1 -0
- package/dist/core/transports/LocalDaemonBridge.d.ts +41 -0
- package/dist/core/transports/LocalDaemonBridge.js +227 -0
- package/dist/core/transports/TauriSignaling.d.ts +28 -0
- package/dist/core/transports/TauriSignaling.js +373 -0
- package/dist/core/transports/TransportFactory.d.ts +9 -0
- package/dist/core/transports/TransportFactory.js +59 -0
- package/dist/core/transports/WasmSignaling.d.ts +78 -0
- package/dist/core/transports/WasmSignaling.js +522 -0
- package/dist/core/transports/WebRTCTransport.d.ts +23 -0
- package/dist/core/transports/WebRTCTransport.js +132 -0
- package/dist/core/trust.d.ts +23 -0
- package/dist/core/trust.js +99 -0
- package/dist/core/types.d.ts +559 -0
- package/dist/core/types.js +19 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +3 -0
- package/dist/moq/MoQMediaTransport.d.ts +6 -0
- package/dist/moq/MoQMediaTransport.js +106 -0
- package/dist/moq/MoQPublisher.d.ts +22 -0
- package/dist/moq/MoQPublisher.js +179 -0
- package/dist/moq/MoQSession.d.ts +35 -0
- package/dist/moq/MoQSession.js +166 -0
- package/dist/moq/MoQSubscriber.d.ts +19 -0
- package/dist/moq/MoQSubscriber.js +235 -0
- package/dist/moq/common.d.ts +47 -0
- package/dist/moq/common.js +304 -0
- package/dist/moq/messages.d.ts +105 -0
- package/dist/moq/messages.js +367 -0
- package/dist/presets/plutoHosted.d.ts +13 -0
- package/dist/presets/plutoHosted.js +18 -0
- package/dist/runtime/DelegatingRuntimeAdapter.d.ts +68 -0
- package/dist/runtime/DelegatingRuntimeAdapter.js +250 -0
- package/dist/runtime/IpcRuntimeAdapter.d.ts +9 -0
- package/dist/runtime/IpcRuntimeAdapter.js +13 -0
- package/dist/runtime/RuntimeClient.d.ts +257 -0
- package/dist/runtime/RuntimeClient.js +1484 -0
- package/dist/runtime/TauriRuntimeAdapter.d.ts +1 -0
- package/dist/runtime/TauriRuntimeAdapter.js +1 -0
- package/dist/runtime/WasmRuntimeAdapter.d.ts +6 -0
- package/dist/runtime/WasmRuntimeAdapter.js +11 -0
- package/dist/runtime/factories.d.ts +24 -0
- package/dist/runtime/factories.js +66 -0
- package/dist/runtime/index.d.ts +6 -0
- package/dist/runtime/index.js +5 -0
- package/dist/runtime/ipc.d.ts +8 -0
- package/dist/runtime/ipc.js +65 -0
- package/dist/runtime/ipcContract.d.ts +46 -0
- package/dist/runtime/ipcContract.js +1 -0
- package/dist/runtime/tauri.d.ts +16 -0
- package/dist/runtime/tauri.js +22 -0
- package/dist/runtime/types.d.ts +110 -0
- package/dist/runtime/types.js +1 -0
- package/dist/transports/TauriTransport.d.ts +17 -0
- package/dist/transports/TauriTransport.js +49 -0
- package/dist/transports/WebTransport.d.ts +23 -0
- package/dist/transports/WebTransport.js +71 -0
- package/dist/utils/debug.d.ts +4 -0
- package/dist/utils/debug.js +33 -0
- package/dist/utils/runtime.d.ts +1 -0
- package/dist/utils/runtime.js +10 -0
- package/package.json +97 -0
- package/wasm/README.md +64 -0
- package/wasm/openrtc.d.ts +284 -0
- package/wasm/openrtc.js +2132 -0
- package/wasm/openrtc_bg.wasm +0 -0
- package/wasm/openrtc_bg.wasm.d.ts +110 -0
- package/wasm/package.json +16 -0
|
@@ -0,0 +1,367 @@
|
|
|
1
|
+
import { BufferWriter, StreamBuffer } from './common';
|
|
2
|
+
// MoQ Transport Draft-07 (0xff000007) Constants
|
|
3
|
+
// https://www.ietf.org/archive/id/draft-ietf-moq-transport-07.html
|
|
4
|
+
export var MsgType;
|
|
5
|
+
(function (MsgType) {
|
|
6
|
+
MsgType[MsgType["SUBSCRIBE"] = 3] = "SUBSCRIBE";
|
|
7
|
+
MsgType[MsgType["SUBSCRIBE_OK"] = 4] = "SUBSCRIBE_OK";
|
|
8
|
+
MsgType[MsgType["SUBSCRIBE_ERROR"] = 5] = "SUBSCRIBE_ERROR";
|
|
9
|
+
MsgType[MsgType["ANNOUNCE"] = 6] = "ANNOUNCE";
|
|
10
|
+
MsgType[MsgType["ANNOUNCE_OK"] = 7] = "ANNOUNCE_OK";
|
|
11
|
+
MsgType[MsgType["ANNOUNCE_ERROR"] = 8] = "ANNOUNCE_ERROR";
|
|
12
|
+
MsgType[MsgType["UNANNOUNCE"] = 9] = "UNANNOUNCE";
|
|
13
|
+
MsgType[MsgType["UNSUBSCRIBE"] = 10] = "UNSUBSCRIBE";
|
|
14
|
+
MsgType[MsgType["SUBSCRIBE_DONE"] = 11] = "SUBSCRIBE_DONE";
|
|
15
|
+
MsgType[MsgType["ANNOUNCE_CANCEL"] = 12] = "ANNOUNCE_CANCEL";
|
|
16
|
+
MsgType[MsgType["TRACK_STATUS_REQUEST"] = 13] = "TRACK_STATUS_REQUEST";
|
|
17
|
+
MsgType[MsgType["TRACK_STATUS"] = 14] = "TRACK_STATUS";
|
|
18
|
+
MsgType[MsgType["GOAWAY"] = 16] = "GOAWAY";
|
|
19
|
+
MsgType[MsgType["MAX_SUBSCRIBE_ID"] = 21] = "MAX_SUBSCRIBE_ID";
|
|
20
|
+
MsgType[MsgType["CLIENT_SETUP"] = 64] = "CLIENT_SETUP";
|
|
21
|
+
MsgType[MsgType["SERVER_SETUP"] = 65] = "SERVER_SETUP";
|
|
22
|
+
})(MsgType || (MsgType = {}));
|
|
23
|
+
export const SETUP_ROLE_PARAMETER_KEY = 0x00;
|
|
24
|
+
export const SETUP_PATH_PARAMETER_KEY = 0x01;
|
|
25
|
+
// Helper: write a Track Namespace tuple (Draft-07 uses tuple encoding)
|
|
26
|
+
// For simplicity, we encode our single namespace string as a 1-element tuple
|
|
27
|
+
function writeNamespaceTuple(w, namespace) {
|
|
28
|
+
const bytes = new TextEncoder().encode(namespace);
|
|
29
|
+
w.writeVarInt(1); // Number of elements in tuple
|
|
30
|
+
w.writeVarInt(bytes.length); // Length of element 1
|
|
31
|
+
w.writeBytes(bytes); // Element 1 data
|
|
32
|
+
}
|
|
33
|
+
// Helper: read a Track Namespace tuple
|
|
34
|
+
function readNamespaceTuple(sb) {
|
|
35
|
+
const numElements = Number(sb.readVarInt());
|
|
36
|
+
const parts = [];
|
|
37
|
+
for (let i = 0; i < numElements; i++) {
|
|
38
|
+
const len = Number(sb.readVarInt());
|
|
39
|
+
const bytes = sb.readBytes(len);
|
|
40
|
+
parts.push(new TextDecoder().decode(bytes));
|
|
41
|
+
}
|
|
42
|
+
return parts.join('/');
|
|
43
|
+
}
|
|
44
|
+
export class MoQSerializer {
|
|
45
|
+
/**
|
|
46
|
+
* Serialize a MoQ control message with proper framing:
|
|
47
|
+
* Type (varint) + Length (varint) + Payload (bytes)
|
|
48
|
+
* Per Draft-07: https://www.ietf.org/archive/id/draft-ietf-moq-transport-07.html
|
|
49
|
+
*/
|
|
50
|
+
static serialize(msg) {
|
|
51
|
+
const payload = new BufferWriter();
|
|
52
|
+
switch (msg.type) {
|
|
53
|
+
case MsgType.CLIENT_SETUP: {
|
|
54
|
+
const m = msg;
|
|
55
|
+
payload.writeVarInt(m.supportedVersions.length);
|
|
56
|
+
for (const v of m.supportedVersions)
|
|
57
|
+
payload.writeVarInt(v);
|
|
58
|
+
// Build params
|
|
59
|
+
const params = new BufferWriter();
|
|
60
|
+
let paramCount = 0;
|
|
61
|
+
// Role (required)
|
|
62
|
+
if (m.role !== undefined) {
|
|
63
|
+
paramCount++;
|
|
64
|
+
params.writeVarInt(SETUP_ROLE_PARAMETER_KEY);
|
|
65
|
+
params.writeVarInt(1); // Length of value
|
|
66
|
+
params.writeVarInt(m.role);
|
|
67
|
+
}
|
|
68
|
+
// PATH - MUST NOT be used with WebTransport per Draft-07
|
|
69
|
+
// (We only use WebTransport, so never send PATH)
|
|
70
|
+
payload.writeVarInt(paramCount);
|
|
71
|
+
payload.writeBytes(params.toUint8Array());
|
|
72
|
+
break;
|
|
73
|
+
}
|
|
74
|
+
case MsgType.SERVER_SETUP: {
|
|
75
|
+
const m = msg;
|
|
76
|
+
payload.writeVarInt(m.selectedVersion);
|
|
77
|
+
const params = new BufferWriter();
|
|
78
|
+
let paramCount = 0;
|
|
79
|
+
if (m.role !== undefined) {
|
|
80
|
+
paramCount++;
|
|
81
|
+
params.writeVarInt(SETUP_ROLE_PARAMETER_KEY);
|
|
82
|
+
params.writeVarInt(1);
|
|
83
|
+
params.writeVarInt(m.role);
|
|
84
|
+
}
|
|
85
|
+
payload.writeVarInt(paramCount);
|
|
86
|
+
payload.writeBytes(params.toUint8Array());
|
|
87
|
+
break;
|
|
88
|
+
}
|
|
89
|
+
case MsgType.SUBSCRIBE: {
|
|
90
|
+
// Draft-07 SUBSCRIBE:
|
|
91
|
+
// Subscribe ID (i), Track Alias (i),
|
|
92
|
+
// Track Namespace (tuple), Track Name Length (i), Track Name (..),
|
|
93
|
+
// Subscriber Priority (8), Group Order (8), Filter Type (i),
|
|
94
|
+
// [StartGroup, StartObject], [EndGroup, EndObject],
|
|
95
|
+
// Number of Parameters (i), Params...
|
|
96
|
+
const m = msg;
|
|
97
|
+
payload.writeVarInt(m.subscribeId);
|
|
98
|
+
payload.writeVarInt(m.trackAlias);
|
|
99
|
+
// Track Namespace as tuple
|
|
100
|
+
writeNamespaceTuple(payload, m.trackNamespace);
|
|
101
|
+
// Track Name (length-prefixed bytes)
|
|
102
|
+
const nameBytes = new TextEncoder().encode(m.trackName);
|
|
103
|
+
payload.writeVarInt(nameBytes.length);
|
|
104
|
+
payload.writeBytes(nameBytes);
|
|
105
|
+
// Subscriber Priority (8-bit raw byte)
|
|
106
|
+
payload.writeUint8(m.subscriberPriority ?? 128);
|
|
107
|
+
// Group Order (8-bit raw byte) 0x0=Original
|
|
108
|
+
payload.writeUint8(m.groupOrder ?? 0x01); // 0x01 = Ascending
|
|
109
|
+
// Filter Type (Draft-07: 0x1=LatestGroup, 0x2=LatestObject, 0x3=AbsoluteStart, 0x4=AbsoluteRange)
|
|
110
|
+
if (m.startGroup !== undefined && m.startObject !== undefined &&
|
|
111
|
+
m.endGroup !== undefined && m.endObject !== undefined) {
|
|
112
|
+
payload.writeVarInt(0x4); // AbsoluteRange
|
|
113
|
+
payload.writeVarInt(m.startGroup);
|
|
114
|
+
payload.writeVarInt(m.startObject);
|
|
115
|
+
payload.writeVarInt(m.endGroup);
|
|
116
|
+
payload.writeVarInt(m.endObject);
|
|
117
|
+
}
|
|
118
|
+
else if (m.startGroup !== undefined && m.startObject !== undefined) {
|
|
119
|
+
payload.writeVarInt(0x3); // AbsoluteStart
|
|
120
|
+
payload.writeVarInt(m.startGroup);
|
|
121
|
+
payload.writeVarInt(m.startObject);
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
payload.writeVarInt(0x1); // LatestGroup
|
|
125
|
+
}
|
|
126
|
+
// Number of Parameters
|
|
127
|
+
payload.writeVarInt(0);
|
|
128
|
+
break;
|
|
129
|
+
}
|
|
130
|
+
case MsgType.SUBSCRIBE_OK: {
|
|
131
|
+
// Draft-07 SUBSCRIBE_OK:
|
|
132
|
+
// Subscribe ID (i), Expires (i), Group Order (8), ContentExists (8),
|
|
133
|
+
// [Largest Group ID (i)], [Largest Object ID (i)],
|
|
134
|
+
// Number of Parameters (i), Params...
|
|
135
|
+
const m = msg;
|
|
136
|
+
payload.writeVarInt(m.subscribeId);
|
|
137
|
+
payload.writeVarInt(m.expires);
|
|
138
|
+
payload.writeUint8(0x01); // Group Order: Ascending
|
|
139
|
+
payload.writeUint8(0); // ContentExists: false
|
|
140
|
+
// (no Largest Group/Object since ContentExists=0)
|
|
141
|
+
payload.writeVarInt(0); // Params
|
|
142
|
+
break;
|
|
143
|
+
}
|
|
144
|
+
case MsgType.ANNOUNCE: {
|
|
145
|
+
// Draft-07 ANNOUNCE:
|
|
146
|
+
// Track Namespace (tuple), Number of Parameters (i), Params...
|
|
147
|
+
const m = msg;
|
|
148
|
+
writeNamespaceTuple(payload, m.trackNamespace);
|
|
149
|
+
payload.writeVarInt(0); // Params
|
|
150
|
+
break;
|
|
151
|
+
}
|
|
152
|
+
case MsgType.ANNOUNCE_OK: {
|
|
153
|
+
// Draft-07 ANNOUNCE_OK:
|
|
154
|
+
// Track Namespace (tuple)
|
|
155
|
+
const m = msg;
|
|
156
|
+
writeNamespaceTuple(payload, m.trackNamespace);
|
|
157
|
+
break;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
// Frame it: Type + Length + Payload
|
|
161
|
+
const payloadBytes = payload.toUint8Array();
|
|
162
|
+
const frame = new BufferWriter();
|
|
163
|
+
frame.writeVarInt(msg.type);
|
|
164
|
+
frame.writeVarInt(payloadBytes.length);
|
|
165
|
+
frame.writeBytes(payloadBytes);
|
|
166
|
+
return frame.toUint8Array();
|
|
167
|
+
}
|
|
168
|
+
// Returns parsed message or null if incomplete (EOF)
|
|
169
|
+
static deserialize(sb) {
|
|
170
|
+
const typeRes = sb.peekVarInt();
|
|
171
|
+
if (!typeRes)
|
|
172
|
+
return null;
|
|
173
|
+
try {
|
|
174
|
+
sb.checkpoint();
|
|
175
|
+
const type = Number(sb.readVarInt());
|
|
176
|
+
// Read message length (required by MoQ framing)
|
|
177
|
+
const msgLength = Number(sb.readVarInt());
|
|
178
|
+
console.log(`[MoQ] Deserializing msg type=0x${type.toString(16)}, length=${msgLength}`);
|
|
179
|
+
// Verify we have enough bytes for the full message payload
|
|
180
|
+
if (!sb.has(msgLength)) {
|
|
181
|
+
sb.rewind();
|
|
182
|
+
return null;
|
|
183
|
+
}
|
|
184
|
+
let msg;
|
|
185
|
+
switch (type) {
|
|
186
|
+
case MsgType.SERVER_SETUP: {
|
|
187
|
+
const selectedVersion = Number(sb.readVarInt());
|
|
188
|
+
const paramCount = Number(sb.readVarInt());
|
|
189
|
+
let role = 0;
|
|
190
|
+
for (let i = 0; i < paramCount; i++) {
|
|
191
|
+
const key = Number(sb.readVarInt());
|
|
192
|
+
const len = Number(sb.readVarInt());
|
|
193
|
+
const valBytes = sb.readBytes(len);
|
|
194
|
+
if (key === SETUP_ROLE_PARAMETER_KEY) {
|
|
195
|
+
const pr = new StreamBuffer();
|
|
196
|
+
pr.append(valBytes);
|
|
197
|
+
role = Number(pr.readVarInt());
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
msg = { type, selectedVersion, role };
|
|
201
|
+
break;
|
|
202
|
+
}
|
|
203
|
+
case MsgType.SUBSCRIBE: {
|
|
204
|
+
// Draft-07 SUBSCRIBE
|
|
205
|
+
const subscribeId = Number(sb.readVarInt());
|
|
206
|
+
const trackAlias = Number(sb.readVarInt());
|
|
207
|
+
const trackNamespace = readNamespaceTuple(sb);
|
|
208
|
+
// Track Name (length-prefixed bytes)
|
|
209
|
+
const nameLen = Number(sb.readVarInt());
|
|
210
|
+
const nameBytes = sb.readBytes(nameLen);
|
|
211
|
+
const trackName = new TextDecoder().decode(nameBytes);
|
|
212
|
+
// Subscriber Priority (8-bit)
|
|
213
|
+
sb.readUint8();
|
|
214
|
+
// Group Order (8-bit)
|
|
215
|
+
sb.readUint8();
|
|
216
|
+
const filterType = Number(sb.readVarInt());
|
|
217
|
+
let startGroup, startObject, endGroup, endObject;
|
|
218
|
+
if (filterType === 0x3) { // AbsoluteStart
|
|
219
|
+
startGroup = Number(sb.readVarInt());
|
|
220
|
+
startObject = Number(sb.readVarInt());
|
|
221
|
+
}
|
|
222
|
+
else if (filterType === 0x4) { // AbsoluteRange
|
|
223
|
+
startGroup = Number(sb.readVarInt());
|
|
224
|
+
startObject = Number(sb.readVarInt());
|
|
225
|
+
endGroup = Number(sb.readVarInt());
|
|
226
|
+
endObject = Number(sb.readVarInt());
|
|
227
|
+
}
|
|
228
|
+
// Parameters
|
|
229
|
+
const paramCount = Number(sb.readVarInt());
|
|
230
|
+
for (let i = 0; i < paramCount; i++) {
|
|
231
|
+
const k = Number(sb.readVarInt());
|
|
232
|
+
const l = Number(sb.readVarInt());
|
|
233
|
+
sb.readBytes(l);
|
|
234
|
+
}
|
|
235
|
+
msg = { type, subscribeId, trackAlias, trackNamespace, trackName, startGroup, startObject };
|
|
236
|
+
break;
|
|
237
|
+
}
|
|
238
|
+
case MsgType.SUBSCRIBE_OK: {
|
|
239
|
+
// Draft-07 SUBSCRIBE_OK:
|
|
240
|
+
// Subscribe ID (i), Expires (i), Group Order (8), ContentExists (8),
|
|
241
|
+
// [Largest Group ID (i), Largest Object ID (i)],
|
|
242
|
+
// Number of Params (i), Params...
|
|
243
|
+
const subscribeId = Number(sb.readVarInt());
|
|
244
|
+
const expires = Number(sb.readVarInt());
|
|
245
|
+
sb.readUint8(); // Group Order (8-bit)
|
|
246
|
+
const contentExists = sb.readUint8(); // ContentExists (8-bit)
|
|
247
|
+
if (contentExists === 1) {
|
|
248
|
+
sb.readVarInt(); // Largest Group ID
|
|
249
|
+
sb.readVarInt(); // Largest Object ID
|
|
250
|
+
}
|
|
251
|
+
// Parameters
|
|
252
|
+
const paramCount = Number(sb.readVarInt());
|
|
253
|
+
for (let i = 0; i < paramCount; i++) {
|
|
254
|
+
const k = Number(sb.readVarInt());
|
|
255
|
+
const l = Number(sb.readVarInt());
|
|
256
|
+
sb.readBytes(l);
|
|
257
|
+
}
|
|
258
|
+
msg = { type, subscribeId, expires };
|
|
259
|
+
break;
|
|
260
|
+
}
|
|
261
|
+
case MsgType.ANNOUNCE_OK: {
|
|
262
|
+
// Draft-07: Track Namespace (tuple)
|
|
263
|
+
const trackNamespace = readNamespaceTuple(sb);
|
|
264
|
+
msg = { type, trackNamespace };
|
|
265
|
+
break;
|
|
266
|
+
}
|
|
267
|
+
case MsgType.ANNOUNCE_ERROR: {
|
|
268
|
+
const trackNamespace = readNamespaceTuple(sb);
|
|
269
|
+
const code = Number(sb.readVarInt());
|
|
270
|
+
const reasonLen = Number(sb.readVarInt());
|
|
271
|
+
const reasonBytes = sb.readBytes(reasonLen);
|
|
272
|
+
const reason = new TextDecoder().decode(reasonBytes);
|
|
273
|
+
console.warn(`[MoQ] ANNOUNCE_ERROR: ns=${trackNamespace} code=${code} reason=${reason}`);
|
|
274
|
+
msg = { type, trackNamespace, code, reason };
|
|
275
|
+
break;
|
|
276
|
+
}
|
|
277
|
+
case MsgType.MAX_SUBSCRIBE_ID: {
|
|
278
|
+
const subscribeId = Number(sb.readVarInt());
|
|
279
|
+
console.log(`[MoQ] MAX_SUBSCRIBE_ID: ${subscribeId}`);
|
|
280
|
+
msg = { type, subscribeId };
|
|
281
|
+
break;
|
|
282
|
+
}
|
|
283
|
+
case MsgType.SUBSCRIBE_ERROR: {
|
|
284
|
+
const subscribeId = Number(sb.readVarInt());
|
|
285
|
+
const code = Number(sb.readVarInt());
|
|
286
|
+
const reasonLen = Number(sb.readVarInt());
|
|
287
|
+
const reasonBytes = sb.readBytes(reasonLen);
|
|
288
|
+
const reason = new TextDecoder().decode(reasonBytes);
|
|
289
|
+
const trackAlias = Number(sb.readVarInt()); // Draft-07: Track Alias at end
|
|
290
|
+
console.warn(`[MoQ] SUBSCRIBE_ERROR: id=${subscribeId} code=${code} reason=${reason} alias=${trackAlias}`);
|
|
291
|
+
msg = { type, subscribeId, code, reason };
|
|
292
|
+
break;
|
|
293
|
+
}
|
|
294
|
+
case MsgType.GOAWAY: {
|
|
295
|
+
// Just read the URI
|
|
296
|
+
const uriLen = Number(sb.readVarInt());
|
|
297
|
+
sb.readBytes(uriLen);
|
|
298
|
+
console.warn(`[MoQ] GOAWAY received`);
|
|
299
|
+
msg = { type };
|
|
300
|
+
break;
|
|
301
|
+
}
|
|
302
|
+
case MsgType.CLIENT_SETUP: {
|
|
303
|
+
const verLen = Number(sb.readVarInt());
|
|
304
|
+
const supportedVersions = [];
|
|
305
|
+
for (let i = 0; i < verLen; i++)
|
|
306
|
+
supportedVersions.push(Number(sb.readVarInt()));
|
|
307
|
+
const pCount = Number(sb.readVarInt());
|
|
308
|
+
let role = 0;
|
|
309
|
+
let path;
|
|
310
|
+
for (let i = 0; i < pCount; i++) {
|
|
311
|
+
const key = Number(sb.readVarInt());
|
|
312
|
+
const len = Number(sb.readVarInt());
|
|
313
|
+
const valBytes = sb.readBytes(len);
|
|
314
|
+
if (key === SETUP_ROLE_PARAMETER_KEY) {
|
|
315
|
+
const pr = new StreamBuffer();
|
|
316
|
+
pr.append(valBytes);
|
|
317
|
+
role = Number(pr.readVarInt());
|
|
318
|
+
}
|
|
319
|
+
else if (key === SETUP_PATH_PARAMETER_KEY) {
|
|
320
|
+
path = new TextDecoder().decode(valBytes);
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
msg = { type, supportedVersions, role, path };
|
|
324
|
+
break;
|
|
325
|
+
}
|
|
326
|
+
case MsgType.UNSUBSCRIBE: {
|
|
327
|
+
const subscribeId = Number(sb.readVarInt());
|
|
328
|
+
console.log(`[MoQ] UNSUBSCRIBE for id=${subscribeId}`);
|
|
329
|
+
msg = { type, subscribeId };
|
|
330
|
+
break;
|
|
331
|
+
}
|
|
332
|
+
case MsgType.SUBSCRIBE_DONE: {
|
|
333
|
+
const subscribeId = Number(sb.readVarInt());
|
|
334
|
+
const code = Number(sb.readVarInt());
|
|
335
|
+
const reasonLen = Number(sb.readVarInt());
|
|
336
|
+
const reasonBytes = sb.readBytes(reasonLen);
|
|
337
|
+
const reason = new TextDecoder().decode(reasonBytes);
|
|
338
|
+
let finalGroup, finalObject;
|
|
339
|
+
const contentExists = sb.readUint8();
|
|
340
|
+
if (contentExists === 1) {
|
|
341
|
+
finalGroup = Number(sb.readVarInt());
|
|
342
|
+
finalObject = Number(sb.readVarInt());
|
|
343
|
+
}
|
|
344
|
+
console.log(`[MoQ] SUBSCRIBE_DONE for id=${subscribeId} code=${code} reason=${reason}`);
|
|
345
|
+
msg = { type, subscribeId, code, reason, finalGroup, finalObject };
|
|
346
|
+
break;
|
|
347
|
+
}
|
|
348
|
+
default: {
|
|
349
|
+
// Unknown type - skip using the length we already read
|
|
350
|
+
console.warn(`[MoQ] Unknown MsgType: 0x${type.toString(16)}, skipping ${msgLength} bytes`);
|
|
351
|
+
sb.readBytes(msgLength);
|
|
352
|
+
msg = { type };
|
|
353
|
+
break;
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
sb.commit();
|
|
357
|
+
return msg;
|
|
358
|
+
}
|
|
359
|
+
catch (e) {
|
|
360
|
+
if (e.message === 'EOF') {
|
|
361
|
+
sb.rewind();
|
|
362
|
+
return null;
|
|
363
|
+
}
|
|
364
|
+
throw e;
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ClientOptions } from '../core/types';
|
|
2
|
+
export declare const PLUTO_HOSTED_PROJECT_ID = "pluto-rtc-prod";
|
|
3
|
+
export declare const PLUTO_HOSTED_FIREBASE_CONFIG: {
|
|
4
|
+
readonly apiKey: "AIzaSyA62Krj-7ZYFT5xjrTUq7mXana41Ahj_mM";
|
|
5
|
+
readonly authDomain: "api.openrtc.app";
|
|
6
|
+
readonly projectId: "pluto-rtc-prod";
|
|
7
|
+
readonly storageBucket: "pluto-rtc-prod.firebasestorage.app";
|
|
8
|
+
readonly messagingSenderId: "607066575224";
|
|
9
|
+
readonly appId: "1:607066575224:web:ed3f51825ba228db92b88d";
|
|
10
|
+
};
|
|
11
|
+
export declare function withPlutoHostedDefaults<T extends ClientOptions>(options: T): T & {
|
|
12
|
+
projectId: string;
|
|
13
|
+
};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export const PLUTO_HOSTED_PROJECT_ID = 'pluto-rtc-prod';
|
|
2
|
+
export const PLUTO_HOSTED_FIREBASE_CONFIG = {
|
|
3
|
+
apiKey: 'AIzaSyA62Krj-7ZYFT5xjrTUq7mXana41Ahj_mM',
|
|
4
|
+
authDomain: 'api.openrtc.app',
|
|
5
|
+
projectId: PLUTO_HOSTED_PROJECT_ID,
|
|
6
|
+
storageBucket: 'pluto-rtc-prod.firebasestorage.app',
|
|
7
|
+
messagingSenderId: '607066575224',
|
|
8
|
+
appId: '1:607066575224:web:ed3f51825ba228db92b88d',
|
|
9
|
+
};
|
|
10
|
+
export function withPlutoHostedDefaults(options) {
|
|
11
|
+
const projectId = typeof options.projectId === 'string' && options.projectId.trim()
|
|
12
|
+
? options.projectId.trim()
|
|
13
|
+
: PLUTO_HOSTED_PROJECT_ID;
|
|
14
|
+
return {
|
|
15
|
+
...options,
|
|
16
|
+
projectId,
|
|
17
|
+
};
|
|
18
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import type { AuthContext } from '../core/IEngineBridge';
|
|
2
|
+
import type { Device, DeviceEvent, ExplicitFileDataSendParams, ISignalingBackend, LocalDeviceInfo, NativeConnectResult, RuntimeIdentity, SessionEvent, SignalingEnvelope, SignalingSession } from '../core/types';
|
|
3
|
+
export declare abstract class DelegatingRuntimeAdapter implements ISignalingBackend {
|
|
4
|
+
protected readonly backend: ISignalingBackend;
|
|
5
|
+
protected constructor(backend: ISignalingBackend);
|
|
6
|
+
get currentUser(): RuntimeIdentity | null;
|
|
7
|
+
setAuthContext(context: AuthContext | null): Promise<void> | void;
|
|
8
|
+
signInAnonymously(): Promise<void>;
|
|
9
|
+
signInWithPluto(): Promise<void>;
|
|
10
|
+
signOut(): Promise<void>;
|
|
11
|
+
stopAuthScopedActivity(): Promise<void>;
|
|
12
|
+
getTurnCredentials(): Promise<any>;
|
|
13
|
+
updatePresence(localNodeId: string, ticketStr: string, isOnline: boolean, ttlMs: number, metadata?: string): Promise<void>;
|
|
14
|
+
setOffline(localNodeId: string): Promise<void>;
|
|
15
|
+
cleanupStaleDevices(): Promise<void>;
|
|
16
|
+
searchDevices(excludeNodeId?: string): Promise<Device[]>;
|
|
17
|
+
listDevicesWithStatus(): Promise<import('../core/types').DeviceStatusSnapshot[]>;
|
|
18
|
+
getPeerSession(id: string): Promise<import('../core/types').PeerSessionSnapshot | null>;
|
|
19
|
+
listPeerSessions(): Promise<import('../core/types').PeerSessionSnapshot[]>;
|
|
20
|
+
waitForSettledPeer(id: string, timeoutMs?: number): Promise<import('../core/types').PeerSessionSnapshot | null>;
|
|
21
|
+
resolvePeerIdentity(id: string): Promise<import('../core/types').ResolvedPeerIdentity>;
|
|
22
|
+
resolvePeerConnectionRecords(id: string): Promise<import('../core/types').ManagedConnectionRecord[]>;
|
|
23
|
+
updateDevice(deviceId: string, updates: {
|
|
24
|
+
deviceName?: string;
|
|
25
|
+
capabilities?: Device['capabilities'];
|
|
26
|
+
metadata?: string;
|
|
27
|
+
}): Promise<void>;
|
|
28
|
+
deleteDevice(deviceId: string): Promise<void>;
|
|
29
|
+
onDevicesChange(callback: (devices: Device[]) => void, excludeNodeId?: string): () => void;
|
|
30
|
+
onAuthChange(callback: (user: RuntimeIdentity | null) => void): () => void;
|
|
31
|
+
checkForSSOToken(): Promise<void>;
|
|
32
|
+
waitForAuth(): Promise<void>;
|
|
33
|
+
sendMessage(targetId: string, payload: string, state?: string, replyPayload?: string): Promise<string>;
|
|
34
|
+
pollMessages(targetId: string): Promise<SignalingEnvelope[]>;
|
|
35
|
+
subscribeDevices(userId: string): Promise<ReadableStream<DeviceEvent[]>>;
|
|
36
|
+
startAutoConnect(userId: string, localDeviceId: string): void;
|
|
37
|
+
startPresenceLoop(userId: string, localNodeId: string, deviceName: string, ticket: string, metadata?: string): void;
|
|
38
|
+
createSession(session: SignalingSession): Promise<void>;
|
|
39
|
+
updateSession(sessionId: string, updateData: any): Promise<void>;
|
|
40
|
+
subscribeSessions(localDeviceId: string): Promise<ReadableStream<SessionEvent[]>>;
|
|
41
|
+
forceReconnectSnapshot(): void;
|
|
42
|
+
getLocalDeviceId(): Promise<string | null>;
|
|
43
|
+
getLocalDeviceInfo(): Promise<LocalDeviceInfo | null>;
|
|
44
|
+
updateLocalDeviceName(deviceName: string): Promise<LocalDeviceInfo | null>;
|
|
45
|
+
getManagedNodeId(options?: {
|
|
46
|
+
initializeIfMissing?: boolean;
|
|
47
|
+
}): Promise<string | null>;
|
|
48
|
+
getEndpointTicket(): Promise<string>;
|
|
49
|
+
getEndpointTicketWithToken(scope: string, maxConnections: number): Promise<string | null>;
|
|
50
|
+
registerSessionToken(token: string, scope: string, maxConnections: number): Promise<void>;
|
|
51
|
+
revokeSessionTokensByScope(scope: string): Promise<string[]>;
|
|
52
|
+
openPeerBi(id: string, timeoutMs?: number): Promise<import('../core/types').BackendPeerBiStream>;
|
|
53
|
+
openPeerUni(id: string, timeoutMs?: number): Promise<import('../core/types').BackendPeerUniStream>;
|
|
54
|
+
connectToDevice(params: {
|
|
55
|
+
deviceId?: string | null;
|
|
56
|
+
endpointTicket: string;
|
|
57
|
+
}): Promise<NativeConnectResult>;
|
|
58
|
+
disconnectDevice(deviceId: string): Promise<void>;
|
|
59
|
+
isConnected(nodeId: string): Promise<boolean>;
|
|
60
|
+
getConnectionStates(): Promise<import('../core/types').BackendConnectionState[]>;
|
|
61
|
+
onConnectionStateChange(callback: (state: import('../core/types').BackendConnectionState) => void): Promise<() => void> | (() => void);
|
|
62
|
+
sendExplicitFilePath(connectionId: string, filePath: string, transferId?: string): Promise<string>;
|
|
63
|
+
sendExplicitFileData(params: ExplicitFileDataSendParams): Promise<void>;
|
|
64
|
+
getTransferHistory(limit?: number): Promise<Array<[string, unknown]>>;
|
|
65
|
+
deleteTransferJob(jobId: string): Promise<void>;
|
|
66
|
+
onIncomingNativeMessage(callback: (connectionId: string, remoteNodeId: string | null, message: any) => void): Promise<() => void>;
|
|
67
|
+
unwrap(): ISignalingBackend;
|
|
68
|
+
}
|