aboutsummaryrefslogtreecommitdiffstats
path: root/packages/meshbay-hub/src/meshbay_hub/static/transport.js
diff options
context:
space:
mode:
Diffstat (limited to 'packages/meshbay-hub/src/meshbay_hub/static/transport.js')
-rw-r--r--packages/meshbay-hub/src/meshbay_hub/static/transport.js39
1 files changed, 37 insertions, 2 deletions
diff --git a/packages/meshbay-hub/src/meshbay_hub/static/transport.js b/packages/meshbay-hub/src/meshbay_hub/static/transport.js
index 24c08b9..844a201 100644
--- a/packages/meshbay-hub/src/meshbay_hub/static/transport.js
+++ b/packages/meshbay-hub/src/meshbay_hub/static/transport.js
@@ -42,6 +42,10 @@ const UPLOAD_CHUNK_SIZE = 48 * 1024;
const UPLOAD_WINDOW = 32;
const UPLOAD_BUFFER_HIGH = 1024 * 1024;
+// Segments of 256 KB: 24 in flight is 6 MB, enough to keep playback fed over a
+// slow link and small enough that nothing accumulates.
+const STREAM_CREDITS = 24;
+
function _aborted() {
const err = new Error('Cancelled');
err.name = 'AbortError';
@@ -522,8 +526,39 @@ class MeshBayTransport {
return msg;
}
- requestStream(fileId) {
- this._send({ type: 'stream_req', v: '0.1', file_id: fileId });
+ /**
+ * Stop this node serving the group key to someone. Operator only.
+ *
+ * Only the node can do this: its roster decides who it serves. Removing them
+ * on the hub is the other half, and neither implies the other.
+ */
+ async revokeMember(userId, signFn) {
+ const msg = await this._sendAndWait({
+ type: 'member_revoke', v: '0.1', user_id: userId,
+ });
+ if (msg.type === 'error') throw new Error(msg.detail);
+ if (msg.type === 'admin_challenge') {
+ return this._authorizeAdminOp(msg, 'member_revoke', userId, signFn);
+ }
+ return msg;
+ }
+
+ /**
+ * Ask for a video stream, and say how much we can take.
+ *
+ * `credits` bounds what is in flight. Without it the node pushes the whole
+ * film as fast as ffmpeg produces it and the browser holds all of it while
+ * MediaSource consumes a segment at a time — which is fine for a clip and
+ * fatal for anything worth streaming.
+ */
+ requestStream(fileId, credits = STREAM_CREDITS) {
+ this._send({ type: 'stream_req', v: '0.1', file_id: fileId, credits });
+ }
+
+ /** Room for `n` more segments. */
+ grantStreamCredit(n = 1) {
+ if (!this._connected) return;
+ this._send({ type: 'stream_more', v: '0.1', n });
}
/**