SonusLab StorageSonusLab Storage

Svelte

Reactive upload state for Svelte 5, powered by runes. Same upload flow as browser uploads, wrapped in a class with reactive fields.

Upload class

Import from sonuslab-storage/svelte. Instantiate once per upload surface; the instance exposes reactive status, progress, and error fields plus upload() and reset() methods.

Uploader.svelte
<script lang="ts">
  import { Upload } from 'sonuslab-storage/svelte'

  const uploader = new Upload({
    presignEndpoint: '/api/upload/presign',
    completeEndpoint: '/api/upload/complete',
  })

  function onChange(e: Event) {
    const file = (e.target as HTMLInputElement).files?.[0]
    if (!file) return
    uploader.upload(file)
  }
</script>

<input type="file" onchange={onChange} disabled={uploader.status === 'uploading'} />

{#if uploader.status === 'uploading'}
  <p>{uploader.progress}%</p>
{/if}
{#if uploader.status === 'error'}
  <p>{uploader.error?.message}</p>
  <button onclick={() => uploader.reset()}>Retry</button>
{/if}

Reactive fields

ParameterTypeDescription
status'idle' | 'uploading' | 'complete' | 'error'Current upload state.
progress{ loaded, total, percent } | nullLive progress during the PUT (0–100).
errorError | nullPopulated when status is error.

Methods

ParameterTypeDescription
upload(file)(file: File, metadata?: Record<string, unknown>) => Promise<UploadResult>Run the presign → PUT → complete flow. Resolves with fileId + key.
reset()() => voidClear status, progress, and error back to idle.

Lifecycle callbacks

Pass these in the constructor for side-effects without reacting to status.

ParameterTypeDescription
onStart(file: File) => voidFires when upload() is invoked, before any network I/O.
onComplete(result: UploadResult) => voidFires after the complete step resolves.
onError(err: Error) => voidFires when the upload rejects (after status becomes error).