Gambaran Singkat

Berikut adalah ilustrasi sederhana terkait Custom Script. Suatu fungsi dalam custom script akan dijalankan merujuk pada jenis pemicu yang diasosiasikan. Sistem MocoBaaS memiliki script-router yang akan menentukan eksekusi script yang sesuai dengan pemicu yang masuk (baik dari HTTP ataupun Event).

graph LR A1[HTTP source] --> B((script-router)) A2[Event source] --> B B -->|webhook| C[Webhook script] B -->|function| D[Remote function script] B -->|event| E[Event consumer script] B -->|cron| F[Cron function script]

Sumber pemicu eksekusi custom script terdiri dari 4 jenis yaitu:

  • webhook
    melalui HTTP invocation. Umum digunakan untuk integrasi dengan pihak lain (3rd party).
  • function
    melalui HTTP invocation dengan standar JSON-API format sesuai Generic Swagger API. Dapat digunakan untuk komunikasi client-server dengan front-end app (mobile / web), khususnya dengan memanfaatkan Client-SDK yang disediakan.
  • event
    melalui Event yang masuk ke dalam sistem
  • cron
    melalui Scheduler Event yang masuk ke dalam sistem

Contoh Script Sesuai trigger type

Webhook & Remote function

Contoh script berikut ini adalah fungsi sebagai handler untuk sebuah http endpoint (webhook). Fungsi ini memiliki sebuah argument ctx yang berisi konteks dari request yang masuk. Pada custom script yang difungsikan sebagai HTTP webhook atau Remote fuction. fungsi yang ditulis harus mengembalikan (return) response dalam bentuk object.

module.exports = async (ctx) => {
if (ctx.data) {
return { data: ctx.data };
} else {
return { error: "data not found" };
}
};

Pengembang bisa memasukkan beberapa properties kepada object yang akan dikembalikan, berikut adalah daftar properties yang dapat digunakan :

nametyperequireddescription
dataanytruebody response dari endpoint/webhook
statusnumberfalsehttp status code
erroranyfalseerror response/message dari endpoint/webhook
headersobjectfalsecustom response headers
serializerenum ["jsonApi"]falseserializer untuk body response
maskarrayfalseopsi untuk masking data
mask[n]objectfalseobject yang berisi ketentuan masking data
mask[n].fieldstringtrueobject properties yang akan di-masking, misal: "nama", "order.jumlah"
mask[n].typestringfalse["phone","password","card","email"]
mask[n].optionsobjectfalsejika tidak diberi options, makan masking dilakukan sesuai konfigurasi default. properties dari mask options akan diterangkan lebih jelas pada tabel di bawah

Berikut adalah properties mask[n].options :

nametypedescriptiondefaultused on type
maskWithstringcharacter pengganti saat masking"*"all
unmaskedStartDigitsnumberjumlah awal character yang tidak dimasking4phone, email, card
unmaskedEndDigitsnumberjumlah akhir character yang tidak dimasking1phone, emal, card
maxMaskedCharactersnumberjumlah maksimal character yang dimasking16password
maskAtTheRatebooleanjika bernilai true, simbol @ akan dimaskingfalseemail
maxMaskedCharactersBeforeAtTheRatenumberjumlah maskimal character yang dimasking sebelum simbol @10email
maxMaskedCharactersAfterAtTheRatenumberjumlah maskimal character yang dimasking setelah simbol @10email

Berikut adalah contoh pemakaian fungsi mask saat mengembalikan data dari custom script.

//data kembalian pada custom script
return {
data,
mask: [
{ field: "test", type: "password" },
{
field: "hello.phone",
type: "phone",
options: { unmaskedEndDigits: 2 },
},
{ field: "hello.card", type: "card" },
{ field: "text" },
],
};
//isi variable `data`
data = {
name: "sdk",
test: "password",
hello: { phone: "+628990432864", card: "1234-4321-1234-4321" },
text: "testing data",
};
//variable `data` setelah di-masking
data = {
name: "sdk",
test: "********",
hello: { phone: "+628*******64", card: "1234-****-****-***1" },
text: "****************",
};

Event & Cron

Contoh script di bawah ini akan menjadi fungsi yang dieksekusi oleh event/cron, yang berfungsi untuk menampilkan data yang dikirim ke event menjadi log pada terminal server.

module.exports = async (ctx) => {
console.log(ctx.data);
};

Khusus pada mode event dan cron, pengembang tidak perlu mendeklarasikan kembalian fungsi (return) dari fungsi yang dibuat.

Configuration

Pengembang tidak perlu mengubah konfigurasi secara manual. Selalu gunakan antarmuka pada MocoBaaS Console untuk mengubah konfigurasi dengan benar. Bagian ini hanya bersifat referensi.

Script yang ditulis oleh pengembang akan akan dimuat saat aplikasi dijalankan. Sistem loader akan membaca folder /scripts yang ada pada directory backend dan memuat masing-masing isinya sesuai dengan konfigurasi yang ada di dalamnya. Sesuai pada diagram di atas, ada beberapa konfigurasi untuk custom scripts. Berikut adalah detail konfigurasi beserta penjelasan dan contohnya.

Parameter konfigurasi di bawah ini akan otomatis terisi sesuai dengan pilihan yang diatur melalui MocoBaaS Console. Berikut adalah penjelasan mengenai konfigurasi yang dimaksud.

config.json properties

nametypedescriptionrequiredspecial use
enablebooleanjika enable=true maka script akan dimuat oleh loader
triggerobjectkonfigurasi tentang jenis trigger dan metadata
trigger.typestringtype dari trigger custom script, bisa berisi [HTTP, SDK, EVENT]
trigger.methodstringHTTP method [GET, POST, PUT, PATCH, DELETE]trigger.type = HTTPwebhook
trigger.pathstringpath untuk endpoint webhooktrigger.type = HTTPwebhook
trigger.schedulestringcron pattern, harus diisi jika membuat custom scripts untuk croncron
trigger.queuestringberisi topic dari queue jika trigger.entity=table
berisi nama dari queue jika trigger.entity=custom
event
trigger.entitystringentitas dari event, bisa berisi [table, custom]event

contoh konfigurasi

Webhook

Custom script akan menjadi fungsi yang akan dieksekusi menggunakan HTTP request sesuai konfigurasi endpoint.

{
"enable": true,
"trigger": { "type": "HTTP", "method": "GET", "path": "/webhook/namascript" },
"policy": { "role": ["Administrator", "Publisher"] }
}

Remote function

Custom script akan menjadi sebuah fungsi remote yang dapat dipanggil melalui Client-SDK ataupun HTTP request.

{
"enable": true,
"trigger": { "type": "SDK" },
"policy": { "role": ["Administrator", "Publisher"] }
}

Cron

Custom script pengembang agar dijalankan secara terjadwal sesuai dengan cron pattern yang tertulis pada konfigurasi.

{
"enable": true,
"trigger": { "type": "EVENT", "schedule": "*/5 4 * * *" }
}

Event(table)

Custom script pengembang akan di-picu melalui event dari table (database). [insert, update, delete]

{
"enable": true,
"trigger": { "type": "EVENT", "queue": "book.insert", "entity": "table" } // queue=<tableName>.<eventType>
}

Event(custom)

Custom script yang ditulis akan menjadi fungsi bekerja sebagai queue consumer. Fungsi ini akan diproses jika terdapat pesan (message) dari queue yang telah didefinisikan.

{
"enable": true,
"trigger": { "type": "EVENT", "queue": "queue", "entity": "custom" }
}

Event(MQTT)

Custom script pengembang akan dijalankan ketika terdapat "message" yang di picu oleh mqtt publish sesuai dengan topic yang diasosiasikan.

{
"enable": true,
"trigger": { "type": "EVENT", "topic": "topic/mqtt", "entity": "mqtt" }
}