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.
Files changed (122) hide show
  1. package/README.md +106 -0
  2. package/dist/OpenRTC.d.ts +71 -0
  3. package/dist/OpenRTC.js +130 -0
  4. package/dist/api/MediaTransport.d.ts +7 -0
  5. package/dist/api/MediaTransport.js +262 -0
  6. package/dist/api/PlutoPeerConnection.d.ts +50 -0
  7. package/dist/api/PlutoPeerConnection.js +434 -0
  8. package/dist/api/PlutoWebSocket.d.ts +24 -0
  9. package/dist/api/PlutoWebSocket.js +113 -0
  10. package/dist/api/PlutoWebTransport.d.ts +29 -0
  11. package/dist/api/PlutoWebTransport.js +105 -0
  12. package/dist/auth/host.d.ts +73 -0
  13. package/dist/auth/host.js +513 -0
  14. package/dist/auth/index.d.ts +1 -0
  15. package/dist/auth/index.js +1 -0
  16. package/dist/auth/internal.d.ts +1 -0
  17. package/dist/auth/internal.js +1 -0
  18. package/dist/compat/index.d.ts +20 -0
  19. package/dist/compat/index.js +20 -0
  20. package/dist/core/Client.d.ts +352 -0
  21. package/dist/core/Client.js +3689 -0
  22. package/dist/core/Connection.d.ts +67 -0
  23. package/dist/core/Connection.js +404 -0
  24. package/dist/core/IEngineBridge.d.ts +18 -0
  25. package/dist/core/IEngineBridge.js +1 -0
  26. package/dist/core/ISignalingTransport.d.ts +13 -0
  27. package/dist/core/ISignalingTransport.js +1 -0
  28. package/dist/core/PeerLifecycleManager.d.ts +43 -0
  29. package/dist/core/PeerLifecycleManager.js +330 -0
  30. package/dist/core/PeerProjectionStore.d.ts +43 -0
  31. package/dist/core/PeerProjectionStore.js +327 -0
  32. package/dist/core/PlutoRTC.d.ts +13 -0
  33. package/dist/core/PlutoRTC.js +26 -0
  34. package/dist/core/Room.d.ts +47 -0
  35. package/dist/core/Room.js +376 -0
  36. package/dist/core/Signaling.d.ts +39 -0
  37. package/dist/core/Signaling.js +147 -0
  38. package/dist/core/bridges/BridgeCodecs.d.ts +19 -0
  39. package/dist/core/bridges/BridgeCodecs.js +317 -0
  40. package/dist/core/bridges/BrowserFirestoreRooms.d.ts +36 -0
  41. package/dist/core/bridges/BrowserFirestoreRooms.js +169 -0
  42. package/dist/core/bridges/BrowserFirestoreSignaling.d.ts +111 -0
  43. package/dist/core/bridges/BrowserFirestoreSignaling.js +1010 -0
  44. package/dist/core/bridges/NativeIpcBridge.d.ts +156 -0
  45. package/dist/core/bridges/NativeIpcBridge.js +1472 -0
  46. package/dist/core/bridges/RtdbPresence.d.ts +122 -0
  47. package/dist/core/bridges/RtdbPresence.js +201 -0
  48. package/dist/core/bridges/TauriBridge.d.ts +8 -0
  49. package/dist/core/bridges/TauriBridge.js +7 -0
  50. package/dist/core/bridges/WasmBridge.d.ts +233 -0
  51. package/dist/core/bridges/WasmBridge.js +1811 -0
  52. package/dist/core/config.d.ts +31 -0
  53. package/dist/core/config.js +138 -0
  54. package/dist/core/transports/ITransport.d.ts +12 -0
  55. package/dist/core/transports/ITransport.js +1 -0
  56. package/dist/core/transports/LocalDaemonBridge.d.ts +41 -0
  57. package/dist/core/transports/LocalDaemonBridge.js +227 -0
  58. package/dist/core/transports/TauriSignaling.d.ts +28 -0
  59. package/dist/core/transports/TauriSignaling.js +373 -0
  60. package/dist/core/transports/TransportFactory.d.ts +9 -0
  61. package/dist/core/transports/TransportFactory.js +59 -0
  62. package/dist/core/transports/WasmSignaling.d.ts +78 -0
  63. package/dist/core/transports/WasmSignaling.js +522 -0
  64. package/dist/core/transports/WebRTCTransport.d.ts +23 -0
  65. package/dist/core/transports/WebRTCTransport.js +132 -0
  66. package/dist/core/trust.d.ts +23 -0
  67. package/dist/core/trust.js +99 -0
  68. package/dist/core/types.d.ts +559 -0
  69. package/dist/core/types.js +19 -0
  70. package/dist/index.d.ts +3 -0
  71. package/dist/index.js +3 -0
  72. package/dist/moq/MoQMediaTransport.d.ts +6 -0
  73. package/dist/moq/MoQMediaTransport.js +106 -0
  74. package/dist/moq/MoQPublisher.d.ts +22 -0
  75. package/dist/moq/MoQPublisher.js +179 -0
  76. package/dist/moq/MoQSession.d.ts +35 -0
  77. package/dist/moq/MoQSession.js +166 -0
  78. package/dist/moq/MoQSubscriber.d.ts +19 -0
  79. package/dist/moq/MoQSubscriber.js +235 -0
  80. package/dist/moq/common.d.ts +47 -0
  81. package/dist/moq/common.js +304 -0
  82. package/dist/moq/messages.d.ts +105 -0
  83. package/dist/moq/messages.js +367 -0
  84. package/dist/presets/plutoHosted.d.ts +13 -0
  85. package/dist/presets/plutoHosted.js +18 -0
  86. package/dist/runtime/DelegatingRuntimeAdapter.d.ts +68 -0
  87. package/dist/runtime/DelegatingRuntimeAdapter.js +250 -0
  88. package/dist/runtime/IpcRuntimeAdapter.d.ts +9 -0
  89. package/dist/runtime/IpcRuntimeAdapter.js +13 -0
  90. package/dist/runtime/RuntimeClient.d.ts +257 -0
  91. package/dist/runtime/RuntimeClient.js +1484 -0
  92. package/dist/runtime/TauriRuntimeAdapter.d.ts +1 -0
  93. package/dist/runtime/TauriRuntimeAdapter.js +1 -0
  94. package/dist/runtime/WasmRuntimeAdapter.d.ts +6 -0
  95. package/dist/runtime/WasmRuntimeAdapter.js +11 -0
  96. package/dist/runtime/factories.d.ts +24 -0
  97. package/dist/runtime/factories.js +66 -0
  98. package/dist/runtime/index.d.ts +6 -0
  99. package/dist/runtime/index.js +5 -0
  100. package/dist/runtime/ipc.d.ts +8 -0
  101. package/dist/runtime/ipc.js +65 -0
  102. package/dist/runtime/ipcContract.d.ts +46 -0
  103. package/dist/runtime/ipcContract.js +1 -0
  104. package/dist/runtime/tauri.d.ts +16 -0
  105. package/dist/runtime/tauri.js +22 -0
  106. package/dist/runtime/types.d.ts +110 -0
  107. package/dist/runtime/types.js +1 -0
  108. package/dist/transports/TauriTransport.d.ts +17 -0
  109. package/dist/transports/TauriTransport.js +49 -0
  110. package/dist/transports/WebTransport.d.ts +23 -0
  111. package/dist/transports/WebTransport.js +71 -0
  112. package/dist/utils/debug.d.ts +4 -0
  113. package/dist/utils/debug.js +33 -0
  114. package/dist/utils/runtime.d.ts +1 -0
  115. package/dist/utils/runtime.js +10 -0
  116. package/package.json +97 -0
  117. package/wasm/README.md +64 -0
  118. package/wasm/openrtc.d.ts +284 -0
  119. package/wasm/openrtc.js +2132 -0
  120. package/wasm/openrtc_bg.wasm +0 -0
  121. package/wasm/openrtc_bg.wasm.d.ts +110 -0
  122. 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
+ }