Skip to content

Commit b5614d3

Browse files
committed
Merge branch 'feature/kotlin-2.0' into feature/api-validation
2 parents fbb34c7 + a85efaa commit b5614d3

File tree

5 files changed

+88
-63
lines changed
  • firebase-firestore/src/jsMain/kotlin/dev/gitlive/firebase/firestore
  • firebase-storage/src

5 files changed

+88
-63
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
@@ -149,7 +149,7 @@ public actual class DocumentChange(public val js: JsDocumentChange) {
149149
get() = js.newIndex
150150
public actual val oldIndex: Int
151151
get() = js.oldIndex
152-
public actual val type: ChangeType
152+
actual val type: ChangeType
153153
get() = ChangeType.entries.first { it.jsString == js.type }
154154
}
155155

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: 63 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -4,28 +4,30 @@
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
89

9-
public external fun getStorage(app: FirebaseApp? = definedExternally, url: String): FirebaseStorage
10+
external fun getStorage(app: FirebaseApp? = definedExternally, bucketUrl: String): FirebaseStorage
1011

1112
public external fun getStorage(app: FirebaseApp? = definedExternally): FirebaseStorage
1213

13-
public external fun ref(storage: FirebaseStorage, url: String? = definedExternally): StorageReference
14-
public external fun ref(ref: StorageReference, url: String? = definedExternally): StorageReference
14+
external fun ref(storage: FirebaseStorage, url: String? = definedExternally): StorageReference
15+
external fun ref(ref: StorageReference, path: String? = definedExternally): StorageReference
1516

1617
public external fun getDownloadURL(ref: StorageReference): Promise<String>
1718

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

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

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

24-
public external fun deleteObject(ref: StorageReference): Promise<Unit>
27+
external fun list(ref: StorageReference, options: ListOptions?): Promise<ListResult>
28+
external fun listAll(ref: StorageReference): Promise<ListResult>
2529

26-
public external fun listAll(ref: StorageReference): Promise<ListResult>
27-
28-
public external fun connectStorageEmulator(
30+
external fun connectStorageEmulator(
2931
storage: FirebaseStorage,
3032
host: String,
3133
port: Double,
@@ -46,44 +48,63 @@ public external interface StorageReference {
4648
public val storage: FirebaseStorage
4749
}
4850

49-
public open external class ListResult {
50-
public val items: Array<StorageReference>
51-
public val nextPageToken: String
52-
public val prefixes: Array<StorageReference>
51+
external interface ListOptions {
52+
val maxResults: Double?
53+
val pageToken: String?
54+
}
55+
56+
external interface ListResult {
57+
val items: Array<StorageReference>
58+
val nextPageToken: String
59+
val prefixes: Array<StorageReference>
5360
}
5461

5562
public external interface StorageError
5663

57-
public external interface UploadTaskSnapshot {
58-
public val bytesTransferred: Number
59-
public val ref: StorageReference
60-
public val state: String
61-
public val task: UploadTask
62-
public val totalBytes: Number
64+
external interface SettableMetadata {
65+
val cacheControl: String?
66+
val contentDisposition: String?
67+
val contentEncoding: String?
68+
val contentLanguage: String?
69+
val contentType: String?
70+
val customMetadata: Json?
71+
}
72+
73+
external interface UploadMetadata : SettableMetadata {
74+
val md5Hash: String?
75+
}
76+
77+
external interface FullMetadata : UploadMetadata {
78+
val bucket: String
79+
val downloadTokens: Array<String>?
80+
val fullPath: String
81+
val generation: String
82+
val metageneration: String
83+
val name: String
84+
val ref: StorageReference?
85+
val size: Double
86+
val timeCreated: String
87+
val updated: String
88+
}
89+
90+
external interface UploadResult {
91+
val metadata: FullMetadata
92+
val ref: StorageReference
6393
}
6494

65-
public external class StorageMetadata {
66-
public val bucket: String?
67-
public var cacheControl: String?
68-
public var contentDisposition: String?
69-
public var contentEncoding: String?
70-
public var contentLanguage: String?
71-
public var contentType: String?
72-
public var customMetadata: Map<String, String>?
73-
public val fullPath: String?
74-
public val generation: String?
75-
public val md5Hash: String?
76-
public val metageneration: String?
77-
public val name: String?
78-
public val size: Number?
79-
public val timeCreated: String?
80-
public val updated: String?
95+
external interface UploadTask {
96+
fun cancel(): Boolean
97+
fun on(event: String, next: (snapshot: UploadTaskSnapshot) -> Unit, error: (a: StorageError) -> Unit, complete: () -> Unit): () -> Unit
98+
fun pause(): Boolean
99+
fun resume(): Boolean
100+
fun then(onFulfilled: ((UploadTaskSnapshot) -> Unit)?, onRejected: ((StorageError) -> Unit)?): Promise<Unit>
101+
val snapshot: UploadTaskSnapshot
81102
}
82103

83-
public external class UploadTask : Promise<UploadTaskSnapshot> {
84-
public fun cancel(): Boolean
85-
public fun on(event: String, next: (snapshot: UploadTaskSnapshot) -> Unit, error: (a: StorageError) -> Unit, complete: () -> Unit): () -> Unit
86-
public fun pause(): Boolean
87-
public fun resume(): Boolean
88-
public val snapshot: UploadTaskSnapshot
104+
external interface UploadTaskSnapshot {
105+
val bytesTransferred: Double
106+
val ref: StorageReference
107+
val state: String
108+
val task: UploadTask
109+
val totalBytes: Double
89110
}

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
public actual val Firebase.storage: FirebaseStorage
1921
get() = FirebaseStorage(getStorage())
@@ -130,7 +132,7 @@ internal fun errorToException(error: dynamic) = (error?.code ?: error?.message ?
130132
}
131133
}
132134

133-
internal fun StorageMetadata.toFirebaseStorageMetadata(): FirebaseStorageMetadata {
135+
internal fun UploadMetadata.toFirebaseStorageMetadata(): FirebaseStorageMetadata {
134136
val sdkMetadata = this
135137
return storageMetadata {
136138
md5Hash = sdkMetadata.md5Hash
@@ -139,19 +141,21 @@ internal fun StorageMetadata.toFirebaseStorageMetadata(): FirebaseStorageMetadat
139141
contentEncoding = sdkMetadata.contentEncoding
140142
contentLanguage = sdkMetadata.contentLanguage
141143
contentType = sdkMetadata.contentType
142-
sdkMetadata.customMetadata?.entries?.forEach {
143-
setCustomMetadata(it.key, it.value)
144-
}
144+
customMetadata = sdkMetadata.customMetadata?.let { metadata ->
145+
val objectKeys = js("Object.keys")
146+
objectKeys(metadata).unsafeCast<Array<String>>().associateWith { key ->
147+
metadata[key]?.toString().orEmpty()
148+
}
149+
}.orEmpty().toMutableMap()
145150
}
146151
}
147152

148-
internal fun FirebaseStorageMetadata.toStorageMetadata(): StorageMetadata {
149-
val metadata = StorageMetadata()
150-
metadata.cacheControl = cacheControl
151-
metadata.contentDisposition = contentDisposition
152-
metadata.contentEncoding = contentEncoding
153-
metadata.contentLanguage = contentLanguage
154-
metadata.contentType = contentType
155-
metadata.customMetadata = customMetadata
156-
return metadata
157-
}
153+
internal fun FirebaseStorageMetadata.toStorageMetadata(): Json = json(
154+
"cacheControl" to cacheControl,
155+
"contentDisposition" to contentDisposition,
156+
"contentEncoding" to contentEncoding,
157+
"contentLanguage" to contentLanguage,
158+
"contentType" to contentType,
159+
"customMetadata" to json(*customMetadata.toList().toTypedArray()),
160+
"md5Hash" to md5Hash,
161+
)
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)