From 9c0850d96716e720d219c17bff54193dbe84ad0c Mon Sep 17 00:00:00 2001 From: Zichuan Ma Date: Tue, 22 Dec 2020 23:24:13 +0800 Subject: [PATCH] Azure queues and ContinueConversationLater/OnContinueConversation (#3083) * added `QueueStorage` as abstract class * new package `botbuilder-azure-queues` * new action ContinueConversationLater and OnContinueConversation * resolved lint errors * use Buffer instead of btoa * added `relatesTo` in continueConversation * added test for azureQueueStorage * removed `await` keyword * use `Record` instead of `object` * initializePromise * allow skipping tests * await _initialize() * fixed docs Co-authored-by: Josh Gummersall <1235378+joshgummersall@users.noreply.github.com> --- .../botbuilder-azure-queues/.eslintrc.json | 3 + libraries/botbuilder-azure-queues/.gitignore | 4 + .../botbuilder-azure-queues/package.json | 52 +++++++ .../src/azureQueueStorage.ts | 66 +++++++++ .../botbuilder-azure-queues/src/index.ts | 4 + .../tests/azureQueueStorage.test.js | 78 +++++++++++ .../botbuilder-azure-queues/tsconfig.json | 12 ++ libraries/botbuilder-core/src/index.ts | 1 + libraries/botbuilder-core/src/queueStorage.ts | 28 ++++ .../src/actions/continueConversationLater.ts | 132 ++++++++++++++++++ .../src/actions/index.ts | 1 + .../src/adaptiveComponentRegistration.ts | 7 + .../src/conditions/index.ts | 1 + .../src/conditions/onContinueConversation.ts | 41 ++++++ .../src/dialogTurnStateConstants.ts | 1 + testing/consumer-test/package.json | 1 + testing/consumer-test/test.ts | 2 + yarn.lock | 36 ++++- 18 files changed, 469 insertions(+), 1 deletion(-) create mode 100644 libraries/botbuilder-azure-queues/.eslintrc.json create mode 100644 libraries/botbuilder-azure-queues/.gitignore create mode 100644 libraries/botbuilder-azure-queues/package.json create mode 100644 libraries/botbuilder-azure-queues/src/azureQueueStorage.ts create mode 100644 libraries/botbuilder-azure-queues/src/index.ts create mode 100644 libraries/botbuilder-azure-queues/tests/azureQueueStorage.test.js create mode 100644 libraries/botbuilder-azure-queues/tsconfig.json create mode 100644 libraries/botbuilder-core/src/queueStorage.ts create mode 100644 libraries/botbuilder-dialogs-adaptive/src/actions/continueConversationLater.ts create mode 100644 libraries/botbuilder-dialogs-adaptive/src/conditions/onContinueConversation.ts diff --git a/libraries/botbuilder-azure-queues/.eslintrc.json b/libraries/botbuilder-azure-queues/.eslintrc.json new file mode 100644 index 000000000..b6e2302cd --- /dev/null +++ b/libraries/botbuilder-azure-queues/.eslintrc.json @@ -0,0 +1,3 @@ +{ + "extends": "../../.eslintrc.json" +} \ No newline at end of file diff --git a/libraries/botbuilder-azure-queues/.gitignore b/libraries/botbuilder-azure-queues/.gitignore new file mode 100644 index 000000000..b9f706805 --- /dev/null +++ b/libraries/botbuilder-azure-queues/.gitignore @@ -0,0 +1,4 @@ +_ts3.4 +lib +coverage +.nyc_output diff --git a/libraries/botbuilder-azure-queues/package.json b/libraries/botbuilder-azure-queues/package.json new file mode 100644 index 000000000..83cbf2edd --- /dev/null +++ b/libraries/botbuilder-azure-queues/package.json @@ -0,0 +1,52 @@ +{ + "name": "botbuilder-azure-queues", + "author": "Microsoft Corp.", + "description": "BotBuilder storage bindings for Azure Queue services", + "version": "4.1.6", + "preview": true, + "license": "MIT", + "keywords": [ + "botbuilder", + "botframework", + "bots", + "chatbots" + ], + "bugs": { + "url": "https://github.com/Microsoft/botbuilder-js/issues" + }, + "repository": { + "type": "git", + "url": "https://github.com/Microsoft/botbuilder-js.git" + }, + "main": "lib/index.js", + "types": "lib/index.d.ts", + "typesVersions": { + "<3.9": { + "*": [ + "_ts3.4/*" + ] + } + }, + "dependencies": { + "@azure/storage-queue": "^12.2.0", + "botbuilder-core": "4.1.6" + }, + "devDependencies": { + "sinon": "^9.2.0", + "ts-essentials": "^7.0.1" + }, + "scripts": { + "build": "tsc -b", + "build-docs": "typedoc --theme markdown --entryPoint botbuilder-azure-queues --excludePrivate --includeDeclarations --ignoreCompilerErrors --module amd --out ..\\..\\doc\\botbuilder-azure-queues .\\lib\\index.d.ts --hideGenerator --name \"Bot Builder SDK - Azure Queues\" --readme none", + "clean": "rimraf _ts3.4 lib tsconfig.tsbuildinfo", + "lint": "eslint . --ext .js,.ts", + "postbuild": "downlevel-dts lib _ts3.4/lib", + "test": "yarn build && nyc mocha --check-leaks tests", + "test:compat": "api-extractor run --verbose" + }, + "files": [ + "_ts3.4", + "lib", + "src" + ] +} diff --git a/libraries/botbuilder-azure-queues/src/azureQueueStorage.ts b/libraries/botbuilder-azure-queues/src/azureQueueStorage.ts new file mode 100644 index 000000000..3bcd2ef11 --- /dev/null +++ b/libraries/botbuilder-azure-queues/src/azureQueueStorage.ts @@ -0,0 +1,66 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import { QueueClient } from '@azure/storage-queue'; +import { Activity, QueueStorage } from 'botbuilder-core'; + +/** + * Service used to add messages to an Azure Storage Queues. + */ +export class AzureQueueStorage extends QueueStorage { + private _initializePromise: Promise; + private readonly _queueClient: QueueClient; + + /** + * Initializes a new instance of the AzureQueueStorage class. + * + * @param {string} queuesStorageConnectionString Azure storage connection string. + * @param {string} queueName Name of the storage queue where entities will be queued. + */ + public constructor(queuesStorageConnectionString: string, queueName: string) { + super(); + if (!queuesStorageConnectionString) { + throw new Error(`queuesStorageConnectionString cannot be empty`); + } + + if (!queueName) { + throw new Error(`queueName cannot be empty`); + } + + this._queueClient = new QueueClient(queuesStorageConnectionString, queueName); + } + + /** + * Queue an Activity to an Azure storage queues. The visibility timeout specifies how long the message should be visible + * to Dequeue and Peek operations. The message content must be a UTF-8 encoded string that is up to 64KB in size. + * + * @param {Partial} activity The [Activity](xref:botframework-core.Activity) to be queued for later processing. + * @param {number} visibilityTimeout Default value of 0. Cannot be larger than 7 days. + * @param {number} messageTimeToLive Specifies the time-to-live interval for the message. + * @returns {Promise} [QueueSendMessageResponse](xref:@azure/storage-queue.QueueSendMessageResponse) as a JSON string. + */ + public async queueActivity( + activity: Partial, + visibilityTimeout?: number, + messageTimeToLive?: number + ): Promise { + await this._initialize(); + + // Convert activity to base64 string + const activityString = JSON.stringify(activity); + const message = Buffer.from(activityString).toString('base64'); + const receipt = await this._queueClient.sendMessage(message, { + visibilityTimeout, + messageTimeToLive, + }); + + return JSON.stringify(receipt); + } + + private _initialize(): Promise { + if (!this._initializePromise) { + this._initializePromise = this._queueClient.createIfNotExists(); + } + return this._initializePromise; + } +} diff --git a/libraries/botbuilder-azure-queues/src/index.ts b/libraries/botbuilder-azure-queues/src/index.ts new file mode 100644 index 000000000..e9ed0b4d3 --- /dev/null +++ b/libraries/botbuilder-azure-queues/src/index.ts @@ -0,0 +1,4 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +export * from './azureQueueStorage'; diff --git a/libraries/botbuilder-azure-queues/tests/azureQueueStorage.test.js b/libraries/botbuilder-azure-queues/tests/azureQueueStorage.test.js new file mode 100644 index 000000000..528d866e4 --- /dev/null +++ b/libraries/botbuilder-azure-queues/tests/azureQueueStorage.test.js @@ -0,0 +1,78 @@ +const assert = require('assert'); +const { QueueClient } = require('@azure/storage-queue'); +const { DialogManager, DialogTurnStateConstants } = require('botbuilder-dialogs'); +const { + ActivityTypes, + ActivityEventNames, + ConversationState, + MemoryStorage, + TestAdapter, + useBotState, + UserState, +} = require('botbuilder-core'); +const fetch = require('node-fetch'); +const { ContinueConversationLater } = require('../../botbuilder-dialogs-adaptive/lib'); +const { AzureQueueStorage } = require('../lib'); + +const connectionString = process.env.AZURE_QUEUE_STORAGE_CONNECTION_STRING || 'UseDevelopmentStorage=true'; +const queueName = process.env.AZURE_QUEUE_NAME || 'azurequeuestoragetest'; +const emulatorEndpoint = 'http://localhost:10001'; + +const checkEmulator = async () => { + let canConnectToEmulator = false; + try { + await fetch(emulatorEndpoint); + canConnectToEmulator = true; + } catch (err) { + canConnectToEmulator = false; + } + if (!canConnectToEmulator) { + console.warn(`Unable to connect to Azure Queue Storage Emulator at ${emulatorEndpoint}. Skipping tests.`); + } + return canConnectToEmulator; +}; + +describe('AzureQueueStorage', function () { + this.timeout(5000); + + it('ContinueConversationLaterTest', async function () { + const canConnectToEmulator = await checkEmulator(); + if (canConnectToEmulator) { + const queue = new QueueClient(connectionString, queueName); + await queue.createIfNotExists(); + await queue.clearMessages(); + const queueStorage = new AzureQueueStorage(connectionString, queueName); + + const dm = new DialogManager( + new ContinueConversationLater().configure({ + date: '=addSeconds(utcNow(), 2)', + value: 'foo', + }) + ); + + dm.initialTurnState.set(DialogTurnStateConstants.queueStorage, queueStorage); + + const adapter = new TestAdapter(async (context) => { + return dm.onTurn(context); + }); + + const memoryStorage = new MemoryStorage(); + useBotState(adapter, new ConversationState(memoryStorage), new UserState(memoryStorage)); + + await adapter.send('hi').startTest(); + + const { receivedMessageItems } = await new Promise((resolve) => setTimeout(resolve, 2000)).then(() => + queue.receiveMessages() + ); + assert.strictEqual(receivedMessageItems.length, 1); + + const message = receivedMessageItems[0]; + const messageJson = Buffer.from(message.messageText, 'base64').toString(); + const activity = JSON.parse(messageJson); + assert.strictEqual(activity.type, ActivityTypes.Event); + assert.strictEqual(activity.name, ActivityEventNames.ContinueConversation); + assert.strictEqual(activity.value, 'foo'); + assert(activity.relatesTo); + } + }); +}); diff --git a/libraries/botbuilder-azure-queues/tsconfig.json b/libraries/botbuilder-azure-queues/tsconfig.json new file mode 100644 index 000000000..e849b1c1c --- /dev/null +++ b/libraries/botbuilder-azure-queues/tsconfig.json @@ -0,0 +1,12 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "esModuleInterop": true, + "outDir": "lib", + "rootDir": "src", + "target": "es6" + }, + "include": [ + "src/**/*" + ] +} diff --git a/libraries/botbuilder-core/src/index.ts b/libraries/botbuilder-core/src/index.ts index 4618a86b0..0cb67cf18 100644 --- a/libraries/botbuilder-core/src/index.ts +++ b/libraries/botbuilder-core/src/index.ts @@ -31,6 +31,7 @@ export * from './messageFactory'; export * from './middlewareSet'; export * from './privateConversationState'; export * from './propertyManager'; +export * from './queueStorage'; export * from './recognizerResult'; export * from './registerClassMiddleware'; export * from './showTypingMiddleware'; diff --git a/libraries/botbuilder-core/src/queueStorage.ts b/libraries/botbuilder-core/src/queueStorage.ts new file mode 100644 index 000000000..b30d1fb80 --- /dev/null +++ b/libraries/botbuilder-core/src/queueStorage.ts @@ -0,0 +1,28 @@ +/** + * @module botbuilder + */ +/** + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. + */ + +import { Activity } from 'botframework-schema'; + +/** + * A base class for enqueueing an Activity for later processing. + */ +export abstract class QueueStorage { + /** + * Enqueues an Activity for later processing. The visibility timeout specifies how long the message should be visible + * to Dequeue and Peek operations. The message content must be a UTF-8 encoded string that is up to 64KB in size. + * + * @param {Partial} activity The [Activity](xref:botframework-schema.Activity) to be queued for later processing. + * @param {number} visibilityTimeout Visibility timeout in seconds. Optional with a default value of 0. Cannot be larger than 7 days. + * @param {number} timeToLive Specifies the time-to-live interval for the message in seconds. + */ + public abstract queueActivity( + activity: Partial, + visibilityTimeout?: number, + timeToLive?: number + ): Promise; +} diff --git a/libraries/botbuilder-dialogs-adaptive/src/actions/continueConversationLater.ts b/libraries/botbuilder-dialogs-adaptive/src/actions/continueConversationLater.ts new file mode 100644 index 000000000..d9e7b088e --- /dev/null +++ b/libraries/botbuilder-dialogs-adaptive/src/actions/continueConversationLater.ts @@ -0,0 +1,132 @@ +/** + * @module botbuilder-dialogs-adaptive + */ +/** + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. + */ + +import { + BoolExpression, + BoolExpressionConverter, + Expression, + StringExpression, + StringExpressionConverter, + ValueExpression, + ValueExpressionConverter, +} from 'adaptive-expressions'; +import { + Activity, + ActivityEventNames, + ActivityTypes, + ConversationReference, + QueueStorage, + TurnContext, +} from 'botbuilder-core'; +import { + Converter, + ConverterFactory, + Dialog, + DialogConfiguration, + DialogContext, + DialogTurnResult, + DialogTurnStateConstants, +} from 'botbuilder-dialogs'; + +export interface ContinueConversationLaterConfiguration extends DialogConfiguration { + disabled?: boolean | string | Expression | BoolExpression; + date?: string | Expression | StringExpression; + value?: unknown | ValueExpression; +} + +/** + * Action which schedules a conversation to be continued later by writing an EventActivity(Name=ContinueConversation) to a queue. + */ +export class ContinueConversationLater extends Dialog implements ContinueConversationLaterConfiguration { + public static $kind = 'Microsoft.ContinueConversationLater'; + + /** + * Gets or sets an optional expression which if is true will disable this action. + */ + public disabled?: BoolExpression; + + /** + * Gets or sets the expression which resolves to the date/time to continue the conversation. + */ + public date: StringExpression; + + /** + * Gets or sets the value to pass in the EventActivity payload. + */ + public value: ValueExpression; + + public getConverter(property: keyof ContinueConversationLaterConfiguration): Converter | ConverterFactory { + switch (property) { + case 'disabled': + return new BoolExpressionConverter(); + case 'date': + return new StringExpressionConverter(); + case 'value': + return new ValueExpressionConverter(); + default: + return super.getConverter(property); + } + } + + /** + * Called when the [Dialog](xref:botbuilder-dialogs.Dialog) is started and pushed onto the dialog stack. + * + * @param {DialogContext} dc The [DialogContext](xref:botbuilder-dialogs.DialogContext) for the current turn of conversation. + * @param {object} options Optional. Initial information to pass to the dialog. + * @returns {Promise} A `Promise` representing the asynchronous operation. + */ + public async beginDialog(dc: DialogContext, options?: Record): Promise { + if (this.disabled && this.disabled.getValue(dc.state)) { + return dc.endDialog(); + } + + const dateString = this.date.getValue(dc.state); + const date = Date.parse(dateString); + if (!date || isNaN(date)) { + throw new Error('Date is invalid'); + } + + if (date <= Date.now()) { + throw new Error('Date must be in the future'); + } + + // create ContinuationActivity from the conversation reference. + const reference = TurnContext.getConversationReference(dc.context.activity); + const activity: Partial = TurnContext.applyConversationReference( + { + type: ActivityTypes.Event, + name: ActivityEventNames.ContinueConversation, + relatesTo: reference as ConversationReference, + }, + reference, + true + ); + activity.value = this.value && this.value.getValue(dc.state); + + const visibility = (date - Date.now()) / 1000; + const ttl = visibility + 2 * 60; + + const queueStorage: QueueStorage = dc.context.turnState.get(DialogTurnStateConstants.queueStorage); + if (!queueStorage) { + throw new Error('Unable to locate QueueStorage in HostContext'); + } + + const receipt = await queueStorage.queueActivity(activity, visibility, ttl); + + // return the receipt as the result. + return dc.endDialog(receipt); + } + + /** + * @protected + * @returns {string} A `string` representing the compute Id. + */ + protected onComputeId(): string { + return `ContinueConversationLater[${this.date && this.date.toString()}s]`; + } +} diff --git a/libraries/botbuilder-dialogs-adaptive/src/actions/index.ts b/libraries/botbuilder-dialogs-adaptive/src/actions/index.ts index 63a5c7c71..c2f91be95 100644 --- a/libraries/botbuilder-dialogs-adaptive/src/actions/index.ts +++ b/libraries/botbuilder-dialogs-adaptive/src/actions/index.ts @@ -15,6 +15,7 @@ export * from './cancelAllDialogs'; export * from './cancelDialog'; export * from './case'; export * from './codeAction'; +export * from './continueConversationLater'; export * from './continueLoop'; export * from './deleteActivity'; export * from './deleteProperties'; diff --git a/libraries/botbuilder-dialogs-adaptive/src/adaptiveComponentRegistration.ts b/libraries/botbuilder-dialogs-adaptive/src/adaptiveComponentRegistration.ts index 62978e0a3..6ac38cba2 100644 --- a/libraries/botbuilder-dialogs-adaptive/src/adaptiveComponentRegistration.ts +++ b/libraries/botbuilder-dialogs-adaptive/src/adaptiveComponentRegistration.ts @@ -24,6 +24,8 @@ import { CancelAllDialogs, CancelDialog, CancelAllDialogsBaseConfiguration, + ContinueConversationLater, + ContinueConversationLaterConfiguration, ContinueLoop, ContinueLoopConfiguration, DeleteActivity, @@ -97,6 +99,7 @@ import { OnChoosePropertyConfiguration, OnCondition, OnConditionConfiguration, + OnContinueConversation, OnConversationUpdateActivity, OnDialogEvent, OnDialogEventConfiguration, @@ -210,6 +213,9 @@ export class AdaptiveComponentRegistration extends ComponentRegistration impleme this._addDeclarativeType(BreakLoop); this._addDeclarativeType(CancelAllDialogs); this._addDeclarativeType(CancelDialog); + this._addDeclarativeType( + ContinueConversationLater + ); this._addDeclarativeType(ContinueLoop); this._addDeclarativeType(DeleteActivity); this._addDeclarativeType(DeleteProperties); @@ -250,6 +256,7 @@ export class AdaptiveComponentRegistration extends ComponentRegistration impleme this._addDeclarativeType(OnChooseIntent); this._addDeclarativeType(OnChooseProperty); this._addDeclarativeType(OnCondition); + this._addDeclarativeType(OnContinueConversation); this._addDeclarativeType(OnConversationUpdateActivity); this._addDeclarativeType(OnDialogEvent); this._addDeclarativeType(OnEndOfActions); diff --git a/libraries/botbuilder-dialogs-adaptive/src/conditions/index.ts b/libraries/botbuilder-dialogs-adaptive/src/conditions/index.ts index c7db20027..176c6faf6 100644 --- a/libraries/botbuilder-dialogs-adaptive/src/conditions/index.ts +++ b/libraries/botbuilder-dialogs-adaptive/src/conditions/index.ts @@ -13,6 +13,7 @@ export * from './onChooseEntity'; export * from './onChooseIntent'; export * from './onChooseProperty'; export * from './onCondition'; +export * from './onContinueConversation'; export * from './onConversationUpdateActivity'; export * from './onDialogEvent'; export * from './onEndOfActions'; diff --git a/libraries/botbuilder-dialogs-adaptive/src/conditions/onContinueConversation.ts b/libraries/botbuilder-dialogs-adaptive/src/conditions/onContinueConversation.ts new file mode 100644 index 000000000..b632ef758 --- /dev/null +++ b/libraries/botbuilder-dialogs-adaptive/src/conditions/onContinueConversation.ts @@ -0,0 +1,41 @@ +/** + * @module botbuilder-dialogs-adaptive + */ +/** + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. + */ +import { Expression, ExpressionParserInterface } from 'adaptive-expressions'; +import { Dialog, TurnPath } from 'botbuilder-dialogs'; +import { OnEventActivity } from './onEventActivity'; + +/** + * Actions triggered when an EventActivity is received. + */ +export class OnContinueConversation extends OnEventActivity { + public static $kind = 'Microsoft.OnContinueConversation'; + + /** + * Initializes a new instance of the [OnContinueConversation](xref:botbuilder-dialogs-adaptive.OnContinueConversation) class. + * + * @param {Dialog[]} actions Optional. A [Dialog](xref:botbuilder-dialogs.Dialog) list containing the actions to add to the plan when the rule constraints are met. + * @param {string} condition Optional. Condition which needs to be met for the actions to be executed. + */ + public constructor(actions: Dialog[] = [], condition?: string) { + super(actions, condition); + } + + /** + * Gets this activity representing expression. + * + * @param {ExpressionParserInterface} parser [ExpressionParserInterface](xref:adaptive-expressions.ExpressionParserInterface) used to parse a string into an [Expression](xref:adaptive-expressions.Expression). + * @returns {Expression} An [Expression](xref:adaptive-expressions.Expression) representing the [Activity](xref:botframework-schema.Activity). + */ + public getExpression(parser: ExpressionParserInterface): Expression { + // add constraints for activity type + return Expression.andExpression( + Expression.parse(`${TurnPath.activity}.name == 'ContinueConversation'`), + super.getExpression(parser) + ); + } +} diff --git a/libraries/botbuilder-dialogs/src/dialogTurnStateConstants.ts b/libraries/botbuilder-dialogs/src/dialogTurnStateConstants.ts index 77381ce3d..02722441a 100644 --- a/libraries/botbuilder-dialogs/src/dialogTurnStateConstants.ts +++ b/libraries/botbuilder-dialogs/src/dialogTurnStateConstants.ts @@ -12,4 +12,5 @@ export class DialogTurnStateConstants { static dialogManager = Symbol('dialogManager'); static telemetryClient = Symbol('telemetryClient'); + static queueStorage = Symbol('queueStorage'); } diff --git a/testing/consumer-test/package.json b/testing/consumer-test/package.json index 169107416..7b3029067 100644 --- a/testing/consumer-test/package.json +++ b/testing/consumer-test/package.json @@ -15,6 +15,7 @@ "botbuilder-applicationinsights": "4.1.6", "botbuilder-azure": "4.1.6", "botbuilder-azure-blobs": "4.1.6", + "botbuilder-azure-queues": "4.1.6", "botbuilder-core": "4.1.6", "botbuilder-dialogs": "4.1.6", "botbuilder-dialogs-adaptive": "4.1.6", diff --git a/testing/consumer-test/test.ts b/testing/consumer-test/test.ts index 68f865289..6de6f83b1 100644 --- a/testing/consumer-test/test.ts +++ b/testing/consumer-test/test.ts @@ -5,6 +5,7 @@ import * as botbuilderAiOrchestrator from 'botbuilder-ai-orchestrator'; import * as botbuilderApplicationInsights from 'botbuilder-applicationinsights'; import * as botbuilderAzure from 'botbuilder-azure'; import * as botbuilderAzureBlobs from 'botbuilder-azure-blobs'; +import * as botbuilderAzureQueues from 'botbuilder-azure-queues'; import * as botbuilderCore from 'botbuilder-core'; import * as botbuilderDialogs from 'botbuilder-dialogs'; import * as botbuilderDialogsAdaptive from 'botbuilder-dialogs-adaptive'; @@ -24,6 +25,7 @@ console.log(Object.keys(botbuilderAiOrchestrator)); console.log(Object.keys(botbuilderApplicationInsights)); console.log(Object.keys(botbuilderAzure)); console.log(Object.keys(botbuilderAzureBlobs)); +console.log(Object.keys(botbuilderAzureQueues)); console.log(Object.keys(botbuilderCore)); console.log(Object.keys(botbuilderDialogs)); console.log(Object.keys(botbuilderDialogsAdaptive)); diff --git a/yarn.lock b/yarn.lock index 43b854dee..b4c8ad7d1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -53,6 +53,27 @@ uuid "^8.1.0" xml2js "^0.4.19" +"@azure/core-http@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@azure/core-http/-/core-http-1.2.0.tgz#eb2a1da9bdba8407a09d78450af5f13f8cc43d63" + integrity sha512-SQmyI1tpstWKePNmTseEUp8PMq1uNBslvGBrYF2zNM/fEfLD1q64XCatoH8nDQtSmDydEPsqlyyLSjjnuXrlOQ== + dependencies: + "@azure/abort-controller" "^1.0.0" + "@azure/core-auth" "^1.1.3" + "@azure/core-tracing" "1.0.0-preview.9" + "@azure/logger" "^1.0.0" + "@opentelemetry/api" "^0.10.2" + "@types/node-fetch" "^2.5.0" + "@types/tunnel" "^0.0.1" + form-data "^3.0.0" + node-fetch "^2.6.0" + process "^0.11.10" + tough-cookie "^4.0.0" + tslib "^2.0.0" + tunnel "^0.0.6" + uuid "^8.3.0" + xml2js "^0.4.19" + "@azure/core-lro@^1.0.2": version "1.0.2" resolved "https://registry.yarnpkg.com/@azure/core-lro/-/core-lro-1.0.2.tgz#b7b51ff7b84910b7eb152a706b0531d020864f31" @@ -141,6 +162,19 @@ events "^3.0.0" tslib "^2.0.0" +"@azure/storage-queue@^12.2.0": + version "12.2.0" + resolved "https://registry.yarnpkg.com/@azure/storage-queue/-/storage-queue-12.2.0.tgz#0c82a0531d82358ee57754c21e1a1fce4ae5e408" + integrity sha512-HxFMLs6f0VQ4q1pyj4BKpdgH2amwvSwcNh+SFFcOmVuu6PpjTgP1HLiVPAf982iZlLEAEwNjzwnw2XrLbDumMA== + dependencies: + "@azure/abort-controller" "^1.0.0" + "@azure/core-http" "^1.2.0" + "@azure/core-paging" "^1.1.1" + "@azure/core-tracing" "1.0.0-preview.9" + "@azure/logger" "^1.0.0" + "@opentelemetry/api" "^0.10.2" + tslib "^2.0.0" + "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a" @@ -11819,7 +11853,7 @@ uuid@^3.0.0, uuid@^3.1.0, uuid@^3.2.1, uuid@^3.3.2, uuid@^3.3.3, uuid@^3.4.0: resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== -uuid@^8.1.0: +uuid@^8.1.0, uuid@^8.3.0: version "8.3.1" resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.1.tgz#2ba2e6ca000da60fce5a196954ab241131e05a31" integrity sha512-FOmRr+FmWEIG8uhZv6C2bTgEVXsHk08kE7mPlrBbEe+c3r9pjceVPgupIfNIhc4yx55H69OXANrUaSuu9eInKg==