Stefan Oltmann
09/01/2025, 8:34 AMjs()
interop, too.
I like this to be Kotlin/WASM, but the sample (a fork from the original hello world) I found was outdated and didn't work for me.
So I appeciate if you drop me hints how to improve or helpful ressources (like sample code) how to properly work with Kotlin/JS (or even better Kotlin/WASM) on Cloudflare Workers. 🙂turansky
09/01/2025, 12:29 PMjs
calls can be replaced with help of Kotlin Wrappers declarationsturansky
09/01/2025, 12:30 PMReflect.deleteProperty
- for property removingturansky
09/01/2025, 12:31 PMglobalThis as EventTarget
for addEventListener
turansky
09/01/2025, 12:40 PMturansky
09/01/2025, 12:42 PMmain
function as event?Stefan Oltmann
09/01/2025, 12:44 PMturansky
09/01/2025, 1:11 PMStefan Oltmann
09/01/2025, 1:23 PMturansky
09/01/2025, 1:24 PMStefan Oltmann
09/01/2025, 1:26 PMStefan Oltmann
09/01/2025, 1:29 PMturansky
09/01/2025, 1:29 PMStefan Oltmann
09/01/2025, 1:29 PMturansky
09/01/2025, 1:29 PMStefan Oltmann
09/01/2025, 1:31 PMStefan Oltmann
09/01/2025, 1:33 PMStefan Oltmann
09/01/2025, 1:35 PMStefan Oltmann
09/02/2025, 6:51 AMturansky
09/03/2025, 9:13 PMCoroutineScope
factories with cancellation support 😉turansky
09/03/2025, 9:18 PMRequest
implements AbortableLike
in your caseStefan Oltmann
09/03/2025, 9:38 PMStefan Oltmann
09/03/2025, 9:39 PMStefan Oltmann
09/03/2025, 9:40 PMStefan Oltmann
09/03/2025, 9:41 PMStefan Oltmann
09/03/2025, 9:41 PMStefan Oltmann
09/03/2025, 9:42 PMStefan Oltmann
09/03/2025, 9:44 PMturansky
09/03/2025, 10:10 PMI guess I need to replace cryptography-Kotlin with your JWT sample code to see how that works out“Native” calls should be faster 😉
turansky
09/03/2025, 10:13 PMes2015
target?turansky
09/03/2025, 10:15 PMStefan Oltmann
09/04/2025, 6:21 AMDo you useNot in the published code, but I added it in a dev version. Doesn't change execution times much.target?es2015
Stefan Oltmann
09/04/2025, 6:24 AMDo you use Kotlin distribution task output in worker?'I use the output of
compileProductionExecutableKotlinJs
I wondered how I can use the output of webpack, but my results didn't work on the Cloudflare worker.
I guess treeshaking removes necessary stuff.
https://github.com/StefanOltmann/cloudflare-steam-name-update-service/blob/b1a9f3d0befbe387565badcf1be06af81acc52f1/wrangler.toml#L8turansky
09/04/2025, 11:18 AMI use the output ofIt goes without optimization/minification :(compileProductionExecutableKotlinJs
Stefan Oltmann
09/04/2025, 11:18 AMStefan Oltmann
09/04/2025, 6:41 PMturansky
09/04/2025, 6:44 PMturansky
09/04/2025, 6:45 PMStefan Oltmann
09/04/2025, 6:45 PMStefan Oltmann
09/04/2025, 6:45 PMStefan Oltmann
09/04/2025, 6:45 PMturansky
09/04/2025, 6:46 PM@JsExport
- right?Stefan Oltmann
09/04/2025, 6:46 PMStefan Oltmann
09/04/2025, 6:46 PMStefan Oltmann
09/04/2025, 6:55 PMStefan Oltmann
09/04/2025, 6:56 PMStefan Oltmann
09/04/2025, 6:58 PMturansky
09/04/2025, 6:58 PMStefan Oltmann
09/04/2025, 7:00 PMStefan Oltmann
09/04/2025, 7:01 PMturansky
09/04/2025, 7:08 PMjsBrowserProductionDistribution
?Stefan Oltmann
09/04/2025, 7:08 PMTask 'jsBrowserProductionDistribution' not found in root project 'worker'.
turansky
09/04/2025, 7:08 PMbuild
includes itStefan Oltmann
09/04/2025, 7:09 PMturansky
09/04/2025, 7:10 PMnodejs
you won't have distribution tasks 😞Stefan Oltmann
09/04/2025, 7:11 PMStefan Oltmann
09/04/2025, 7:13 PMturansky
09/04/2025, 7:14 PMbrowser()
will add distribution tasksStefan Oltmann
09/04/2025, 7:14 PMturansky
09/04/2025, 7:16 PMwhole-program
turansky
09/04/2025, 7:16 PMStefan Oltmann
09/04/2025, 7:17 PMturansky
09/04/2025, 7:18 PMStefan Oltmann
09/04/2025, 7:22 PMturansky
09/04/2025, 7:23 PMglobalThis
override requiredStefan Oltmann
09/04/2025, 7:23 PMStefan Oltmann
09/04/2025, 7:25 PMturansky
09/04/2025, 7:26 PMturansky
09/04/2025, 7:26 PMnodejs()
call and build distribution with ncc
turansky
09/04/2025, 7:28 PMvite
bundlerStefan Oltmann
09/04/2025, 7:29 PMStefan Oltmann
09/04/2025, 7:30 PMturansky
09/04/2025, 7:32 PMncc
configuration should be easierStefan Oltmann
09/04/2025, 7:34 PMStefan Oltmann
09/04/2025, 7:42 PMfun utf8Decode(uint8arr: Uint8Array<*>): String {
return TODO()
}
fun base64urlToUint8Array(base64url: String): Uint8Array<ArrayBuffer> {
return TODO()
}
fun base64ToUint8Array(base64: String): Uint8Array<ArrayBuffer> {
return TODO()
}
Stefan Oltmann
09/04/2025, 7:43 PMfun utf8Decode(uint8arr: Uint8Array<*>): String =
uint8arr.toByteArray().decodeToString()
fun base64urlToUint8Array(base64url: String): Uint8Array<ArrayBuffer> =
Base64.UrlSafe.decode(base64url).toUint8Array()
fun base64ToUint8Array(base64: String): Uint8Array<ArrayBuffer> =
Base64.decode(base64).toUint8Array()
turansky
09/04/2025, 7:49 PMBuffer.from(str)
should be fasterStefan Oltmann
09/04/2025, 7:51 PMprivate fun base64ToUint8Array(base64: String): Uint8Array<ArrayBuffer> =
Buffer.from(base64).toUint8Array()
?Stefan Oltmann
09/04/2025, 7:56 PMturansky
09/04/2025, 7:58 PMturansky
09/04/2025, 7:59 PMStefan Oltmann
09/04/2025, 7:59 PMStefan Oltmann
09/04/2025, 8:13 PMStefan Oltmann
09/04/2025, 8:23 PMprivate fun base64urlToUint8Array(base64url: String): Uint8Array<ArrayBuffer> =
Buffer.from(base64url, BufferEncoding.base64url)
private fun base64ToUint8Array(base64: String): Uint8Array<ArrayBuffer> =
Buffer.from(base64, BufferEncoding.base64)
And you need to import org.jetbrains.kotlin-wrappers:kotlin-node:2025.9.2-24.3.0
Stefan Oltmann
09/04/2025, 8:25 PMturansky
09/04/2025, 10:57 PMBuffer
in listturansky
09/04/2025, 10:58 PMStefan Oltmann
09/04/2025, 11:16 PMturansky
09/04/2025, 11:52 PMBuffer
:
TextEncoder().encode(atob(base64_string))
turansky
09/04/2025, 11:52 PMturansky
09/04/2025, 11:53 PMTextDecoder
- in opposite directionStefan Oltmann
09/05/2025, 6:28 PMfunction base64ToUint8Array(base64: string): Uint8Array {
const binaryString = atob(base64);
const length = binaryString.length;
const bytes = new Uint8Array(length);
for (let index = 0; index < length; index++)
bytes[index] = binaryString.charCodeAt(index);
return bytes;
}
turansky
09/05/2025, 6:29 PMIt fails on the worker.With some error?
Stefan Oltmann
09/05/2025, 6:30 PMStefan Oltmann
09/05/2025, 6:30 PMprivate fun utf8Decode(uint8arr: Uint8Array<*>): String =
textDecoder.decode(uint8arr)
private fun base64urlToUint8Array(base64url: String): Uint8Array<ArrayBuffer> =
textEncoder.encode(atob(base64url.replace('-', '+').replace('_', '/'))).toUint8Array()
private fun base64ToUint8Array(base64: String): Uint8Array<ArrayBuffer> =
textEncoder.encode(atob(base64))
Stefan Oltmann
09/05/2025, 6:32 PMStefan Oltmann
09/05/2025, 7:00 PMturansky
09/05/2025, 10:03 PMweb.encoding.TextEncoder
?
According calls looks like other type.Stefan Oltmann
09/05/2025, 10:19 PM