I’m currently trying out kotlin multiplatform with jvm and js targets. The idea was to create a module structure like this:
- a-client: Multiplatform module containing model code and methods needed to call backend Api A
- b-client: Multiplatform module containing model code and methods needed to call backend Api B
- common-client: Multiplatform module containing code that is shared by a-client and b-client (for example creation of the ktor-HttpClient)
- frontend: react (typescript) module using a-client/b-client/common-client
Here is a full example of this: GitHub - Fabian-G/shared-mpp
Like I said I am using ktor-client to make the HttpRequests in a-client and b-client. The client itself is created in common-client and then injected via constructor parameter to a-client/b-client.
I do it like that, because I would prefer if I could manage the HttpClient in the frontend module so that I could hand the very same HttpClient to a-client and b-client if I wanted to.
This does not work though. As soon as either a-client or b-client tries to use it I get this error at runtime:
Uncaught (in promise) TypeError: this.__this__10._client.execute_ixyi6b_k$ is not a function
doResume_0_k$ HttpStatement.kt:104
executeUnsafe_0_k$ HttpStatement.kt:101
doResume_0_k$ TodosApi.kt:17
findById_ha5a7z_k$ TodosApi.kt:13
doResume_0_k$ JsTodosApi.kt:18
invoke_mzru1z_k$ JsTodosApi.kt:17
l bundle.js:38410
doResume_2_0_k$ IntrinsicsJs.kt:163
doResume_0_k$ bundle.js:11608
resumeWith_jccoe6_k$ Standard.kt:55
resumeWith_bnunh2_k$ bundle.js:11512
resumeCancellableWith DispatchedContinuation.kt:283
startCoroutineCancellable Cancellable.kt:30
startCoroutineImpl Builders.common.kt:192
start_hfyz87_k$ Builders.kt:28
async Builders.common.kt:91
promise Promise.kt:30
promise$default Promise.kt:25
findById JsTodosApi.kt:19
loadTodo App.tsx:27
React 14
unstable_runWithPriority scheduler.development.js:468
React 4
HttpStatement.kt:104
In the linked repo there is also another branch where I instead added the dependencies a-client -> common-client
and b-client -> common-client
and then create two HttpClients by using the factoryMethods of the common-client bundled with a-client (respectively b-client), which works fine, but also doesn’t allow me to share the same HttpClient with a-client and b-client.
Is this possible at all? If so, can you give me some pointers here?