Skip to content

Commit a85efaa

Browse files
committed
Fixed Storage for JS
1 parent 9639a5d commit a85efaa

File tree

5 files changed

+77
-52
lines changed
  • firebase-firestore/src/jsMain/kotlin/dev/gitlive/firebase/firestore
  • firebase-storage/src

5 files changed

+77
-52
lines changed

firebase-firestore/src/jsMain/kotlin/dev/gitlive/firebase/firestore/firestore.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ actual class DocumentChange(val js: JsDocumentChange) {
154154
actual val oldIndex: Int
155155
get() = js.oldIndex
156156
actual val type: ChangeType
157-
get() = ChangeType.values().first { it.jsString == js.type }
157+
get() = ChangeType.entries.first { it.jsString == js.type }
158158
}
159159

160160
actual data class NativeDocumentSnapshot(val js: JsDocumentSnapshot)

firebase-storage/src/commonTest/kotlin/dev/gitlive/firebase/storage/storage.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ class FirebaseStorageTest {
5454
}
5555

5656
@Test
57-
fun testStorageNotNull() {
57+
fun testStorageNotNull() = runTest {
5858
assertNotNull(storage)
5959
}
6060

@@ -79,7 +79,7 @@ class FirebaseStorageTest {
7979

8080
assertNotNull(metadataResult)
8181
assertNotNull(metadataResult.contentType)
82-
assertEquals(metadataResult.contentType, metadata.contentType)
82+
assertEquals(metadata.contentType, metadataResult.contentType)
8383
}
8484

8585
@Test
@@ -95,7 +95,7 @@ class FirebaseStorageTest {
9595
val metadataResult = ref.getMetadata()
9696

9797
assertNotNull(metadataResult)
98-
assertEquals(metadataResult.customMetadata["key"], metadata.customMetadata["key"])
98+
assertEquals( metadata.customMetadata["key"], metadataResult.customMetadata["key"])
9999
}
100100
}
101101

firebase-storage/src/jsMain/kotlin/dev/gitlive/firebase/storage/externals/storage.kt

Lines changed: 52 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -4,26 +4,29 @@
44
package dev.gitlive.firebase.storage.externals
55

66
import dev.gitlive.firebase.externals.FirebaseApp
7+
import kotlin.js.Json
78
import kotlin.js.Promise
9+
import kotlin.js.collections.JsMap
810

9-
external fun getStorage(app: FirebaseApp? = definedExternally, url: String): FirebaseStorage
11+
external fun getStorage(app: FirebaseApp? = definedExternally, bucketUrl: String): FirebaseStorage
1012

1113
external fun getStorage(app: FirebaseApp? = definedExternally): FirebaseStorage
1214

1315
external fun ref(storage: FirebaseStorage, url: String? = definedExternally): StorageReference
14-
external fun ref(ref: StorageReference, url: String? = definedExternally): StorageReference
16+
external fun ref(ref: StorageReference, path: String? = definedExternally): StorageReference
1517

1618
external fun getDownloadURL(ref: StorageReference): Promise<String>
1719

18-
external fun getMetadata(ref: StorageReference): Promise<StorageMetadata>
20+
external fun getMetadata(ref: StorageReference): Promise<FullMetadata>
21+
external fun updateMetadata(ref: StorageReference, metadata: SettableMetadata): Promise<FullMetadata>
1922

20-
external fun uploadBytes(ref: StorageReference, file: dynamic, metadata: StorageMetadata?): Promise<Unit>
23+
external fun uploadBytes(ref: StorageReference, file: dynamic, metadata: Json?): Promise<UploadResult>
24+
external fun uploadBytesResumable(ref: StorageReference, data: dynamic, metadata: Json?): UploadTask
2125

22-
external fun uploadBytesResumable(ref: StorageReference, data: dynamic, metadata: StorageMetadata?): UploadTask
26+
external fun deleteObject(ref: StorageReference): Promise<Unit>
2327

24-
external fun deleteObject(ref: StorageReference): Promise<Unit>;
25-
26-
external fun listAll(ref: StorageReference): Promise<ListResult>;
28+
external fun list(ref: StorageReference, options: ListOptions?): Promise<ListResult>
29+
external fun listAll(ref: StorageReference): Promise<ListResult>
2730

2831
external fun connectStorageEmulator(
2932
storage: FirebaseStorage,
@@ -46,45 +49,63 @@ external interface StorageReference {
4649
val storage: FirebaseStorage
4750
}
4851

49-
external open class ListResult {
52+
external interface ListOptions {
53+
val maxResults: Double?
54+
val pageToken: String?
55+
}
56+
57+
external interface ListResult {
5058
val items: Array<StorageReference>
5159
val nextPageToken: String
5260
val prefixes: Array<StorageReference>
5361
}
5462

5563
external interface StorageError
5664

57-
external interface UploadTaskSnapshot {
58-
val bytesTransferred: Number
59-
val ref: StorageReference
60-
val state: String
61-
val task: UploadTask
62-
val totalBytes: Number
65+
external interface SettableMetadata {
66+
val cacheControl: String?
67+
val contentDisposition: String?
68+
val contentEncoding: String?
69+
val contentLanguage: String?
70+
val contentType: String?
71+
val customMetadata: Json?
6372
}
6473

65-
external class StorageMetadata {
66-
val bucket: String?
67-
var cacheControl: String?
68-
var contentDisposition: String?
69-
var contentEncoding: String?
70-
var contentLanguage: String?
71-
var contentType: String?
72-
var customMetadata: Map<String, String>?
73-
val fullPath: String?
74-
val generation: String?
74+
external interface UploadMetadata : SettableMetadata {
7575
val md5Hash: String?
76-
val metageneration: String?
77-
val name: String?
78-
val size: Number?
79-
val timeCreated: String?
80-
val updated: String?
76+
}
8177

78+
external interface FullMetadata : UploadMetadata {
79+
val bucket: String
80+
val downloadTokens: Array<String>?
81+
val fullPath: String
82+
val generation: String
83+
val metageneration: String
84+
val name: String
85+
val ref: StorageReference?
86+
val size: Double
87+
val timeCreated: String
88+
val updated: String
8289
}
8390

84-
external class UploadTask : Promise<UploadTaskSnapshot> {
91+
external interface UploadResult {
92+
val metadata: FullMetadata
93+
val ref: StorageReference
94+
}
95+
96+
external interface UploadTask {
8597
fun cancel(): Boolean;
8698
fun on(event: String, next: (snapshot: UploadTaskSnapshot) -> Unit, error: (a: StorageError) -> Unit, complete: () -> Unit): () -> Unit
8799
fun pause(): Boolean;
88100
fun resume(): Boolean;
101+
fun then(onFulfilled: ((UploadTaskSnapshot) -> Unit)?, onRejected: ((StorageError) -> Unit)?): Promise<Unit>
89102
val snapshot: UploadTaskSnapshot
90103
}
104+
105+
external interface UploadTaskSnapshot {
106+
val bytesTransferred: Double
107+
val ref: StorageReference
108+
val state: String
109+
val task: UploadTask
110+
val totalBytes: Double
111+
}

firebase-storage/src/jsMain/kotlin/dev/gitlive/firebase/storage/storage.kt

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ import kotlinx.coroutines.channels.awaitClose
1414
import kotlinx.coroutines.flow.FlowCollector
1515
import kotlinx.coroutines.flow.callbackFlow
1616
import kotlinx.coroutines.flow.emitAll
17+
import kotlin.js.Json
18+
import kotlin.js.json
1719

1820
actual val Firebase.storage
1921
get() = FirebaseStorage(getStorage())
@@ -134,7 +136,7 @@ internal fun errorToException(error: dynamic) = (error?.code ?: error?.message ?
134136
}
135137

136138

137-
internal fun StorageMetadata.toFirebaseStorageMetadata(): FirebaseStorageMetadata {
139+
internal fun UploadMetadata.toFirebaseStorageMetadata(): FirebaseStorageMetadata {
138140
val sdkMetadata = this
139141
return storageMetadata {
140142
md5Hash = sdkMetadata.md5Hash
@@ -143,19 +145,21 @@ internal fun StorageMetadata.toFirebaseStorageMetadata(): FirebaseStorageMetadat
143145
contentEncoding = sdkMetadata.contentEncoding
144146
contentLanguage = sdkMetadata.contentLanguage
145147
contentType = sdkMetadata.contentType
146-
sdkMetadata.customMetadata?.entries?.forEach {
147-
setCustomMetadata(it.key, it.value)
148-
}
148+
customMetadata = sdkMetadata.customMetadata?.let { metadata ->
149+
val objectKeys = js("Object.keys")
150+
objectKeys(metadata).unsafeCast<Array<String>>().associateWith { key ->
151+
metadata[key]?.toString().orEmpty()
152+
}
153+
}.orEmpty().toMutableMap()
149154
}
150155
}
151156

152-
internal fun FirebaseStorageMetadata.toStorageMetadata(): StorageMetadata {
153-
val metadata = StorageMetadata()
154-
metadata.cacheControl = cacheControl
155-
metadata.contentDisposition = contentDisposition
156-
metadata.contentEncoding = contentEncoding
157-
metadata.contentLanguage = contentLanguage
158-
metadata.contentType = contentType
159-
metadata.customMetadata = customMetadata
160-
return metadata
161-
}
157+
internal fun FirebaseStorageMetadata.toStorageMetadata(): Json = json(
158+
"cacheControl" to cacheControl,
159+
"contentDisposition" to contentDisposition,
160+
"contentEncoding" to contentEncoding,
161+
"contentLanguage" to contentLanguage,
162+
"contentType" to contentType,
163+
"customMetadata" to json(*customMetadata.toList().toTypedArray()),
164+
"md5Hash" to md5Hash
165+
)
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
package dev.gitlive.firebase.storage
22

3-
actual fun createTestData(): Data {
4-
TODO("Not yet implemented")
5-
}
3+
import org.khronos.webgl.Uint8Array
4+
5+
actual fun createTestData(): Data = Data(Uint8Array("test".encodeToByteArray().toTypedArray()))

0 commit comments

Comments
 (0)