about summary refs log tree commit diff
path: root/assets/src/models
diff options
context:
space:
mode:
authorMelonai <einebeere@gmail.com>2021-07-08 23:29:20 +0200
committerMelonai <einebeere@gmail.com>2021-07-08 23:29:20 +0200
commitc3b05a72b7185112ece6e42c99e9a828c8298f04 (patch)
tree317da6fbe640ffa57cf771b4b9e3b0beb80e836c /assets/src/models
parent9d8ca2a653661560f471d717d188e92a79edb250 (diff)
downloadrook-c3b05a72b7185112ece6e42c99e9a828c8298f04.tar.zst
rook-c3b05a72b7185112ece6e42c99e9a828c8298f04.zip
State display for incoming and own requests
Diffstat (limited to 'assets/src/models')
-rw-r--r--assets/src/models/incoming_request.ts57
-rw-r--r--assets/src/models/own_request.ts40
2 files changed, 97 insertions, 0 deletions
diff --git a/assets/src/models/incoming_request.ts b/assets/src/models/incoming_request.ts
new file mode 100644
index 0000000..e1eefb1
--- /dev/null
+++ b/assets/src/models/incoming_request.ts
@@ -0,0 +1,57 @@
+import { bindTransfer, Transfer } from "../network/transfer/transfer";
+import { Writable, writable } from "svelte/store";
+import { createOfferTransfer } from "../network/transfer/share_transfer";
+
+// Represents the current progress of every request
+export enum IncomingRequestState {
+    // Request was neither accepted nor declined yet
+    WAITING,
+    // Data is being transferred, more precise data
+    // is available in the corresponding Transfer object
+    IN_FLIGHT,
+    // Requestor has received all data
+    DONE,
+    // Request was declined
+    DECLINED,
+}
+
+// Identifying information about the requestor
+export type IncomingRequestInfo = {
+    token: string;
+};
+
+// The model for a request received by a sharer
+// The state marks changes in the progression of the request lifecycle and can be subscribed to
+export type IncomingRequest = {
+    // Transfer is null while request isn't IN_FLIGHT
+    transfer: Transfer | null;
+    info: IncomingRequestInfo;
+    state: Writable<IncomingRequestState>;
+};
+
+// Create a model for a new incoming request
+export function newIncomingRequest(token: string): IncomingRequest {
+    const info = {
+        token,
+    };
+
+    return {
+        transfer: null,
+        info,
+        // Each request starts out as just received and waiting for an answer
+        state: writable(IncomingRequestState.WAITING),
+    };
+}
+
+// Starts the transfer of data from the sharer to the requestor
+export function acceptIncomingRequest(request: IncomingRequest) {
+    request.state.set(IncomingRequestState.IN_FLIGHT);
+
+    bindTransfer(request, createOfferTransfer(request.info.token), () =>
+        request.state.set(IncomingRequestState.DONE)
+    );
+}
+
+export function declineIncomingRequest(request: IncomingRequest) {
+    // TODO
+}
diff --git a/assets/src/models/own_request.ts b/assets/src/models/own_request.ts
new file mode 100644
index 0000000..2ad29af
--- /dev/null
+++ b/assets/src/models/own_request.ts
@@ -0,0 +1,40 @@
+import { bindTransfer, Transfer } from "../network/transfer/transfer";
+import { writable, Writable } from "svelte/store";
+import { createAnswerTransfer } from "../network/transfer/request_transfer";
+
+// Represents the current progress of the request
+export enum OwnRequestState {
+    PENDING,
+    ACKNOWLEDGED,
+
+    IN_FLIGHT,
+    DONE,
+
+    DECLINED,
+    SHARE_CANCELLED,
+    NO_SUCH_SHARE,
+}
+
+export type OwnRequest = {
+    // Transfer is null while request isn't IN_FLIGHT
+    transfer: Transfer | null;
+    state: Writable<OwnRequestState>;
+};
+
+export function initializeRequest(): OwnRequest {
+    return {
+        transfer: null,
+        state: writable(OwnRequestState.PENDING),
+    };
+}
+
+export function requestAccepted(
+    request: OwnRequest,
+    description: RTCSessionDescriptionInit
+) {
+    request.state.set(OwnRequestState.IN_FLIGHT);
+
+    bindTransfer(request, createAnswerTransfer(description), () =>
+        request.state.set(OwnRequestState.DONE)
+    );
+}