import { ExtendedPatch } from "@noya-app/noya-multiplayer-react"; import { Input, OutputTransform } from "@noya-app/noya-schemas"; import { Observable } from "@noya-app/observable"; import { RPCManager } from "./rpcManager"; /** Helper type that preserves all properties and their requirements except for id */ export type CreateParams = | Omit | (Partial & { id?: string; stableId?: string }); export class IOManager { constructor(public rpcManager: RPCManager) {} inputs$ = new Observable([]); outputTransforms$ = new Observable([]); inputsInitialized$ = new Observable(false); outputTransformsInitialized$ = new Observable(false); isInitialized$ = Observable.combine( [this.inputsInitialized$, this.outputTransformsInitialized$], ([inputsInitialized, outputTransformsInitialized]) => inputsInitialized && outputTransformsInitialized ); async fetchInputs(): Promise { const response = await this.rpcManager.requestRoute("GET /api/inputs", {}); const result = this.rpcManager.getResponseBody(response); return result; } async fetchOutputTransforms(): Promise { const response = await this.rpcManager.requestRoute( "GET /api/outputTransforms", {} ); const result = this.rpcManager.getResponseBody(response); return result; } async createInput(input: CreateParams): Promise { const response = await this.rpcManager.requestRoute("POST /api/inputs", { headers: { "Content-Type": "application/json", }, body: JSON.stringify(input), }); const newInput = this.rpcManager.getResponseBody(response); return newInput; } async createOutputTransform( outputTransform: CreateParams ): Promise { const response = await this.rpcManager.requestRoute( "POST /api/outputTransforms", { headers: { "Content-Type": "application/json", }, body: JSON.stringify(outputTransform), } ); const newOutputTransform = this.rpcManager.getResponseBody(response); return newOutputTransform; } async deleteInput(id: string): Promise<{ success: true }> { const response = await this.rpcManager.requestRoute("DELETE /api/inputs", { headers: { "Content-Type": "application/json", }, body: JSON.stringify({ id }), }); const result = this.rpcManager.getResponseBody(response); return result; } async deleteOutputTransform(id: string): Promise<{ success: true }> { const response = await this.rpcManager.requestRoute( "DELETE /api/outputTransforms", { headers: { "Content-Type": "application/json", }, body: JSON.stringify({ id }), } ); const result = this.rpcManager.getResponseBody(response); return result; } async applyInputPatches(patches: ExtendedPatch[]): Promise { const response = await this.rpcManager.requestRoute("PATCH /api/inputs", { headers: { "Content-Type": "application/json", }, body: JSON.stringify(patches), }); const result = this.rpcManager.getResponseBody(response); return result; } async applyOutputTransformPatches( patches: ExtendedPatch[] ): Promise { const response = await this.rpcManager.requestRoute( "PATCH /api/outputTransforms", { headers: { "Content-Type": "application/json", }, body: JSON.stringify(patches), } ); const result = this.rpcManager.getResponseBody(response); return result; } }