Semantik eksekusi, batasan, dan keamanan
Halaman ini merangkum bagaimana Script berperilaku saat runtime (urutan, transaksi, error, penguncian), batasan statis apa yang dikenakan saat disimpan, dan model keamanannya. Untuk sintaksis, lihat Katalog Statement dan Ekspresi nilai; untuk kombinasi praktis, lihat Cookbook.
Urutan eksekusi
statementsdieksekusi secara berurutan dari atas ke bawah. Ketika mencapaiReturn, eksekusi berhenti di titik tersebut.- Eksekusi berlangsung secara inline, pada jalur yang menangani permintaan panggilan. Respons panggilan itu sendiri adalah hasil eksekusi (untuk bentuk responsnya, lihat Permintaan dan respons di Ikhtisar Script), dan waktu yang diberikan untuk satu eksekusi dibahas di Anggaran waktu di bawah.
Semantik eksekusi
Guard (prakondisi)
Tidak ada Statement guard khusus. Anda menyatakannya dengan If dan then:[Return]. Ketika kondisi dilanggar, ia mengembalikan hasil dan tidak menjalankan Statement selanjutnya (tentu saja Script tanpa guard juga dimungkinkan).
{ "type": "If", "condition": { "<": [ "{ /wallet/fields/balance/en-US }", "{ /payload/fields/cost }" ] },
"then": [ { "type": "Return", "value": { "ok": false, "reason": "insufficient credit" }, "statusCode": 402 } ] }Tanpa transaksi dan kompensasi best-effort
Script bukanlah transaksi. Saat gagal, engine mencoba mengompensasi (compensation) pekerjaan yang telah dilakukan sejauh ini dan mengembalikan penyebab error, tetapi dengan keterbatasan berikut (diterima sebagai konsekuensi desain).
- Membatalkan penghapusan membuat
sys.idbaru, sehingga referensi yang tadinya menunjuk ke sana menjadi rusak. - Efek eksternal (
Http) bersifat ireversibel (panggilan yang sudah keluar beserta biayanya tidak dapat dibatalkan). - Kompensasi bisa sama sekali tidak berjalan, sehingga keadaan yang belum terkompensasi dapat tertinggal.
Jika Anda membutuhkan atomisitas sejati, tulis sendiri kompensasi di dalam Script tersebut, atau tempatkan operasi yang tidak dapat dibatalkan (misalnya panggilan eksternal) di paling akhir. Urutan yang paling berbahaya adalah yang "berhasil dirantai tetapi tidak dapat di-rollback, namun tampak aman."
Penguncian optimis
Persaingan update/patch dipersempit dengan version pada ResourceUpdate dan ResourcePatch. Jika Anda memberikan version (ekspresi nilai, Int), pembaruan dilakukan hanya jika cocok dengan sys.version target saat ini; ketidakcocokan di-abort karena error konflik versi (dapat ditangani secara lokal dengan Try/catch). Jika dihilangkan, berlaku last-write-wins tanpa pemeriksaan. Biasanya Anda membaca terlebih dahulu dengan ResourceRead atau ResourceFind lalu meneruskan sys.version tersebut (lihat CAS penguncian optimis di Cookbook).
Penulisan berbasis origin
Penulisan selalu tercermin di origin (draft), dan apakah diekspos ke delivery (CDA/ACDA) dikendalikan oleh publish (publish pada ResourceCreate/ResourceUpdate/ResourcePatch, atau ResourcePublish/ResourceUnpublish).
Apa yang dianggap sebagai kegagalan
Jika satu Statement gagal di tengah eksekusi, eksekusi berhenti di titik itu, kecuali ada Try yang menangani kegagalan tersebut. Pada saat itu engine mencoba membatalkan pekerjaan yang telah dilakukan sampai saat itu. Pembatalan ini memiliki keterbatasan, dan detailnya dibahas di Tanpa transaksi dan kompensasi best-effort.
Jika Statement yang gagal berada di dalam Try, kegagalan itu dapat ditangani di catch. Di dalam catch, Anda merujuk isi kegagalan ({ message }) melalui /error. Statement mana yang gagal tidak disertakan di dalamnya.
Kasus-kasus berikut diperlakukan sebagai kegagalan.
- Operasi resource gagal (target tidak ada, versi tidak cocok, operasi tidak didukung, dan sebagainya)
Httpgagal (lihat Dua cara Http gagal)- Transformasi file Media gagal (lihat Kasus ketika transformasi file gagal)
- Batas atas runtime yang ditetapkan untuk setiap Statement terlampaui (misalnya, Batas atas panjang nilai)
Return bukanlah kegagalan. Return mengakhiri eksekusi lebih awal secara normal, sehingga tidak berpindah ke catch.
Dua cara Http gagal
Kegagalan Http terbagi menjadi dua jenis, tergantung apakah kegagalan itu ditangani sebagai respons status. Perbedaan ini menentukan apakah retry dan ignoreStatusCode berlaku.
| Kategori | Ditangani sebagai respons status | Langsung gagal |
|---|---|---|
| Kasus yang termasuk | API tujuan merespons dengan status 400 atau lebih, waktu habis (status 504), tidak dapat terhubung ke API tujuan atau tidak dapat membaca responsnya (status 502), body respons melebihi 10MiB (status 502) | responseType bernilai "Json" tetapi body respons sukses bukan JSON, file yang akan dikirim melampaui batas unduhan, URL file merespons dengan status selain 2xx atau URL file tidak dapat dihubungi, format nilai part tidak valid |
retry | Dicoba ulang sebanyak jumlah yang ditentukan | Tidak dicoba ulang |
ignoreStatusCode: true | Tidak dianggap gagal, dan { status, body } di-bind sebagai hasil | Tidak berlaku dan diperlakukan sebagai kegagalan |
Try/catch | Dapat ditangani di catch | Dapat ditangani di catch |
Kondisi kegagalan selama proses pengiriman file dibahas secara rinci di Mengirim file sebagai body.
Agregasi sisi server hanya untuk jumlah
Jumlahnya dihitung di sisi server oleh ResourceCount. Karena ia tidak membaca itemnya, ia tidak terikat pada batas atas jumlah item yang diproses.
Untuk sum dan group-by tidak ada operasi server khusus. Agregasi semacam itu harus Anda hitung sendiri dengan menelusuri ResourceForEach lalu menggunakan SetVar dan JsonLogic, sehingga terikat pada batas atas jumlah item yang diproses (tidak cocok untuk mengagregasi jutaan record). Jika Anda hanya membutuhkan jumlahnya, gunakan ResourceCount alih-alih menelusuri.
Tanpa penungguan atau penundaan
Script tidak memiliki Statement Delay. Script dieksekusi sekali lalu selesai, dan tidak menunggu atau melakukan polling secara internal hingga job eksternal selesai.
Batasan statis (divalidasi saat disimpan)
Berikut ini diperiksa pada saat Script disimpan (pembuatan/perubahan). Jika dilanggar, penyimpanan ditolak (gagal saat penyusunan, bukan saat runtime). Pelanggaran mana yang ditolak dengan kode mana dibahas di Error.
| Batasan | Nilai |
|---|---|
Panggilan eksternal maksimum per definisi (Http, EmailSend) | Per paket (lihat Paket Harga) |
Total item yang diproses ResourceForEach maksimum (jika limit yang dideklarasikan tidak ada, menelusuri hingga nilai ini; gagal jika tercapai sementara masih ada kecocokan) | 10.000 |
SetVar maksimum per definisi (termasuk yang bersarang) | 10 |
Cache maksimum per definisi (termasuk yang bersarang, dijumlahkan tanpa memandang operasinya) | 5. Jika melebihi, penyimpanan ditolak |
Cache di dalam blok Loop, ResourceForEach | Penyimpanan ditolak |
Cache.key | Hanya literal, maksimal 128 karakter. Jika berupa ekspresi nilai, penyimpanan ditolak |
Cache.ttl | Antara 1 dan 30 detik; jika dihilangkan, 5 detik. Jika di luar rentang itu, penyimpanan ditolak |
| Total Statement maksimum per definisi (termasuk yang bersarang) | Per paket (lihat Paket Harga) |
Batas atas Http.retry | 2 |
Field body permintaan pada satu Http (body, urlBody, multipartBody) | Hanya salah satu dari ketiganya. Jika menulis dua atau lebih, penyimpanan ditolak |
Jumlah part pada Http.multipartBody | 1 atau lebih. Jika kosong, penyimpanan ditolak |
value, url pada part multipartBody | Tepat salah satu. Jika keduanya ditulis atau keduanya kosong, penyimpanan ditolak |
fileName pada part multipartBody | Hanya pada part yang memiliki url. Jika ditulis tanpa url, penyimpanan ditolak |
Panjang Regex.pattern | 128 karakter |
secrets maksimum per definisi | 20 |
key pada secrets | 1~64 karakter, hanya huruf Latin, angka, _, dan -. Jika ada dua key yang sama, penyimpanan ditolak |
value pada secrets | 1~4.096 karakter. Jika di luar rentang itu, penyimpanan ditolak |
Referensi { /secrets… } | Tepat berbentuk /secrets/<key yang dideklarasikan>. Jika tidak, penyimpanan ditolak |
| Statement yang membuat atau menghapus ServiceUser | Penyimpanan ditolak. Hanya tiga Statement pembacaan serta ResourceUpdate dan ResourcePatch yang menerima resource ini |
Jika anonymousCallEnabled bernilai true, createdBy: ":self" pada where | Penyimpanan ditolak |
transformations pada instruksi ingest Media (Transformasi file) | Hanya array. type elemen harus PdfWatermark, dan color harus #RRGGBB. text harus berupa satu baris yang seluruh string tertulisnya (termasuk path { /pointer }) terdiri dari karakter yang dapat dipakai. Jika dilanggar, penyimpanan ditolak |
Panjang text literal pada PdfWatermark | 1~64 karakter. Jika di luar rentang itu, penyimpanan ditolak. text yang memuat { /pointer } tidak diperiksa saat penyimpanan, melainkan diperiksa dengan nilai hasil resolve saat eksekusi |
Batas tetap pada tabel di atas adalah nilai yang ditetapkan platform, sehingga sama tanpa memandang paket. Sebaliknya, jumlah total Statement dan jumlah panggilan eksternal per definisi adalah batas per paket. Karena keduanya bukan error validasi melainkan batas paket, jika terlampaui, penyimpanan/pengubahan ditolak karena melampaui batas paket (definisi yang sama diperbolehkan pada paket yang lebih tinggi) dan dibuka dengan peningkatan paket. Angka per paket ada di Paket Harga.
Berbeda dengan panggilan eksternal seperti
Http,EmailSend, penyerapan file Media tidak dihitung terhadap batas panggilan eksternal per definisi.
ResourceForEachadalah Statement komposit yang memiliki anak, sehingga Statement itu sendiri tidak dihitung ke jumlah panggilan eksternal. Statement panggilan eksternal (Http,EmailSend) di dalamonEach-lah yang dihitung (secara statis dihitung sebagai 1, tetapi benar-benar dijalankan untuk tiap item selama penelusuran).onEachdapat memuat panggilan eksternal atau penyerapan file Media, dan hal ini juga berlaku untuk bodyLoop. Berapa kali perulangan itu benar-benar berputar tidak masuk ke hitungan ini, melainkan masuk sebagai perkalian pada Anggaran waktu di bawah.
Batas atas panjang nilai (runtime)
Statement tanda tangan dan pemrosesan teks, serta Cache, memiliki batas atas untuk ukuran nilai yang ditanganinya. Yang dibatasi bukan panjang ekspresinya, melainkan panjang nilai hasil resolve dari ekspresi itu (enam belas karakter { /rawPayload } menunjuk ke puluhan KB), sehingga pemeriksaannya terjadi selama eksekusi, bukan saat penyimpanan.
- Keempatnya sama seperti kegagalan runtime lainnya sehingga dapat ditangani secara lokal dengan
Try/catch. - Batas atas
Signaturedisesuaikan dengan ukuran body yang benar-benar dikirim penyedia (peristiwa pembayaran berukuran beberapa KB, dan webhook pesanan mencapai puluhan KB).Hashmenempati posisi yang menyambung beberapa field saja, sehingga jauh lebih sempit. - Angka 128 karakter untuk
Regex.patternadalah pemeriksaan saat penyimpanan pada Batasan statis di atas. Panjang itu bukan perangkat untuk mencegah ledakan komputasi ((a+)+$sudah berbahaya hanya dengan enam karakter). Yang mencegah ledakan adalah aturan yang mengharuskan pattern ditulis sebagai literal serta anggaran waktu di bawah; yang dijanjikan panjang itu hanyalah ukuran yang masih dapat dibaca dan ditinjau manusia.
Anggaran waktu (runtime)
Waktu yang diizinkan untuk satu eksekusi paling lama 180 detik. Waktu yang benar-benar diizinkan ditentukan oleh definisi Script (dan juga oleh paket jika mengirim file), yaitu dasar 30 detik ditambah waktu yang dapat dipakai oleh panggilan eksternal.
Anggaran ini berlaku untuk eksekusi secara keseluruhan. Terpisah dari itu, satu permintaan Http harus selesai dalam timeoutMs milik permintaan tersebut.
Dasar 30 detik
Semua pekerjaan yang bukan panggilan eksternal, seperti membaca dan menulis resource atau menerima dan memproses file Media, diproses di dalam 30 detik ini. Script tanpa panggilan eksternal diberi 30 detik.
Waktu yang ditambahkan per Statement
Waktu Statement yang diletakkan berurutan dijumlahkan seluruhnya.
| Statement | Waktu yang ditambahkan |
|---|---|
Http | timeoutMs (30 detik jika tidak ditentukan). Jika mengirim file, waktu unduhan (tabel di bawah) ditambahkan untuk setiap file, dan jika retry ditentukan, totalnya dikalikan dengan jumlah percobaan (1 + retry) |
EmailSend | timeoutMs (10 detik jika tidak ditentukan). Karena tidak dicoba ulang, waktunya ditambahkan satu kali saja |
If | Waktu yang lebih panjang di antara then dan else |
Parallel | Waktu yang paling panjang di antara branches |
Try | Jumlah seluruh waktu body, catch, dan finally |
Loop | Waktu body dikalikan maxIterations (10.000 jika tidak ditentukan) |
ResourceForEach | Waktu onEach dikalikan limit (10.000 jika tidak ditentukan) |
| Statement lainnya (yang tidak memuat Statement lain) | Tidak ditambahkan. Diproses di dalam dasar 30 detik |
Jika tidak ada panggilan eksternal di dalam perulangan, waktu yang ditambahkan tetap 0 meskipun dikalikan dengan jumlah iterasi. Karena itu, perulangan semacam itu harus selesai di dalam dasar 30 detik.
Waktu unduhan per file
| Paket | Waktu unduhan |
|---|---|
| Free | Sekitar 5,2 detik |
| Basic | Sekitar 10,5 detik |
| Pro | Sekitar 10,5 detik |
| Enterprise | Sekitar 107,4 detik |
Nilai ini adalah waktu yang dibutuhkan untuk menerima data sebesar batas unduhan paket dengan kecepatan 10.000.000 byte per detik.
Contoh perhitungan
Script yang memanggil satu Http (timeoutMs 30 detik, retry 1) yang mengirim dua foto pada paket Pro dihitung sebagai berikut.
Http: (30 detik + 10,5 detik × 2) × 2 = sekitar 102 detik- Seluruh eksekusi: 30 detik + 102 detik = sekitar 132 detik
132 detik lebih pendek daripada 180 detik, sehingga Script ini diberi 132 detik.
Jika melebihi 180 detik
Meskipun nilai hasil perhitungan melebihi 180 detik, Script tetap tersimpan dan dijalankan. Namun, eksekusi dihentikan begitu mencapai 180 detik.
Batas jumlah per paket
Untuk Script, jumlah per Organization dibatasi oleh paket.
| Paket | Jumlah Script |
|---|---|
| Free | 10 |
| Basic | 30 |
| Pro | 100 |
| Enterprise | Tak terbatas |
Terpisah dari itu, jumlah Statement dan jumlah panggilan eksternal (Http, EmailSend) yang dapat dimuat oleh satu definisi Script juga dibatasi oleh paket. Saat menyimpan/mengubah definisi, jika melampaui batas paket tersebut, permintaan ditolak; untuk angka konkretnya, lihat Paket Harga.
Ketika batas tercapai, pembuatan Script baru ditolak.
Ukuran unduhan file Http
Ketika Http mengambil file yang akan dikirim sebagai body permintaan dari URL (urlBody, part url pada multipartBody), ukuran yang dapat diterima per URL file dibatasi oleh paket. Yang berlaku adalah paket dari Organization tempat Space pemilik Script tersebut berada.
| Paket | Ukuran maksimum per URL file |
|---|---|
| Free | 50MiB |
| Basic | 100MiB |
| Pro | 100MiB |
| Enterprise | 1GiB |
- Batas ini berlaku terpisah untuk setiap URL. Jika ada beberapa part
url, setiap file harus berada dalam batas ini. - Jika Anda mencoba mengirim file yang melampaui batas,
Httptersebut gagal (lihat Dua cara Http gagal). - Batas ini juga menjadi dasar waktu unduhan yang ditambahkan ke Anggaran waktu.
Model keamanan
secrets
Nilai rahasia seperti kunci API eksternal, kunci rahasia penyedia pembayaran (PG), kunci tanda tangan webhook, atau nilai autentikasi Basic … yang sudah dihitung sebelumnya tidak ditulis apa adanya di Statement. Deklarasikan nilai itu di secrets pada definisi, lalu baca di Statement dengan { /secrets/<key> }. Kunci uji yang dipublikasikan juga diletakkan di tempat yang sama. Dengan begitu, saat beralih ke kunci sungguhan, Statement tidak perlu diubah dan Anda cukup mengganti nilai di secrets.
"secrets": [
{ "key": "LLM_API_KEY", "value": "sk-...", "description": "Kunci API untuk memanggil LLM" },
{ "key": "WEBHOOK_SIGNING_SECRET", "value": "whsec_...", "description": "" }
],
"statements": [
{ "type": "Http", "method": "POST", "url": "https://api.openai.com/v1/chat/completions",
"headers": [ { "key": "Authorization", "value": "Bearer { /secrets/LLM_API_KEY }" } ],
"body": { /* ... */ }, "name": "llm" }
]| Field | Wajib | Aturan |
|---|---|---|
key | Wajib | 1~64 karakter dan hanya memakai huruf Latin, angka, _, dan -. Harus unik dalam satu Script. |
value | Wajib | String sepanjang 1~4.096 karakter. Karena merupakan nilai statis yang tidak ditafsirkan sebagai template, { /… } yang dimasukkan di dalamnya pun dipakai persis sebagai teks. |
description | Wajib | Keterangan kegunaan sepanjang 0~128 karakter. String kosong "" juga diperbolehkan. |
- Penyimpanan:
valuedienkripsi dan disimpan dengan aman oleh WEEGLOO. Statement membaca nilai aslinya dengan{ /secrets/<key> }. - Pembacaan: dalam respons API yang mengembalikan Script (pembacaan, pembuatan, perubahan),
valuedikembalikan sebagai nilai aslinya. Role yang dapat membaca Script itu dapat melihat nilainya, jadi persempit izin bacanya. Anggota (ServiceUser) tidak dapat membaca definisi Script (pembacaan dan penyusunannya khusus CMA, dan ACMA tidak memiliki Script API). - Perubahan: perubahan penuh (PUT) mengganti seluruh definisi. Jika Anda mengirimnya tanpa
secrets, nilai rahasia yang sudah dideklarasikan akan terhapus, dan jika Statement masih mereferensikan nilai itu dengan{ /secrets/… }, penyimpanan ditolak. Karena itu, kirimkansecretssetiap kali Anda melakukan perubahan. Anda cukup mengirim kembali nilai dari respons pembacaan apa adanya. - Nilai selama eksekusi: apa yang dilakukan terhadap nilai yang dibaca ditentukan oleh Statement. Jika nilai itu dikembalikan dengan
Return, nilainya tercatat di respons eksekusi dan ScriptLog, dan jika dimasukkan keSetVar,Cache, Content, nilainya tersimpan sebagai nilai asli di tempat tersebut. Kirim nilai rahasia hanya ke API eksternal yang membutuhkan nilai itu. - App Bundle: saat Script dipaketkan menjadi App Bundle,
valuepadasecretsdisamarkan menjadi******, sedangkankeydandescriptionikut dimuat apa adanya. Script yang dibuat dengan menginstal App Bundle tersebut memiliki nilai rahasia berupa******, sehingga Statement yang membaca nilai itu baru berfungsi setelah pihak yang menginstal memasukkan nilai sebenarnya. Nilai yang ditulis di luarsecrets(headerHttp,secretpadaSignature, dan sebagainya) tidak disamarkan dan ikut dimuat apa adanya.
Satu Script dapat memiliki hingga 20 secrets. Aturan pointer dibahas di /secrets pada Ekspresi nilai.
Identitas eksekusi dan otorisasi
- Identitas eksekusi: selama eksekusi, setiap operasi resource dilakukan dengan identitas pengguna yang memanggil
/execute.createdBy/updatedBydari resource yang dibuat atau diubah adalah pemanggil, dan cakupancreatedBy: ":self"juga diuraikan berdasarkan pemanggil. Pengecualiannya adalah panggilan anonim. Eksekusi yang masuk melalui/execute/anonymoustidak memiliki pemanggil, sehingga keduanya diuraikan berdasarkan penulis (Panggilan anonim). - Ada dua batas otorisasi, dan saat runtime izin resource tidak diperiksa ulang pada setiap Statement.
- Saat penyusunan (penyimpanan): ketika sebuah Script disimpan, sistem memeriksa apakah penulis benar-benar memiliki izin resource dan aksi yang dipakai oleh Statement di dalamnya. Jika satu saja tidak ada, penyimpanan ditolak. Dengan kata lain, Script yang memuat operasi tanpa izin memang tidak akan pernah tersimpan sejak awal. Statement yang memilih resource, baik berupa leaf maupun
ResourceForEachyang memiliki blok, semuanya menjalani pemeriksaan ini. Definisi yang sudah tersimpan pun diperiksa ulang ketika diubah, sehingga setelah izinnya dicabut, definisi itu tidak dapat diperbaiki dan disimpan lagi.- Direktori anggota (ServiceUser) diperiksa bukan lewat map izin, melainkan lewat sumbu pengaturan. Untuk memakai
resource: "ServiceUser"pada tiga Statement pembacaan sertaResourceUpdatedanResourcePatch,settingspada SpaceRole penulis harus memuatSETTING_SERVICE_LOGIN(atauSETTING_ALL) (settings pada SpaceRole). Alasannya, direktori anggota adalah resource yang dikelola pengaturan Space di semua jalur lainnya juga. - Statement yang membuat atau menghapus anggota tidak dapat disimpan dengan role apa pun. Karena Script tidak dapat membuat atau menghapus anggota, penolakannya bukan karena izin kurang (
403) melainkan karena Statement yang salah tulis (400). Artinya, ini bukan celah yang bisa ditutup dengan menambah izin. Perubahan yang diizinkan hanyalahroleOverridedanenableLoginpadaResourceUpdatedanResourcePatch(Menangani direktori anggota).
- Direktori anggota (ServiceUser) diperiksa bukan lewat map izin, melainkan lewat sumbu pengaturan. Untuk memakai
- Saat pemanggilan (
/execute): hanya izin Execute Script milik pemanggil yang diperiksa. Tanpa izin itu, hasilnya403. Jika lolos, izin resource per Statement tidak diperiksa lagi saat runtime; eksekusi langsung berjalan. Cara kerjanya seperti izin eksekusi fungsi dalam pemrograman. Jika Anda memiliki izin untuk menjalankan fungsi tersebut, izin untuk setiap operasi individual di dalamnya tidak ditanyakan lagi. Pada jalur panggilan anonim, pemeriksaan ini tidak ada. Sebab tidak ada pemanggil yang bisa diperiksa, sehingga membuka jalur itu setara dengan mempublikasikan satu Script tanpa autentikasi.
- Saat penyusunan (penyimpanan): ketika sebuah Script disimpan, sistem memeriksa apakah penulis benar-benar memiliki izin resource dan aksi yang dipakai oleh Statement di dalamnya. Jika satu saja tidak ada, penyimpanan ditolak. Dengan kata lain, Script yang memuat operasi tanpa izin memang tidak akan pernah tersimpan sejak awal. Statement yang memilih resource, baik berupa leaf maupun
- Pemblokiran pemanggilan langsung (
directCallEnabled): jikadirectCallEnableddari Script bernilaifalse, pemanggilan langsung/executeitu sendiri ditolak. Gerbang ini terkena setelah pemeriksaan izin Execute dilewati, sehingga pemanggilan tetap terblokir meskipun Anda memiliki izin Execute. Pemanggil yang tidak memiliki izin menerima403sebelum mencapai gerbang ini. Karena gerbang ini hanya ada pada endpoint tersebut, aksi terhubung (script) pada Webhook dan Scheduler tetap menjalankannya seperti biasa. Nilai bawaannya adalahtrue(memperbolehkan pemanggilan langsung). - Panggilan anonim (
anonymousCallEnabled): nilai bawaannya adalahfalse. Jika diseteltrue, hanya Script itu yang juga dapat dijalankan melalui jalur khusus tanpa autentikasi (/execute/anonymous), dan saat itu identitas eksekusinya adalah penulis, bukan pemanggil. Dari kedua batas di atas, pemeriksaan saat pemanggilan (izin Execute) tidak ada pada jalur itu, sehingga autentikasi yang sebenarnya dilakukan oleh Script itu sendiri (verifikasi tanda tangan atas permintaan yang diterima). Syarat mengaktifkannya dan aturan penyimpanannya dibahas di Panggilan anonim. - Cakupan kepemilikan:
createdBy: ":self"pada filterwhereberarti "hanya yang dibuat oleh pemanggil saat ini" (misalnya, hanya membaca dompet milik Anda sendiri). Pada Script yang mengizinkan panggilan anonim, filter ini tidak dapat dipakai. Karena tidak ada pemanggil, ia diuraikan menjadi penulis, sehingga makna aslinya sebagai cakupan kepemilikan tidak lagi berlaku. - Izin yang didelegasikan (perhatian bagi penulis): menggabungkan kedua batas di atas, menjalankan sebuah Script setara dengan bertindak dengan izin penulis yang didelegasikan kepadanya. Pemanggil hanya perlu Execute, dan Statement di dalam Script berjalan persis dalam cakupan yang diotorisasikan kepada penulis saat disimpan. Akibatnya, operasi resource yang tidak dapat dilakukan sendiri oleh pemanggil pun tetap bisa terjadi melalui Script. Karena izin yang diberikan kepada penulis itulah jangkauan efektif dari Script tersebut, tentukan dengan cermat operasi apa yang Anda masukkan ke dalam Script.
Daftar periksa ringkas
Sebelum menyimpan, periksa hal-hal berikut.
- Jika Anda mengaktifkan panggilan anonim (
anonymousCallEnabled), tidak adacreatedBy: ":self"padawhere, dan Statement yang memverifikasi permintaan yang diterima (Signature, dan sejenisnya) diletakkan di paling depan. - Jumlah panggilan eksternal (
Http,EmailSend) dan total Statement berada dalam batas paket,SetVar10 atau kurang, danCache5 atau kurang. - Jika memakai
Cache, Anda menuliskeysebagai literal dan tidak meletakkannya di dalamLoopatauResourceForEach. - Jika menelusuri kumpulan besar dengan
ResourceForEach, Anda telah mendeklarasikanlimitatau memastikan ukurannya dapat diselesaikan seluruhnya. - Jika Anda memuat perulangan (
Loop,ResourceForEach), Anda sudah memastikan bahwa perulangan itu masuk sebagai perkalian ke Anggaran waktu (tanpa panggilan eksternal, batasnya adalah anggaran dasar 30 detik). - Nilai rahasia seperti kunci API eksternal atau kunci tanda tangan sudah dideklarasikan di
secretsdan dibaca dengan{ /secrets/<key> }. Tidak ada nilai rahasia yang ditulis apa adanya di Statement. - Jika menyimpan dengan perubahan penuh (PUT), Anda mengirimkan
secretsbersamanya. - Pesan yang dipakai untuk verifikasi tanda tangan diambil dengan
{ /rawPayload }, bukan/payload. - Jika ada Statement yang menangani anggota (ServiceUser), penulis memiliki
SETTING_SERVICE_LOGIN, dan Anda tidak menyertakan Statement yang membuat atau menghapus resource tersebut. - Operasi yang tidak dapat dibatalkan (panggilan eksternal) ditempatkan sebisa mungkin di bagian akhir.
- Jika mengirim file dengan
Http, Anda hanya menulis satu field body permintaan (body,urlBody,multipartBody) dan sudah memastikan setiap file berada dalam batas unduhan per paket. - Jika Anda mengkhawatirkan persaingan update/patch, gunakan
versionpadaResourceUpdateatauResourcePatch. - Untuk mengembalikan hasil, Anda menentukan
Return.value.
Error
Berikut adalah kode yang muncul saat penyimpanan ditolak karena bentuk definisi melanggar batasan statis. Kode yang melanggar aturan ekspresi nilai ada di Error pada Ekspresi nilai, sedangkan kode yang muncul saat pemanggilan dan penghapusan ada di Error pada endpoint. Untuk kode yang berlaku umum pada semua resource, lihat Error umum.
| Kode | Kondisi |
|---|---|
WGL400066 | Jumlah Statement Cache dalam satu definisi melebihi 5. |
WGL400068 | Anda menempatkan Statement Cache di dalam blok Loop atau ResourceForEach. |
WGL400067 | Anda menulis referensi { /pointer } pada key Statement Cache, bukan literal. |
WGL400065 | ttl pada Statement Cache berada di luar rentang yang diizinkan. |
WGL400063 | Anda menulis field yang tidak sesuai dengan action pada Statement Cache (ttl pada Get, defaultValue pada Set). |
WGL400060 | Anda menulis "ServiceUser" pada resource milik ResourceCreate, ResourceDelete serta Statement publikasi dan pengarsipan. Direktori anggota hanya menerima tiga Statement pembacaan serta ResourceUpdate dan ResourcePatch. |
WGL400077 | Anda menulis resource yang tidak dapat dihitung pada resource milik ResourceCount. Media dan direktori anggota (ServiceUser) tidak dapat dihitung. |
WGL400037 | Anda menulis to dan toServiceUser sekaligus pada EmailSend, atau mengosongkan keduanya. Tulis tepat salah satu. |
WGL400054 | Total penerima EmailSend (to 1 orang + cc + bcc) melebihi 50 orang. |
WGL400039 | timeoutMs pada EmailSend melebihi batas atas. |
WGL400101 | Anda menulis body dan templateBody sekaligus pada EmailSend, atau mengosongkan keduanya. Tulis tepat salah satu. |
WGL400102 | templateBody.source pada EmailSend bukan satu pointer yang menunjuk Content yang dibaca ResourceRead, ResourceFind pada Script ini. Jika ada huruf lain sebelum atau sesudah pointer, ia juga ditolak. |
WGL400061 | Anda menulis createdBy: ":self" pada where Statement pembacaan di dalam Script yang mengizinkan panggilan anonim (anonymousCallEnabled). |
WGL400023 | Jumlah Statement SetVar dalam satu definisi melebihi 10. |
WGL400026 | retry pada Statement Http melebihi batas atas 2. |
WGL400087 | Anda menulis dua atau lebih field body permintaan (body, urlBody, multipartBody) pada Http. |
WGL400088 | multipartBody pada Http tidak memiliki part sama sekali. |
WGL400089 | Anda menulis value dan url sekaligus pada part multipartBody, atau tidak menulis keduanya. |
WGL400090 | Anda menulis fileName tanpa url pada part multipartBody. |
WGL400036 | ResourceForEach melebihi batas atas jumlah item yang dapat diproses. |
WGL400094 | Ada dua atau lebih item di secrets yang memakai key yang sama. |
WGL400095 | Jumlah secrets dalam satu definisi melebihi 20. |
WGL400086 | value pada secrets berada di luar rentang 1~4.096 karakter. value tidak dimuat dalam error. |
WGL400086 | text pada PdfWatermark yang tidak memuat { /pointer } berada di luar rentang 1~64 karakter. |
WGL400096 | transformations pada instruksi ingest Media bukan array, type elemennya bukan PdfWatermark, PdfWatermark tidak memiliki text atau text-nya berupa objek atau array, color tidak berformat #RRGGBB, atau text sebagaimana ditulis memuat karakter yang tidak dapat dipakai atau baris baru. |
WGL429005 | Total jumlah Statement dalam satu definisi melebihi batas paket. |
WGL429006 | Jumlah panggilan eksternal (Http, EmailSend) dalam satu definisi melebihi batas paket. |
WGL403015 | Penulis tidak memiliki izin atas resource dan aksi yang ditangani Statement di dalam definisi itu. Meskipun izin itu ada, permintaan tetap ditolak bila izin tersebut disertai filter contentType, createdBy, atau tag. Izin itu harus berupa izin tanpa syarat. Satu-satunya pengecualian adalah Create pada Content: untuk aksi itu izin yang dibatasi cakupan contentType pun diterima, dan cakupan itu dibandingkan dengan contentType yang ditulis pada Statement tersebut (Create pada Media tidak memiliki pengecualian ini). Kasus ketika resource pada Statement pembacaan diisi "ServiceUser" sedangkan penulis tidak memiliki SETTING_SERVICE_LOGIN juga memakai kode ini. |
Dokumen terkait
- Ekspresi nilai: aturan nilai dan kondisi.
- Katalog Statement: field dan hasil dari setiap Statement.
- Cookbook: kumpulan contoh yang lengkap.
- Resource dan endpoint Script: struktur resource
Scriptdan endpoint HTTP seperti/execute. - Ikhtisar Script: struktur tingkat atas dan waktu yang diberikan untuk satu eksekusi.
