Azure Notification Hubs SDK for JavaScript
Azure Notification Hubs には、任意のバックエンド (クラウドまたはオンプレミス) から任意のプラットフォーム (Apple、Amazon Kindle、Firebase、Baidu、Xiaomi、Web、Windows など) に通知を送信できるスケールアウト プッシュ エンジンが用意されています。 Notification Hubs は、エンタープライズ シナリオとコンシューマー シナリオの両方に適しています。 いくつかのシナリオの例を次に示します。
- ニュース速報の通知を数百万台のデバイスに速やかに送信する。
- 場所に基づいたクーポンを対象のユーザー セグメントに送信する。
- イベント関連の通知を、メディア/スポーツ/金融/ゲーム アプリケーションのユーザーまたはグループに送信する。
- 注意を引いて顧客に販売するために、プロモーション コンテンツをアプリケーションにプッシュする。
- 新着メッセージや作業項目などのエンタープライズ イベントをユーザーに通知する。
- 多要素認証のコードを送信する。
主要リンク:
注: パッケージを使用 azure-sb
している場合は、 migration guide to move from azure-sb to @azure/notification-hubs
はじめに
現在サポートされている環境
- Node.js の LTS バージョン
- Safari、Chrome、Edge、Firefox の最新バージョン。
詳細については、Microsoft のサポート ポリシーを参照してください。
パッケージをインストールする
npm install @azure/notification-hubs
前提条件
Azure Notification Hubs リソースをCreateする
Azure Notification Hub は、次の方法で作成できます。
作成した通知ハブは、 Azure Portal または Azure CLI を使用して構成できます。
クライアントのインポート
この JavaScript 用 SDK には、クラスベースのアプローチまたはモジュール式の設計アプローチを使用して、Azure Notification Hubs と対話する 2 つの方法が用意されています。 クラスベースのアプローチは、クライアントを作成してからクライアント上のメソッドと対話するために、すべてのパッケージで一貫しています。
import {
NotificationHubsClient,
createAppleInstallation
} from "@azure/notification-hubs";
const client = new NotificationHubsClient("<connection string>", "<hub name>");
const installation = createAppleInstallation({
installationId: "<installation-id>",
pushChannel: "<push-channel>",
tags: ["likes_javascript"],
});
const result = await client.createOrUpdateInstallation(installation);
モジュール型のアプローチを使用すると、開発者は、各メソッドが個別に公開されるときにインポートする関数を選択できます。 この方法では、サブパス エクスポートと ES-Modules を使用して、直接インポートを介してメソッドを公開します。 個々のエクスポートでは、これにより、より優れたツリーシェイク エクスペリエンスと、開発者が利用できるバンドル サイズが小さくなります。
クライアントの作成はサブパスを介して "@azure/notification-hubs/api"
公開され、すべてのクライアント メソッドはサブパスを "@azure/notification-hubs/api"
介して公開されることに注意してください。 エクスポートされた各関数は、 を最初のパラメーターとして受け取り client
、残りのパラメーターは変更されません。
次のサブパスが公開されます。
@azure/notification-hubs/api
- や などのgetInstallation
クライアント メソッドを介したcreateClientContext
クライアントのメインエントリ ポイントsendNotification
@azure/notification-hubs/models
- Notification Hubs モデルとファクトリ メソッド。
上記のコード スニペットは、次のようになります。
import { createClientContext, createOrUpdateInstallation } from "@azure/notification-hubs/api";
import { createAppleInstallation } from "@azure/notification-hubs/models";
const context = createClientContext("<connection string>", "<hub name>");
const installation = createAppleInstallation({
installationId: "<installation-id>",
pushChannel: "<push-channel>",
tags: ["likes_javascript"],
});
const result = await createOrUpdateInstallation(context, installation);
クライアントを認証する
Azure Notification Hub との対話は、Shared Access Signature 接続文字列をサポートする から始まりますNotificationHubsClient
。 これには、 リッスン、 管理、 送信のアクセス許可レベルが含まれます。
Listen を使用すると、クライアントは Registration and Installations API を使用して自身を登録できます。 Send を使用すると、クライアントは送信 API を使用してデバイスに通知を送信できます。 最後に、Manage を使用すると、ユーザーはクエリなどの登録とインストールの管理を実行できます。
新しいNotificationHubsClient
クライアントは、接続文字列と通知ハブ名を持つコンストラクターを使用して作成できます。
import { NotificationHubsClient } from "@azure/notification-hubs";
const client = new NotificationHubsClient("<connection string>", "<hub name>");
モジュール型のアプローチを使用すると、 を createClientContext
サブパス経由で "@azure/notification-hubs/api"
インポートできます。
import { createClientContext } from "@azure/notification-hubs/api";
const context = createClientContext("<connection string>", "<hub name>");
主要な概念
NotificationHubClient
が初期化されたら、次の概念を調べることができます。
- インストールと RegistrationDescriptions を使用したデバイス管理
- デバイスに通知を送信する
デバイスの管理
デバイス管理は、APN や Firebase などのネイティブ プラットフォーム通知サービス (PNS) からの一意の識別子と、対象ユーザーにプッシュ通知を送信するために使用されるタグなどの関連メタデータを格納できるようにするための Notification Hubs の主要な概念です。 これは、新しく推奨されるメカニズムであるインストール API と登録という 2 つの API で行われます。
Installations API
インストールは、対象ユーザーへの送信に使用できるインストール ID やユーザー ID などの追加のプロパティを含む、デバイス管理に対する新しいネイティブ JSON アプローチです。 インストール API には、次の方法で既存の登録 API よりもいくつかの利点があります。
- 完全にべき等 API なので、インストールで create を呼び出すので、重複を心配することなく操作を再試行できます。
userId
installationId
および などの$InstallationId:{myInstallId}
$UserId:{bob@contoso.com}
タグ式で使用できる および プロパティのサポート。- テンプレートは、別の登録ではなくインストールの一部になり、送信用のタグとして名前で参照できます。
- 部分的な更新は JSON Patch Standard を通じてサポートされています。これにより、最初にインストールに対してクエリを実行することなく、タグを追加したり、他のデータを変更したりできます。
インストールは、次のようなメソッドを createOrUpdateInstallation
使用して作成できます。
import { NotificationHubsClient, createAppleInstallation } from "@azure/notification-hubs";
import { v4 as uuid } from "uuid";
const client = new NotificationHubsClient("<connection string>", "<hub name>");
// Create an installation for APNs
let installation = createAppleInstallation({
installationId: uuid(), // Must be unique
pushChannel: "00fc13adff785122b4ad28809a3420982341241421348097878e577c991de8f0", // PNS specific handle
tags: ["likes_hockey", "likes_football"],
});
installation = await client.createOrUpdateInstallation(installation);
モジュール型のアプローチを使用すると、コードは次のようになります。
import { createClientContext, createOrUpdateInstallation } from "@azure/notification-hubs/api";
import { createAppleInstallation } from "@azure/notification-hubs/models";
import { v4 as uuid } from "uuid";
const context = createClientContext("<connection string>", "<hub name>");
// Create an installation for APNs
let installation = createAppleInstallation({
installationId: uuid(), // Must be unique
pushChannel: "00fc13adff785122b4ad28809a3420982341241421348097878e577c991de8f0", // PNS specific handle
tags: ["likes_hockey", "likes_football"],
});
installation = await createOrUpdateInstallation(context, installation);
インストールに対する更新は、 メソッドを使用してタグとユーザー ID を追加するなど、JSON Patch スキーマを updateInstallation
使用して行うことができます。
import { NotificationHubsClient, JsonPatch } from "@azure/notification-hubs";
const client = new NotificationHubsClient("<connection string>", "<hub name>");
const installationId = "<unique installation ID>";
const updates: JsonPatch[] = [
{ op: "add", path: "/tags", value: "likes_baseball" },
{ op: "add", path: "/userId", value: "bob@contoso.com" },
];
const installation = await client.updateInstallation(installationId, updates);
モジュール型のアプローチを使用すると、コードは次のようになります。
import { createClientContext, updateInstallation } from "@azure/notification-hubs/api";
import { JsonPatch } from "@azure/notification-hubs/models";
const context = createClientContext("<connection string>", "<hub name>");
const installationId = "<unique installation ID>";
const updates: JsonPatch[] = [
{ op: "add", path: "/tags", value: "likes_baseball" },
{ op: "add", path: "/userId", value: "bob@contoso.com" },
];
const installation = await updateInstallation(context, installationId, updates);
既存のインストールを取得するには、 メソッドを getInstallation
使用して、既存の一意のインストール ID を指定します。
import { NotificationHubsClient } from "@azure/notification-hubs";
const client = new NotificationHubsClient("<connection string>", "<hub name>");
const installationId = "<unique installation ID>";
const installation = client.getInstallation(installationId);
モジュール型のアプローチを使用すると、コードは次のようになります。
import { createClientContext, getInstallation } from "@azure/notification-hubs/api";
const context = createClientContext("<connection string>", "<hub name>");
const installationId = "<unique installation ID>";
const installation = getInstallation(context, installationId);
Registrations API
登録は、上記のインストールと同様に PNS に関連付けられます。PNS からの一意のデバイス識別子と、関連付けられたタグを使用します。 テンプレートの登録は、定義済みの本文テンプレートを作成する方法であり、送信時にメッセージに入力するプロパティを使用してカスタマイズできます。 テンプレートの詳細については、 テンプレートのドキュメントを参照してください。
インストールは、2 つの方法のいずれかで作成できます。まず、 を使用してサーバーから登録 ID を取得してからcreateOrUpdateRegistration
、 メソッドを使用してまたは をcreateRegistration
使用getInstallationId
します。
import {
NotificationHubsClient,
createAppleRegistrationDescription,
} from "@azure/notification-hubs";
const client = new NotificationHubsClient("<connection string>", "<hub name>");
let registration = createAppleRegistrationDescription({
deviceToken: "00fc13adff785122b4ad28809a3420982341241421348097878e577c991de8f0",
tags: ["likes_hockey", "likes_football"],
});
registration = await client.createRegistration(registration);
console.log(`New Registration ID: ${registration.registrationId}`);
モジュール型のアプローチを使用すると、コードは次のようになります。
import { createClientContext, createRegistration } from "@azure/notification-hubs/api";
import { createAppleRegistrationDescription } from "@azure/notification-hubs/models";
const context = createClientContext("<connection string>", "<hub name>");
let registration = createAppleRegistrationDescription({
deviceToken: "00fc13adff785122b4ad28809a3420982341241421348097878e577c991de8f0",
tags: ["likes_hockey", "likes_football"],
});
registration = await createRegistration(context, registration);
console.log(`New Registration ID: ${registration.registrationId}`);
Updatesは メソッドをupdateRegistration
使用して実行できますが、インストールとは異なり、増分更新はサポートされません。 既存の登録のクエリは、 メソッドを getRegistration
使用して実行できます。
import { NotificationHubsClient } from "@azure/notification-hubs";
const client = new NotificationHubsClient("<connection string>", "<hub name>");
const registrationId = "<unique Registration ID>";
let registration = await client.getRegistration(registrationId);
registration.tags.push("likes_sports");
registration = await client.updateRegistration(registration);
モジュール型のアプローチを使用すると、コードは次のようになります。
import {
createClientContext,
getRegistration,
updateRegistration
} from "@azure/notification-hubs/api";
const context = createClientContext("<connection string>", "<hub name>");
const registrationId = "<unique Registration ID>";
let registration = await getRegistration(context, registrationId);
registration.tags.push("likes_sports");
registration = await updateRegistration(context, registration);
登録は、インストールとは異なり、クエリを実行して、すべての登録を取得したり、条件に登録を照合したり、タグで照合したりすることができます。 登録は、 メソッドと listRegistrationsByTag
メソッドを使用してクエリをlistRegistrations
listRegistrationsByChannel
実行できます。 すべてのメソッドは、 オプションを使用した制限を top
サポートし、非同期ページングをサポートします。
import { NotificationHubsClient } from "@azure/notification-hubs/api";
const client = new NotificationHubsClient("<connection string>", "<hub name>");
const registrations = await client.listRegistrationsByTag("likes_hockey");
let page = 0;
for await (const pages of registrations.byPage()) {
console.log(`Page number ${page++}`);
for (const item of pages) {
console.log(JSON.stringify(item, null, 2));
}
}
モジュール型のアプローチを使用すると、コードは次のようになります。
import { createClientContext, listRegistrationsByTag } from "@azure/notification-hubs/api";
const context = createClientContext("<connection string>", "<hub name>");
const registrations = await listRegistrationsByTag(context, "likes_hockey");
let page = 0;
for await (const pages of registrations.byPage()) {
console.log(`Page number ${page++}`);
for (const item of pages) {
console.log(JSON.stringify(item, null, 2));
}
}
送信操作
Notification Hubs では、一意の PNS で提供される識別子を直接使用するか、対象ユーザー送信用のタグを使用するか、すべてのデバイスに対して一般的なブロードキャストを使用して、デバイスに通知を送信できます。 Standard SKU 以上を使用して、 スケジュールされた送信 を使用すると、ユーザーは最大 7 日前に通知をスケジュールできます。 すべての送信操作は、Notification Hubs サポート ケースに使用できる追跡 ID と関連付け ID を返します。 Standard SKU 以降では、通知 ID も返されます。これは、 メソッドを介して getNotificationOutcomeDetails
通知テレメトリを取得するために使用できます。
デバッグの目的で、メソッドの enableTestSend
PNS sendNotification
からすぐにフィードバックを受け取るオプションを に設定true
できますが、運用環境のシナリオではサポートされていません。 これは、スケジュールされた送信メソッドではサポートされていません。
生の JSON または XML 文字列は、送信またはスケジュールされた送信メソッドに送信することも、通知ビルダーを使用して、APN、Firebase、Baidu、ADM、WNS などの PNS ごとにメッセージを構築するのに役立ちます。 これらのビルダーはネイティブ メッセージ形式を構築するため、PNS ごとに使用可能なフィールドについては推測されません。
// Using the class-based approach
import { createAppleNotificationBody } from "@azure/notification-hubs";
// Using the modular approach
import { createAppleNotification, createAppleNotificationBody } from "@azure/notification-hubs/models";
const apnsBody = createAppleNotificationBody({
alert: {
title: "Notification Title",
subtitle: "Notification Subtitle",
body: "Notification body goes here",
},
sound: "default",
interruptionLevel: "time-sensitive",
});
// Send the message using the modular approach
const notification = createAppleNotification({
body: apnsBody
})
const result = await sendNotification(context, notification);
ブロードキャスト送信
Notification Hubs を使用すると、 メソッドを介してブロードキャスト送信を使用して、プラットフォームごとに登録されているすべてのデバイスに通知を sendNotification
送信できます。
import {
NotificationHubsClient,
createAppleNotification,
} from "@azure/notification-hubs/api";
const context = createClientContext(connectionString, hubName);
const messageBody = `{ "aps" : { "alert" : "Hello" } }`;
const message = createAppleNotification({
body: messageBody,
headers: {
"apns-priority": "10",
"apns-push-type": "alert",
},
});
const result = await client.sendNotification(message);
console.log(`Tracking ID: ${result.trackingId}`);
console.log(`Correlation ID: ${result.correlationId}`);
// Only available in Standard SKU and above
if (result.notificationId) {
console.log(`Notification ID: ${result.notificationId}`);
}
モジュール型のアプローチを使用すると、コードは次のようになります。
import { createClientContext, sendNotification } from "@azure/notification-hubs/api";
import { createAppleNotification } from "@azure/notification-hubs/models";
const context = createClientContext(connectionString, hubName);
const messageBody = `{ "aps" : { "alert" : "Hello" } }`;
const message = createAppleNotification({
body: messageBody,
headers: {
"apns-priority": "10",
"apns-push-type": "alert",
},
});
const result = await sendNotification(context, message);
console.log(`Tracking ID: ${result.trackingId}`);
console.log(`Correlation ID: ${result.correlationId}`);
// Only available in Standard SKU and above
if (result.notificationId) {
console.log(`Notification ID: ${result.notificationId}`);
}
直接送信
デバイスを直接送信するには、 パラメーターを使用して メソッドを呼び出すことによって、APNs デバイス トークンなどのプラットフォームで提供される一意識別子をsendNotification
deviceHandle
使用して送信できます。
import {
NotificationHubsClient,
createAppleNotification,
} from "@azure/notification-hubs";
const client = new NotificationHubsClient(connectionString, hubName);
const deviceHandle = "00fc13adff785122b4ad28809a3420982341241421348097878e577c991de8f0";
const messageBody = `{ "aps" : { "alert" : "Hello" } }`;
const message = createAppleNotification({
body: messageBody,
headers: {
"apns-priority": "10",
"apns-push-type": "alert",
},
});
const result = await client.sendNotification(message, { deviceHandle });
console.log(`Tracking ID: ${result.trackingId}`);
console.log(`Correlation ID: ${result.correlationId}`);
// Only available in Standard SKU and above
if (result.notificationId) {
console.log(`Notification ID: ${result.notificationId}`);
}
モジュール型のアプローチを使用すると、コードは次のようになります。
import { createClientContext, sendDirectNotification } from "@azure/notification-hubs/api";
import { createAppleNotification } from "@azure/notification-hubs/models";
const context = createClientContext(connectionString, hubName);
const deviceHandle = "00fc13adff785122b4ad28809a3420982341241421348097878e577c991de8f0";
const messageBody = `{ "aps" : { "alert" : "Hello" } }`;
const message = createAppleNotification({
body: messageBody,
headers: {
"apns-priority": "10",
"apns-push-type": "alert",
},
});
const result = await sendNotification(context, message, { deviceHandle });
console.log(`Tracking ID: ${result.trackingId}`);
console.log(`Correlation ID: ${result.correlationId}`);
// Only available in Standard SKU and above
if (result.notificationId) {
console.log(`Notification ID: ${result.notificationId}`);
}
対象ユーザーの送信
1 つのデバイスをターゲットにするだけでなく、ユーザーはタグを使用して複数のデバイスをターゲットにすることができます。 これらのタグは、タグの一覧として指定できます。これにより、登録済みデバイスに一致するタグ式が作成されます。また、タグ式を使用して、ブール値ロジックを使用して適切な対象ユーザーをターゲットにすることができます。 タグとタグ式の詳細については、「 ルーティングとタグ式」を参照してください。
タグの配列からタグ式を作成する場合は、 メソッドを createTagExpression
使用してタグ式ビルダーを使用できます。これは、最上位レベルのインポートまたは @azure/notification-hubs/models/tagExpressionBuilder
モジュールインポートで公開され、タグから "またはタグ式" を作成します。
// Top level import
import { createTagExpression } from "@azure/notification-hubs";
// Modular import
import { createTagExpression } from "@azure/notification-hubs/models";
const tags = ["likes_football", "likes_hockey"];
const tagExpression = createTagExpression(tags);
console.log(tagExpression);
// likes_football||likes_hockey
タグ式メッセージは、次のコードを使用して送信できます。
import {
NotificationHubsClient,
createAppleNotification,
} from "@azure/notification-hubs";
const client = new NotificationHubsClient("<connection string>", "<hub name>");
const tagExpression = "likes_hockey && likes_football";
const messageBody = `{ "aps" : { "alert" : "Hello" } }`;
const notification = createAppleNotification({
body: messageBody,
headers: {
"apns-priority": "10",
"apns-push-type": "alert",
},
});
const result = await client.sendNotification(notification, { tagExpression });
console.log(`Tracking ID: ${result.trackingId}`);
console.log(`Correlation ID: ${result.correlationId}`);
// Only available in Standard SKU and above
if (result.notificationId) {
console.log(`Notification ID: ${result.notificationId}`);
}
モジュール型のアプローチを使用すると、コードは次のようになります。
import { createClientContext, sendNotification } from "@azure/notification-hubs/api";
import { createAppleNotification } from "@azure/notification-hubs/models";
const context = createClientContext("<connection string>", "<hub name>");
const tagExpression = "likes_hockey && likes_football";
const messageBody = `{ "aps" : { "alert" : "Hello" } }`;
const notification = createAppleNotification({
body: messageBody,
headers: {
"apns-priority": "10",
"apns-push-type": "alert",
},
});
const result = await sendNotification(context, notification, { tagExpression });
console.log(`Tracking ID: ${result.trackingId}`);
console.log(`Correlation ID: ${result.correlationId}`);
// Only available in Standard SKU and above
if (result.notificationId) {
console.log(`Notification ID: ${result.notificationId}`);
}
スケジュールされた送信
プッシュ通知は、タグまたは一般的なブロードキャストを使用してデバイスに送信するメソッドを scheduleBroadcastNotification
使用して、Standard SKU 名前空間以降で最大 7 日前にスケジュールできます。 これにより通知 ID が返されます。この ID は、 メソッドを介して必要に応じて cancelScheduledNotification
キャンセルに使用できます。
import {
NotificationHubsClient,
createAppleNotification,
} from "@azure/notification-hubs";
const client = new NotificationHubsClient("<connection string>", "<hub name>");
const tagExpression = "likes_hockey && likes_football";
const messageBody = `{ "aps" : { "alert" : "Hello" } }`;
// Schedule 8 hours from now
const scheduledTime = new Date(Date.now() + (8 * 60 * 60 * 1000));
const message = createAppleNotification({
body: messageBody,
headers: {
"apns-priority": "10",
"apns-push-type": "alert",
},
});
const result = await client.scheduleNotification(scheduledTime, message, { tagExpression });
console.log(`Tracking ID: ${result.trackingId}`);
console.log(`Correlation ID: ${result.correlationId}`);
// Can be used to cancel via the cancelScheduledSend method
console.log(`Notification ID: ${result.notificationId}`);
モジュール型のアプローチを使用すると、コードは次のようになります。
import { createClientContext, scheduleNotification } from "@azure/notification-hubs/api";
import { createAppleNotification } from "@azure/notification-hubs/models";
const context = createClientContext("<connection string>", "<hub name>");
const tagExpression = "likes_hockey && likes_football";
const messageBody = `{ "aps" : { "alert" : "Hello" } }`;
// Schedule 8 hours from now
const scheduledTime = new Date(Date.now() + (8 * 60 * 60 * 1000));
const message = createAppleNotification({
body: messageBody,
headers: {
"apns-priority": "10",
"apns-push-type": "alert",
},
});
const result = await scheduleNotification(context, scheduledTime, message, { tagExpression });
console.log(`Tracking ID: ${result.trackingId}`);
console.log(`Correlation ID: ${result.correlationId}`);
// Can be used to cancel via the cancelScheduledSend method
console.log(`Notification ID: ${result.notificationId}`);
トラブルシューティング
React Native サポート
React Native現在、Azure Notification Hubs SDK で使用される [URLSearchParams
] はサポートされていません。 React Nativeで SDK を使用するには、SDK を使用する前にパッケージをurl-search-params-polyfill
インストールしてインポートする必要があります。
import 'url-search-params-polyfill';
また、API と非同期反復子 API の TextEncoder
ポリフィルも提供する必要があります。 詳細については、expo のReact Nativeサンプルを参照してください。
破棄された通知を診断する
Azure Notification Hubs には、「Azure Notification Hubs ガイドで削除された通知を診断する」の 削除された通知に関する問題のトラブルシューティングに関する完全なガイドがあります。
テスト送信 は、 オプションを使用して sendNotification
メソッド enableTestSend
でサポートされています。
// Using the client
const result = await client.sendNotification(notification, { tags, enableTestSend: true });
// Using the modular approach
const result = await sendNotification(context, notification, { tags, enableTestSend: true });
ログの記録
ログの記録を有効にすると、エラーに関する有用な情報を明らかにするのに役立つ場合があります。 HTTP 要求と応答のログを表示するには、環境変数 AZURE_LOG_LEVEL
を info
に設定します。 または、@azure/logger
で setLogLevel
を呼び出して、実行時にログ記録を有効にすることもできます。
const { setLogLevel } = require("@azure/logger");
setLogLevel("info");
ログを有効にする方法の詳細については、@azure/logger パッケージに関するドキュメントを参照してください。
次の手順
次のサンプルは、Azure Notification Hubs と対話するさまざまな方法を示しています。
デバイス管理:
- Installations API
- 登録 API
送信操作:
管理操作:
共同作成
このライブラリに投稿する場合、コードをビルドしてテストする方法の詳細については、投稿ガイドを参照してください。
このモジュールのテストは、ライブ テストと単体テストの組み合わせであり、Azure Notification Hubs インスタンスを用意する必要があります。 テストを実行するには、次を実行する必要があります。
rush update
rush build -t @azure/notification-hubs
- フォルダーに次の内容を含む .env ファイルを
sdk\notificationhubs\notification-hubs
Createします。NOTIFICATIONHUBS_CONNECTION_STRING=connection string for your Notification Hubs instance
NOTIFICATION_HUB_NAME=Notification Hub name
cd sdk\notificationhubs\notification-hubs
rushx test
.
詳細については、 テスト フォルダーを参照してください。
関連プロジェクト
Azure SDK for JavaScript