

# CloudFront Functions の JavaScript ランタイム 1.0 の機能
<a name="functions-javascript-runtime-10"></a>

CloudFront Functions の JavaScript ランタイム環境は [ ECMAScript (ES) バージョン 5.1](https://262.ecma-international.org/5.1/) に準拠しており、ES バージョン 6～9 の一部の機能をサポートしています。また、ES 仕様に含まれない非標準メソッドも提供しています。

次のトピックでは、サポートされるすべての言語機能の一覧を示します。

**Topics**
+ [主要機能](#writing-functions-javascript-features-core)
+ [プリミティブオブジェクト](#writing-functions-javascript-features-primitive-objects)
+ [ビルトインオブジェクト](#writing-functions-javascript-features-builtin-objects)
+ [エラーのタイプ](#writing-functions-javascript-features-error-types)
+ [Globals](#writing-functions-javascript-features-globals)
+ [ビルトインモジュール](#writing-functions-javascript-features-builtin-modules)
+ [制限された機能](#writing-functions-javascript-features-restricted-features)

## 主要機能
<a name="writing-functions-javascript-features-core"></a>

ES の次の主要機能がサポートされています。

**Types]**  
すべての ES 5.1 タイプでサポートされています。これには、ブール値、数値、文字列、オブジェクト、配列、関数、関数コンストラクタ、正規表現が含まれます。

**演算子**  
すべての ES 5.1 演算子でサポートされています。  
ES 7 指数演算子 (`**`) がサポートされています。

**ステートメント**  
`const` および `let` ステートメントはサポートされていません。
次の ES 5.1 ステートメントがサポートされています。  
+ `break`
+ `catch`
+ `continue`
+ `do-while`
+ `else`
+ `finally`
+ `for`
+ `for-in`
+ `if`
+ `return`
+ `switch`
+ `throw`
+ `try`
+ `var`
+ `while`
+ ラベル付きステートメント

**リテラル**  
ES 6 テンプレートリテラル (複数行の文字列、式の補間、および入れ子テンプレート) がサポートされています。

**関数**  
すべての ES 5.1 機能がサポートされています。  
ES 6 のアロー関数、ES 6 のレストパラメータ (残余因数) 構文がサポートされています。

**Unicode**  
ソーステキストおよび文字列リテラルには、Unicode でエンコードされた文字を含めることができます。6 文字の Unicode エスケープシーケンス (コードポイント、例: `\uXXXX`) もサポートされています。

**Strict モード**  
関数は Strict モードで動作するため、関数コードに `use strict` ステートメントを追加する必要はありません。これは変更できません。

## プリミティブオブジェクト
<a name="writing-functions-javascript-features-primitive-objects"></a>

以下の ES プリミティブオブジェクトがサポートされています。

**オブジェクト**  
オブジェクトについて以下の ES 5.1 メソッドがサポートされています。  
+ `create` (プロパティリストなし)
+ `defineProperties`
+ `defineProperty`
+ `freeze`
+ `getOwnPropertyDescriptor`
+ `getOwnPropertyNames`
+ `getPrototypeOf`
+ `hasOwnProperty`
+ `isExtensible`
+ `isFrozen`
+ `prototype.isPrototypeOf`
+ `isSealed`
+ `keys`
+ `preventExtensions`
+ `prototype.propertyIsEnumerable`
+ `seal`
+ `prototype.toString`
+ `prototype.valueOf`
オブジェクトについて以下の ES 6 メソッドがサポートされています。  
+ `assign`
+ `is`
+ `prototype.setPrototypeOf`
オブジェクトについて以下の ES 8 メソッドがサポートされています。  
+ `entries`
+ `values`

**文字列**  
文字列について以下の ES 5.1 メソッドがサポートされています。  
+ `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`
文字列について以下の ES 6 メソッドがサポートされています。  
+ `fromCodePoint`
+ `prototype.codePointAt`
+ `prototype.endsWith`
+ `prototype.includes`
+ `prototype.repeat`
+ `prototype.startsWith`
文字列について以下の ES 8 メソッドがサポートされています。  
+ `prototype.padStart`
+ `prototype.padEnd`
文字列について以下の ES 9 メソッドがサポートされています。  
+ `prototype.trimStart`
+ `prototype.trimEnd`
文字列について以下の非標準メソッドがサポートされています。  
+ `prototype.bytesFrom(array | string, encoding)`

  オクテット列またはエンコードされた文字列からバイト文字列を作成します。文字列エンコーディングオプションは `hex`、`base64`、`base64url`です。
+ `prototype.fromBytes(start[, end])`

  バイト文字列から Unicode 文字列を作成します。各バイトは、対応する Unicode コードポイントで置き換えられます。
+ `prototype.fromUTF8(start[, end])`

  UTF-8 でエンコードされたバイト文字列から Unicode 文字列を作成します。エンコーディングが正しくない場合は、`null` が返されます。
+ `prototype.toBytes(start[, end])`

  Unicode 文字列からバイト文字列を作成します。すべての文字は [0,255] の範囲内にある必要があります。そうでない場合は、`null` が返されます。
+ `prototype.toUTF8(start[, end])`

  Unicode 文字列から UTF-8 でエンコードされたバイト文字列を作成します。

**数値**  
番号に関するすべての ES 5.1 メソッドがサポートされています。  
番号について以下の ES 6 メソッドがサポートされています。  
+ `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`

## ビルトインオブジェクト
<a name="writing-functions-javascript-features-builtin-objects"></a>

ES の以下のビルトインオブジェクトがサポートされています。

**Math**  
ES 5.1 のすべての Math メソッドがサポートされています。  
CloudFront Functions runtime 環境では、`Math.random()` 実装に、関数が実行されたときのタイムスタンプがシードされた OpenBSD `arc4random` を使用します。
以下の ES 6 Math メソッドがサポートされています。  
+ `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`

**日付**  
すべての ES 5.1 の `Date` 機能がサポートされています。  
セキュリティ上の理由から、`Date` は、単一の関数実行の有効期間中、常に同じ値 (関数の開始時間) を返します。詳細については、「[制限された機能](#writing-functions-javascript-features-restricted-features)」を参照してください。

**関数**  
`apply`、`bind`、`call` メソッドがサポートされています。  
関数コンストラクタはサポートされていません。

**正規表現**  
すべての ES 5.1 の正規表現機能がサポートされています。正規表現言語は Perl 互換です。ES 9 の名前付きキャプチャグループがサポートされています。

**JSON**  
`parse`、`stringify` を含むすべての ES 5.1 JSON 機能がサポートされています。

**配列**  
配列について以下の ES 5.1 メソッドがサポートされています。  
+ `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`
配列について以下の ES 6 メソッドがサポートされています。  
+ `of`
+ `prototype.copyWithin`
+ `prototype.fill`
+ `prototype.find`
+ `prototype.findIndex`
配列について以下の ES 7 メソッドがサポートされています。  
+ `prototype.includes`

**型付き配列**  
以下の ES 6 型付き配列がサポートされています。  
+ `Int8Array`
+ `Uint8Array`
+ `Uint8ClampedArray`
+ `Int16Array`
+ `Uint16Array`
+ `Int32Array`
+ `Uint32Array`
+ `Float32Array`
+ `Float64Array`
+ `prototype.copyWithin`
+ `prototype.fill`
+ `prototype.join`
+ `prototype.set`
+ `prototype.slice`
+ `prototype.subarray`
+ `prototype.toString`

**ArrayBuffer**  
`ArrayBuffer` について以下のメソッドがサポートされています。  
+ `prototype.isView`
+ `prototype.slice`

**promise**  
promise について以下のメソッドがサポートされています。  
+ `reject`
+ `resolve`
+ `prototype.catch`
+ `prototype.finally`
+ `prototype.then`

**Crypto**  
暗号モジュールは、標準のハッシュおよびハッシュベースのメッセージ認証コード (HMAC) ヘルパーを提供します。`require('crypto')` を使用してモジュールをロードできます。モジュールは、Node.js の相対物とまったく同じように動作する以下のメソッドを公開します。  
+ `createHash(algorithm)`
+ `hash.update(data)`
+ `hash.digest([encoding])`
+ `createHmac(algorithm, secret key)`
+ `hmac.update(data)`
+ `hmac.digest([encoding])`
詳細については、「ビルトインモジュールセクション」の「[Crypto (ハッシュと HMAC)](#writing-functions-javascript-features-builtin-modules-crypto)」を参照してください。

**コンソール**  
これはデバッグ用のヘルパーオブジェクトです。ログメッセージを記録するための `log()` メソッドのみサポートしています。  
CloudFront Functions は、`console.log('a', 'b')` などのカンマ構文をサポートしていません。代わりに、`console.log('a' + ' ' + 'b')` 形式を使用してください。

## エラーのタイプ
<a name="writing-functions-javascript-features-error-types"></a>

以下のエラーオブジェクトがサポートされています。
+ `Error`
+ `EvalError`
+ `InternalError`
+ `MemoryError`
+ `RangeError`
+ `ReferenceError`
+ `SyntaxError`
+ `TypeError`
+ `URIError`

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

`globalThis` オブジェクトはサポートされています。

以下の ES 5.1 グローバル関数がサポートされています。
+ `decodeURI`
+ `decodeURIComponent`
+ `encodeURI`
+ `encodeURIComponent`
+ `isFinite`
+ `isNaN`
+ `parseFloat`
+ `parseInt`

以下のグローバル定数がサポートされています。
+ `NaN`
+ `Infinity`
+ `undefined`

## ビルトインモジュール
<a name="writing-functions-javascript-features-builtin-modules"></a>

以下のビルトインモジュールがサポートされています。

**Topics**
+ [Crypto (ハッシュと HMAC)](#writing-functions-javascript-features-builtin-modules-crypto)
+ [クエリ文字列](#writing-functions-javascript-features-builtin-modules-query-string)

### Crypto (ハッシュと HMAC)
<a name="writing-functions-javascript-features-builtin-modules-crypto"></a>

暗号モジュール (`crypto`) は、標準のハッシュおよびハッシュベースのメッセージ認証コード (HMAC) ヘルパーを提供します。`require('crypto')` を使用してモジュールをロードできます。このモジュールは、Node.js の相対物とまったく同じように動作する以下のメソッドを提供します。

**ハッシュメソッド**

`crypto.createHash(algorithm)`  
ハッシュオブジェクトを作成して返します。このハッシュオブジェクトは、指定されたアルゴリズム (`md5`、`sha1`、`sha256` のいずれか) を使用してハッシュダイジェストの生成に使用できます。

`hash.update(data)`  
指定された `data` を使用してハッシュコンテンツを更新します。

`hash.digest([encoding])`  
`hash.update()` を使用して渡されたすべてのデータのダイジェストを計算します。エンコードは `hex`、`base64`、`base64url` のいずれかを使用します。

**HMAC メソッド**

`crypto.createHmac(algorithm, secret key)`  
指定された `algorithm` と `secret key` を使用する HMAC オブジェクトを作成して返します。アルゴリズムは `md5`、`sha1`、`sha256` のいずれかを使用します。

`hmac.update(data)`  
指定された `data` を使用して HMAC コンテンツを更新します 。

`hmac.digest([encoding])`  
`hmac.update()` を使用して渡されたすべてのデータのダイジェストを計算します。エンコードは `hex`、`base64`、`base64url` のいずれかを使用します。

### クエリ文字列
<a name="writing-functions-javascript-features-builtin-modules-query-string"></a>

**注記**  
[CloudFront Functions イベントオブジェクト](functions-event-structure.md)は、URL クエリ文字列を自動的に解析します。つまり、ほとんどの場合、このモジュールを使用する必要はありません。

クエリ文字列モジュール (`querystring`) は、URL クエリ文字列を解析および書式設定するためのメソッドを提供します。`require('querystring')` を使用してモジュールをロードできます。このモジュールは、以下のメソッドを提供します。

`querystring.escape(string)`  
URL は `string` をエンコードし、エスケープしたクエリ文字列を返します。このメソッドは `querystring.stringify()` で使用するため、直接使用しないでください。

`querystring.parse(string[, separator[, equal[, options]]])`  
クエリ文字列 (`string`) を解析し、オブジェクトを返します。  
`separator` パラメータは、クエリ文字列のキーと値のペアを区切る substring です。デフォルトでは、`&` です。  
`equal` パラメータは、クエリ文字列のキーと値を区切る substring です。デフォルトでは、`=` です。  
`options` パラメータは、以下のキーを持つオブジェクトです。    
`decodeURIComponent function`  
クエリ文字列のパーセントエンコーディングされた文字を decode する関数です。デフォルトでは、`querystring.unescape()` です。  
`maxKeys number`  
解析するキーの最大数。デフォルトでは、`1000` です。キーカウントの制限を解除するには、`0` の値を使用します。
デフォルトでは、クエリ文字列のパーセントエンコーディングされた文字は、UTF-8 エンコーディングを使用していると見なされます。無効な UTF-8 シーケンスは、`U+FFFD` 置換文字に置き換えられます。  
たとえば、次のクエリ文字列の場合:  

```
'name=value&abc=xyz&abc=123'
```
`querystring.parse()`の戻り値は次のとおりです。  

```
{
name: 'value',
abc: ['xyz', '123']
}
```
`querystring.decode()` は のエイリアスです。`querystring.parse()`

`querystring.stringify(object[, separator[, equal[, options]]])`  
`object` をシリアル化し、クエリ文字列を返します。  
`separator` パラメータは、クエリ文字列のキーと値のペアを区切る substring です。デフォルトでは、`&` です。  
`equal` パラメータは、クエリ文字列のキーと値を区切る substring です。デフォルトでは、`=` です。  
`options` パラメータは、以下のキーを持つオブジェクトです。    
`encodeURIComponent function`  
URL-unsafe 文字をクエリ文字列のパーセントエンコーディングに変換するために使用される関数です。デフォルトでは、`querystring.escape()` です。
デフォルトでは、クエリ文字列でパーセントエンコーディングが必要な文字は UTF-8 としてエンコードされます。別のエンコーディングを使用するには、`encodeURIComponent` オプションを指定します。  
以下のコードでの例:  

```
querystring.stringify({ name: 'value', abc: ['xyz', '123'], anotherName: '' });
```
戻り値:  

```
'name=value&abc=xyz&abc=123&anotherName='
```
`querystring.encode()` は のエイリアスです。`querystring.stringify()`

`querystring.unescape(string)`  
指定された `string` 内の URL パーセントエンコーディングされた文字をデコードし、エスケープしていないクエリ文字列を返します。このメソッドは `querystring.parse()`で使用するため、直接使用しないでください。

## 制限された機能
<a name="writing-functions-javascript-features-restricted-features"></a>

次の JavaScript 言語機能は、セキュリティ上の問題により、サポートされていないか、制限されています。

**動的コード評価**  
動的コード評価はサポートされていません。`eval()`、`Function` 両方のコンストラクタが試行された場合、エラーをスローします。たとえば、`const sum = new Function('a', 'b', 'return a + b')` はエラーをスローします。

**タイマー **  
`setTimeout()`、`setImmediate()`、`clearTimeout()` 関数はサポートされていません。関数実行中に defer または yield する規定はありません。関数は同期的に実行しないと完了できません。

**日付とタイムスタンプ**  
セキュリティ上の理由から、高解像度タイマーにはアクセスできません。現在の時刻を照会するすべての `Date` メソッドは、単一の関数実行の存続期間中は常に同じ値を返します。返されるタイムスタンプは、関数の実行を開始した時刻です。したがって、関数内で経過時間を測定することはできません。

**ファイルシステムへのアクセス**  
ファイルシステムにはアクセスできません。たとえば、Node.js にあるようなファイルシステムアクセス用の `fs` モジュールはありません。

**プロセスへのアクセス**  
プロセスにはアクセスできません。例えば、Node.js にあるような、情報アクセスを処理するための `process` グローバルオブジェクトはありません。

**環境変数**  
環境変数にはアクセスできません。  
この代わりに、CloudFront KeyValueStore を使用して、CloudFront Functions のための key-value ペアの一元化されたデータストアを作成できます。CloudFront KeyValueStore を使用すると、コード変更をデプロイする必要なく、設定データを動的に更新できます。CloudFront KeyValueStore を使用するには、[JavaScript ランタイム 2.0](functions-javascript-runtime-20.md) を使用する必要があります。詳細については、「[Amazon CloudFront KeyValueStore](kvs-with-functions.md)」を参照してください。

**ネットワークアクセス**  
ネットワークコールはサポートされていません。たとえば、XHR、HTTP (S)、ソケットはサポートされていません。