about summary refs log tree commit diff
path: root/assets/src/network/channel/share_connection.ts
diff options
context:
space:
mode:
Diffstat (limited to 'assets/src/network/channel/share_connection.ts')
-rw-r--r--assets/src/network/channel/share_connection.ts51
1 files changed, 51 insertions, 0 deletions
diff --git a/assets/src/network/channel/share_connection.ts b/assets/src/network/channel/share_connection.ts
new file mode 100644
index 0000000..415cb7f
--- /dev/null
+++ b/assets/src/network/channel/share_connection.ts
@@ -0,0 +1,51 @@
+import { newIncomingRequest } from "../../models/incoming_request";
+import requests from "../../stores/received_requests";
+import {
+    ConnectionState,
+    on,
+    onWithToken,
+    start,
+    updateState,
+} from "./connection";
+import type { UnregisterHandler } from "./messages/handler";
+import type {
+    NewRequestMessage,
+    RequestCancelledMessage,
+} from "./messages/messages";
+import { joinShareChannel } from "./socket";
+
+export async function startShareConnection() {
+    const connection = await start();
+
+    updateState(ConnectionState.CONNECTING_CHANNEL);
+
+    const shareChannel = await joinShareChannel(
+        connection.socket,
+        connection.token
+    );
+    connection.channel = shareChannel;
+
+    on("new_request", onNewRequest);
+
+    updateState(ConnectionState.CONNECTED);
+}
+
+// Events which can happen without prior triggers during a share's lifetime
+
+function onNewRequest(message: NewRequestMessage) {
+    const token = message.token;
+
+    const request = newIncomingRequest(token);
+    requests.addRequest(request);
+
+    onWithToken("request_cancelled", token, onRequestCancelled);
+}
+
+function onRequestCancelled(
+    message: RequestCancelledMessage,
+    unregister: UnregisterHandler
+) {
+    const token = message.token;
+    requests.removeRequest(token);
+    unregister();
+}