I’m an Android developer (since 2010)
I use Kotlin (since 2015) instead of Java
About me
I’m an Android developer (since 2010)
I use Kotlin (since 2015) instead of Java
I use a lot of Firebase services
About me
Target: cost-free backend!
Free hosting options:
● PHP (a lot of free hosting, since 2000)
○ Altervista, Netsons, …
● Solution PaaS (Platform as a Service)
○ Google App Engine
■ Support for: Node.js, Java, Ruby, C#, Go, Python e PHP, …
■ 28 hours instance a day
○ Amazon Web Services (Free tear only for the first 12 months)
● Solution “serverless”
2.000.000
calls/month?
What if:
I call a function
every second
1 day = 86.400 seconds
~ 12 days = 1.000.000 seconds
~ 23 days = 2.000.000 seconds
30 days = 2.592.000 seconds
New Project in Kotlin/JS
● Download: IntelliJ IDEA Community Edition (Free)
○ https://www.jetbrains.com/idea/download
● New Project: Gradle > Kotlin (JavaScript)
New Project in Kotlin/JS
● Download: IntelliJ IDEA Community Edition (Free)
○ https://www.jetbrains.com/idea/download
● New Project: Gradle > Kotlin (JavaScript)
● GroupId: “com.example” & ArtifactId: “myservice”
● Confirm default settings until “Finish”
Configure: Cloud Functions for Firebase
● Create new project on Firebase (optional)
○ Use console: https://console.firebase.google.com
Configure: Cloud Functions for Firebase
● Create new project on Firebase (optional)
○ Use console: https://console.firebase.google.com
● Open Functions section > click “Start”
Configure: Cloud Functions for Firebase
● Create new project on Firebase (optional)
○ Use console: https://console.firebase.google.com
● Open Functions section > click “Start”
● Install Node.js: https://nodejs.org
○ Command line: “npm install -g firebase-tools” and “npm install kotlin”
○ Open Terminal in project folder and run “firebase init” (and follow instructions)
Kotlin for JavaScript
JavaScript is a dynamically-typed language, which means it does not check
types at compile-time.
You can freely talk to JavaScript from Kotlin via dynamic types, but if you want
the full power of Kotlin type system, you can create Kotlin headers for JavaScript
libraries.
Kotlin: useful keywords for JavaScript
Keywords:
● external - Modifier to tell Kotlin that a certain declaration is written in pure
JavaScript. Compiler assumes that the implementation for the corresponding
class, function or property is provided by the developer.
● dynamic - The dynamic type basically turns off Kotlin's type checker. The
most peculiar feature of dynamic is that we are allowed to call any property
or function with any parameters on a dynamic variable.
Kotlin: useful functions for JavaScript
Extensions:
● .asDynamic() - Reinterprets this value as a value of the dynamic type.
● .unsafeCast<T>() - Reinterprets this “dynamic” value as a value of the
specified type [T] (ex: String / Array) without any actual type checking.
Methods:
● js(code) - Puts the given piece of a JavaScript code right into the calling
function. The compiler replaces call to `js(...)` code with the string constant
provided as a parameter.
Example: Utils.kt
fun toJson(obj: dynamic) = JSON.stringify(obj) { key, value -> value ?: undefined }
// Arrays / Map utils
fun jsMap(init: (dynamic) -> Unit) = Any().apply { init(asDynamic()) }.asDynamic()
fun keys(obj: dynamic) = js("Object").keys(obj).unsafeCast<Array<String>>()
// JavaScript functions
fun getDateOfWeek(week: Int, year: Int) = js("""
var simple = new Date(year, 0, 1 + (week - 1) * 7);
var dow = simple.getDay();
var iso = simple;
if (dow <= 4) iso.setDate(simple.getDate() - simple.getDay() + 1);
else iso.setDate(simple.getDate() + 8 - simple.getDay());
return iso;""").unsafeCast<Date>()
GET on /helloWorld
external fun require(module: String): dynamic
external val exports: dynamic
fun main(args: Array<String>) {
val fireFunctions = require("firebase-functions")
val config = fireFunctions.config()
exports.helloWorld = fireFunctions.https.onRequest { request, response ->
console.log("Request headers: " + toJson(request.headers))
console.log("Request body: " + toJson(request.body))
response.send("Hello from Firebase!")
}
}
Deploy
Before deploy update Node.js dependencies, from command line use:
● npm update
● npm install
Build index.js file from gradle and deploy on Firebase!
● ./gradlew build
● firebase deploy
Demo: https://goo.gl/tkdvfk
Full source: https://github.com/jacklt/firebase-cloud-functions-with-kotlin-js