Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
56 changes: 0 additions & 56 deletions kotlin-js-store/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions libraries/apollo-engine-tests/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ plugins {
apolloLibrary(
namespace = "com.apollographql.apollo.engine.tests",
withLinux = false,
withJs = true
)

kotlin {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import com.apollographql.mockserver.MockResponse
import com.apollographql.mockserver.MockServer
import com.apollographql.mockserver.awaitRequest
import com.apollographql.mockserver.enqueueString
import com.apollographql.mockserver.headerValueOf
import okio.use
import kotlin.test.assertEquals
import kotlin.test.assertFailsWith
Expand Down Expand Up @@ -68,7 +69,7 @@ suspend fun post(engine: (Long) -> HttpEngine) = MockServer().use { mockServer -
assertEquals("body", request.body.utf8())
// With ktor we get "text/plain; charset=UTF-8"
assertTrue(request.headers["Content-Type"]!!.startsWith("text/plain"))
assertEquals("body".length.toString(), request.headers["Content-Length"])
assertEquals("body".length.toString(), request.headers.headerValueOf("Content-Length"))
}

@ApolloInternal
Expand Down
1 change: 0 additions & 1 deletion libraries/apollo-runtime/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,6 @@ kotlin {

findByName("jsMain")?.apply {
dependencies {
implementation(npm("node-fetch", libs.versions.node.fetch.get()))
implementation(libs.ktor.client.js.get().toString()) {
because("We use in the ktor client in DefaultWebSocketEngine")
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ import com.apollographql.apollo.api.http.HttpMethod
import com.apollographql.apollo.api.http.HttpRequest
import com.apollographql.apollo.api.http.HttpResponse
import com.apollographql.apollo.exception.ApolloNetworkException
import com.apollographql.apollo.internal.isNode
import kotlinx.coroutines.await
import kotlinx.coroutines.suspendCancellableCoroutine
import okio.Buffer
Expand Down Expand Up @@ -35,33 +34,22 @@ private class JsHttpEngine(
) : HttpEngine {
constructor(timeoutMillis: Long) : this(timeoutMillis, timeoutMillis)

private val nodeFetch: dynamic = if (isNode) requireNodeFetch() else null

@Suppress("UnsafeCastFromDynamic")
override suspend fun execute(request: HttpRequest): HttpResponse {
val abortController = AbortController()
val connectTimeoutId = setTimeout({ abortController.abort() }, connectTimeoutMillis)

val fetchOptions = request.toFetchOptions(abortSignal = abortController.signal)
val responsePromise: Promise<Response> = if (isNode) {
nodeFetch(
resource = request.url,
options = fetchOptions
)
} else {
fetch(
resource = request.url,
options = fetchOptions
)
}
val responsePromise: Promise<Response> = fetch(
resource = request.url,
options = fetchOptions
)

return try {
val response = responsePromise.await()
clearTimeout(connectTimeoutId)
val responseBodySource = if (isNode) {
readBodyNode(response.body, readTimeoutMillis, abortController)
} else {
readBodyBrowser(response.body, readTimeoutMillis, abortController)
}
val responseBodySource = readBody(response.body, readTimeoutMillis, abortController)

HttpResponse.Builder(response.status.toInt())
.body(responseBodySource)
.apply {
Expand Down Expand Up @@ -114,28 +102,7 @@ private fun HttpRequest.toFetchOptions(abortSignal: dynamic): dynamic {
}

@Suppress("UnsafeCastFromDynamic")
private suspend fun readBodyNode(body: dynamic, readTimeoutMillis: Long, abortController: dynamic): BufferedSource {
var readTimeoutId = setTimeout({ abortController.abort() }, readTimeoutMillis)
val bufferedSource = Buffer()
return suspendCancellableCoroutine { continuation ->
body.on("data") { chunk: ArrayBuffer ->
clearTimeout(readTimeoutId)
readTimeoutId = setTimeout({ abortController.abort() }, readTimeoutMillis)
val chunkBytes = Uint8Array(chunk).asByteArray()
bufferedSource.write(chunkBytes)
}
body.on("end") {
continuation.resume(bufferedSource)
}
body.on("error") { error: Throwable ->
continuation.resumeWithException(error)
}
Unit
}
}

@Suppress("UnsafeCastFromDynamic")
private suspend fun readBodyBrowser(body: dynamic, readTimeoutMillis: Long, abortController: dynamic): BufferedSource {
private suspend fun readBody(body: dynamic, readTimeoutMillis: Long, abortController: dynamic): BufferedSource {
var readTimeoutId = setTimeout({ abortController.abort() }, readTimeoutMillis)
val bufferedSource = Buffer()
val stream: ReadableStream<Uint8Array> = body ?: return Buffer()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,10 +30,6 @@ internal fun AbortController(): dynamic {
return js("new AbortController()")
}

internal fun requireNodeFetch(): dynamic {
return js("eval('require')('node-fetch')")
}

internal external interface ReadableStream<R> {
fun getReader(): ReadableStreamDefaultReader<R>
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import com.apollographql.mockserver.MockResponse
import com.apollographql.mockserver.MockServer
import com.apollographql.mockserver.awaitRequest
import com.apollographql.mockserver.enqueueString
import com.apollographql.mockserver.headerValueOf
import com.apollographql.apollo.network.http.HttpInfo
import com.apollographql.apollo.testing.internal.runTest
import kotlin.test.Test
Expand Down Expand Up @@ -42,8 +43,8 @@ class HTTPHeadersTest {

val recordedRequest = mockServer.awaitRequest()
assertEquals("POST", recordedRequest.method)
assertNotEquals(null, recordedRequest.headers["Content-Length"])
assertNotEquals("0", recordedRequest.headers["Content-Length"])
assertNotEquals(null, recordedRequest.headers.headerValueOf("Content-Length"))
assertNotEquals("0", recordedRequest.headers.headerValueOf("Content-Length"))
}

@Test
Expand Down
Loading
Loading