

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

# Tulis kode fungsi
<a name="writing-function-code"></a>

Anda dapat menggunakan CloudFront Fungsi untuk menulis fungsi ringan untuk penyesuaian JavaScript CDN skala tinggi yang sensitif terhadap latensi. Kode fungsi Anda dapat memanipulasi permintaan dan respons yang mengalir CloudFront, melakukan otentikasi dan otorisasi dasar, menghasilkan respons HTTP di tepi, dan banyak lagi.

Untuk membantu Anda menulis kode fungsi untuk CloudFront Fungsi, lihat topik berikut. Untuk contoh kode, lihat [CloudFront Contoh fungsi untuk CloudFront](service_code_examples_cloudfront_functions_examples.md) dan [amazon-cloudfront-functions repositori aktif](https://github.com/aws-samples/amazon-cloudfront-functions). GitHub

**Topics**
+ [Tentukan tujuan fungsi](function-code-choose-purpose.md)
+ [Struktur peristiwa](functions-event-structure.md)
+ [JavaScript fitur runtime](functions-javascript-runtime-features.md)
+ [Metode pembantu untuk penyimpanan nilai kunci](functions-custom-methods.md)
+ [Metode pembantu untuk modifikasi asal](helper-functions-origin-modification.md)
+ [Metode pembantu untuk properti CloudFront SaaS Manager](saas-specific-logic-function-code.md)
+ [Gunakan async dan await](async-await-syntax.md)
+ [Dukungan CWT untuk Fungsi CloudFront](cwt-support-cloudfront-functions.md)
+ [Metode pembantu umum](general-helper-methods.md)

# Tentukan tujuan fungsi
<a name="function-code-choose-purpose"></a>

Sebelum Anda menulis kode fungsi Anda, tentukan tujuan fungsi Anda. Sebagian besar CloudFront fungsi dalam Fungsi memiliki salah satu tujuan berikut.

**Topics**
+ [Ubah permintaan HTTP dalam jenis acara permintaan penampil](#function-code-modify-request)
+ [Hasilkan respons HTTP dalam jenis acara permintaan penampil](#function-code-generate-response)
+ [Ubah respons HTTP dalam jenis peristiwa respons penampil](#function-code-modify-response)
+ [Validasi koneksi mTLS dalam jenis acara permintaan koneksi](#function-code-connection-request)
+ [Informasi Terkait](#related-information-cloudfront-functions-purpose)

Terlepas dari tujuan fungsi Anda, `handler` adalah titik masuk untuk fungsi apa pun. Dibutuhkan argumen tunggal yang disebut`event`, yang diteruskan ke fungsi oleh CloudFront. `event` adalah objek JSON yang berisi representasi dari permintaan HTTP (dan respons, jika fungsi Anda memodifikasi respons HTTP). 

## Ubah permintaan HTTP dalam jenis acara permintaan penampil
<a name="function-code-modify-request"></a>

Fungsi Anda dapat memodifikasi permintaan HTTP yang CloudFront menerima dari penampil (klien), dan mengembalikan permintaan yang dimodifikasi ke CloudFront pemrosesan lanjutan. Misalnya, kode fungsi Anda mungkin menormalkan [kunci cache](understanding-the-cache-key.md) atau mengubah header permintaan.

Setelah Anda membuat dan memublikasikan fungsi yang mengubah permintaan HTTP, pastikan untuk menambahkan asosiasi untuk jenis peristiwa *permintaan penampil*. Untuk informasi selengkapnya, lihat [Buat fungsi](functions-tutorial.md#functions-tutorial-create). Ini membuat fungsi berjalan setiap kali CloudFront menerima permintaan dari penampil, sebelum memeriksa untuk melihat apakah objek yang diminta ada dalam CloudFront cache.

**Example Contoh**  
Pseudocode berikut menunjukkan struktur fungsi yang mengubah permintaan HTTP.  

```
function handler(event) {
    var request = event.request;

    // Modify the request object here.

    return request;
}
```
Fungsi mengembalikan `request` objek yang dimodifikasi ke CloudFront. CloudFrontterus memproses permintaan yang dikembalikan dengan memeriksa CloudFront cache untuk mendapatkan cache, dan mengirim permintaan ke asal jika perlu.

## Hasilkan respons HTTP dalam jenis acara permintaan penampil
<a name="function-code-generate-response"></a>

Fungsi Anda dapat menghasilkan respons HTTP di tepi dan mengembalikannya langsung ke penampil (klien) tanpa memeriksa respons yang di-cache atau pemrosesan lebih lanjut oleh CloudFront. Misalnya, kode fungsi Anda mungkin mengalihkan permintaan ke URL baru, atau memeriksa otorisasi dan mengembalikan respons `401` atau `403` terhadap permintaan yang tidak sah.

Saat Anda membuat fungsi yang menghasilkan respons HTTP, pastikan untuk memilih jenis peridtiwa *permintaan penampil*. Ini berarti bahwa fungsi berjalan setiap kali CloudFront menerima permintaan dari penampil, sebelum CloudFront melakukan pemrosesan permintaan lebih lanjut.

**Example Contoh**  
Pseudocode berikut menunjukkan struktur fungsi yang menghasilkan respons HTTP.  

```
function handler(event) {
    var request = event.request;

    var response = ...; // Create the response object here,
                        // using the request properties if needed.

    return response;
}
```
Fungsi mengembalikan `response` objek ke CloudFront, yang CloudFront segera kembali ke penampil tanpa memeriksa CloudFront cache atau mengirim permintaan ke asal.

## Ubah respons HTTP dalam jenis peristiwa respons penampil
<a name="function-code-modify-response"></a>

Fungsi Anda dapat memodifikasi respons HTTP sebelum CloudFront mengirimkannya ke penampil (klien), terlepas dari apakah respons berasal dari CloudFront cache atau asal. Misalnya, kode fungsi Anda mungkin menambahkan atau memodifikasi header respons, kode status, dan isi isi.

Saat Anda membuat fungsi yang mengubah respons HTTP, pastikan untuk memilih jenis peristiwa *respons penampil*. Ini berarti bahwa fungsi berjalan sebelum CloudFront mengembalikan respons ke penampil, terlepas dari apakah respons berasal dari CloudFront cache atau asal.

**Example Contoh**  
Pseudocode berikut menunjukkan struktur fungsi yang mengubah respons HTTP.  

```
function handler(event) {
    var request = event.request;
    var response = event.response;

    // Modify the response object here,
    // using the request properties if needed.

    return response;
}
```
Fungsi mengembalikan `response` objek yang dimodifikasi ke CloudFront, yang CloudFront segera kembali ke penampil.

## Validasi koneksi mTLS dalam jenis acara permintaan koneksi
<a name="function-code-connection-request"></a>

Fungsi koneksi adalah jenis CloudFront Fungsi yang berjalan selama koneksi TLS untuk memberikan validasi kustom dan logika otentikasi. Fungsi koneksi saat ini tersedia untuk koneksi TLS (mTLS) bersama, di mana Anda dapat memvalidasi sertifikat klien dan menerapkan logika otentikasi khusus di luar validasi sertifikat standar. Fungsi koneksi berjalan selama proses jabat tangan TLS dan dapat mengizinkan atau menolak koneksi berdasarkan properti sertifikat, alamat IP klien, atau kriteria lainnya.

Setelah Anda membuat dan memublikasikan fungsi koneksi, pastikan untuk menambahkan asosiasi untuk jenis peristiwa *permintaan koneksi* dengan distribusi berkemampuan MTLS. Hal ini membuat fungsi berjalan setiap kali klien mencoba untuk membuat koneksi mTLS dengan CloudFront.

**Example**  
Pseudocode berikut menunjukkan struktur fungsi koneksi:  

```
function connectionHandler(connection) {
    // Validate certificate and connection properties here.
    
    if (/* validation passes */) {
        connection.allow();
    } else {
        connection.deny();
    }
}
```
Fungsi ini menggunakan metode pembantu untuk menentukan apakah akan mengizinkan atau menolak koneksi. Tidak seperti permintaan penampil dan fungsi respons penampil, fungsi koneksi tidak dapat mengubah permintaan atau tanggapan HTTP.

## Informasi Terkait
<a name="related-information-cloudfront-functions-purpose"></a>

Untuk informasi selengkapnya tentang bekerja dengan CloudFront Fungsi, lihat topik berikut:
+ [Struktur peristiwa](functions-event-structure.md)
+ [JavaScript fitur runtime](functions-javascript-runtime-features.md)
+ [CloudFront Contoh fungsi ](service_code_examples_cloudfront_functions_examples.md)
+ [Pembatasan pada fungsi edge](edge-functions-restrictions.md)

# CloudFront Fungsi struktur acara
<a name="functions-event-structure"></a>

CloudFront Fungsi meneruskan `event` objek ke kode fungsi Anda sebagai input ketika menjalankan fungsi. Saat Anda [menguji fungsi](test-function.md), Anda membuat objek `event` dan meneruskannya ke fungsi Anda. Saat Anda membuat objek `event` untuk menguji fungsi, Anda dapat menghilangkan kolom `distributionDomainName`, `distributionId`, dan `requestId` dalam objek `context`. Pastikan bahwa nama header adalah huruf kecil, yang selalu terjadi pada `event` objek yang diteruskan CloudFront Functions ke fungsi Anda dalam produksi.

Berikut ini menunjukkan gambaran umum struktur objek peristiwa ini. 

```
{
    "version": "1.0",
    "context": {
        <context object>
    },
    "viewer": {
        <viewer object>
    },
    "request": {
        <request object>
    },
    "response": {
        <response object>
    }
}
```

Untuk informasi selengkapnya, lihat topik berikut:

**Topics**
+ [Bidang versi](#functions-event-structure-version)
+ [Objek konteks](#functions-event-structure-context)
+ [Struktur acara koneksi](#functions-event-structure-connection)
+ [Objek penampil](#functions-event-structure-viewer)
+ [Permintaan objek](#functions-event-structure-request)
+ [Objek respons](#functions-event-structure-response)
+ [Kode status dan badan](#functions-event-structure-status-body)
+ [Struktur untuk string kueri, header, atau cookie](#functions-event-structure-query-header-cookie)
+ [Contoh objek respon](#functions-response-structure-example)
+ [Contoh objek acara](#functions-event-structure-example)

## Bidang versi
<a name="functions-event-structure-version"></a>

`version`Bidang berisi string yang menentukan versi objek acara CloudFront Functions. Versi saat ini adalah `1.0`.

## Objek konteks
<a name="functions-event-structure-context"></a>

Objek `context` berisi informasi kontekstual tentang peristiwa tersebut. Ini mencakup kolom-kolom berikut:

**`distributionDomainName`**  
Nama CloudFront domain (misalnya, d111111abcdef8.cloudfront.net) dari distribusi standar yang terkait dengan acara tersebut.  
`distributionDomainName`Bidang hanya muncul ketika fungsi Anda dipanggil untuk distribusi standar.

**`endpoint`**  
Nama CloudFront domain (misalnya, d111111abcdef8.cloudfront.net) dari grup koneksi yang terkait dengan acara tersebut.  
`endpoint`Bidang hanya muncul ketika fungsi Anda dipanggil untuk distribusi multi-penyewa.

**`distributionId`**  
ID distribusi (misalnya, EDFDVBD6 CONTOH) yang terkait dengan acara.

**`eventType`**  
Jenis peristiwa, `viewer-request` atau `viewer-response`.

**`requestId`**  
String yang secara unik mengidentifikasi CloudFront permintaan (dan respons terkait).

## Struktur acara koneksi
<a name="functions-event-structure-connection"></a>

Fungsi koneksi menerima struktur peristiwa yang berbeda dari fungsi penampil. Untuk informasi rinci tentang struktur acara koneksi dan format respons, lihat[Kaitkan Fungsi CloudFront Koneksi](connection-functions.md).

## Objek penampil
<a name="functions-event-structure-viewer"></a>

Objek `viewer` berisi kolom `ip` yang nilainya adalah alamat IP penampil (klien) yang mengirim permintaan. Jika perminttaan penampil melewati proksi HTTP atau penyeimbang beban, nilainya adalah alamat IP proksi atau load balancer.

## Permintaan objek
<a name="functions-event-structure-request"></a>

`request`Objek berisi representasi dari permintaan viewer-to-CloudFront HTTP. Dalam `event` objek yang diteruskan ke fungsi Anda, `request` objek mewakili permintaan aktual yang CloudFront diterima dari penampil.

Jika kode fungsi Anda mengembalikan `request` objek ke CloudFront, itu harus menggunakan struktur yang sama.

Objek `request` berisi kolom-kolom berikut:

**`method`**  
Metode HTTP permintaan. Jika kode fungsi Anda mengembalikan a`request`, itu tidak dapat memodifikasi bidang ini. Ini adalah satu-satunya kolom hanya-baca di objek `request`.

**`uri`**  
Jalur relatif objek yang diminta.   
Jika fungsi Anda memodifikasi `uri` nilai, berikut ini berlaku:  
+ Nilai `uri` baru harus dimulai dengan garis miring ke depan (`/`).
+ Saat fungsi mengubah nilai `uri`, fungsi tersebut mengubah objek yang diminta oleh penampil.
+ Saat fungsi mengubah `uri` nilainya, fungsi tersebut *tidak* mengubah perilaku cache untuk permintaan atau asal tempat permintaan asal dikirim.

**`querystring`**  
Sebuah objek yang mewakili string kueri dalam permintaan. Jika permintaan tidak menyertakan string kueri, `request` objek masih menyertakan `querystring` objek kosong.  
Objek `querystring` berisi satu kolom untuk setiap parameter string kueri dalam permintaan.

**`headers`**  
Sebuah objek yang mewakili string kueri dalam permintaan. Jika permintaan berisi header `Cookie`, header tersebut bukan bagian dari objek `headers`. Cookie diwakili secara terpisah dalam objek `cookies`.  
Objek `headers` berisi satu kolom untuk setiap header dalam permintaan. Nama header dikonversi ke ASCII-huruf kecil di objek acara, dan nama header harus ASCII-huruf kecil ketika ditambahkan oleh kode fungsi Anda. Ketika CloudFront Fungsi mengubah objek acara kembali ke permintaan HTTP, huruf pertama dari setiap kata dalam nama header dikapitalisasi, jika itu adalah huruf ASCII. CloudFront Fungsi tidak menerapkan perubahan apa pun pada simbol non-ASCII dalam nama header. Misalnya, `TÈst-header` akan menjadi `tÈst-header` di dalam fungsi. Simbol `È` non-ASCII tidak berubah.  
Kata-kata dipisahkan oleh tanda hubung ()`-`. Misalnya, jika kode fungsi Anda menambahkan header bernama`example-header-name`, CloudFront konversi ini ke `Example-Header-Name` dalam permintaan HTTP.

**`cookies`**  
Sebuah objek yang mewakili cookie dalam permintaan (header `Cookie`).  
Objek `cookies` berisi satu kolom untuk setiap cookie dalam permintaan.

Untuk informasi selengkapnya tentang struktur string kueri, header, dan cookie, lihat [Struktur untuk string kueri, header, atau cookie](#functions-event-structure-query-header-cookie).

Misalnya, objek `event`, lihat [Contoh objek acara](#functions-event-structure-example).

## Objek respons
<a name="functions-event-structure-response"></a>

`response`Objek berisi representasi dari respon CloudFront-to-viewer HTTP. Dalam `event` objek yang diteruskan ke fungsi Anda, `response` objek mewakili respons CloudFront aktual terhadap permintaan penampil.

Jika kode fungsi Anda mengembalikan objek `response`, kode tersebut harus menggunakan struktur yang sama.

Objek `response` berisi kolom-kolom berikut:

**`statusCode`**  
Kode status HTTP dari respons. Nilai ini adalah bilangan bulat, bukan string.  
Fungsi Anda dapat menghasilkan atau memodifikasi`statusCode`.

**`statusDescription`**  
Deskripsi status HTTP untuk respons. Jika kode fungsi Anda menghasilkan respons, kolom ini menjadi opsional.

**`headers`**  
Sebuah objek yang merepresentasikan header HTTP dalam respons. Jika respons berisi header `Set-Cookie`, header tersebut bukan bagian dari objek `headers`. Cookie diwakili secara terpisah dalam objek `cookies`.  
Objek `headers` berisi satu kolom untuk setiap header dalam respons. Nama header dikonversi ke huruf kecil di objek acara, dan nama header harus huruf kecil ketika ditambahkan oleh kode fungsi Anda. Ketika CloudFront Fungsi mengubah objek acara kembali menjadi respons HTTP, huruf pertama dari setiap kata dalam nama header dikapitalisasi. Kata-kata dipisahkan oleh tanda hubung ()`-`. Misalnya, jika kode fungsi Anda menambahkan header bernama`example-header-name`, CloudFront konversi ini ke `Example-Header-Name` dalam respon HTTP.

**`cookies`**  
Sebuah objek yang mewakili cookie dalam respons (header `Set-Cookie`).  
Objek `cookies` berisi satu kolom untuk setiap cookie dalam respons.

**`body`**  
Menambahkan `body` bidang adalah opsional, dan itu tidak akan ada di `response` objek kecuali Anda menentukannya dalam fungsi Anda. Fungsi Anda tidak memiliki akses ke badan asli yang dikembalikan oleh CloudFront cache atau asal. Jika Anda tidak menentukan `body` bidang dalam fungsi respons penampil, isi asli yang dikembalikan oleh CloudFront cache atau asal akan dikembalikan ke penampil.  
Jika Anda CloudFront ingin mengembalikan badan khusus ke penampil, tentukan konten isi di `data` bidang, dan pengkodean badan di `encoding` bidang. Anda dapat menentukan encoding sebagai plain text (`"encoding": "text"`) atau sebagai Base64-encoded content (). `"encoding": "base64"`  
Sebagai pintasan, Anda juga dapat menentukan isi isi langsung di `body` bidang (`"body": "<specify the body content here>"`). Ketika Anda melakukan ini, hilangkan `encoding` bidang `data` dan. CloudFront memperlakukan tubuh sebagai teks biasa dalam kasus ini.    
`encoding`  
Pengkodean untuk `body` konten (`data`bidang). Satu-satunya pengodean yang valid adalah `text` dan `base64`.  
Jika Anda menentukan `encoding` sebagai `base64` tetapi tubuh tidak valid base64, CloudFront mengembalikan kesalahan.  
`data`  
`body`Konten.

Untuk informasi selengkapnya tentang kode status dan isi isi yang dimodifikasi, lihat[Kode status dan badan](#functions-event-structure-status-body).

Untuk informasi selengkapnya tentang struktur header dan cookie, lihat [Struktur untuk string kueri, header, atau cookie](#functions-event-structure-query-header-cookie).

Misalnya, objek `response`, lihat [Contoh objek respon](#functions-response-structure-example).

## Kode status dan badan
<a name="functions-event-structure-status-body"></a>

Dengan CloudFront Fungsi, Anda dapat memperbarui kode status respons penampil, mengganti seluruh badan respons dengan yang baru, atau menghapus badan respons. Beberapa skenario umum untuk memperbarui respons penampil setelah mengevaluasi aspek respons dari CloudFront cache atau asal termasuk yang berikut:
+ Mengubah status untuk menyetel kode status HTTP 200 dan membuat konten badan statis untuk kembali ke penampil.
+ Mengubah status untuk menetapkan kode status HTTP 301 atau 302 untuk mengarahkan pengguna ke situs web lain.
+ Memutuskan apakah akan melayani atau menjatuhkan tubuh respons pemirsa.

**catatan**  
Jika asal mengembalikan kesalahan HTTP 400 ke atas, CloudFront Fungsi tidak akan berjalan. Untuk mengetahui informasi selengkapnya, lihat [Pembatasan pada semua fungsi edge](edge-function-restrictions-all.md).

Saat Anda bekerja dengan respons HTTP, CloudFront Functions tidak memiliki akses ke badan respons. Anda dapat mengganti isi isi dengan mengaturnya ke nilai yang diinginkan, atau Anda dapat menghapus tubuh dengan mengatur nilai menjadi kosong. Jika Anda tidak memperbarui bidang isi dalam fungsi Anda, isi asli yang dikembalikan oleh CloudFront cache atau asal dikembalikan ke penampil.

**Tip**  
Saat menggunakan CloudFront Functions untuk mengganti body, pastikan untuk menyelaraskan header yang sesuai, seperti`content-encoding`,, atau `content-type``content-length`, ke isi isi baru.   
Misalnya, jika CloudFront asal atau cache kembali `content-encoding: gzip` tetapi fungsi respons penampil menyetel isi teks biasa, fungsi tersebut juga perlu mengubah `content-encoding` dan `content-type` header yang sesuai.

Jika CloudFront Fungsi Anda dikonfigurasi untuk mengembalikan kesalahan HTTP 400 atau lebih tinggi, penampil Anda tidak akan melihat [halaman kesalahan kustom](creating-custom-error-pages.md) yang telah Anda tentukan untuk kode status yang sama.

## Struktur untuk string kueri, header, atau cookie
<a name="functions-event-structure-query-header-cookie"></a>

String kueri, header, dan cookie berbagi struktur yang sama. String kueri dapat muncul dalam permintaan. Header muncul dalam permintaan dan tanggapan. Cookie muncul dalam permintaan dan tanggapan.

Setiap string kueri, header, atau cookie adalah kolom yang unik dalam objek `querystring`,`headers`, atau `cookies` induk. Nama bidang adalah nama string kueri, header, atau cookie. Setiap kolom berisi properti `value` dengan nilai string kueri, header, atau cookie.

**Contents**
+ [Nilai string kueri atau objek string kueri](#functions-event-structure-query)
+ [Pertimbangan khusus untuk header](#functions-event-structure-headers)
+ [Duplikasi string kueri, header, dan cookie (`multiValue` susunan)](#functions-event-structure-multivalue)
+ [Atribut cookie](#functions-event-structure-cookie-attributes)

### Nilai string kueri atau objek string kueri
<a name="functions-event-structure-query"></a>

Sebuah fungsi dapat mengembalikan nilai string query selain objek string query. Nilai string kueri dapat digunakan untuk mengatur parameter string kueri dalam urutan kustom apa pun. 

**Example Contoh**  
Untuk memodifikasi string kueri dalam kode fungsi Anda, gunakan kode seperti berikut ini.  

```
var request = event.request; 
request.querystring = 'ID=42&Exp=1619740800&TTL=1440&NoValue=&querymv=val1&querymv=val2,val3';
```

### Pertimbangan khusus untuk header
<a name="functions-event-structure-headers"></a>

Hanya untuk header, nama header dikonversi ke huruf kecil di objek acara, dan nama header harus huruf kecil ketika ditambahkan oleh kode fungsi Anda. Ketika CloudFront Fungsi mengubah objek acara kembali menjadi permintaan atau respons HTTP, huruf pertama dari setiap kata dalam nama header dikapitalisasi. Kata-kata dipisahkan oleh tanda hubung ()`-`. Misalnya, jika kode fungsi Anda menambahkan header bernama`example-header-name`, CloudFront mengonversinya menjadi `Example-Header-Name` permintaan atau respons HTTP.

**Example Contoh**  
Pertimbangkan `Host` header berikut dalam permintaan HTTP.  

```
Host: video.example.com
```
Header ini direpresentasikan sebagai berikut dalam objek `request`:  

```
"headers": {
    "host": {
        "value": "video.example.com"
    }
}
```
Untuk mengakses header `Host` dalam kode fungsi Anda, gunakan kode seperti berikut:  

```
var request = event.request;
var host = request.headers.host.value;
```
Untuk menambah atau memodifikasi header dalam kode fungsi Anda, gunakan kode seperti berikut (kode ini menambahkan header bernama `X-Custom-Header` dengan nilai `example value`):  

```
var request = event.request;
request.headers['x-custom-header'] = {value: 'example value'};
```

### Duplikasi string kueri, header, dan cookie (`multiValue` susunan)
<a name="functions-event-structure-multivalue"></a>

Permintaan atau respons HTTP dapat berisi lebih dari satu string kueri, header, atau cookie dengan nama yang sama. Dalam hal ini, string kueri, header, atau cookie duplikat dikumpulkan dalam satu kolom di objek `request` atau `response`, tetapi kolom ini berisi properti tambahan bernama `multiValue`. Properti `multiValue` berisi susunan dengan nilai-nilai masing-masing string kueri, header, atau cookie duplikat.

**Example Contoh**  
Pertimbangkan permintaan HTTP dengan `Accept` header berikut.  

```
Accept: application/json
Accept: application/xml
Accept: text/html
```
Header ini direpresentasikan sebagai berikut dalam `request` objek.  

```
"headers": {
    "accept": {
        "value": "application/json",
        "multiValue": [
            {
                "value": "application/json"
            },
            {
                "value": "application/xml"
            },
            {
                "value": "text/html"
            }
        ]
    }
}
```

**catatan**  
Nilai header pertama (dalam hal ini,`application/json`) diulang di kedua `multiValue` properti `value` dan. Ini memungkinkan Anda untuk mengakses *semua* nilai dengan perulangan melalui `multiValue` susunan.

Jika kode fungsi Anda memodifikasi string kueri, header, atau cookie yang memiliki `multiValue` array, CloudFront Fungsi menggunakan aturan berikut untuk menerapkan perubahan:

1. Jika `multiValue` susunan ada dan memiliki modifikasi, modifikasi tersebut akan diterapkan. Elemen pertama dalam properti `value` diabaikan.

1. Jika tidak, modifikasi apa pun pada properti `value`properti diterapkan, dan nilai berikutnya (jika ada) tetap sama.

Properti `multiValue` digunakan hanya ketika permintaan HTTP atau respons berisi string kueri, header, atau cookie duplikat dengan nama yang sama, seperti yang ditunjukkan dalam contoh sebelumnya. Namun, jika ada beberapa nilai dalam satu string kueri, header, atau cookie, properti `multiValue` tidak akan digunakan.

**Example Contoh**  
Pertimbangkan permintaan dengan satu `Accept` header yang berisi tiga nilai.  

```
Accept: application/json, application/xml, text/html
```
Header ini direpresentasikan sebagai berikut dalam `request` objek.  

```
"headers": {
    "accept": {
        "value": "application/json, application/xml, text/html"
    }
}
```

### Atribut cookie
<a name="functions-event-structure-cookie-attributes"></a>

Dalam header `Set-Cookie` dalam respons HTTP, header berisi pasangan nama-nilai untuk cookie dan opsi satu set atribut dipisahkan oleh titik koma. 

**Example Contoh**  

```
Set-Cookie: cookie1=val1; Secure; Path=/; Domain=example.com; Expires=Wed, 05 Apr 2021 07:28:00 GMT
```
Di objek `response`, atribut ini direpresentasikan dalam properti `attributes` dari kolom cookie. Sebagai contoh, header `Set-Cookie` sebelumnya direpresentasikan sebagai berikut:  

```
"cookie1": {
    "value": "val1",
    "attributes": "Secure; Path=/; Domain=example.com; Expires=Wed, 05 Apr 2021 07:28:00 GMT"
}
```

## Contoh objek respon
<a name="functions-response-structure-example"></a>

Contoh berikut menunjukkan `response` objek - output dari fungsi respons penampil - di mana tubuh telah digantikan oleh fungsi respons penampil.

```
{
  "response": {
    "statusCode": 200,
    "statusDescription": "OK",
    "headers": {
      "date": {
        "value": "Mon, 04 Apr 2021 18:57:56 GMT"
      },
      "server": {
        "value": "gunicorn/19.9.0"
      },
      "access-control-allow-origin": {
        "value": "*"
      },
      "access-control-allow-credentials": {
        "value": "true"
      },
      "content-type": {
        "value": "text/html"
      },
      "content-length": {
        "value": "86"
      }
    },
    "cookies": {
      "ID": {
        "value": "id1234",
        "attributes": "Expires=Wed, 05 Apr 2021 07:28:00 GMT"
      },
      "Cookie1": {
        "value": "val1",
        "attributes": "Secure; Path=/; Domain=example.com; Expires=Wed, 05 Apr 2021 07:28:00 GMT",
        "multiValue": [
          {
            "value": "val1",
            "attributes": "Secure; Path=/; Domain=example.com; Expires=Wed, 05 Apr 2021 07:28:00 GMT"
          },
          {
            "value": "val2",
            "attributes": "Path=/cat; Domain=example.com; Expires=Wed, 10 Jan 2021 07:28:00 GMT"
          }
        ]
      }
    },
    
    // Adding the body field is optional and it will not be present in the response object
    // unless you specify it in your function.
    // Your function does not have access to the original body returned by the CloudFront
    // cache or origin.
    // If you don't specify the body field in your viewer response function, the original
    // body returned by the CloudFront cache or origin is returned to viewer.

     "body": {
      "encoding": "text",
      "data": "<!DOCTYPE html><html><body><p>Here is your custom content.</p></body></html>"
    }
  }
}
```

## Contoh objek acara
<a name="functions-event-structure-example"></a>

Contoh berikut menunjukkan objek `event` lengkap. Ini adalah contoh pemanggilan untuk distribusi standar, dan bukan untuk distribusi multi-penyewa. Untuk distribusi multi-penyewa, `endpoint` bidang digunakan sebagai ganti Nilai dari `distributionDomainName` adalah nama CloudFront domain (misalnya, d111111abcdef8.cloudfront.net) dari `endpoint` grup koneksi yang terkait dengan acara tersebut.

**catatan**  
Objek `event` adalah masukan untuk fungsi Anda. Fungsi Anda hanya mengembalikan hanya objek `request` atau `response`, bukan objek `event` lengkap.

```
{
    "version": "1.0",
    "context": {
        "distributionDomainName": "d111111abcdef8.cloudfront.net",
        "distributionId": "EDFDVBD6EXAMPLE",
        "eventType": "viewer-response",
        "requestId": "EXAMPLEntjQpEXAMPLE_SG5Z-EXAMPLEPmPfEXAMPLEu3EqEXAMPLE=="
    },
    "viewer": {"ip": "198.51.100.11"},
    "request": {
        "method": "GET",
        "uri": "/media/index.mpd",
        "querystring": {
            "ID": {"value": "42"},
            "Exp": {"value": "1619740800"},
            "TTL": {"value": "1440"},
            "NoValue": {"value": ""},
            "querymv": {
                "value": "val1",
                "multiValue": [
                    {"value": "val1"},
                    {"value": "val2,val3"}
                ]
            }
        },
        "headers": {
            "host": {"value": "video.example.com"},
            "user-agent": {"value": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:83.0) Gecko/20100101 Firefox/83.0"},
            "accept": {
                "value": "application/json",
                "multiValue": [
                    {"value": "application/json"},
                    {"value": "application/xml"},
                    {"value": "text/html"}
                ]
            },
            "accept-language": {"value": "en-GB,en;q=0.5"},
            "accept-encoding": {"value": "gzip, deflate, br"},
            "origin": {"value": "https://website.example.com"},
            "referer": {"value": "https://website.example.com/videos/12345678?action=play"},
            "cloudfront-viewer-country": {"value": "GB"}
        },
        "cookies": {
            "Cookie1": {"value": "value1"},
            "Cookie2": {"value": "value2"},
            "cookie_consent": {"value": "true"},
            "cookiemv": {
                "value": "value3",
                "multiValue": [
                    {"value": "value3"},
                    {"value": "value4"}
                ]
            }
        }
    },
    "response": {
        "statusCode": 200,
        "statusDescription": "OK",
        "headers": {
            "date": {"value": "Mon, 04 Apr 2021 18:57:56 GMT"},
            "server": {"value": "gunicorn/19.9.0"},
            "access-control-allow-origin": {"value": "*"},
            "access-control-allow-credentials": {"value": "true"},
            "content-type": {"value": "application/json"},
            "content-length": {"value": "701"}
        },
        "cookies": {
            "ID": {
                "value": "id1234",
                "attributes": "Expires=Wed, 05 Apr 2021 07:28:00 GMT"
            },
            "Cookie1": {
                "value": "val1",
                "attributes": "Secure; Path=/; Domain=example.com; Expires=Wed, 05 Apr 2021 07:28:00 GMT",
                "multiValue": [
                    {
                        "value": "val1",
                        "attributes": "Secure; Path=/; Domain=example.com; Expires=Wed, 05 Apr 2021 07:28:00 GMT"
                    },
                    {
                        "value": "val2",
                        "attributes": "Path=/cat; Domain=example.com; Expires=Wed, 10 Jan 2021 07:28:00 GMT"
                    }
                ]
            }
        }
    }
}
```

# JavaScript fitur runtime untuk Fungsi CloudFront
<a name="functions-javascript-runtime-features"></a>

Lingkungan JavaScript runtime CloudFront Functions sesuai dengan [ECMAScript (ES) versi 5.1](https://www.ecma-international.org/ecma-262/5.1/) dan juga mendukung beberapa fitur ES versi 6 hingga 12.

Untuk sebagian besar up-to-date fitur, kami menyarankan Anda menggunakan JavaScript runtime 2.0. 

Fitur JavaScript runtime 2.0 memiliki perubahan berikut dibandingkan dengan 1.0:
+ Metode modul buffer tersedia
+ Metode prototipe string non-standar berikut tidak tersedia:
  + `String.prototype.bytesFrom()`
  + `String.prototype.fromBytes()`
  + `String.prototype.fromUTF8()`
  + `String.prototype.toBytes()`
  + `String.prototype.toUTF8()`
+ Modul kriptografi memiliki perubahan berikut:
  + `hash.digest()`— Jenis pengembalian diubah menjadi `Buffer` jika tidak ada pengkodean yang disediakan
  + `hmac.digest()`— Jenis pengembalian diubah menjadi `Buffer` jika tidak ada pengkodean yang disediakan
+ Untuk informasi selengkapnya tentang fitur baru tambahan, lihat[JavaScript fitur runtime 2.0 untuk Fungsi CloudFront](functions-javascript-runtime-20.md).

**Topics**
+ [JavaScript fitur runtime 1.0](functions-javascript-runtime-10.md)
+ [JavaScript fitur runtime 2.0](functions-javascript-runtime-20.md)

# JavaScript fitur runtime 1.0 untuk Fungsi CloudFront
<a name="functions-javascript-runtime-10"></a>

Lingkungan JavaScript runtime CloudFront Functions sesuai dengan [ECMAScript (ES) versi 5.1](https://262.ecma-international.org/5.1/) dan juga mendukung beberapa fitur ES versi 6 hingga 9. Lingkungan ini juga menyediakan beberapa metode standar yang bukan bagian dari spesifikasi ES. 

Topik berikut mencantumkan semua fitur bahasa yang didukung.

**Topics**
+ [Fitur inti](#writing-functions-javascript-features-core)
+ [Objek primitif](#writing-functions-javascript-features-primitive-objects)
+ [Objek bawaan](#writing-functions-javascript-features-builtin-objects)
+ [Jenis kesalahan](#writing-functions-javascript-features-error-types)
+ [Global](#writing-functions-javascript-features-globals)
+ [Modul bawaan](#writing-functions-javascript-features-builtin-modules)
+ [Fitur yang dibatasi](#writing-functions-javascript-features-restricted-features)

## Fitur inti
<a name="writing-functions-javascript-features-core"></a>

Mendukung fitur inti ES berikut.

**Jenis**  
Mendukung semua jenis ES 5.1. Ini termasuk nilai, angka, string, objek, susunan, fungsi, konstruktor fungsi, dan ekspresi reguler Boolean.

**Operator**  
Mendukung Semua operator ES 5.1 didukung.  
Mendukung operator eksponensial ES 7 (`**`).

**Pernyataan**  
Tidak mendukung pernyataan `const` dan `let`.
Mendukung pernyataan ES 5.1 berikut:  
+ `break`
+ `catch`
+ `continue`
+ `do-while`
+ `else`
+ `finally`
+ `for`
+ `for-in`
+ `if`
+ `return`
+ `switch`
+ `throw`
+ `try`
+ `var`
+ `while`
+ Pernyataan berlabel

**Literal**  
Literal template ES 6 didukung: string multiline, interpolasi ekspresi, dan templat bersarang.

**Fungsi**  
Mendukung semua fitur fungsi ES 5.1.  
Mendukung fungsi panah ES 6 didukung, dan sintaks parameter ES 6 sintaks parameter istirahat.

**Unicode**  
Sumber teks dan literal string dapat berisi karakter Unicode yang dikodekan. Juga mendukung unicode code point escape sequence enam karakter (misalnya, `\uXXXX`).

**Mode ketat**  
Fungsi beroperasi dalam mode ketat secara default, sehingga Anda tidak perlu menambahkan pernyataan `use strict` dalam kode fungsi Anda. Ini tidak dapat diubah.

## Objek primitif
<a name="writing-functions-javascript-features-primitive-objects"></a>

Mendukung objek primitif ES berikut.

**Objek**  
Mendukung metode ES 5.1 berikut pada objek:  
+ `create` (tanpa daftar properti)
+ `defineProperties`
+ `defineProperty`
+ `freeze`
+ `getOwnPropertyDescriptor`
+ `getOwnPropertyNames`
+ `getPrototypeOf`
+ `hasOwnProperty`
+ `isExtensible`
+ `isFrozen`
+ `prototype.isPrototypeOf`
+ `isSealed`
+ `keys`
+ `preventExtensions`
+ `prototype.propertyIsEnumerable`
+ `seal`
+ `prototype.toString`
+ `prototype.valueOf`
Mendukung metode ES 6 berikut pada objek:  
+ `assign`
+ `is`
+ `prototype.setPrototypeOf`
Mendukung metode ES 8 berikut pada objek:  
+ `entries`
+ `values`

**String**  
Mendukung metode ES 5.1 berikut pada string:  
+ `fromCharCode`
+ `prototype.charAt`
+ `prototype.concat`
+ `prototype.indexOf`
+ `prototype.lastIndexOf`
+ `prototype.match`
+ `prototype.replace`
+ `prototype.search`
+ `prototype.slice`
+ `prototype.split`
+ `prototype.substr`
+ `prototype.substring`
+ `prototype.toLowerCase`
+ `prototype.trim`
+ `prototype.toUpperCase`
Mendukung metode ES 6 berikut pada string:  
+ `fromCodePoint`
+ `prototype.codePointAt`
+ `prototype.endsWith`
+ `prototype.includes`
+ `prototype.repeat`
+ `prototype.startsWith`
Mendukung metode ES 8 berikut pada string:  
+ `prototype.padStart`
+ `prototype.padEnd`
Mendukung metode ES 9 berikut pada string:  
+ `prototype.trimStart`
+ `prototype.trimEnd`
Mendukung metode tidak standar berikut pada string:  
+ `prototype.bytesFrom(array | string, encoding)`

  Menciptakan string byte dari susunan oktet atau string yang dikodekan. Opsi pengkodean string adalah `hex`, `base64`, dan `base64url`.
+ `prototype.fromBytes(start[, end])`

  Menciptakan string Unicode dari string byte di mana setiap byte diganti dengan titik kode Unicode yang sesuai.
+ `prototype.fromUTF8(start[, end])`

  Menciptakan string Unicode dari UTF-8 string byte yang dikodekan. Jika pengkodean salah, akan muncul `null`.
+ `prototype.toBytes(start[, end])`

  Menciptakan string byte dari string Unicode. Semua karakter harus dalam rentang [0,255]. Jika tidak, akan muncul `null`.
+ `prototype.toUTF8(start[, end])`

  Menciptakan UTF-8 string byte yang dikodekan dari string Unicode.

**Nomor**  
Mendukung semua metode ES 5.1 pada nomor.  
Mendukung metode ES 6 berikut pada nomor:  
+ `isFinite`
+ `isInteger`
+ `isNaN`
+ `isSafeInteger`
+ `parseFloat`
+ `parseInt`
+ `prototype.toExponential`
+ `prototype.toFixed`
+ `prototype.toPrecision`
+ `EPSILON`
+ `MAX_SAFE_INTEGER`
+ `MAX_VALUE`
+ `MIN_SAFE_INTEGER`
+ `MIN_VALUE`
+ `NEGATIVE_INFINITY`
+ `NaN`
+ `POSITIVE_INFINITY`

## Objek bawaan
<a name="writing-functions-javascript-features-builtin-objects"></a>

Mendukung objek ES bawaan berikut.

**Matematika**  
Mendukung semua metode matematika ES 5.1.  
Di lingkungan runtime CloudFront Functions, `Math.random()` implementasi menggunakan `arc4random` OpenBSD yang diunggulkan dengan stempel waktu saat fungsi berjalan.
Mendukung metode matematika ES 6 berikut:  
+ `acosh`
+ `asinh`
+ `atanh`
+ `cbrt`
+ `clz32`
+ `cosh`
+ `expm1`
+ `fround`
+ `hypot`
+ `imul`
+ `log10`
+ `log1p`
+ `log2`
+ `sign`
+ `sinh`
+ `tanh`
+ `trunc`
+ `E`
+ `LN10`
+ `LN2`
+ `LOG10E`
+ `LOG2E`
+ `PI`
+ `SQRT1_2`
+ `SQRT2`

**Tanggal**  
Mendukung semua fitur ES 5.1 `Date`.  
Untuk alasan keamanan, `Date` selalu mengembalikan nilai yang sama—waktu mulai fungsi ini—saat menjalankan fungsi tunggal. Untuk informasi selengkapnya, lihat [Fitur yang dibatasi](#writing-functions-javascript-features-restricted-features).

**Fungsi**  
Mendukung metode `apply`, `bind`, dan `call`.  
Tidak mendukung konstruktor fungsi.

**Ekspresi reguler**  
Mendukung semua fitur ekspresi reguler ES 5.1. Bahasa ekspresi reguler adalah kompatibel dengan Perl. Mendukung kelompok penangkap bernama ES 9.

**JSON**  
Mendukung semua fitur JSON ES 5.1 JSON, termasuk `parse` dan `stringify`.

**Susunan**  
Mendukung metode ES 5.1 berikut pada susunan:  
+ `isArray`
+ `prototype.concat`
+ `prototype.every`
+ `prototype.filter`
+ `prototype.forEach`
+ `prototype.indexOf`
+ `prototype.join`
+ `prototype.lastIndexOf`
+ `prototype.map`
+ `prototype.pop`
+ `prototype.push`
+ `prototype.reduce`
+ `prototype.reduceRight`
+ `prototype.reverse`
+ `prototype.shift`
+ `prototype.slice`
+ `prototype.some`
+ `prototype.sort`
+ `prototype.splice`
+ `prototype.unshift`
Mendukung metode ES 6 berikut pada susunan:  
+ `of`
+ `prototype.copyWithin`
+ `prototype.fill`
+ `prototype.find`
+ `prototype.findIndex`
Mendukung metode ES 7 berikut pada susunan:  
+ `prototype.includes`

**Susunan yang dijeniskan**  
Mendukung susunan yang diketik ES 6 berikut:  
+ `Int8Array`
+ `Uint8Array`
+ `Uint8ClampedArray`
+ `Int16Array`
+ `Uint16Array`
+ `Int32Array`
+ `Uint32Array`
+ `Float32Array`
+ `Float64Array`
+ `prototype.copyWithin`
+ `prototype.fill`
+ `prototype.join`
+ `prototype.set`
+ `prototype.slice`
+ `prototype.subarray`
+ `prototype.toString`

**ArrayBuffer**  
Mendukung metode pada `ArrayBuffer` berikut:  
+ `prototype.isView`
+ `prototype.slice`

**Janji**  
Mendukung metode janji berikut:  
+ `reject`
+ `resolve`
+ `prototype.catch`
+ `prototype.finally`
+ `prototype.then`

**Kripto**  
Modul kriptografi menyediakan hashing standar dan pembantu kode autentikasi pesan berbasis hash (HMAC). Anda dapat memuat modul menggunakan `require('crypto')`. Modul ini memperlihatkan metode berikut yang berperilaku persis seperti rekan-rekan Node.js mereka:  
+ `createHash(algorithm)`
+ `hash.update(data)`
+ `hash.digest([encoding])`
+ `createHmac(algorithm, secret key)`
+ `hmac.update(data)`
+ `hmac.digest([encoding])`
Untuk informasi lebih lanjut, lihat [Kripto (hash dan HMAC)](#writing-functions-javascript-features-builtin-modules-crypto) di bagian modul bawaan.

**Konsol**  
Ini adalah objek pembantu untuk debugging. Ini hanya mendukung metode `log()`, untuk merekam pesan log.  
CloudFront Fungsi tidak mendukung sintaks koma, seperti. `console.log('a', 'b')` Sebagai gantinya, gunakan `console.log('a' + ' ' + 'b')` formatnya.

## Jenis kesalahan
<a name="writing-functions-javascript-features-error-types"></a>

Mendukung objek kesalahan berikut:
+ `Error`
+ `EvalError`
+ `InternalError`
+ `MemoryError`
+ `RangeError`
+ `ReferenceError`
+ `SyntaxError`
+ `TypeError`
+ `URIError`

## Global
<a name="writing-functions-javascript-features-globals"></a>

Mendukung objek `globalThis`.

Mendukung fungsi global ES 5.1 berikut:
+ `decodeURI`
+ `decodeURIComponent`
+ `encodeURI`
+ `encodeURIComponent`
+ `isFinite`
+ `isNaN`
+ `parseFloat`
+ `parseInt`

Mendukung konstanta global berikut:
+ `NaN`
+ `Infinity`
+ `undefined`

## Modul bawaan
<a name="writing-functions-javascript-features-builtin-modules"></a>

Mendukung modul bawaan berikut.

**Topics**
+ [Kripto (hash dan HMAC)](#writing-functions-javascript-features-builtin-modules-crypto)
+ [String kueri](#writing-functions-javascript-features-builtin-modules-query-string)

### Kripto (hash dan HMAC)
<a name="writing-functions-javascript-features-builtin-modules-crypto"></a>

Modul kriptografi (`crypto`) menyediakan hashing standar dan pembantu kode autentikasi pesan berbasis hash (HMAC). Anda dapat memuat modul menggunakan `require('crypto')`. Modul ini menyediakan metode berikut yang berperilaku persis seperti rekan-rekan Node.js mereka.

**Metode hashing**

`crypto.createHash(algorithm)`  
Menciptakan dan mengembalikan objek hash yang dapat digunakan untuk menghasilkan hash digests menggunakan algoritme yang diberikan: `md5`, `sha1`, atau `sha256`.

`hash.update(data)`  
Update konten hash dengan `data` yang tersedia.

`hash.digest([encoding])`  
Menghitung digest dari semua data yang diteruskan menggunakan `hash.update()`. Pengkodean dapat berupa `hex`, `base64`, atau `base64url`.

**Metode HMAC**

`crypto.createHmac(algorithm, secret key)`  
Menciptakan dan mengembalikan objek HMAC yang menggunakan `algorithm` dan `secret key` yang tersedia. Algoritma dapat berupa `md5`, `sha1`, atau `sha256`.

`hmac.update(data)`  
Memperbarui konten HMAC dengan `data` yang tersedia.

`hmac.digest([encoding])`  
Menghitung digest dari semua data yang diteruskan menggunakan `hmac.update()`. Pengkodean dapat berupa `hex`, `base64`, atau `base64url`.

### String kueri
<a name="writing-functions-javascript-features-builtin-modules-query-string"></a>

**catatan**  
[Objek acara CloudFront Functions](functions-event-structure.md) secara otomatis mem-parsing string kueri URL untuk Anda. Itu berarti bahwa dalam kebanyakan kasus Anda tidak perlu menggunakan modul ini.

Modul string kueri (`querystring`) menyediakan metode untuk mengurai dan memformat string kueri URL. Anda dapat memuat modul menggunakan `require('querystring')`. Modul ini menyediakan metode berikut.

`querystring.escape(string)`  
Mengkodekan URL `string` yang tersedia, mengembalikan string kueri yang lolos. Metode ini digunakan oleh `querystring.stringify()` dan tidak boleh digunakan secara langsung.

`querystring.parse(string[, separator[, equal[, options]]])`  
Mengurai string kueri (`string`) dan mengembalikan objek.  
Parameter `separator` adalah substring untuk membatasi pasangan kunci dan nilai dalam string kueri. Secara default, itu adalah `&`.  
Parameter `equal` adalah substring untuk membatasi kunci dan nilai dalam string kueri. Secara default, itu adalah `=`.  
Parameter `options` adalah objek dengan kunci berikut:    
`decodeURIComponent function`  
Sebuah fungsi untuk memecahkan kode karakter persentase dikodekan dalam string kueri. Secara default, itu adalah `querystring.unescape()`.  
`maxKeys number`  
Jumlah kunci maksimum untuk diurai Secara default, itu adalah `1000`. Gunakan nilai `0` untuk menghapus pembatasan untuk menghitung kunci.
Secara default, karakter persentase dikodekan dalam string kueri diasumsikan menggunakan pengkodean UTF-8. Urutan UTF-8 tidak valid diganti dengan karakter pengganti `U+FFFD`.  
Misalnya, untuk string kueri berikut:  

```
'name=value&abc=xyz&abc=123'
```
Nilai `querystring.parse()` yang dikembalikan adalah:  

```
{
name: 'value',
abc: ['xyz', '123']
}
```
`querystring.decode()` adalah alias untuk `querystring.parse()`.

`querystring.stringify(object[, separator[, equal[, options]]])`  
Menyerialisasi `object` dan mengembalikan string kueri.  
Parameter `separator` adalah substring untuk membatasi pasangan kunci dan nilai dalam string kueri. Secara default, itu adalah `&`.  
Parameter `equal` adalah substring untuk membatasi kunci dan nilai dalam string kueri. Secara default, itu adalah `=`.  
Parameter `options` adalah objek dengan kunci berikut:    
`encodeURIComponent function`  
Fungsi yang digunakan untuk mengonversi karakter URL yang tidak aman untuk pengkodean persentase dalam string kueri. Secara default, itu adalah `querystring.escape()`.
Secara default, karakter yang memerlukan pengkodean persentase dalam string kueri dikodekan sebagai UTF-8. Untuk menggunakan pengkodean yang berbeda, tentukan opsi `encodeURIComponent`.  
Misalnya, gunakan kode berikut:  

```
querystring.stringify({ name: 'value', abc: ['xyz', '123'], anotherName: '' });
```
Nilai yang dikembalikan adalah:  

```
'name=value&abc=xyz&abc=123&anotherName='
```
`querystring.encode()` adalah alias untuk `querystring.stringify()`.

`querystring.unescape(string)`  
Mendekode karakter yang dikodekan persentase URL dalam `string` yang tersedia, mengembalikan string kueri yang tidak lolos. Metode ini digunakan oleh `querystring.parse()` dan tidak boleh digunakan secara langsung.

## Fitur yang dibatasi
<a name="writing-functions-javascript-features-restricted-features"></a>

Fitur JavaScript bahasa berikut tidak didukung atau dibatasi karena masalah keamanan.

**Evaluasi kode dinamis**  
Evaluasi kode dinamis tidak didukung. Konstruktor `eval()` dan `Function` mengalami kesalahan jika dicoba. Misalnya, `const sum = new Function('a', 'b', 'return a + b')` mengalami kesalahan.

**Timer**  
Fungsi `setTimeout()`, `setImmediate()`, dan `clearTimeout()` tidak didukung. Tidak ada ketentuan untuk menunda atau menghasilkan dalam fungsi jalankan. Fungsi Anda harus dijalankan secara serentak sampai selesai.

**Tanggal dan stempel waktu**  
Untuk alasan keamanan, tidak ada akses ke timer beresolusi tinggi. Semua metode `Date` untuk meminta waktu saat ini selalu mengembalikan nilai yang sama saat menjalankan fungsi tunggal. Stempel waktu yang dikembalikan adalah waktu fungsi mulai berjalan. Akibatnya, Anda tidak dapat mengukur waktu berlalu dalam fungsi Anda.

**Akses sistem file**  
Tidak ada akses sistem file. Misalnya, tidak ada modul `fs` untuk akses sistem file seperti yang ada di Node.js.

**Akses proses**  
Tidak ada akses proses. Misalnya, tidak ada objek `process` global untuk memproses akses informasi seperti yang ada di Node.js.

**Variabel-variabel lingkungan**  
Tidak ada akses ke variabel lingkungan.   
Sebagai gantinya, Anda dapat menggunakan CloudFront KeyValueStore untuk membuat datastore terpusat dari pasangan kunci-nilai untuk Fungsi Anda. CloudFront CloudFront KeyValueStore memungkinkan pembaruan dinamis ke data konfigurasi Anda tanpa perlu menerapkan perubahan kode. Anda harus menggunakan [JavaScript runtime 2.0](functions-javascript-runtime-20.md) untuk menggunakannya CloudFront KeyValueStore. Untuk informasi selengkapnya, lihat [Amazon CloudFront KeyValueStore](kvs-with-functions.md).

**Akses jaringan**  
Tidak ada dukungan untuk panggilan jaringan. Misalnya, XHR, HTTP (S), dan soket tidak didukung.

# JavaScript fitur runtime 2.0 untuk Fungsi CloudFront
<a name="functions-javascript-runtime-20"></a>

Lingkungan JavaScript runtime CloudFront Functions sesuai dengan [ECMAScript (ES) versi 5.1](https://262.ecma-international.org/5.1/) dan juga mendukung beberapa fitur ES versi 6 hingga 12. Lingkungan ini juga menyediakan beberapa metode standar yang bukan bagian dari spesifikasi ES. Topik berikut mencantumkan semua fitur yang didukung dalam runtime ini.

**Topics**
+ [Fitur inti](#writing-functions-javascript-features-core-20)
+ [Objek primitif](#writing-functions-javascript-features-primitive-objects-20)
+ [Objek bawaan](#writing-functions-javascript-features-builtin-objects-20)
+ [Jenis kesalahan](#writing-functions-javascript-features-error-types-20)
+ [Global](#writing-functions-javascript-features-globals-20)
+ [Modul bawaan](#writing-functions-javascript-features-builtin-modules-20)
+ [Fitur yang dibatasi](#writing-functions-javascript-features-restricted-features-20)

## Fitur inti
<a name="writing-functions-javascript-features-core-20"></a>

Mendukung fitur inti ES berikut.

**Jenis**  
Mendukung semua jenis ES 5.1. Ini termasuk nilai boolean, angka, string, objek, array, fungsi, dan ekspresi reguler.

**Operator**  
Mendukung Semua operator ES 5.1 didukung.  
Mendukung operator eksponensial ES 7 (`**`).

**Pernyataan**  
Mendukung pernyataan ES 5.1 berikut:  
+ `break`
+ `catch`
+ `continue`
+ `do-while`
+ `else`
+ `finally`
+ `for`
+ `for-in`
+ `if`
+ `label`
+ `return`
+ `switch`
+ `throw`
+ `try`
+ `var`
+ `while`
Pernyataan ES 6 berikut didukung:  
+ `const`
+ `let`
Pernyataan ES 8 berikut didukung:  
+ `async`
+ `await`
`async`,`await`,`const`, dan `let` didukung dalam JavaScript runtime 2.0.  
`await`hanya dapat digunakan di dalam `async` fungsi. `async`argumen dan penutupan tidak didukung.

**Literal**  
Literal template ES 6 didukung: string multiline, interpolasi ekspresi, dan templat bersarang.

**Fungsi**  
Mendukung semua fitur fungsi ES 5.1.  
Mendukung fungsi panah ES 6 didukung, dan sintaks parameter ES 6 sintaks parameter istirahat.

**Unicode**  
Sumber teks dan literal string dapat berisi karakter Unicode yang dikodekan. Juga mendukung unicode code point escape sequence enam karakter (misalnya, `\uXXXX`).

**Mode ketat**  
Fungsi beroperasi dalam mode ketat secara default, sehingga Anda tidak perlu menambahkan pernyataan `use strict` dalam kode fungsi Anda. Ini tidak dapat diubah.

## Objek primitif
<a name="writing-functions-javascript-features-primitive-objects-20"></a>

Mendukung objek primitif ES berikut.

**Objek**  
Mendukung metode ES 5.1 berikut pada objek:  
+ `Object.create()` (tanpa daftar properti)
+ `Object.defineProperties()`
+ `Object.defineProperty()`
+ `Object.freeze()`
+ `Object.getOwnPropertyDescriptor()`
+ `Object.getOwnPropertyDescriptors()`
+ `Object.getOwnPropertyNames()`
+ `Object.getPrototypeOf()`
+ `Object.isExtensible()`
+ `Object.isFrozen()`
+ `Object.isSealed()`
+ `Object.keys()`
+ `Object.preventExtensions()`
+ `Object.seal()`
Mendukung metode ES 6 berikut pada objek:  
+ `Object.assign()`
Mendukung metode ES 8 berikut pada objek:  
+ `Object.entries()`
+ `Object.values()`
Metode prototipe ES 5.1 berikut pada objek didukung:  
+ `Object.prototype.hasOwnProperty()`
+ `Object.prototype.isPrototypeOf()`
+ `Object.prototype.propertyIsEnumerable()`
+ `Object.prototype.toString()`
+ `Object.prototype.valueOf()`
Metode prototipe ES 6 berikut pada objek didukung:  
+ `Object.prototype.is()`
+ `Object.prototype.setPrototypeOf()`

**String**  
Mendukung metode ES 5.1 berikut pada string:  
+ `String.fromCharCode()`
Mendukung metode ES 6 berikut pada string:  
+ `String.fromCodePoint()`
Metode prototipe ES 5.1 berikut pada string didukung:  
+ `String.prototype.charAt()`
+ `String.prototype.concat()`
+ `String.prototype.indexOf()`
+ `String.prototype.lastIndexOf()`
+ `String.prototype.match()`
+ `String.prototype.replace()`
+ `String.prototype.search()`
+ `String.prototype.slice()`
+ `String.prototype.split()`
+ `String.prototype.substr()`
+ `String.prototype.substring()`
+ `String.prototype.toLowerCase()`
+ `String.prototype.trim()`
+ `String.prototype.toUpperCase()`
Metode prototipe ES 6 berikut pada string didukung:  
+ `String.prototype.codePointAt()`
+ `String.prototype.endsWith()`
+ `String.prototype.includes()`
+ `String.prototype.repeat()`
+ `String.prototype.startsWith()`
Metode prototipe ES 8 berikut pada string didukung:  
+ `String.prototype.padStart()`
+ `String.prototype.padEnd()`
Metode prototipe ES 9 berikut pada string didukung:  
+ `String.prototype.trimStart()`
+ `String.prototype.trimEnd()`
Metode prototipe ES 12 berikut pada string didukung:  
+ `String.prototype.replaceAll()`
**catatan**  
`String.prototype.replaceAll()`baru di JavaScript runtime 2.0.

**Bilangan**  
SEMUA nomor ES 5 didukung.  
Properti ES 6 berikut pada angka didukung:  
+ `Number.EPSILON`
+ `Number.MAX_SAFE_INTEGER`
+ `Number.MIN_SAFE_INTEGER`
+ `Number.MAX_VALUE`
+ `Number.MIN_VALUE`
+ `Number.NaN`
+ `Number.NEGATIVE_INFINITY`
+ `Number.POSITIVE_INFINITY`
Mendukung metode ES 6 berikut pada nomor:  
+ `Number.isFinite()`
+ `Number.isInteger()`
+ `Number.isNaN()`
+ `Number.isSafeInteger()`
+ `Number.parseInt()`
+ `Number.parseFloat()`
Metode prototipe ES 5.1 berikut pada angka didukung:  
+ `Number.prototype.toExponential()`
+ `Number.prototype.toFixed()`
+ `Number.prototype.toPrecision()`
Pemisah numerik ES 12 didukung.  
Pemisah numerik ES 12 baru di JavaScript runtime 2.0.

## Objek bawaan
<a name="writing-functions-javascript-features-builtin-objects-20"></a>

Mendukung objek ES bawaan berikut.

**Matematika**  
Mendukung semua metode matematika ES 5.1.  
Di lingkungan runtime CloudFront Functions, `Math.random()` implementasi menggunakan `arc4random` OpenBSD yang diunggulkan dengan stempel waktu saat fungsi berjalan.
Properti matematika ES 6 berikut didukung:  
+ `Math.E`
+ `Math.LN10`
+ `Math.LN2`
+ `Math.LOG10E`
+ `Math.LOG2E`
+ `Math.PI`
+ `Math.SQRT1_2`
+ `Math.SQRT2`
Mendukung metode matematika ES 6 berikut:  
+ `Math.abs()`
+ `Math.acos()`
+ `Math.acosh()`
+ `Math.asin()`
+ `Math.asinh()`
+ `Math.atan()`
+ `Math.atan2()`
+ `Math.atanh()`
+ `Math.cbrt()`
+ `Math.ceil()`
+ `Math.clz32()`
+ `Math.cos()`
+ `Math.cosh()`
+ `Math.exp()`
+ `Math.expm1()`
+ `Math.floor()`
+ `Math.fround()`
+ `Math.hypot()`
+ `Math.imul()`
+ `Math.log()`
+ `Math.log1p()`
+ `Math.log2()`
+ `Math.log10()`
+ `Math.max()`
+ `Math.min()`
+ `Math.pow()`
+ `Math.random()`
+ `Math.round()`
+ `Math.sign()`
+ `Math.sinh()`
+ `Math.sin()`
+ `Math.sqrt()`
+ `Math.tan()`
+ `Math.tanh()`
+ `Math.trunc()`

**Tanggal**  
Mendukung semua fitur ES 5.1 `Date`.  
Untuk alasan keamanan, `Date` selalu mengembalikan nilai yang sama—waktu mulai fungsi ini—saat menjalankan fungsi tunggal. Untuk informasi selengkapnya, lihat [Fitur yang dibatasi](functions-javascript-runtime-10.md#writing-functions-javascript-features-restricted-features).

**Fungsi**  
Metode prototipe ES 5.1 berikut didukung:  
+ `Function.prototype.apply()`
+ `Function.prototype.bind()`
+ `Function.prototype.call()`
Tidak mendukung konstruktor fungsi.

**Ekspresi reguler**  
Mendukung semua fitur ekspresi reguler ES 5.1. Bahasa ekspresi reguler adalah kompatibel dengan Perl.  
Properti pengakses prototipe ES 5.1 berikut didukung:  
+ `RegExp.prototype.global`
+ `RegExp.prototype.ignoreCase`
+ `RegExp.protoype.multiline`
+ `RegExp.protoype.source`
+ `RegExp.prototype.sticky`
+ `RegExp.prototype.flags`
**catatan**  
`RegExp.prototype.sticky`dan `RegExp.prototype.flags` baru di JavaScript runtime 2.0.
Metode prototipe ES 5.1 berikut didukung:  
+ `RegExp.prototype.exec()`
+ `RegExp.prototype.test()`
+ `RegExp.prototype.toString()`
+ `RegExp.prototype[@@replace]()`
+ `RegExp.prototype[@@split]()`
**catatan**  
`RegExp.prototype[@@split]()`baru di JavaScript runtime 2.0.
Properti instans ES 5.1 berikut didukung:  
+ `lastIndex`
Mendukung kelompok penangkap bernama ES 9.

**JSON**  
Metode ES 5.1 berikut didukung:  
+ `JSON.parse()`
+ `JSON.stringify()`

**Array**  
Mendukung metode ES 5.1 berikut pada susunan:  
+ `Array.isArray()`
Mendukung metode ES 6 berikut pada susunan:  
+ `Array.of()`
Metode prototipe ES 5.1 berikut didukung:  
+ `Array.prototype.concat()`
+ `Array.prototype.every()`
+ `Array.prototype.filter()`
+ `Array.prototype.forEach()`
+ `Array.prototype.indexOf()`
+ `Array.prototype.join()`
+ `Array.prototype.lastIndexOf()`
+ `Array.prototype.map()`
+ `Array.prototype.pop()`
+ `Array.prototype.push()`
+ `Array.prototype.reduce()`
+ `Array.prototype.reduceRight()`
+ `Array.prototype.reverse()`
+ `Array.prototype.shift()`
+ `Array.prototype.slice()`
+ `Array.prototype.some()`
+ `Array.prototype.sort()`
+ `Array.prototype.splice()`
+ `Array.prototype.unshift()`
Metode prototipe ES 6 berikut didukung  
+ `Array.prototype.copyWithin()`
+ `Array.prototype.fill()`
+ `Array.prototype.find()`
+ `Array.prototype.findIndex()`
Metode prototipe ES 7 berikut didukung:  
+ `Array.prototype.includes()`

**Susunan yang dijeniskan**  
Konstruktor array yang diketik ES 6 berikut didukung:  
+ `Float32Array`
+ `Float64Array`
+ `Int8Array`
+ `Int16Array`
+ `Int32Array`
+ `Uint8Array`
+ `Uint8ClampedArray`
+ `Uint16Array`
+ `Uint32Array`
Metode ES 6 berikut didukung:  
+ `TypedArray.from()`
+ `TypedArray.of()`
**catatan**  
`TypedArray.from()`dan `TypedArray.of()` baru di JavaScript runtime 2.0.
Metode prototipe ES 6 berikut didukung:  
+ `TypedArray.prototype.copyWithin()`
+ `TypedArray.prototype.every()`
+ `TypedArray.prototype.fill()`
+ `TypedArray.prototype.filter()`
+ `TypedArray.prototype.find()`
+ `TypedArray.prototype.findIndex()`
+ `TypedArray.prototype.forEach()`
+ `TypedArray.prototype.includes()`
+ `TypedArray.prototype.indexOf()`
+ `TypedArray.prototype.join()`
+ `TypedArray.prototype.lastIndexOf()`
+ `TypedArray.prototype.map()`
+ `TypedArray.prototype.reduce()`
+ `TypedArray.prototype.reduceRight()`
+ `TypedArray.prototype.reverse()`
+ `TypedArray.prototype.some()`
+ `TypedArray.prototype.set()`
+ `TypedArray.prototype.slice()`
+ `TypedArray.prototype.sort()`
+ `TypedArray.prototype.subarray()`
+ `TypedArray.prototype.toString()`
**catatan**  
`TypedArray.prototype.every()`,`TypedArray.prototype.fill()`,`TypedArray.prototype.filter()`,`TypedArray.prototype.find()`,`TypedArray.prototype.findIndex()`,,`TypedArray.prototype.forEach()`,`TypedArray.prototype.includes()`,`TypedArray.prototype.indexOf()`,`TypedArray.prototype.join()`,`TypedArray.prototype.lastIndexOf()`,`TypedArray.prototype.map()`,`TypedArray.prototype.reduce()`,`TypedArray.prototype.reduceRight()`,`TypedArray.prototype.reverse()`,, dan `TypedArray.prototype.some()` baru di JavaScript runtime 2.0.

**ArrayBuffer**  
Metode ES 6 berikut ArrayBuffer didukung:  
+ `isView()`
Metode prototipe ES 6 berikut ArrayBuffer didukung:  
+ `ArrayBuffer.prototype.slice()`

**Janji**  
Metode ES 6 berikut pada janji didukung:  
+ `Promise.all()`
+ `Promise.allSettled()`
+ `Promise.any()`
+ `Promise.reject()`
+ `Promise.resolve()`
+ `Promise.race()`
**catatan**  
`Promise.all()`,`Promise.allSettled()`,`Promise.any()`, dan `Promise.race()` baru di JavaScript runtime 2.0.
Metode prototipe ES 6 berikut pada janji didukung:  
+ `Promise.prototype.catch()`
+ `Promise.prototype.finally()`
+ `Promise.prototype.then()`

**DataView**  
Metode prototipe ES 6 berikut didukung:  
+ `DataView.prototype.getFloat32()`
+ `DataView.prototype.getFloat64()`
+ `DataView.prototype.getInt16()`
+ `DataView.prototype.getInt32()`
+ `DataView.prototype.getInt8()`
+ `DataView.prototype.getUint16()`
+ `DataView.prototype.getUint32()`
+ `DataView.prototype.getUint8()`
+ `DataView.prototype.setFloat32()`
+ `DataView.prototype.setFloat64()`
+ `DataView.prototype.setInt16()`
+ `DataView.prototype.setInt32()`
+ `DataView.prototype.setInt8()`
+ `DataView.prototype.setUint16()`
+ `DataView.prototype.setUint32()`
+ `DataView.prototype.setUint8()`
**catatan**  
Semua metode prototipe Dataview ES 6 baru di JavaScript runtime 2.0.

**Simbol**  
Metode ES 6 berikut didukung:  
+ `Symbol.for()`
+ `Symbol.keyfor()`
**catatan**  
Semua metode Symbol ES 6 baru di JavaScript runtime 2.0.

**Teks Decoder**  
Metode prototipe berikut didukung:  
+ `TextDecoder.prototype.decode()`
Properti pengakses prototipe berikut didukung:  
+ `TextDecoder.prototype.encoding`
+ `TextDecoder.prototype.fatal`
+ `TextDecoder.prototype.ignoreBOM`

**Encoder Teks**  
Metode prototipe berikut didukung:  
+ `TextEncoder.prototype.encode()`
+ `TextEncoder.prototype.encodeInto()`

**Konsol**  
Ini adalah objek pembantu untuk debugging. Ini hanya mendukung metode `log()`, untuk merekam pesan log.  
CloudFront Fungsi tidak mendukung sintaks koma, seperti. `console.log('a', 'b')` Sebagai gantinya, gunakan `console.log('a' + ' ' + 'b')` formatnya.

## Jenis kesalahan
<a name="writing-functions-javascript-features-error-types-20"></a>

Mendukung objek kesalahan berikut:
+ `Error`
+ `EvalError`
+ `InternalError`
+ `RangeError`
+ `ReferenceError`
+ `SyntaxError`
+ `TypeError`
+ `URIError`

## Global
<a name="writing-functions-javascript-features-globals-20"></a>

Mendukung objek `globalThis`.

Mendukung fungsi global ES 5.1 berikut:
+ `decodeURI()`
+ `decodeURIComponent()`
+ `encodeURI()`
+ `encodeURIComponent()`
+ `isFinite()`
+ `isNaN()`
+ `parseFloat()`
+ `parseInt()`

Fungsi global ES 6 berikut didukung:
+ `atob()`
+ `btoa()`
**catatan**  
`atob()`dan `btoa()` baru di JavaScript runtime 2.0.

Mendukung konstanta global berikut:
+ `NaN`
+ `Infinity`
+ `undefined`
+ `arguments`

## Modul bawaan
<a name="writing-functions-javascript-features-builtin-modules-20"></a>

Mendukung modul bawaan berikut.

**Topics**
+ [Penyangga](#writing-functions-javascript-features-builtin-modules-buffer-20)
+ [String kueri](#writing-functions-javascript-features-builtin-modules-query-string-20)
+ [Kripto](#writing-functions-javascript-features-builtin-modules-crypto-20)

### Penyangga
<a name="writing-functions-javascript-features-builtin-modules-buffer-20"></a>

Modul ini menyediakan metode berikut:
+ `Buffer.alloc(size[, fill[, encoding]])`

  Alokasikan a. `Buffer`
  + `size`: Ukuran penyangga. Masukkan bilangan bulat.
  + `fill`: Opsional. Masukkan string,`Buffer`, Uint8Array, atau integer. Default-nya adalah `0`. 
  + `encoding`: Opsional. `fill`Kapan string, masukkan salah satu dari berikut ini:`utf8`,`hex`,`base64`,`base64url`. Default-nya adalah `utf8`.
+ `Buffer.allocUnsafe(size)`

  Alokasikan `Buffer` non-inisialisasi.
  + `size`: Masukkan bilangan bulat.
+ `Buffer.byteLength(value[, encoding])`

  Kembalikan panjang nilai, dalam byte.
  + `value`: Sebuah string,,`Buffer`, Dataview TypedArray, atau Arraybuffer.
  + `encoding`: Opsional. `value`Kapan string, masukkan salah satu dari berikut ini:`utf8`,`hex`,`base64`,`base64url`. Default-nya adalah `utf8`.
+ `Buffer.compare(buffer1, buffer2)`

  Bandingkan dua `Buffer` s untuk membantu mengurutkan array. Mengembalikan `0` jika mereka sama, `-1` jika `buffer1` datang lebih dulu, atau `1` jika `buffer2` datang lebih dulu.
  + `buffer1`: Masukkan a`Buffer`.
  + `buffer2`: Masukkan yang berbeda`Buffer`.
+ `Buffer.concat(list[, totalLength])`

  Gandungkan beberapa s. `Buffer` Kembali `0` jika tidak ada. Kembali hingga`totalLength`.
  + `list`: Masukkan daftar `Buffer` s. Perhatikan ini akan dipotong menjadi. `totalLength`
  + `totalLength`: Opsional. Masukkan bilangan bulat yang tidak ditandatangani. Gunakan jumlah `Buffer` instance dalam daftar jika kosong.
+ `Buffer.from(array)`

  Buat `Buffer` dari array.
  + `array`: Masukkan array byte dari `0` ke`255`. 
+ `Buffer.from(arrayBuffer, byteOffset[, length]))`

  Buat tampilan dari`arrayBuffer`, mulai dari offset `byteOffset` dengan panjang`length`.
  + `arrayBuffer`: Masukkan `Buffer` array.
  + `byteOffset`: Masukkan bilangan bulat.
  + `length`: Opsional. Masukkan bilangan bulat.
+ `Buffer.from(buffer)`

  Buat salinan dari`Buffer`.
  + `buffer`: Masukkan a`Buffer`.
+ `Buffer.from(object[, offsetOrEncoding[, length]])`

  Buat `Buffer` dari objek. Mengembalikan `Buffer.from(object.valueOf(), offsetOrEncoding, length)` jika `valueOf()` tidak sama dengan objek.
  + `object`: Masukkan objek.
  + `offsetOrEncoding`: Opsional. Masukkan integer atau string encoding.
  + `length`: Opsional. Masukkan bilangan bulat.
+ `Buffer.from(string[, encoding])`

  Buat `Buffer` dari string.
  + `string`: Masukkan string.
  + `encoding`: Opsional. Masukkan salah satu dari berikut ini:`utf8`,`hex`,`base64`,`base64url`. Default-nya adalah `utf8`.
+ `Buffer.isBuffer(object)`

  Periksa apakah `object` itu Buffer. Pengembalian `true` atau`false`.
  + `object`: Masukkan objek.
+ `Buffer.isEncoding(encoding)`

  Periksa `encoding` apakah didukung. Pengembalian `true` atau`false`.
  + `encoding`: Opsional. Masukkan salah satu dari berikut ini:`utf8`,`hex`,`base64`,`base64url`. Default-nya adalah `utf8`.

Modul ini menyediakan metode prototipe buffer berikut:
+ `Buffer.prototype.compare(target[, targetStart[, targetEnd[, sourceStart[, sourceEnd]]]])`

  Bandingkan `Buffer` dengan target. Mengembalikan `0` jika mereka sama, `1` jika `buffer` datang lebih dulu, atau `-1` jika `target` datang lebih dulu.
  + `target`: Masukkan a`Buffer`.
  + `targetStart`: Opsional. Masukkan bilangan bulat. Default-nya adalah 0.
  + `targetEnd`: Opsional. Masukkan bilangan bulat. Default adalah `target` panjang.
  + `sourceStart`: Opsional. Masukkan bilangan bulat. Default-nya adalah 0.
  + `sourceEnd`: Opsional. Masukkan bilangan bulat. Default adalah `Buffer` panjang.
+ `Buffer.prototype.copy(target[, targetStart[, sourceStart[, sourceEnd]]])`

  Salin buffer ke`target`.
  + `target`: Masukkan a `Buffer` atau`Uint8Array`.
  + `targetStart`: Opsional. Masukkan bilangan bulat. Default-nya adalah 0.
  + `sourceStart`: Opsional. Masukkan bilangan bulat. Default-nya adalah 0.
  + `sourceEnd`: Opsional. Masukkan bilangan bulat. Default adalah `Buffer` panjang.
+ `Buffer.prototype.equals(otherBuffer)`

  Bandingkan `Buffer` dengan`otherBuffer`. Pengembalian `true` atau`false`.
  + `otherBuffer`: Masukkan string.
+ `Buffer.prototype.fill(value[, offset[, end][, encoding])`

  Isi `Buffer` dengan`value`.
  + `value`: Masukkan string,`Buffer`, atau bilangan bulat.
  + `offset`: Opsional. Masukkan bilangan bulat.
  + `end`: Opsional. Masukkan bilangan bulat.
  + `encoding`: Opsional. Masukkan salah satu dari berikut ini:`utf8`,`hex`,`base64`,`base64url`. Default-nya adalah `utf8`.
+ `Buffer.prototype.includes(value[, byteOffset][, encoding])`

  Cari `value` di`Buffer`. Pengembalian `true` atau`false`.
  + `value`: Masukkan string,, `Buffer``Uint8Array`, atau bilangan bulat.
  + `byteOffset`: Opsional. Masukkan bilangan bulat.
  + `encoding`: Opsional. Masukkan salah satu dari berikut ini:`utf8`,`hex`,`base64`,`base64url`. Default-nya adalah `utf8`.
+ `Buffer.prototype.indexOf(value[, byteOffset][, encoding])`

  Cari yang pertama `value` di`Buffer`. Mengembalikan `index` jika ditemukan; kembali `-1` jika tidak ditemukan.
  + `value`: Masukkan string,`Buffer`, Unit8Array, atau bilangan bulat dari 0 hingga 255. 
  + `byteOffset`: Opsional. Masukkan bilangan bulat.
  + `encoding`: Opsional. Masukkan salah satu dari berikut jika `value` adalah string:`utf8`,`hex`,`base64`,`base64url`. Default-nya adalah `utf8`.
+ `Buffer.prototype.lastIndexOf(value[, byteOffset][, encoding])`

  Cari yang terakhir `value` di`Buffer`. Mengembalikan `index` jika ditemukan; kembali `-1` jika tidak ditemukan.
  + `value`: Masukkan string,`Buffer`, Unit8Array, atau bilangan bulat dari 0 hingga 255. 
  + `byteOffset`: Opsional. Masukkan bilangan bulat.
  + `encoding`: Opsional. Masukkan salah satu dari berikut jika `value` adalah string:`utf8`,`hex`,`base64`,`base64url`. Default-nya adalah `utf8`.
+ `Buffer.prototype.readInt8(offset)`

  Baca `Int8` di `offset` dari`Buffer`.
  + `offset`: Masukkan bilangan bulat.
+ `Buffer.prototype.readIntBE(offset, byteLength)`

  Baca `Int` sebagai big-endian di from. `offset` `Buffer`
  + `offset`: Masukkan bilangan bulat.
  + `byteLength`: Opsional. Masukkan bilangan bulat dari `1` ke`6`.
+ `Buffer.prototype.readInt16BE(offset)`

  Baca `Int16` sebagai big-endian di from. `offset` `Buffer`
  + `offset`: Masukkan bilangan bulat.
+ `Buffer.prototype.readInt32BE(offset)`

  Baca `Int32` sebagai big-endian di from. `offset` `Buffer`
  + `offset`: Masukkan bilangan bulat.
+ `Buffer.prototype.readIntLE(offset, byteLength)`

  Baca `Int` sebagai endian kecil di dari. `offset` `Buffer`
  + `offset`: Masukkan bilangan bulat.
  + `byteLength`: Masukkan bilangan bulat dari `1` ke`6`.
+ `Buffer.prototype.readInt16LE(offset)`

  Baca `Int16` sebagai endian kecil di dari. `offset` `Buffer`
  + `offset`: Masukkan bilangan bulat.
+ `Buffer.prototype.readInt32LE(offset)`

  Baca `Int32` sebagai endian kecil di dari. `offset` `Buffer`
  + `offset`: Masukkan bilangan bulat.
+ `Buffer.prototype.readUInt8(offset)`

  Baca `UInt8` di `offset` dari`Buffer`.
  + `offset`: Masukkan bilangan bulat.
+ `Buffer.prototype.readUIntBE(offset, byteLength)`

  Baca `UInt` sebagai big-endian di from. `offset` `Buffer`
  + `offset`: Masukkan bilangan bulat.
  + `byteLength`: Masukkan bilangan bulat dari `1` ke`6`.
+ `Buffer.prototype.readUInt16BE(offset)`

  Baca `UInt16` sebagai big-endian di from. `offset` `Buffer`
+ 
  + `offset`: Masukkan bilangan bulat.
+ `Buffer.prototype.readUInt32BE(offset)`

  Baca `UInt32` sebagai big-endian di from. `offset` `Buffer`
  + `offset`: Masukkan bilangan bulat.
+ `Buffer.prototype.readUIntLE(offset, byteLength)`

  Baca `UInt` sebagai endian kecil di dari. `offset` `Buffer`
  + `offset`: Masukkan bilangan bulat.
  + `byteLength`: Masukkan bilangan bulat dari `1` ke`6`.
+ `Buffer.prototype.readUInt16LE(offset)`

  Baca `UInt16` sebagai endian kecil di dari. `offset` `Buffer`
  + `offset`: Masukkan bilangan bulat.
+ `Buffer.prototype.readUInt32LE(offset)`

  Baca `UInt32` sebagai endian kecil di dari. `offset` `Buffer`
  + `offset`: Masukkan bilangan bulat.
+ `Buffer.prototype.readDoubleBE([offset])`

  Baca 64-bit ganda sebagai big-endian di from. `offset` `Buffer`
  + `offset`: Opsional. Masukkan bilangan bulat.
+ `Buffer.prototype.readDoubleLE([offset])`

  Baca 64-bit ganda sebagai endian kecil di from. `offset` `Buffer`
  + `offset`: Opsional. Masukkan bilangan bulat.
+ `Buffer.prototype.readFloatBE([offset])`

  Baca float 32-bit sebagai big-endian di from. `offset` `Buffer`
  + `offset`: Opsional. Masukkan bilangan bulat.
+ `Buffer.prototype.readFloatLE([offset])`

  Baca float 32-bit sebagai endian kecil di from. `offset` `Buffer`
  + `offset`: Opsional. Masukkan bilangan bulat.
+ `Buffer.prototype.subarray([start[, end]])`

  Mengembalikan salinan `Buffer` yang diimbangi dan dipotong dengan yang baru `start` dan. `end`
  + `start`: Opsional. Masukkan bilangan bulat. Default-nya adalah 0.
  + `end`: Opsional. Masukkan bilangan bulat. Default adalah panjang buffer.
+ `Buffer.prototype.swap16()`

  Tukar urutan byte `Buffer` array, memperlakukannya sebagai array angka 16-bit. `Buffer`panjangnya harus habis dibagi 2, atau Anda akan menerima kesalahan.
+ `Buffer.prototype.swap32()`

  Tukar urutan byte `Buffer` array, memperlakukannya sebagai array angka 32-bit. `Buffer`panjangnya harus habis dibagi 4, atau Anda akan menerima kesalahan.
+ `Buffer.prototype.swap64()`

  Tukar urutan byte `Buffer` array, memperlakukannya sebagai array angka 64-bit. `Buffer`panjangnya harus habis dibagi 8, atau Anda akan menerima kesalahan.
+ `Buffer.prototype.toJSON()`

  Kembali `Buffer` sebagai JSON. 
+ `Buffer.prototype.toString([encoding[, start[, end]]])`

  Konversi`Buffer`, dari `start` ke`end`, ke string yang dikodekan.
  + `encoding`: Opsional. Masukkan salah satu dari berikut ini:`utf8`,`hex`,`base64`, atau`base64url`. Default-nya adalah `utf8`.
  + `start`: Opsional. Masukkan bilangan bulat. Default-nya adalah 0.
  + `end`: Opsional. Masukkan bilangan bulat. Default adalah panjang buffer.
+ `Buffer.prototype.write(string[, offset[, length]][, encoding])`

  Tulis dikodekan `string` ke `Buffer` jika ada spasi, atau terpotong `string` jika tidak ada cukup ruang.
  + `string`: Masukkan string.
  + `offset`: Opsional. Masukkan bilangan bulat. Default-nya adalah 0.
  + `length`: Opsional. Masukkan bilangan bulat. Default adalah panjang string.
  + `encoding`: Opsional. Secara opsional masukkan salah satu dari berikut ini:`utf8`,`hex`,`base64`, atau`base64url`. Default-nya adalah `utf8`.
+ `Buffer.prototype.writeInt8(value, offset, byteLength)`

  Menulis `Int8` `value` dari `byteLength` at `offset` ke`Buffer`.
  + `value`: Masukkan bilangan bulat.
  + `offset`: Masukkan bilangan bulat
  + `byteLength`: Masukkan bilangan bulat dari `1` ke`6`.
+ `Buffer.prototype.writeIntBE(value, offset, byteLength)`

  Menulis `value` di `offset` ke`Buffer`, menggunakan big-endian.
  + `value`: Masukkan bilangan bulat.
  + `offset`: Masukkan bilangan bulat
  + `byteLength`: Masukkan bilangan bulat dari `1` ke`6`.
+ `Buffer.prototype.writeInt16BE(value, offset, byteLength)`

  Menulis `value` di `offset` ke`Buffer`, menggunakan big-endian.
  + `value`: Masukkan bilangan bulat.
  + `offset`: Masukkan bilangan bulat
  + `byteLength`: Masukkan bilangan bulat dari `1` ke`6`.
+ `Buffer.prototype.writeInt32BE(value, offset, byteLength)`

  Menulis `value` di `offset` ke`Buffer`, menggunakan big-endian.
  + `value`: Masukkan bilangan bulat.
  + `offset`: Masukkan bilangan bulat
  + `byteLength`: Masukkan bilangan bulat dari `1` ke`6`.
+ `Buffer.prototype.writeIntLE(offset, byteLength)`

  Menulis `value` di `offset` ke`Buffer`, menggunakan little-endian.
  + `offset`: Masukkan bilangan bulat.
  + `byteLength`: Masukkan bilangan bulat dari `1` ke`6`.
+ `Buffer.prototype.writeInt16LE(offset, byteLength)`

  Menulis `value` di `offset` ke`Buffer`, menggunakan little-endian.
  + `offset`: Masukkan bilangan bulat.
  + `byteLength`: Masukkan bilangan bulat dari `1` ke`6`.
+ `Buffer.prototype.writeInt32LE(offset, byteLength)`

  Menulis `value` di `offset` ke`Buffer`, menggunakan little-endian.
  + `offset`: Masukkan bilangan bulat.
  + `byteLength`: Masukkan bilangan bulat dari `1` ke`6`.
+ `Buffer.prototype.writeUInt8(value, offset, byteLength)`

  Menulis `UInt8` `value` dari `byteLength` at `offset` ke`Buffer`.
  + `value`: Masukkan bilangan bulat.
  + `offset`: Masukkan bilangan bulat
  + `byteLength`: Masukkan bilangan bulat dari `1` ke`6`.
+ `Buffer.prototype.writeUIntBE(value, offset, byteLength)`

  Menulis `value` di `offset` ke`Buffer`, menggunakan big-endian.
  + `value`: Masukkan bilangan bulat.
  + `offset`: Masukkan bilangan bulat
  + `byteLength`: Masukkan bilangan bulat dari `1` ke`6`.
+ `Buffer.prototype.writeUInt16BE(value, offset, byteLength)`

  Menulis `value` di `offset` ke`Buffer`, menggunakan big-endian.
  + `value`: Masukkan bilangan bulat.
  + `offset`: Masukkan bilangan bulat
  + `byteLength`: Masukkan bilangan bulat dari `1` ke`6`.
+ `Buffer.prototype.writeUInt32BE(value, offset, byteLength)`

  Menulis `value` di `offset` ke`Buffer`, menggunakan big-endian.
  + `value`: Masukkan bilangan bulat.
  + `offset`: Masukkan bilangan bulat
  + `byteLength`: Masukkan bilangan bulat dari `1` ke`6`.
+ `Buffer.prototype.writeUIntLE(value, offset, byteLength)`

  Menulis `value` di `offset` ke`Buffer`, menggunakan little-endian.
  + `value`: Masukkan bilangan bulat.
  + `offset`: Masukkan bilangan bulat
  + `byteLength`: Masukkan bilangan bulat dari `1` ke`6`.
+ `Buffer.prototype.writeUInt16LE(value, offset, byteLength)`

  Menulis `value` di `offset` ke`Buffer`, menggunakan little-endian.
  + `value`: Masukkan bilangan bulat.
  + `offset`: Masukkan bilangan bulat
  + `byteLength`: Masukkan bilangan bulat dari `1` ke`6`.
+ `Buffer.prototype.writeUInt32LE(value, offset, byteLength)`

  Menulis `value` di `offset` ke`Buffer`, menggunakan little-endian.
  + `value`: Masukkan bilangan bulat.
  + `offset`: Masukkan bilangan bulat
  + `byteLength`: Masukkan bilangan bulat dari `1` ke`6`.
+ `Buffer.prototype.writeDoubleBE(value, [offset])`

  Menulis `value` di `offset` ke`Buffer`, menggunakan big-endian.
  + `value`: Masukkan bilangan bulat.
  + `offset`: Opsional. Masukkan bilangan bulat. Default-nya adalah 0.
+ `Buffer.prototype.writeDoubleLE(value, [offset])`

  Menulis `value` di `offset` ke`Buffer`, menggunakan little-endian.
  + `value`: Masukkan bilangan bulat.
  + `offset`: Opsional. Masukkan bilangan bulat. Default-nya adalah 0.
+ `Buffer.prototype.writeFloatBE(value, [offset])`

  Menulis `value` di `offset` ke`Buffer`, menggunakan big-endian.
  + `value`: Masukkan bilangan bulat.
  + `offset`: Opsional. Masukkan bilangan bulat. Default-nya adalah 0.
+ `Buffer.prototype.writeFloatLE(value, [offset])`

  Menulis `value` di `offset` ke`Buffer`, menggunakan little-endian.
  + `value`: Masukkan bilangan bulat.
  + `offset`: Opsional. Masukkan bilangan bulat. Default-nya adalah 0.

Metode contoh berikut didukung:
+ `buffer[index]`

  Dapatkan dan atur oktet (byte) di `index` dalam. `Buffer` 
  + Dapatkan nomor dari `0` ke`255`. Atau tetapkan angka dari dari `0` ke`255`.

Properti contoh berikut didukung:
+ `buffer`

  Dapatkan `ArrayBuffer` objek untuk buffer. 
+ `byteOffset`

  Dapatkan `Arraybuffer` objek buffer. `byteOffset`
+ `length`

  Dapatkan jumlah byte buffer.

**catatan**  
Semua metode modul Buffer baru di JavaScript runtime 2.0.

### String kueri
<a name="writing-functions-javascript-features-builtin-modules-query-string-20"></a>

**catatan**  
[Objek acara CloudFront Functions](functions-event-structure.md) secara otomatis mem-parsing string kueri URL untuk Anda. Itu berarti bahwa dalam kebanyakan kasus Anda tidak perlu menggunakan modul ini.

Modul string kueri (`querystring`) menyediakan metode untuk mengurai dan memformat string kueri URL. Anda dapat memuat modul menggunakan `require('querystring')`. Modul ini menyediakan metode berikut.

`querystring.escape(string)`  
Mengkodekan URL `string` yang tersedia, mengembalikan string kueri yang lolos. Metode ini digunakan oleh `querystring.stringify()` dan tidak boleh digunakan secara langsung.

`querystring.parse(string[, separator[, equal[, options]]])`  
Mengurai string kueri (`string`) dan mengembalikan objek.  
Parameter `separator` adalah substring untuk membatasi pasangan kunci dan nilai dalam string kueri. Secara default, itu adalah `&`.  
Parameter `equal` adalah substring untuk membatasi kunci dan nilai dalam string kueri. Secara default, itu adalah `=`.  
Parameter `options` adalah objek dengan kunci berikut:    
`decodeURIComponent function`  
Sebuah fungsi untuk memecahkan kode karakter persentase dikodekan dalam string kueri. Secara default, itu adalah `querystring.unescape()`.  
`maxKeys number`  
Jumlah kunci maksimum untuk diurai Secara default, itu adalah `1000`. Gunakan nilai `0` untuk menghapus pembatasan untuk menghitung kunci.
Secara default, karakter persentase dikodekan dalam string kueri diasumsikan menggunakan pengkodean UTF-8. Urutan UTF-8 tidak valid diganti dengan karakter pengganti `U+FFFD`.  
Misalnya, untuk string kueri berikut:  

```
'name=value&abc=xyz&abc=123'
```
Nilai `querystring.parse()` yang dikembalikan adalah:  

```
{
name: 'value',
abc: ['xyz', '123']
}
```
`querystring.decode()` adalah alias untuk `querystring.parse()`.

`querystring.stringify(object[, separator[, equal[, options]]])`  
Menyerialisasi `object` dan mengembalikan string kueri.  
Parameter `separator` adalah substring untuk membatasi pasangan kunci dan nilai dalam string kueri. Secara default, itu adalah `&`.  
Parameter `equal` adalah substring untuk membatasi kunci dan nilai dalam string kueri. Secara default, itu adalah `=`.  
Parameter `options` adalah objek dengan kunci berikut:    
`encodeURIComponent function`  
Fungsi yang digunakan untuk mengonversi karakter URL yang tidak aman untuk pengkodean persentase dalam string kueri. Secara default, itu adalah `querystring.escape()`.
Secara default, karakter yang memerlukan pengkodean persentase dalam string kueri dikodekan sebagai UTF-8. Untuk menggunakan pengkodean yang berbeda, tentukan opsi `encodeURIComponent`.  
Misalnya, gunakan kode berikut:  

```
querystring.stringify({ name: 'value', abc: ['xyz', '123'], anotherName: '' });
```
Nilai yang dikembalikan adalah:  

```
'name=value&abc=xyz&abc=123&anotherName='
```
`querystring.encode()` adalah alias untuk `querystring.stringify()`.

`querystring.unescape(string)`  
Mendekode karakter yang dikodekan persentase URL dalam `string` yang tersedia, mengembalikan string kueri yang tidak lolos. Metode ini digunakan oleh `querystring.parse()` dan tidak boleh digunakan secara langsung.

### Kripto
<a name="writing-functions-javascript-features-builtin-modules-crypto-20"></a>

Modul kriptografi (`crypto`) menyediakan hashing standar dan pembantu kode autentikasi pesan berbasis hash (HMAC). Anda dapat memuat modul menggunakan `require('crypto')`.

**Metode hashing**

`crypto.createHash(algorithm)`  
Menciptakan dan mengembalikan objek hash yang dapat digunakan untuk menghasilkan hash digests menggunakan algoritme yang diberikan: `md5`, `sha1`, atau `sha256`.

`hash.update(data)`  
Update konten hash dengan `data` yang tersedia.

`hash.digest([encoding])`  
Menghitung digest dari semua data yang diteruskan menggunakan `hash.update()`. Pengkodean dapat berupa `hex`, `base64`, atau `base64url`.

**Metode HMAC**

`crypto.createHmac(algorithm, secret key)`  
Menciptakan dan mengembalikan objek HMAC yang menggunakan `algorithm` dan `secret key` yang tersedia. Algoritma dapat berupa `md5`, `sha1`, atau `sha256`.

`hmac.update(data)`  
Memperbarui konten HMAC dengan `data` yang tersedia.

`hmac.digest([encoding])`  
Menghitung digest dari semua data yang diteruskan menggunakan `hmac.update()`. Pengkodean dapat berupa `hex`, `base64`, atau `base64url`.

## Fitur yang dibatasi
<a name="writing-functions-javascript-features-restricted-features-20"></a>

Fitur JavaScript bahasa berikut tidak didukung atau dibatasi karena masalah keamanan.

**Evaluasi kode dinamis**  
Evaluasi kode dinamis tidak didukung. Konstruktor `eval()` dan `Function` mengalami kesalahan jika dicoba. Misalnya, `const sum = new Function('a', 'b', 'return a + b')` mengalami kesalahan.

**Timer**  
Fungsi `setTimeout()`, `setImmediate()`, dan `clearTimeout()` tidak didukung. Tidak ada ketentuan untuk menunda atau menghasilkan dalam fungsi jalankan. Fungsi Anda harus dijalankan secara serentak sampai selesai.

**Tanggal dan stempel waktu**  
Untuk alasan keamanan, tidak ada akses ke timer beresolusi tinggi. Semua metode `Date` untuk meminta waktu saat ini selalu mengembalikan nilai yang sama saat menjalankan fungsi tunggal. Stempel waktu yang dikembalikan adalah waktu fungsi mulai berjalan. Akibatnya, Anda tidak dapat mengukur waktu berlalu dalam fungsi Anda.

**Akses sistem file**  
Tidak ada akses sistem file. Misalnya, tidak ada modul `fs` untuk akses sistem file seperti yang ada di Node.js.

**Akses proses**  
Tidak ada akses proses. Misalnya, tidak ada objek `process` global untuk memproses akses informasi seperti yang ada di Node.js.

**Variabel-variabel lingkungan**  
Tidak ada akses ke variabel lingkungan. Sebagai gantinya, Anda dapat menggunakan CloudFront KeyValueStore untuk membuat datastore terpusat dari pasangan kunci-nilai untuk Fungsi Anda. CloudFront CloudFront KeyValueStore memungkinkan pembaruan dinamis ke data konfigurasi Anda tanpa perlu menerapkan perubahan kode. Untuk informasi selengkapnya, lihat [Amazon CloudFront KeyValueStore](kvs-with-functions.md).

**Akses jaringan**  
Tidak ada dukungan untuk panggilan jaringan. Misalnya, XHR, HTTP (S), dan soket tidak didukung.

# Metode pembantu untuk penyimpanan nilai kunci
<a name="functions-custom-methods"></a>

**catatan**  
Panggilan metode pembantu penyimpanan nilai kunci dari CloudFront Fungsi tidak memicu peristiwa AWS CloudTrail data. Peristiwa ini tidak dicatat dalam riwayat CloudTrail peristiwa. Untuk informasi selengkapnya, lihat [Pencatatan panggilan CloudFront API Amazon menggunakan AWS CloudTrail](logging_using_cloudtrail.md).

Bagian ini berlaku jika Anda menggunakan [CloudFront Key Value Store](kvs-with-functions.md) untuk menyertakan nilai kunci dalam fungsi yang Anda buat. CloudFront Fungsi memiliki modul yang menyediakan tiga metode pembantu untuk membaca nilai dari penyimpanan nilai kunci.

Untuk menggunakan modul ini dalam kode fungsi, pastikan bahwa Anda telah [mengaitkan penyimpanan nilai kunci](kvs-with-functions-associate.md) dengan fungsi tersebut. 

Selanjutnya, sertakan pernyataan berikut di baris pertama kode fungsi:

```
import cf from 'cloudfront';
const kvsHandle = cf.kvs();
```



## Metode `get()`
<a name="functions-custom-methods-get"></a>

Gunakan metode ini untuk mengembalikan nilai kunci untuk nama kunci yang Anda tentukan. 

**Permintaan**

```
get("key", options);
```
+ `key`: Nama kunci yang nilainya perlu diambil
+ `options`: Ada satu pilihan,`format`. Ini memastikan bahwa fungsi mem-parsing data dengan benar. Kemungkinan nilai:
  + `string`: (Default) UTF8 dikodekan
  + `json` 
  + `bytes`: Buffer data biner mentah

**Minta contoh**

```
const value = await kvsHandle.get("myFunctionKey", { format: "string"});
```

**Respons**

Responsnya adalah `promise` yang menyelesaikan nilai dalam format yang diminta dengan menggunakan. `options` Secara default, nilai dikembalikan sebagai string.

### Penanganan kesalahan
<a name="error-handling-exists-method"></a>

`get()`Metode ini akan mengembalikan kesalahan ketika kunci yang Anda minta tidak ada di penyimpanan nilai kunci terkait. Untuk mengelola kasus penggunaan ini, Anda dapat menambahkan `try` dan `catch` memblokir kode Anda.

**Awas**  
Menggunakan kombinator janji (misalnya,`Promise.all`,`Promise.any`, dan metode rantai janji (misalnya, `then` dan`catch`) dapat memerlukan penggunaan memori fungsi tinggi. Jika fungsi Anda melebihi kuota [memori fungsi maksimum](cloudfront-limits.md#limits-functions), itu akan gagal dijalankan. Untuk menghindari kesalahan ini, kami sarankan Anda menggunakan `await` sintaks secara berurutan atau dalam loop untuk meminta beberapa nilai.  
**Contoh**  

```
var value1 = await kvs.get('key1');
var value2 = await kvs.get('key2');
```
Saat ini, menggunakan kombinator janji untuk mendapatkan beberapa nilai tidak akan meningkatkan kinerja, seperti contoh berikut.  

```
var values = await Promise.all([kvs.get('key1'), kvs.get('key2'),]);
```

## Metode `exists()`
<a name="functions-custom-methods-exists"></a>

Gunakan metode ini untuk mengidentifikasi apakah kunci ada di penyimpanan nilai kunci atau tidak.

**Permintaan**

```
exists("key");
```

**Minta contoh**

```
const exist = await kvsHandle.exists("myFunctionkey");
```

**Respons**

Responsnya adalah `promise` yang mengembalikan Boolean (`true`atau`false`). Nilai ini menentukan apakah kunci ada atau tidak di penyimpanan nilai kunci.

## Metode `meta()`
<a name="functions-custom-methods-meta"></a>

Gunakan metode ini untuk mengembalikan metadata tentang penyimpanan nilai kunci.

**Permintaan**

```
meta();
```

**Minta contoh**

```
const meta = await kvsHandle.meta();
```

**Respons**

Responsnya adalah `promise` yang menyelesaikan objek dengan properti berikut:
+ `creationDateTime`: Tanggal dan waktu penyimpanan nilai kunci dibuat, dalam format ISO 8601.
+ `lastUpdatedDateTime`: Tanggal dan waktu penyimpanan nilai kunci terakhir disinkronkan dari sumber, dalam format ISO 8601. Nilainya tidak termasuk waktu propagasi ke tepi.
+ `keyCount`: Jumlah total kunci di KVS setelah sinkronisasi terakhir dari sumber.

**Contoh respons**

```
{keyCount:3,creationDateTime:2023-11-30T23:07:55.765Z,lastUpdatedDateTime:2023-12-15T03:57:52.411Z}
```

# Metode pembantu untuk modifikasi asal
<a name="helper-functions-origin-modification"></a>

Bagian ini berlaku jika Anda secara dinamis memperbarui atau mengubah asal yang digunakan pada permintaan di dalam kode CloudFront Fungsi Anda. Anda dapat memperbarui asal hanya pada CloudFront fungsi *permintaan penampil*. CloudFront Fungsi memiliki modul yang menyediakan metode pembantu untuk memperbarui atau mengubah asal secara dinamis.

Untuk menggunakan modul ini, buat CloudFront fungsi menggunakan JavaScript runtime 2.0 dan sertakan pernyataan berikut di baris pertama kode fungsi:

```
import cf from 'cloudfront';
```

Untuk informasi selengkapnya, lihat [JavaScript fitur runtime 2.0 untuk Fungsi CloudFront](functions-javascript-runtime-20.md).

**catatan**  
Halaman Test API dan Test console tidak menguji apakah modifikasi asal telah terjadi. Namun, pengujian memastikan bahwa kode fungsi dijalankan tanpa kesalahan.

## Pilih antara CloudFront Fungsi dan Lambda @Edge
<a name="origin-modification-considerations"></a>

Anda dapat memperbarui asal Anda dengan menggunakan CloudFront Fungsi atau Lambda @Edge.

Saat menggunakan CloudFront Fungsi untuk memperbarui asal, Anda menggunakan pemicu peristiwa *permintaan penampil*, yang berarti logika ini akan berjalan pada setiap permintaan saat fungsi ini digunakan. Saat menggunakan Lambda @Edge, kemampuan pembaruan asal ada di pemicu peristiwa *permintaan asal*, yang berarti logika ini hanya berjalan pada kesalahan cache.

Pilihan Anda sangat bergantung pada beban kerja Anda dan penggunaan CloudFront Fungsi dan Lambda @Edge yang ada pada distribusi Anda. Pertimbangan berikut dapat membantu Anda memutuskan apakah akan menggunakan CloudFront Fungsi atau Lambda @Edge untuk memperbarui asal Anda.

CloudFront Fungsi paling berguna dalam situasi berikut:
+ Ketika permintaan Anda dinamis (artinya mereka tidak dapat di-cache) dan akan selalu pergi ke asal. CloudFront Fungsi memberikan kinerja yang lebih baik dan biaya keseluruhan yang lebih rendah.
+ Ketika Anda sudah memiliki CloudFront fungsi permintaan penampil yang ada yang akan berjalan pada setiap permintaan, Anda dapat menambahkan logika pembaruan asal ke dalam fungsi yang ada.

Untuk menggunakan CloudFront Fungsi untuk memperbarui asal, lihat metode pembantu dalam topik berikut.

Lambda @Edge paling berguna dalam situasi berikut:
+ Ketika Anda memiliki konten yang sangat dapat di-cache, Lambda @Edge bisa lebih hemat biaya karena hanya berjalan pada cache yang gagal, sementara Fungsi berjalan pada setiap permintaan. CloudFront 
+ Ketika Anda sudah memiliki fungsi Lambda @Edge permintaan asal yang ada, Anda dapat menambahkan logika pembaruan asal ke dalam fungsi yang ada.
+ Bila logika pembaruan asal Anda memerlukan pengambilan data dari sumber data pihak ketiga, seperti Amazon DynamoDB atau Amazon S3.

Untuk informasi selengkapnya tentang Lambda @Edge, lihat. [Sesuaikan di tepi dengan Lambda @Edge](lambda-at-the-edge.md)

## updateRequestOrigin() metode
<a name="update-request-origin-helper-function"></a>

Gunakan `updateRequestOrigin()` metode ini untuk memperbarui pengaturan asal untuk permintaan. Anda dapat menggunakan metode ini untuk memperbarui properti asal yang ada untuk asal yang sudah ditentukan dalam distribusi Anda, atau untuk menentukan asal baru untuk permintaan tersebut. Untuk melakukannya, tentukan properti yang ingin Anda ubah.

**penting**  
Pengaturan apa pun yang tidak Anda tentukan `updateRequestOrigin()` akan mewarisi *pengaturan yang sama* dari konfigurasi asal yang ada.

Asal yang ditetapkan oleh `updateRequestOrigin()` metode dapat berupa titik akhir HTTP apa pun dan tidak perlu menjadi asal yang ada dalam CloudFront distribusi Anda.

**Catatan**  
Jika Anda memperbarui asal yang merupakan bagian dari grup asal, hanya *asal utama* grup asal yang diperbarui. Asal sekunder tetap tidak berubah. Kode respons apa pun dari asal yang dimodifikasi yang cocok dengan kriteria failover akan memicu failover ke asal sekunder.
Jika Anda mengubah tipe asal dan mengaktifkan OAC, pastikan tipe asal `originAccessControlConfig` cocok dengan tipe asal baru.
Anda tidak dapat menggunakan `updateRequestOrigin()` metode ini untuk memperbarui asal [VPC](private-content-vpc-origins.md). Permintaan akan gagal.

**Permintaan**

```
updateRequestOrigin({origin properties})
```

`origin properties`Dapat berisi yang berikut:

**domainName (opsional)**  
Nama domain asal. Jika ini tidak disediakan, nama domain dari asal yang ditetapkan digunakan sebagai gantinya.    
**Untuk asal kustom**  
Tentukan nama domain DNS, seperti`www.example.com`. Nama domain tidak dapat menyertakan titik dua (`:`) dan tidak bisa menjadi alamat IP. Nama domain dapat terdiri dari hingga 253 karakter.  
**Untuk asal S3**  
Tentukan nama domain DNS bucket Amazon S3, seperti. `amzn-s3-demo-bucket.s3.eu-west-1.amazonaws.com` Nama bisa sampai 128 karakter dan harus berupa huruf kecil.

**Hostheader (opsional, untuk asal-usul kustom non-S3)**  
Header host untuk digunakan saat membuat permintaan ke asal. Jika ini tidak disediakan, nilai dari parameter domainName digunakan. Jika header host atau parameter nama domain tidak disediakan, nama domain dari asal yang ditetapkan akan digunakan atau header host dari permintaan masuk jika kebijakan penerusan ke asal (FTO) menyertakan host. Header host tidak dapat menyertakan titik dua (`:`) dan tidak bisa menjadi alamat IP. Header host dapat mencapai 253 karakter.

**originPath (opsional)**  
Jalur direktori di tempat asal permintaan harus menemukan konten. Jalur harus dimulai dengan garis miring (/) tetapi tidak boleh diakhiri dengan garis miring. Misalnya, seharusnya tidak berakhir dengan`example-path/`. Jika ini tidak disediakan, maka jalur asal dari asal yang ditetapkan digunakan.    
**Untuk asal kustom**  
Jalur harus dikodekan URL dan memiliki panjang maksimum 255 karakter.

**CustomHeaders (opsional)**  
Anda dapat menyertakan judul kustom dengan permintaan dengan menyebutkan nama header dan pasangan nilai untuk masing-masing header khusus. Formatnya berbeda dari header permintaan dan respons dalam struktur acara. Gunakan sintaks pasangan kunci-nilai berikut:  

```
{"key1": "value1", "key2": "value2", ...}
```
Anda tidak dapat menambahkan header yang tidak diizinkan, dan header dengan nama yang sama juga tidak dapat hadir dalam permintaan masuk. `headers` Nama header harus huruf kecil dalam kode fungsi Anda. Ketika CloudFront Fungsi mengubah objek acara kembali ke permintaan HTTP, huruf pertama dari setiap kata dalam nama header dikapitalisasi, dan kata-kata dipisahkan oleh tanda hubung.  
Misalnya, jika kode fungsi Anda menambahkan header bernama`example-header-name`, CloudFront mengkonversi ini ke `Example-Header-Name` dalam permintaan HTTP. Untuk informasi selengkapnya, lihat [Header khusus yang tidak CloudFront dapat ditambahkan ke permintaan asal](add-origin-custom-headers.md#add-origin-custom-headers-denylist) dan [Pembatasan pada fungsi edge](edge-functions-restrictions.md).  
Jika ini tidak disediakan, maka header khusus apa pun dari asal yang ditetapkan akan digunakan.

**ConnectionAtts (opsional)**  
Berapa kali yang CloudFront mencoba untuk terhubung ke asal. Minimal adalah 1 dan maksimum adalah 3. Jika ini tidak disediakan, upaya koneksi dari asal yang ditetapkan digunakan.

**OriginShield (opsional)**  
Ini memungkinkan atau memperbarui CloudFront Origin Shield. Menggunakan Shield Asal dapat membantu mengurangi beban pada asal Anda. Untuk informasi selengkapnya, lihat [Gunakan Amazon CloudFront Origin Shield](origin-shield.md). Jika ini tidak disediakan, pengaturan Origin Shield dari asal yang ditetapkan akan digunakan.    
**diaktifkan (wajib)**  
Ekspresi Boolean untuk mengaktifkan atau menonaktifkan Origin Shield. Menerima `false` nilai `true` atau.  
**wilayah (diperlukan saat diaktifkan)**  
 Wilayah AWS Untuk Origin Shield. Tentukan Wilayah AWS yang memiliki latensi terendah pada asal Anda. Gunakan kode Region, bukan nama Region. Misalnya, gunakan `us-east-2` untuk menentukan Wilayah Timur AS (Ohio).  
Ketika Anda mengaktifkan CloudFront Origin Shield, Anda harus menentukan Wilayah AWS untuk itu. Untuk daftar yang tersedia Wilayah AWS dan membantu memilih Wilayah terbaik untuk asal Anda, lihat[Pilih AWS Wilayah untuk Origin Shield](origin-shield.md#choose-origin-shield-region).

**originAccessControlConfig (opsional)**  
Pengidentifikasi unik dari kontrol akses asal (OAC) untuk asal ini. Ini hanya digunakan ketika asal mendukung CloudFront OAC, seperti Amazon S3, URLs fungsi MediaStore Lambda, dan V2. MediaPackage Jika ini tidak disediakan, maka pengaturan OAC dari asal yang ditetapkan digunakan.  
Ini tidak mendukung identitas akses asal warisan (OAI). Untuk informasi selengkapnya, lihat [Batasi akses ke asal AWS](private-content-restricting-access-to-origin.md).    
**diaktifkan (wajib)**  
Ekspresi Boolean untuk mengaktifkan atau menonaktifkan OAC. Menerima `false` nilai `true` atau.  
**SigningBehavior (diperlukan saat diaktifkan)**  
Menentukan permintaan CloudFront tanda (menambahkan informasi otentikasi ke). Tentukan `always` untuk kasus penggunaan yang paling umum. Untuk informasi selengkapnya, lihat [Pengaturan lanjutan untuk kontrol akses asal](private-content-restricting-access-to-s3.md#oac-advanced-settings-s3).   
Bidang ini dapat memiliki salah satu nilai berikut:  
+ `always`— CloudFront menandatangani semua permintaan asal, menimpa `Authorization` header dari permintaan penampil jika ada.
+ `never`— CloudFront tidak menandatangani permintaan asal apa pun. Nilai ini mematikan kontrol akses asal untuk asal.
+ `no-override`— Jika permintaan penampil tidak berisi `Authorization` header, maka CloudFront tandatangani permintaan asal. Jika permintaan penampil berisi `Authorization` header, maka CloudFront tidak menandatangani permintaan asal dan sebagai gantinya meneruskan `Authorization` header dari permintaan penampil.
**Awas**  
Untuk meneruskan `Authorization` header dari permintaan penampil, Anda harus menambahkannya ke kebijakan permintaan asal untuk semua perilaku cache yang menggunakan asal yang terkait dengan kontrol akses asal ini. Untuk informasi selengkapnya, lihat [Kontrol permintaan asal dengan kebijakan](controlling-origin-requests.md).  
**SigningProtocol (diperlukan saat diaktifkan)**  
Protokol penandatanganan OAC, yang menentukan bagaimana CloudFront tanda (mengotentikasi) permintaan. Satu-satunya nilai yang valid adalah `sigv4`.  
**OriginType (diperlukan saat diaktifkan)**  
Jenis asal untuk OAC ini. Nilai yang valid termasuk `s3`, `mediapackagev2`, `mediastore`, dan `lambda`. 

**batas waktu (opsional)**  
Timeout yang dapat Anda tentukan untuk berapa lama CloudFront harus mencoba menunggu asal merespons atau mengirim data. Jika ini tidak disediakan, maka pengaturan batas waktu dari asal yang ditetapkan digunakan.   
Kecuali ditentukan, batas waktu ini mendukung asal kustom dan asal Amazon S3.   
**ReadTimeout (opsional)**  
`readTimeout`Ini berlaku untuk kedua nilai berikut:  
+ Berapa lama (dalam detik) CloudFront menunggu respons setelah meneruskan permintaan ke asal.
+ Berapa lama (dalam detik) CloudFront menunggu setelah menerima paket respons dari asal dan sebelum menerima paket berikutnya. 
Batas waktu minimum adalah 1 detik dan maksimum 120 detik. Untuk informasi selengkapnya, lihat [Batas waktu respons](DownloadDistValuesOrigin.md#DownloadDistValuesOriginResponseTimeout).  
**responseCompletionTimeout (opsional)**  
Waktu (dalam detik) permintaan dari CloudFront ke asal dapat tetap terbuka dan menunggu tanggapan. Jika respons lengkap tidak diterima dari asal saat ini, CloudFront akhiri koneksi.  
Nilai untuk `responseCompletionTimeout` harus sama dengan atau lebih besar dari nilai untuk`readTimeout`. Untuk informasi selengkapnya, lihat [Batas waktu penyelesaian respons](DownloadDistValuesOrigin.md#response-completion-timeout).  
**keepAliveTimeout (opsional)**  
Batas waktu ini hanya berlaku untuk asal kustom, bukan asal Amazon S3. (Konfigurasi asal S3 akan mengabaikan pengaturan ini.)   
`keepAliveTimeout`Menentukan berapa lama CloudFront harus mencoba untuk mempertahankan koneksi ke asal setelah menerima paket terakhir dari respon. Batas waktu minimum adalah 1 detik dan maksimum 120 detik. Untuk informasi selengkapnya, lihat [Keep-alive timeout (khusus dan hanya asal VPC)](DownloadDistValuesOrigin.md#DownloadDistValuesOriginKeepaliveTimeout).  
**ConnectionTimeout (opsional)**  
Jumlah detik yang CloudFront menunggu ketika mencoba membuat koneksi ke asal. Batas waktu minimum adalah 1 detik dan maksimum 10 detik. Untuk informasi selengkapnya, lihat [Batas waktu koneksi](DownloadDistValuesOrigin.md#origin-connection-timeout).

**customOriginConfig (opsional)**  
Gunakan `customOriginConfig` untuk menentukan setelan koneksi untuk asal yang *bukan* bucket Amazon S3. Ada satu pengecualian: Anda dapat menentukan pengaturan ini jika bucket S3 dikonfigurasi dengan hosting situs web statis. (Jenis konfigurasi bucket S3 lainnya akan mengabaikan pengaturan ini.) Jika tidak `customOriginConfig` disediakan, maka pengaturan dari asal yang ditetapkan digunakan.    
**port (diperlukan)**  
Port HTTP yang CloudFront digunakan untuk terhubung ke asal. Tentukan port HTTP yang didengar oleh asal.   
**protokol (wajib)**  
Menentukan protokol (HTTP atau HTTPS) yang CloudFront digunakan untuk terhubung ke asal. Nilai yang valid adalah sebagai berikut:  
+ `http`— CloudFront selalu menggunakan HTTP untuk terhubung ke asal
+ `https`— CloudFront selalu menggunakan HTTPS untuk terhubung ke asal  
**SSLProtocols (wajib)**  
Daftar yang menentukan SSL/TLS protokol minimum yang CloudFront digunakan saat menghubungkan ke asal Anda melalui HTTPS. Nilai yang valid termasuk `SSLv3`, `TLSv1`, `TLSv1.1`, dan `TLSv1.2`. Untuk informasi selengkapnya, lihat [Protokol SSL asal minimum](DownloadDistValuesOrigin.md#DownloadDistValuesOriginSSLProtocols).  
**ipAddressType (opsional)**  
Menentukan jenis alamat IP yang CloudFront digunakan untuk terhubung ke asal. Nilai yang valid termasuk `ipv4`, `ipv6`, dan `dualstack`. Perubahan `ipAddressType` hanya didukung ketika `domainName` properti juga sedang diubah.

**sni (opsional, untuk asal kustom non-S3)**  
Server Name Indication (SNI) adalah ekstensi ke protokol Transport Layer Security (TLS) dimana klien menunjukkan nama host mana yang ingin disambungkan pada awal proses jabat tangan TLS. Nilai ini harus cocok dengan nama umum pada sertifikat TLS di server asal Anda. Jika tidak, server asal Anda mungkin akan menimbulkan kesalahan.   
Jika ini tidak disediakan, nilai dari `hostHeader` parameter digunakan. Jika header host tidak disediakan, nilai dari `domainName` parameter digunakan.  
Jika header host atau parameter nama domain tidak disediakan, nama domain dari asal yang ditetapkan akan digunakan atau header host dari permintaan masuk jika kebijakan penerusan ke asal (FTO) menyertakan host. SNI tidak dapat menyertakan titik dua (`:`) dan tidak dapat menjadi alamat IP. SNI dapat mencapai 253 karakter.

**allowedCertificateNames (opsional, untuk asal kustom non-S3)**  
Anda dapat menyertakan daftar nama sertifikat yang valid yang akan digunakan CloudFront untuk memvalidasi pencocokan domain dari sertifikat TLS server asal Anda selama jabat tangan TLS dengan server asal Anda. Bidang ini mengharapkan array nama domain yang valid dan dapat menyertakan domain wildcard, seperti. `*.example.com`   
Anda dapat menentukan hingga 20 nama sertifikat yang diizinkan. Setiap nama sertifikat dapat memiliki hingga 64 karakter.

**Example - Perbarui ke asal permintaan Amazon S3**  
Contoh berikut mengubah asal permintaan viewer ke bucket S3, mengaktifkan OAC, dan mengatur ulang header kustom yang dikirim ke asal.  

```
cf.updateRequestOrigin({
    "domainName" : "amzn-s3-demo-bucket-in-us-east-1.s3.us-east-1.amazonaws.com",
    "originAccessControlConfig": {
        "enabled": true,
        "signingBehavior": "always",
        "signingProtocol": "sigv4",
        "originType": "s3"
    },
    // Empty object resets any header configured on the assigned origin
    "customHeaders": {}
});
```

**Example — Perbarui ke asal permintaan Application Load Balancer**  
Contoh berikut mengubah asal permintaan penampil ke asal Application Load Balancer dan menetapkan header dan batas waktu kustom.  

```
cf.updateRequestOrigin({
    "domainName" : "example-1234567890.us-east-1.elb.amazonaws.com",
    "timeouts": {
        "readTimeout": 30,
        "connectionTimeout": 5
    },
    "customHeaders": {
        "x-stage": "production",
        "x-region": "us-east-1"
    }
});
```

**Example — Perbarui ke asal dengan Origin Shield diaktifkan**  
Dalam contoh berikut, asal dalam distribusi mengaktifkan Origin Shield. Kode fungsi hanya memperbarui nama domain yang digunakan untuk asal dan menghilangkan semua parameter opsional lainnya. Dalam hal ini, Origin Shield akan tetap digunakan dengan nama domain asal yang dimodifikasi karena parameter Origin Shield tidak diperbarui.  

```
cf.updateRequestOrigin({
    "domainName" : "www.example.com"
});
```

**Example — Perbarui header host, SNI, dan nama sertifikat yang diizinkan**  
Untuk sebagian besar kasus penggunaan, Anda tidak perlu menggunakan jenis modifikasi ini untuk permintaan yang menuju ke asal Anda. Parameter ini tidak boleh digunakan kecuali Anda memahami dampak dari mengubah nilai-nilai ini. 
Contoh berikut mengubah nama domain, header host, SNI, dan sertifikat yang diizinkan atas permintaan ke asal.   

```
cf.updateRequestOrigin({ 
    "domainName": "www.example.com", 
    "hostHeader": "test.example.com", 
    "sni": "test.example.net", 
    "allowedCertificateNames": ["*.example.com", "*.example.net"],
});
```

## selectRequestOriginById() metode
<a name="select-request-origin-id-helper-function"></a>

Gunakan `selectRequestOriginById()` untuk memperbarui asal yang ada dengan memilih asal berbeda yang sudah dikonfigurasi dalam distribusi Anda. Metode ini menggunakan semua pengaturan yang sama yang ditentukan oleh asal yang diperbarui.

Metode ini hanya menerima asal yang sudah ditentukan dalam distribusi yang sama yang digunakan saat menjalankan fungsi. Origins direferensikan oleh ID asal, yang merupakan nama asal yang Anda tentukan saat mengatur asal.

Jika Anda memiliki asal VPC yang dikonfigurasi dalam distribusi Anda, Anda dapat menggunakan metode ini untuk memperbarui asal Anda ke asal VPC Anda. Untuk informasi selengkapnya, lihat [Batasi akses dengan asal VPC](private-content-vpc-origins.md).

**Catatan**  
`selectRequestOriginById()`Fungsi tidak dapat memilih asal yang mengaktifkan TLS (asal) timbal balik. Mencoba memilih asal yang diaktifkan TLS (origin) bersama menggunakan fungsi ini akan menghasilkan kesalahan validasi.
Jika kasus penggunaan Anda memerlukan pemilihan asal dinamis dengan TLS timbal balik (asal), gunakan `updateRequestOrigin()` sebagai gantinya, pastikan semua asal target menggunakan sertifikat klien yang sama.

**Permintaan**

```
cf.selectRequestOriginById(origin_id, {origin_overrides})
```

Pada contoh sebelumnya, `origin_id` adalah string yang menunjuk ke nama asal asal dalam distribusi yang menjalankan fungsi. `origin_overrides `Parameter dapat berisi yang berikut:

**Hostheader (opsional, untuk asal-usul kustom non-S3)**  
Header host untuk digunakan saat membuat permintaan ke asal. Jika ini tidak disediakan, nilai dari `domainName` parameter digunakan.   
Jika header host atau parameter nama domain tidak disediakan, nama domain dari asal yang ditetapkan akan digunakan atau header host dari permintaan masuk jika kebijakan penerusan ke asal (FTO) menyertakan host. Header host tidak dapat menyertakan titik dua (`:`) dan tidak bisa menjadi alamat IP. Header host dapat mencapai 253 karakter.

**sni (opsional, untuk asal kustom non-S3)**  
Server Name Indication (SNI) adalah ekstensi ke protokol Transport Layer Security (TLS) dimana klien menunjukkan nama host mana yang ingin disambungkan pada awal proses jabat tangan TLS. Nilai ini harus cocok dengan nama umum pada sertifikat TLS di server asal Anda. Jika tidak, server asal Anda mungkin akan menimbulkan kesalahan.   
Jika ini tidak disediakan, nilai dari `hostHeader` parameter digunakan. Jika header host tidak disediakan, nilai dari `domainName` parameter digunakan.   
Jika header host atau parameter nama domain tidak disediakan, nama domain dari asal yang ditetapkan akan digunakan atau header host dari permintaan masuk jika kebijakan penerusan ke asal (FTO) menyertakan host. SNI tidak dapat menyertakan titik dua (`:`) dan tidak dapat menjadi alamat IP. SNI dapat mencapai 253 karakter.

**allowedCertificateNames (opsional, untuk asal kustom non-S3)**  
Anda dapat menyertakan daftar nama sertifikat yang valid yang akan digunakan CloudFront untuk memvalidasi pencocokan domain dari sertifikat TLS server asal Anda selama jabat tangan TLS dengan server asal Anda. Bidang ini mengharapkan array nama domain yang valid dan dapat menyertakan domain wildcard, seperti. `*.example.com`   
Anda dapat menentukan hingga 20 nama sertifikat yang diizinkan. Setiap nama sertifikat dapat memiliki hingga 64 karakter.

**Permintaan**

```
selectRequestOriginById(origin_id)
```

Dalam contoh sebelumnya, `origin_id` adalah string yang menunjuk ke nama asal asal dalam distribusi yang menjalankan fungsi.

**Example — Pilih asal permintaan Amazon S3**  
Contoh berikut memilih asal yang dinamai `amzn-s3-demo-bucket-in-us-east-1` dari daftar asal yang terkait dengan distribusi, dan menerapkan pengaturan konfigurasi `amzn-s3-demo-bucket-in-us-east-1` asal ke permintaan.  

```
cf.selectRequestOriginById("amzn-s3-demo-bucket-in-us-east-1");
```

**Example — Pilih asal permintaan Application Load Balancer**  
Contoh berikut memilih asal Application Load Balancer `myALB-prod` bernama dari daftar asal yang terkait dengan distribusi, dan menerapkan pengaturan konfigurasi untuk `myALB-prod` permintaan.  

```
cf.selectRequestOriginById("myALB-prod");
```

**Example — Pilih asal permintaan Application Load Balancer dan ganti header host**  
Seperti contoh sebelumnya, contoh berikut memilih asal Application Load Balancer yang `myALB-prod` dinamai dari daftar asal yang terkait dengan distribusi, dan menerapkan pengaturan konfigurasi untuk `myALB-prod` permintaan. Namun, contoh ini mengesampingkan nilai header host menggunakan. `origin_overrides`  

```
cf.overrideRequestOrigin("myALB-prod",{ 
        "hostHeader" : "test.example.com"
});
```

## createRequestOriginMetode grup ()
<a name="create-request-origin-group-helper-function"></a>

Gunakan `createRequestOriginGroup()` untuk mendefinisikan dua asal untuk digunakan sebagai [grup asal](high_availability_origin_failover.md#concept_origin_groups.creating) untuk failover dalam skenario yang membutuhkan ketersediaan tinggi.

Grup asal mencakup dua asal (primer dan sekunder) dan kriteria failover yang Anda tentukan. Anda membuat grup asal untuk mendukung failover asal. CloudFront Saat membuat atau memperbarui grup asal menggunakan metode ini, Anda dapat menentukan grup asal, bukan satu asal. CloudFront akan failover dari asal primer ke asal sekunder, menggunakan kriteria failover.

Jika Anda memiliki asal VPC yang dikonfigurasi dalam distribusi Anda, Anda dapat menggunakan metode ini untuk membuat grup asal menggunakan asal VPC. Untuk informasi selengkapnya, lihat [Batasi akses dengan asal VPC](private-content-vpc-origins.md).

**Catatan**  
`createRequestOriginGroup()`Fungsi ini tidak mendukung pembuatan grup asal yang menyertakan asal yang diaktifkan Mutual TLS (origin). Grup asal dengan asal Mutual TLS (asal) tidak dapat dibuat secara dinamis melalui CloudFront Fungsi.
Jika Anda memerlukan kemampuan failover asal dengan Mutual TLS (origin), konfigurasikan grup asal secara langsung di pengaturan CloudFront distribusi Anda daripada membuatnya secara dinamis dalam fungsi.

### Permintaan
<a name="create-origin-group-request"></a>

```
createRequestOriginGroup({origin_group_properties})
```

Dalam contoh sebelumnya, `origin_group_properties` dapat berisi yang berikut:

**OriginIds (wajib)**  
Array dari`origin_ids`, di mana `origin_id` adalah string yang menunjuk ke nama asal asal dalam distribusi yang menjalankan fungsi. Anda harus memberikan dua asal sebagai bagian dari array. Asal pertama dalam daftar adalah asal primer dan yang kedua berfungsi sebagai asal kedua untuk tujuan failover. 

**OriginOverrides (opsional)**  
 Beberapa pengaturan lanjutan diizinkan untuk ditimpa dengan menggunakan `{origin_overrides}` parameter. `origin overrides`Dapat berisi yang berikut:     
**Hostheader (opsional, untuk asal-usul kustom non-S3)**  
Header host untuk digunakan saat membuat permintaan ke asal. Jika ini tidak disediakan, nilai dari `domainName` parameter digunakan.   
Jika header host atau parameter nama domain tidak disediakan, nama domain dari asal yang ditetapkan akan digunakan atau header host dari permintaan masuk jika kebijakan penerusan ke asal (FTO) menyertakan host. Header host tidak dapat menyertakan titik dua (`:`) dan tidak bisa menjadi alamat IP. Header host dapat mencapai 253 karakter.  
**sni (opsional, untuk asal kustom non-S3)**  
Server Name Indication (SNI) adalah ekstensi ke protokol Transport Layer Security (TLS) dimana klien menunjukkan nama host mana yang ingin disambungkan pada awal proses handshaking TLS. Nilai ini harus cocok dengan nama umum pada sertifikat TLS di server asal Anda, jika tidak, server asal Anda dapat menimbulkan kesalahan.   
Jika ini tidak disediakan, nilai dari `hostHeader` parameter digunakan. Jika header host tidak disediakan, nilai dari `domainName` parameter digunakan.  
Jika header host atau parameter nama domain tidak disediakan, nama domain dari asal yang ditetapkan akan digunakan atau header host dari permintaan masuk jika kebijakan penerusan ke asal (FTO) menyertakan host. SNI tidak dapat menyertakan titik dua (`:`) dan tidak dapat menjadi alamat IP. SNI dapat mencapai 253 karakter.  
**allowedCertificateNames (opsional, untuk asal kustom non-S3)**  
Anda dapat menyertakan daftar nama sertifikat yang valid yang akan digunakan CloudFront untuk memvalidasi pencocokan domain dari sertifikat TLS server asal Anda selama jabat tangan TLS dengan server asal Anda. Bidang ini mengharapkan array nama domain yang valid dan dapat menyertakan domain wildcard, seperti. `*.example.com`   
Anda dapat menentukan hingga 20 nama sertifikat yang diizinkan. Setiap nama sertifikat dapat memiliki hingga 64 karakter.

**SelectionCriteria (opsional)**  
Pilih apakah akan menggunakan kriteria failover `default` asal atau menggunakan logika failover `media-quality-score` berbasis. Nilai yang valid adalah sebagai berikut:  
+ `default`menggunakan kriteria failover, berdasarkan kode status yang ditentukan dalam. `failoverCriteria` Jika Anda tidak mengatur `selectionCriteria` fungsi, `default` akan digunakan.
+ `media-quality-score`digunakan ketika kemampuan perutean sadar media sedang digunakan.

**FailOverCriteria (wajib)**  
Array kode status yang, ketika dikembalikan dari asal primer, akan memicu failover CloudFront ke asal sekunder. Jika Anda menimpa grup asal yang ada, larik ini akan menimpa semua kode status failover yang ditetapkan dalam konfigurasi asli grup asal.  
Saat Anda menggunakan `media-quality-score``selectionCriteria`, CloudFront akan mencoba untuk merutekan permintaan berdasarkan skor kualitas media. Jika asal yang dipilih mengembalikan kode kesalahan yang diatur dalam array ini, CloudFront akan failover ke asal lainnya.

**Example — Buat grup asal permintaan**  
Contoh berikut membuat grup asal untuk permintaan menggunakan asal IDs. Asal ini IDs berasal dari konfigurasi grup asal untuk distribusi yang digunakan untuk menjalankan fungsi ini.  
Secara opsional, Anda dapat menggunakan `originOverrides` untuk mengganti konfigurasi grup asal untuk`sni`,, `hostHeader` dan. `allowedCertificateNames`  

```
import cf from 'cloudfront';

function handler(event) {
    cf.createRequestOriginGroup({
        "originIds": [
            {
                "originId": "origin-1",
                "originOverrides": {
                    "hostHeader": "hostHeader.example.com",
                    "sni": "sni.example.com",
                    "allowedCertificateNames": ["cert1.example.com", "cert2.example.com", "cert3.example.com"]
                }
            },
            {
                "originId": "origin-2",
                "originOverrides": {
                    "hostHeader": "hostHeader2.example.com",
                    "sni": "sni2.example.com",
                    "allowedCertificateNames": ["cert4.example.com", "cert5.example.com"]
                }
            }
        ],
        "failoverCriteria": {
            "statusCodes": [500]
        }
    });
    
    event.request.headers['x-hookx'] = { value: 'origin-overrides' };
    return event.request;
}
```

# Metode pembantu untuk properti CloudFront SaaS Manager
<a name="saas-specific-logic-function-code"></a>

Gunakan fungsi pembantu berikut untuk CloudFront SaaS Manager untuk mengambil nilai untuk distribusi multi-penyewa Anda dalam fungsi yang Anda buat. Untuk menggunakan contoh di halaman ini, Anda harus terlebih dahulu membuat CloudFront fungsi dengan menggunakan JavaScript runtime 2.0. Untuk informasi selengkapnya, lihat [JavaScript fitur runtime 2.0 untuk Fungsi CloudFront](functions-javascript-runtime-20.md).

**Topics**
+ [Grup koneksi](#connection-groups-helper-function)
+ [Penyewa distribusi](#distribution-tenants-helper-functions)

## Grup koneksi
<a name="connection-groups-helper-function"></a>

Grup koneksi yang terkait dengan penyewa distribusi Anda memiliki nama domain.

Untuk mendapatkan nilai ini, gunakan `endpoint` bidang `context` subobject dari objek acara. 

**Permintaan**

```
const value = event.context.endpoint;
```

**Respons**

Responsnya adalah `string` yang berisi nama domain grup koneksi, seperti d111111abcdef8.cloudfront.net. `endpoint`Bidang hanya muncul ketika fungsi Anda dipanggil untuk distribusi multi-penyewa dengan grup koneksi terkait. Untuk informasi selengkapnya, lihat [Objek konteks](functions-event-structure.md#functions-event-structure-context).

## Penyewa distribusi
<a name="distribution-tenants-helper-functions"></a>

CloudFront Fungsi memiliki modul yang menyediakan akses ke nilai penyewa distribusi tertentu.

Untuk menggunakan modul ini, sertakan pernyataan berikut di baris pertama kode fungsi Anda:

```
import cf from 'cloudfront';
```

Anda dapat menggunakan contoh berikut hanya dalam `handler` fungsi, baik secara langsung atau melalui fungsi panggilan bersarang.

### `distributionTenant.id`lapangan
<a name="distribution-tenants-field"></a>

Gunakan bidang ini untuk mendapatkan nilai ID penyewa distribusi.

**Permintaan**

```
const value = cf.distributionTenant.id;
```

**Respons**

Responsnya adalah `string` yang berisi ID penyewa distribusi, seperti`dt_1a2b3c4d5e6f7`.

**Penanganan kesalahan**

Jika fungsi Anda dipanggil untuk distribusi standar, menentukan `distributionTenant.id` bidang akan mengembalikan kesalahan `distributionTenant module is not available` tipe. Untuk menangani kasus penggunaan ini, Anda dapat menambahkan `try` dan `catch` memblokir kode Anda.

### Metode `distributionTenant.parameters.get()`
<a name="distribution-tenant-parameters-get-method"></a>

Gunakan metode ini untuk mengembalikan nilai untuk nama parameter penyewa distribusi yang Anda tentukan.

```
distributionTenant.parameters.get("key");
```

`key`: Nama parameter penyewa distribusi yang ingin Anda ambil nilainya.

**Permintaan**

```
const value = distributionTenant.parameters.get("key");
```

**Respons**

Responsnya adalah a `string` yang berisi nilai untuk parameter penyewa distribusi. Misalnya, jika nama kunci Anda adalah`TenantPath`, maka nilai untuk parameter ini mungkin`tenant1`.

**Penanganan kesalahan**

Anda mungkin menerima kesalahan berikut:
+ Jika fungsi Anda dipanggil untuk distribusi standar, `distributionTenant.parameters.get()` metode akan mengembalikan kesalahan `distributionTenant module is not available` tipe. 
+ `DistributionTenantParameterKeyNotFound`Kesalahan dikembalikan ketika parameter penyewa distribusi yang Anda tentukan tidak ada. 

Untuk mengelola kasus penggunaan ini, Anda dapat menambahkan `try` dan `catch` memblokir kode Anda.

# Gunakan async dan await
<a name="async-await-syntax"></a>

CloudFront Fungsi JavaScript runtime function 2.0 menyediakan `async` dan `await` sintaks untuk menangani `Promise` objek. Janji mewakili hasil tertunda yang dapat diakses melalui `await` kata kunci dalam fungsi yang ditandai sebagai`async`. Berbagai WebCrypto fungsi baru menggunakan Promises.

Untuk informasi selengkapnya tentang `Promise` objek, lihat [Janji](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise).

**catatan**  
Anda harus menggunakan JavaScript runtime 2.0 untuk contoh kode berikut.  
`await`hanya dapat digunakan di dalam `async` fungsi. `async`argumen dan penutupan tidak didukung.

```
async function answer() {
    return 42;
}

// Note: async, await can be used only inside an async function. async arguments and closures are not supported.

async function handler(event) {
    // var answer_value = answer(); // returns Promise, not a 42 value
    let answer_value = await answer(); // resolves Promise, 42
    console.log("Answer"+answer_value);
    event.request.headers['answer'] = { value : ""+answer_value };
    return event.request;
}
```

 JavaScript Kode contoh berikut menunjukkan cara melihat janji dengan metode `then` rantai. Anda dapat menggunakan `catch` untuk melihat kesalahan.

**Awas**  
Menggunakan kombinator janji (misalnya,`Promise.all`,`Promise.any`, dan metode rantai janji (misalnya, `then` dan`catch`) dapat memerlukan penggunaan memori fungsi tinggi. Jika fungsi Anda melebihi kuota [memori fungsi maksimum](cloudfront-limits.md#limits-functions), itu akan gagal dijalankan. Untuk menghindari kesalahan ini, kami sarankan Anda menggunakan `await` sintaks alih-alih `promise` metode.

```
async function answer() {
    return 42;
}

async function squared_answer() {
   return answer().then(value => value * value)
} 
// Note: async, await can be used only inside an async function. async arguments and closures are not supported.
async function handler(event) {
    // var answer_value = answer(); // returns Promise, not a 42 value
    let answer_value = await squared_answer(); // resolves Promise, 42
    console.log("Answer"+answer_value);
    event.request.headers['answer'] = { value : ""+answer_value };
    return event.request;
}
```

# Dukungan CWT untuk Fungsi CloudFront
<a name="cwt-support-cloudfront-functions"></a>

Bagian ini memberikan detail tentang dukungan untuk CBOR Web Tokens (CWT) di CloudFront Fungsi Anda, yang memungkinkan otentikasi dan otorisasi berbasis token yang aman di Lokasi Edge. CloudFront Dukungan ini disediakan sebagai modul, dapat diakses di CloudFront Fungsi Anda. 

Untuk menggunakan modul ini, buat CloudFront Function menggunakan JavaScript runtime 2.0 dan sertakan pernyataan berikut di baris pertama kode fungsi: 

```
import cf from 'cloudfront';
```

Metode yang terkait dengan modul ini dapat diakses melalui (di mana \$1 adalah wildcard yang mewakili berbagai fungsi yang ada dalam modul):

```
cf.cwt.*
```

Untuk informasi selengkapnya, lihat [JavaScript fitur runtime 2.0 untuk Fungsi CloudFront](functions-javascript-runtime-20.md).

Saat ini, modul hanya mendukung struktur MAC0 dengan algoritma HS256 (HMAC-SHA256) dengan batas 1KB untuk ukuran token maksimum.

## Struktur token
<a name="token-structure"></a>

Bagian ini mencakup struktur token yang diharapkan oleh modul CWT. Modul mengharapkan token ditandai dengan benar dan dapat diidentifikasi (misalnya COSE MAC0). Selain itu, untuk struktur token, modul mengikuti standar yang ditetapkan oleh [CBOR Object Signing and Encryption (COSE) [RFC](https://datatracker.ietf.org/doc/html/rfc8152) 8152].

```
( // CWT Tag (Tag value: 61) --- optional    
    ( // COSE MAC0 Structure Tag (Tag value: 17) --- required        
        [            
            protectedHeaders,            
            unprotectedHeaders,            
            payload,            
            tag,        
        ]    
    )
)
```

**Example : CWT menggunakan struktur COSE MAC0**  

```
61( // CWT tag     
    17( // COSE_MAC0 tag       
        [         
            { // Protected Headers           
                1: 4  // algorithm : HMAC-256-64         
            },         
            { // Unprotected Headers           
                4: h'53796d6d6574726963323536' // kid : Symmetric key id          
            },         
            { // Payload           
                1: "https://iss.example.com", // iss           
                2: "exampleUser", // sub           
                3: "https://aud.example.com", // aud           
                4: 1444064944, // exp           
                5: 1443944944, // nbf           
                6: 1443944944, // iat         
            },         
            h'093101ef6d789200' // tag       
        ]     
    )   
)
```
Tag CWT bersifat opsional saat menghasilkan token. Namun, tag struktur COSE diperlukan.

## metode validateToken ()
<a name="validatetoken-method"></a>

Fungsi menerjemahkan dan memvalidasi token CWT menggunakan kunci yang ditentukan. Jika validasi berhasil, ia mengembalikan token CWT yang diterjemahkan. Jika tidak, itu akan menimbulkan kesalahan. Harap dicatat bahwa fungsi ini tidak melakukan validasi pada set klaim.

### Permintaan
<a name="validatetoken-request"></a>

```
cf.cwt.validateToken(token, handlerContext{key})
```Parameter

**token (wajib)**  
Token yang dikodekan untuk validasi. Ini pasti JavaScript Buffer.

**HandlerContext (Diperlukan)**  
 JavaScript Objek yang menyimpan konteks untuk panggilan ValidateToken. Saat ini, hanya properti kunci yang didukung.

**kunci (Diperlukan)**  
Kunci rahasia untuk perhitungan intisari pesan. Dapat disediakan baik sebagai string atau JavaScript Buffer.

### Respons
<a name="validatetoken-response"></a>

Ketika `validateToken()` metode mengembalikan token berhasil divalidasi, respon dari fungsi adalah `CWTObject` dalam format berikut. Setelah diterjemahkan, semua kunci klaim direpresentasikan sebagai string.

```
CWTObject {    
    protectedHeaders,    
    unprotectedHeaders,    
    payload
}
```

### Contoh - Validasi token dengan anak dikirim sebagai bagian dari token
<a name="validatetoken-example"></a>

Contoh ini menunjukkan validasi token CWT, di mana anak diekstraksi dari header. Anak itu kemudian diteruskan ke CloudFront Fungsi KeyValueStore untuk mengambil kunci rahasia yang digunakan untuk memvalidasi token.

```
import cf from 'cloudfront'

const CwtClaims = {
   iss: 1,
   aud: 3,
   exp: 4
}

async function handler(event) {
    try {
        let request = event.request;
        let encodedToken = request.headers['x-cwt-token'].value;
        let kid = request.headers['x-cwt-kid'].value;
                
        // Retrieve the secret key from the kvs
        let secretKey = await cf.kvs().get(kid);
                 
        // Now you can use the secretKey to decode & validate the token.
        let tokenBuffer = Buffer.from(encodedToken, 'base64url');
                
        let handlerContext = {
           key: secretKey,
        }
                
        try {
            let cwtObj = cf.cwt.validateToken(tokenBuffer, handlerContext);
                        
            // Check if token is expired
            const currentTime = Math.floor(Date.now() / 1000); // Current time in seconds
            if (cwtObj[CwtClaims.exp] && cwtObj[CwtClaims.exp] < currentTime) {
                return {
                    statusCode: 401,
                    statusDescription: 'Token expired'
                };
            }
        } catch (error) {
            return {
               statusCode: 401,
               statusDescription: 'Invalid token'
            };
         }
    } catch (error) {
        return {
            statusCode: 402,
            statusDescription: 'Token processing failed'
        };
     }
    return request;
}
```

## metode generateToken ()
<a name="generatetoken-method"></a>

Fungsi ini menghasilkan token CWT baru menggunakan pengaturan payload dan konteks yang disediakan.

### Permintaan
<a name="generatetoken-request"></a>

```
cf.cwt.generateToken(generatorContext, payload)
```Parameter

**GeneratorContext (Diperlukan)**  
Ini JavaScript Object yang digunakan sebagai konteks untuk menghasilkan token dan berisi pasangan nilai kunci berikut:    
**CWTTag (Opsional)**  
Nilai ini adalah boolean, yang jika `true` menentukan `cwtTag` harus ditambahkan.  
**CoseTag (Diperlukan)**  
Menentukan jenis tag COSE. Saat ini hanya mendukung`MAC0`.  
**kunci (Diperlukan)**  
Kunci rahasia untuk menghitung intisari pesan. Nilai ini dapat berupa string atau JavaScript `Buffer`.

**payload (Wajib)**  
Payload token untuk pengkodean. Muatan harus dalam `CWTObject` format.

### Respons
<a name="generatetoken-response"></a>

Mengembalikan JavaScript Buffer yang berisi token dikodekan.

**Example : Menghasilkan token CWT**  

```
import cf from 'cloudfront';

const CwtClaims = {
    iss: 1,
    sub: 2,
    exp: 4
};

const CatClaims = {
    catu: 401,
    catnip: 402,
    catm: 403,
    catr: 404
};

const Catu = {
    host: 1,
    path: 2,
    ext: 3
};

const CatuMatchTypes = {
    prefix_match: 1,
    suffix_match: 2,
    exact_match: 3
};

const Catr = {
    renewal_method: 1,
    next_renewal_time: 2,
    max_uses: 3
};

async function handler(event) {
    try {
        const response = {
            statusCode: 200,
            statusDescription: 'OK',
            headers: {}
        };
        
        const commonAccessToken = {
            protected: {
                1: "5",
            },
            unprotected: {},
            payload: {
                [CwtClaims.iss]: "cloudfront-documentation",
                [CwtClaims.sub]: "cwt-support-on-cloudfront-functions",
                [CwtClaims.exp]: 1740000000,
                [CatClaims.catu]: {
                    [Catu.host]: {
                        [CatuMatchTypes.suffix_match]: ".cloudfront.net"
                    },
                    [Catu.path]: {
                        [CatuMatchTypes.prefix_match]: "/media/live-stream/cf-4k/"
                    },
                    [Catu.ext]: {
                        [CatuMatchTypes.exact_match]: [
                            ".m3u8",
                            ".ts",
                            ".mpd"
                        ]
                    }
                },
                [CatClaims.catnip]: [
                    "[IP_ADDRESS]",
                    "[IP_ADDRESS]"
                ],
                [CatClaims.catm]: [
                    "GET",
                    "HEAD"
                ],
                [CatClaims.catr]: {
                    [Catr.renewal_method]: "header_renewal",
                    [Catr.next_renewal_time]: 1750000000,
                    [Catr.max_uses]: 5
                }
            }
        };
        
        if (!request.headers['x-cwt-kid']) {
            throw new Error('Missing x-cwt-kid header');
        }
        
        const kid = request.headers['x-cwt-kid'].value;
        const secretKey = await cf.kvs().get(kid);
        
        if (!secretKey) {
            throw new Error('Secret key not found for provided kid');
        }
        
        try {
            const genContext = {
                cwtTag: true,
                coseTag: "MAC0",
                key: secretKey
            };
            
            const tokenBuffer = cf.cwt.generateToken(commonAccessToken, genContext);
            response.headers['x-generated-cwt-token'] = { value: tokenBuffer.toString('base64url') };
                        
            return response;
        } catch (tokenError) {
            return {
                statusCode: 401,
                statusDescription: 'Could not generate the token'
            };
        }
    } catch (error) {
        return {
            statusCode: 402,
            statusDescription: 'Token processing failed'
        };
    }
}
```

**Example : Segarkan token berdasarkan beberapa logika**  

```
import cf from 'cloudfront'

const CwtClaims = {
   iss: 1,
   aud: 3,
   exp: 4
}

async function handler(event) {
    try {
        let request = event.request;
        let encodedToken = request.headers['x-cwt-token'].value;
        let kid = request.headers['x-cwt-kid'].value;
        let secretKey = await cf.kvs().get(kid); // Retrieve the secret key from the kvs
                
        // Now you can use the secretKey to decode & validate the token.
        let tokenBuffer = Buffer.from(encodedToken, 'base64url');
                
        let handlerContext = {
           key: secretKey,
        }
                
        try {
            let cwtJSON = cf.cwt.validateToken(tokenBuffer, handlerContext);
                        
            // Check if token is expired
            const currentTime = Math.floor(Date.now() / 1000); // Current time in seconds
            if (cwtJSON[CwtClaims.exp] && cwtJSON[CwtClaims.exp] < currentTime) {
                // We can regnerate the token and add 8 hours to the expiry time
                cwtJSON[CwtClaims.exp] = Math.floor(Date.now() / 1000) + (8 * 60 * 60);
                                
                let genContext = {
                  coseTag: "MAC0",
                  key: secretKey
                }
                                
                let newTokenBuffer = cf.cwt.generateToken(cwtJSON, genContext);
                 request.headers['x-cwt-regenerated-token'] = newTokenBuffer.toString('base64url');
            }
        } catch (error) {
            return {
               statusCode: 401,
               statusDescription: 'Invalid token'
            };
         }
    }
    catch (error) {
        return {
            statusCode: 402,
            statusDescription: 'Token processing failed'
        };
     }
    return request;
}
```

# Metode pembantu umum
<a name="general-helper-methods"></a>

Halaman ini menyediakan metode pembantu tambahan di dalam CloudFront Fungsi. Untuk menggunakan metode ini, buat CloudFront fungsi menggunakan JavaScript runtime 2.0.

```
import cf from 'cloudfront';
```

Untuk informasi selengkapnya, lihat [JavaScript fitur runtime 2.0 untuk Fungsi CloudFront](functions-javascript-runtime-20.md).

## `edgeLocation`metadata
<a name="edge-location-metadata"></a>

Metode ini membutuhkan penggunaan `cloudfront` modul.

**catatan**  
Anda hanya dapat menggunakan metode ini untuk fungsi permintaan pemirsa. Untuk fungsi respons pemirsa, metode ini kosong.

Gunakan JavaScript objek ini untuk mendapatkan kode bandara lokasi tepi, wilayah [Regional Edge Cache](HowCloudFrontWorks.md#CloudFrontRegionaledgecaches) yang diharapkan atau alamat IP CloudFront server yang digunakan untuk menangani permintaan. Metadata ini hanya tersedia pemicu peristiwa permintaan penampil.

```
cf.edgeLocation = {
    name: SEA
    serverIp: 1.2.3.4
    region: us-west-2
}
```

`cf.edgeLocation`Objek dapat berisi yang berikut:

**name**  
[Kode IATA](https://en.wikipedia.org/wiki/IATA_airport_code) tiga huruf dari lokasi tepi yang menangani permintaan.

**ServeIP**  
 IPv6 Alamat IPv4 atau server yang menangani permintaan.

**region**  
 CloudFront Regional Edge Cache (REC) yang *diharapkan akan* digunakan permintaan jika ada cache yang hilang. Nilai ini tidak diperbarui jika REC yang diharapkan tidak tersedia dan REC cadangan digunakan untuk permintaan tersebut. Ini tidak termasuk lokasi Origin Shield yang digunakan, kecuali jika REC utama dan Origin Shield berada di lokasi yang sama.

**catatan**  
CloudFront Fungsi tidak dipanggil untuk kedua kalinya ketika CloudFront dikonfigurasi untuk menggunakan failover asal. Untuk informasi selengkapnya, lihat [Optimalkan ketersediaan tinggi dengan failover CloudFront asal](high_availability_origin_failover.md).

## Metode `rawQueryString()`
<a name="raw-query-string-method"></a>

Metode ini tidak memerlukan `cloudFront` modul.

Gunakan `rawQueryString()` metode ini untuk mengambil string kueri yang tidak diurai dan tidak diubah sebagai string.

**Permintaan**

```
function handler(event) {
    var request = event.request;
    const qs = request.rawQueryString();
}
```

**Respons**

Mengembalikan string query lengkap dari permintaan masuk sebagai nilai string tanpa memimpin`?`. 
+ Jika tidak ada string query, tetapi `?` hadir, fungsi mengembalikan string kosong. 
+ Jika tidak ada string kueri dan `?` tidak hadir, fungsi kembali`undefined`.

**Kasus 1: String kueri lengkap dikembalikan (tanpa memimpin`?`)**  
URL permintaan masuk: `https://example.com/page?name=John&age=25&city=Boston`  
`rawQueryString()`mengembalikan: `"name=John&age=25&city=Boston"`

**Kasus 2: String kosong dikembalikan (kapan `?` ada tetapi tanpa parameter)**  
URL permintaan masuk: `https://example.com/page?`  
`rawQueryString()`mengembalikan: `""`

**Kasus 3: `undefined` dikembalikan (tidak ada string kueri dan tidak`?`)**  
URL permintaan masuk: `https://example.com/page`  
`rawQueryString()`mengembalikan: `undefined`