Spaces:
Runtime error
Runtime error
File size: 4,945 Bytes
560b99e 66ed450 560b99e 66ed450 a6e7e8f 560b99e 304976c a6e7e8f 73e6846 a6e7e8f 73e6846 a6e7e8f 560b99e 304976c 73e6846 a6e7e8f 73e6846 a6e7e8f 560b99e 1d701d3 e5b9b7e 1d701d3 a6e7e8f 1d701d3 a6e7e8f e5b9b7e 1d701d3 66ed450 73e6846 e5b9b7e 73e6846 a6e7e8f 1d701d3 32561d8 304976c 32561d8 304976c 66ed450 560b99e 66ed450 1d701d3 66ed450 32561d8 304976c 32561d8 304976c 32561d8 1d701d3 66ed450 304976c 32561d8 66ed450 a6e7e8f 66ed450 560b99e |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 |
<script lang="ts">
import Cursor from '$lib/Cursor.svelte';
import Frame from '$lib/Frame.svelte';
import Canvas from '$lib/Canvas.svelte';
import Menu from '$lib/Menu.svelte';
import PromptModal from '$lib/PromptModal.svelte';
import type { Room } from '@liveblocks/client';
import { COLORS, EMOJIS } from '$lib/constants';
import { PUBLIC_WS_ENDPOINT } from '$env/static/public';
import { onMount } from 'svelte';
import {
isLoading,
loadingState,
currZoomTransform,
myPresence,
others,
isPrompting,
clickedPosition,
imagesList
} from '$lib/store';
import { base64ToBlob, uploadImage } from '$lib/utils';
/**
* The main Liveblocks code for the example.
* Check in src/routes/index.svelte to see the setup code.
*/
export let room: Room;
onMount(() => {});
async function onClose(e: CustomEvent) {
$isPrompting = false;
}
async function onPrompt(e: CustomEvent) {
const prompt = e.detail.prompt;
const imgURLs = await generateImage(prompt);
$isPrompting = false;
console.log('prompt', prompt, imgURLs);
}
async function generateImage(_prompt: string) {
if (!_prompt || $isLoading == true) return;
$loadingState = 'Pending';
$isLoading = true;
const sessionHash = crypto.randomUUID();
const payload = {
fn_index: 2,
data: [_prompt],
session_hash: sessionHash
};
const websocket = new WebSocket(PUBLIC_WS_ENDPOINT);
// websocket.onopen = async function (event) {
// websocket.send(JSON.stringify({ hash: sessionHash }));
// };
websocket.onclose = (evt) => {
if (!evt.wasClean) {
$loadingState = 'Error';
$isLoading = false;
}
};
websocket.onmessage = async function (event) {
try {
const data = JSON.parse(event.data);
$loadingState = '';
switch (data.msg) {
case 'send_data':
$loadingState = 'Sending Data';
websocket.send(JSON.stringify(payload));
break;
case 'queue_full':
$loadingState = 'Queue full';
websocket.close();
$isLoading = false;
return;
case 'estimation':
const { msg, rank, queue_size } = data;
$loadingState = `On queue ${rank}/${queue_size}`;
break;
case 'process_generating':
$loadingState = data.success ? 'Generating' : 'Error';
break;
case 'process_completed':
try {
const imgsBase64 = data.output.data[0] as string[];
const imgBlobs = await Promise.all(imgsBase64.map((base64) => base64ToBlob(base64)));
const imgURLs = await Promise.all(imgBlobs.map((blob) => uploadImage(blob, _prompt)));
$imagesList.push({
prompt: _prompt,
images: imgURLs,
position: $clickedPosition
});
console.log(imgURLs);
$loadingState = data.success ? 'Complete' : 'Error';
} catch (e) {
$loadingState = e.message;
}
websocket.close();
$isLoading = false;
return;
case 'process_starts':
$loadingState = 'Processing';
break;
}
} catch (e) {
console.error(e);
$isLoading = false;
$loadingState = 'Error';
}
};
}
let modal = false;
</script>
<!-- Show the current user's cursor location -->
<div class="text touch-none pointer-events-none">
{$myPresence?.cursor
? `${$myPresence.cursor.x} × ${$myPresence.cursor.y}`
: 'Move your cursor to broadcast its position to other people in the room.'}
{$loadingState}
{$isLoading}
</div>
{#if $isPrompting}
<PromptModal on:prompt={onPrompt} on:close={onClose} />
{/if}
<div class="fixed top-0 left-0 z-0 w-screen h-screen">
<Canvas />
<main class="z-10 relative">
{#if $imagesList}
{#each $imagesList as image, i}
<Frame
color={COLORS[0]}
position={$imagesList.get(i).position}
images={$imagesList.get(i).images}
transform={$currZoomTransform}
dumped={false}
/>
{/each}
{/if}
{#if $clickedPosition}
<Frame color={COLORS[0]} position={$clickedPosition} transform={$currZoomTransform} />
{/if}
{#if $myPresence?.cursor}
<Frame color={COLORS[0]} position={$myPresence.cursor} transform={$currZoomTransform} />
<Cursor
emoji={EMOJIS[0]}
color={COLORS[0]}
position={$myPresence.cursor}
transform={$currZoomTransform}
/>
{/if}
<!-- When others connected, iterate through others and show their cursors -->
{#if others}
{#each [...$others] as { connectionId, presence } (connectionId)}
{#if presence?.cursor}
<Frame
color={COLORS[1 + (connectionId % (COLORS.length - 1))]}
position={presence.cursor}
transform={$currZoomTransform}
/>
<Cursor
emoji={EMOJIS[1 + (connectionId % (EMOJIS.length - 1))]}
color={COLORS[1 + (connectionId % (COLORS.length - 1))]}
position={presence.cursor}
transform={$currZoomTransform}
/>
{/if}
{/each}
{/if}
</main>
</div>
<div class="fixed bottom-0 left-0 right-0 z-10 my-2">
<Menu />
</div>
<style lang="postcss" scoped>
</style>
|