npm package: @suiftly/core
Description: Common low level functions for Suiftly.io
Author: Suiftly.io
Latest version: 0.1.0

[![Discord chat](https://img.shields.io/discord/1038616996062953554.svg?logo=discord&style=flat-square)](https://discord.gg/Erb6SwsVbH) [![Active Development](https://img.shields.io/badge/Maintenance%20Level-Actively%20Developed-brightgreen.svg)](https://gist.github.com/cheerfulstoic/d107229326a01ff0f333a1d3476e068d)

# Suiftly - CDN Optimizations for Sui Walrus

Fast and robust loading of any Walrus blobs.

Simple use: `fetchBlob(blobID)`

Works for any Web2/Web3 and NodeJS apps.

Useful for loading (and authenticate the data) even when not hosted on walrus.site

You can alternatively download any blob (without data authentication) with a direct link: `https://cdn.suiftly.io/blob/{blobID}`

Example:
    https://cdn.suiftly.io/blob/fK7v0bft1JqVbxQaM_KJAYkejbY9FgU9doqZwg7smw8

## More Info

Video Demo: https://youtu.be/ldTN7w4Du8o

Walrus Demo: https://suiftly.walrus.site

https://suiftly.io

> MIME Content-Type header is properly generated by Suiftly

> Important: Blob encoding has not been finalized and published by Mysten Labs, therefore fetchBlob() skips validation for now.

# Functions

## fetchBlob

```typescript
function fetchBlob(
    blobID: string,
    options?: {
        mimeType?: string;
        allowSuiftly?: boolean;
        allowWalrus?: boolean;
    },
): Promise<Blob>;
```

Fetches a Walrus blob

### Parameters

-   `blobID` - Walrus blob ID
-   `options` - Optional parameters
    -   `options.allowSuiftly` - Whether to allow fetching from Suiftly CDN as the primary source. Default is true.
    -   `options.allowWalrus` - Whether to allow fallback to Walrus if the primary fetch fails. Default is true.
    -   `options.mimeType` - Force the MIME type (e.g. image/png) in the returned Blob. By default, will be properly set when retrieving from Suiftly. Will be an empty string when retrieving from Walrus.

### Returns

A promise that resolves to a standard Blob object. Returned data is verified to match `blobID`.

### Throws

Will throw an error if the fetch or blob integrity check fails.

### Example 1

```ts
import { fetchBlob } from '@suiftly/core';

async function getAnyBlob(blobId: string) {
    try {
        const blob = await fetchBlob(blobId);
        console.log(blob);
    } catch (error) {
        console.error('Error fetching blob:', error);
    }
}

getAnyBlob('fK7v0bft1JqVbxQaM_KJAYkejbY9FgU9doqZwg7smw8');
```

### Example 2

```ts
import { fetchBlob } from '@suiftly/core';

async function setImage(blobId: string) {
    try {
        // Fetch the blob.
        // Force the type (not really needed, done here just to demo).
        const blob = await fetchBlob(blobId, { mimeType: 'image/png' });
        // Display as an HTML image element
        const url = URL.createObjectURL(blob);
        const imageContainer = document.getElementById('image-container');
        if (imageContainer) {
            const img = document.createElement('img');
            img.src = url;
            imageContainer.appendChild(img);
        }
    } catch (error) {
        console.error('Error fetching blob:', error);
    }
}

setImage('fK7v0bft1JqVbxQaM_KJAYkejbY9FgU9doqZwg7smw8');
```