about summary refs log tree commit diff
path: root/src/lib/api/upload-blob.web.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/api/upload-blob.web.ts')
-rw-r--r--src/lib/api/upload-blob.web.ts26
1 files changed, 26 insertions, 0 deletions
diff --git a/src/lib/api/upload-blob.web.ts b/src/lib/api/upload-blob.web.ts
new file mode 100644
index 000000000..d3c52190c
--- /dev/null
+++ b/src/lib/api/upload-blob.web.ts
@@ -0,0 +1,26 @@
+import {BskyAgent, ComAtprotoRepoUploadBlob} from '@atproto/api'
+
+/**
+ * @note It is recommended, on web, to use the `file` instance of the file
+ * selector input element, rather than a `data:` URL, to avoid
+ * loading the file into memory. `File` extends `Blob` "file" instances can
+ * be passed directly to this function.
+ */
+export async function uploadBlob(
+  agent: BskyAgent,
+  input: string | Blob,
+  encoding?: string,
+): Promise<ComAtprotoRepoUploadBlob.Response> {
+  if (typeof input === 'string' && input.startsWith('data:')) {
+    const blob = await fetch(input).then(r => r.blob())
+    return agent.uploadBlob(blob, {encoding})
+  }
+
+  if (input instanceof Blob) {
+    return agent.uploadBlob(input, {
+      encoding,
+    })
+  }
+
+  throw new TypeError(`Invalid uploadBlob input: ${typeof input}`)
+}