twilio-taskrouter 0.7.0 → 0.7.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/dist/docs/Activity.html +1 -1
- package/dist/docs/Channel.html +1 -1
- package/dist/docs/IncomingTransfer.html +1 -1
- package/dist/docs/OutgoingTransfer.html +1 -1
- package/dist/docs/Reservation.html +1 -1
- package/dist/docs/Task.html +1 -1
- package/dist/docs/TaskQueue.html +1 -1
- package/dist/docs/Transfers.html +1 -1
- package/dist/docs/Worker.html +1 -1
- package/dist/docs/Workspace.html +1 -1
- package/dist/docs/classes.list.html +1 -1
- package/dist/docs/index.html +1 -1
- package/dist/docs/quicksearch.html +1 -1
- package/dist/index.commonjs2.js +1 -1
- package/dist/index.commonjs2.js.LICENSE.txt +1 -1
- package/dist/index.window.js +2 -2
- package/dist/index.window.js.LICENSE.txt +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
package/dist/docs/Activity.html
CHANGED
|
@@ -763,7 +763,7 @@
|
|
|
763
763
|
<span class="jsdoc-message">
|
|
764
764
|
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.7</a>
|
|
765
765
|
|
|
766
|
-
on 2022-
|
|
766
|
+
on 2022-11-03T07:19:23+00:00
|
|
767
767
|
|
|
768
768
|
using the <a href="https://github.com/docstrap/docstrap">DocStrap template</a>.
|
|
769
769
|
</span>
|
package/dist/docs/Channel.html
CHANGED
|
@@ -839,7 +839,7 @@
|
|
|
839
839
|
<span class="jsdoc-message">
|
|
840
840
|
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.7</a>
|
|
841
841
|
|
|
842
|
-
on 2022-
|
|
842
|
+
on 2022-11-03T07:19:23+00:00
|
|
843
843
|
|
|
844
844
|
using the <a href="https://github.com/docstrap/docstrap">DocStrap template</a>.
|
|
845
845
|
</span>
|
|
@@ -475,7 +475,7 @@
|
|
|
475
475
|
<span class="jsdoc-message">
|
|
476
476
|
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.7</a>
|
|
477
477
|
|
|
478
|
-
on 2022-
|
|
478
|
+
on 2022-11-03T07:19:23+00:00
|
|
479
479
|
|
|
480
480
|
using the <a href="https://github.com/docstrap/docstrap">DocStrap template</a>.
|
|
481
481
|
</span>
|
|
@@ -1124,7 +1124,7 @@ No more attempts on the <a href="OutgoingTransfer.html">OutgoingTransfer</a> wil
|
|
|
1124
1124
|
<span class="jsdoc-message">
|
|
1125
1125
|
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.7</a>
|
|
1126
1126
|
|
|
1127
|
-
on 2022-
|
|
1127
|
+
on 2022-11-03T07:19:23+00:00
|
|
1128
1128
|
|
|
1129
1129
|
using the <a href="https://github.com/docstrap/docstrap">DocStrap template</a>.
|
|
1130
1130
|
</span>
|
|
@@ -5379,7 +5379,7 @@ upon rejecting the <a href="Reservation.html">Reservation</a></p></td>
|
|
|
5379
5379
|
<span class="jsdoc-message">
|
|
5380
5380
|
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.7</a>
|
|
5381
5381
|
|
|
5382
|
-
on 2022-
|
|
5382
|
+
on 2022-11-03T07:19:23+00:00
|
|
5383
5383
|
|
|
5384
5384
|
using the <a href="https://github.com/docstrap/docstrap">DocStrap template</a>.
|
|
5385
5385
|
</span>
|
package/dist/docs/Task.html
CHANGED
|
@@ -3352,7 +3352,7 @@
|
|
|
3352
3352
|
<span class="jsdoc-message">
|
|
3353
3353
|
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.7</a>
|
|
3354
3354
|
|
|
3355
|
-
on 2022-
|
|
3355
|
+
on 2022-11-03T07:19:23+00:00
|
|
3356
3356
|
|
|
3357
3357
|
using the <a href="https://github.com/docstrap/docstrap">DocStrap template</a>.
|
|
3358
3358
|
</span>
|
package/dist/docs/TaskQueue.html
CHANGED
|
@@ -619,7 +619,7 @@
|
|
|
619
619
|
<span class="jsdoc-message">
|
|
620
620
|
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.7</a>
|
|
621
621
|
|
|
622
|
-
on 2022-
|
|
622
|
+
on 2022-11-03T07:19:23+00:00
|
|
623
623
|
|
|
624
624
|
using the <a href="https://github.com/docstrap/docstrap">DocStrap template</a>.
|
|
625
625
|
</span>
|
package/dist/docs/Transfers.html
CHANGED
|
@@ -307,7 +307,7 @@
|
|
|
307
307
|
<span class="jsdoc-message">
|
|
308
308
|
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.7</a>
|
|
309
309
|
|
|
310
|
-
on 2022-
|
|
310
|
+
on 2022-11-03T07:19:23+00:00
|
|
311
311
|
|
|
312
312
|
using the <a href="https://github.com/docstrap/docstrap">DocStrap template</a>.
|
|
313
313
|
</span>
|
package/dist/docs/Worker.html
CHANGED
|
@@ -3186,7 +3186,7 @@ provided, defaults to 'default' channel.</p></td>
|
|
|
3186
3186
|
<span class="jsdoc-message">
|
|
3187
3187
|
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.7</a>
|
|
3188
3188
|
|
|
3189
|
-
on 2022-
|
|
3189
|
+
on 2022-11-03T07:19:23+00:00
|
|
3190
3190
|
|
|
3191
3191
|
using the <a href="https://github.com/docstrap/docstrap">DocStrap template</a>.
|
|
3192
3192
|
</span>
|
package/dist/docs/Workspace.html
CHANGED
|
@@ -1985,7 +1985,7 @@
|
|
|
1985
1985
|
<span class="jsdoc-message">
|
|
1986
1986
|
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.7</a>
|
|
1987
1987
|
|
|
1988
|
-
on 2022-
|
|
1988
|
+
on 2022-11-03T07:19:23+00:00
|
|
1989
1989
|
|
|
1990
1990
|
using the <a href="https://github.com/docstrap/docstrap">DocStrap template</a>.
|
|
1991
1991
|
</span>
|
|
@@ -3537,7 +3537,7 @@ No more attempts on the <a href="OutgoingTransfer.html">OutgoingTransfer</a> wil
|
|
|
3537
3537
|
<span class="jsdoc-message">
|
|
3538
3538
|
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.7</a>
|
|
3539
3539
|
|
|
3540
|
-
on 2022-
|
|
3540
|
+
on 2022-11-03T07:19:23+00:00
|
|
3541
3541
|
|
|
3542
3542
|
using the <a href="https://github.com/docstrap/docstrap">DocStrap template</a>.
|
|
3543
3543
|
</span>
|
package/dist/docs/index.html
CHANGED
|
@@ -223,7 +223,7 @@ request/contribution process, <a href="https://gun.io/blog/how-to-github-fork-br
|
|
|
223
223
|
<span class="jsdoc-message">
|
|
224
224
|
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.7</a>
|
|
225
225
|
|
|
226
|
-
on 2022-
|
|
226
|
+
on 2022-11-03T07:19:23+00:00
|
|
227
227
|
|
|
228
228
|
using the <a href="https://github.com/docstrap/docstrap">DocStrap template</a>.
|
|
229
229
|
</span>
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
<script src="scripts/fulltext-search.js"></script>
|
|
7
7
|
|
|
8
8
|
<script type="text/x-docstrap-searchdb">
|
|
9
|
-
{"classes.list.html":{"id":"classes.list.html","title":"Classes","body":" Documentation Classes ActivityChannelIncomingTransferOutgoingTransferReservationTaskTaskQueueTransfersWorkerWorkspace Events Channel#event:availabilityUpdatedChannel#event:capacityUpdatedOutgoingTransfer#event:attemptFailedOutgoingTransfer#event:canceledOutgoingTransfer#event:completedOutgoingTransfer#event:failedReservation#event:acceptedReservation#event:canceledReservation#event:completedReservation#event:rejectedReservation#event:rescindedReservation#event:timeoutReservation#event:wrapupTask#event:canceledTask#event:completedTask#event:transferInitiatedTask#event:updatedTask#event:wrapupWorker#event:activityUpdatedWorker#event:attributesUpdatedWorker#event:disconnectedWorker#event:errorWorker#event:readyWorker#event:reservationCreatedWorker#event:reservationFailedWorker#event:tokenExpiredWorker#event:tokenUpdated Classes Classes Activity Channel IncomingTransfer OutgoingTransfer Reservation Task TaskQueue Transfers Worker Workspace Events availabilityUpdated The availability of this Channel was updated Parameters: Name Type Description channel Channel The Channel whose availability was updated capacityUpdated The capacity of this Channel was updated Parameters: Name Type Description channel Channel The Channel whose capacity was updated attemptFailed The attempt to transfer the Task to the desired entity failed Parameters: Name Type Description outgoingTransfer OutgoingTransfer The OutgoingTransfer that had an attempt failure canceled The Task's current OutgoingTransfer has successfully been cancelled Parameters: Name Type Description outgoingTransfer OutgoingTransfer The OutgoingTransfer that was canceled completed The OutgoingTransfer has successfully been transferred to the desired entity Parameters: Name Type Description outgoingTransfer OutgoingTransfer The OutgoingTransfer that was completed failed All attempts to transfer the Task to the desired entity have failed. No more attempts on the OutgoingTransfer will be made. Parameters: Name Type Description outgoingTransfer OutgoingTransfer The OutgoingTransfer that has failed accepted Fired when a Reservation has been accepted for this Worker Parameters: Name Type Description reservation Reservation The accepted Reservation canceled Fired when a Reservation has been canceled for this Worker Parameters: Name Type Description reservation Reservation The canceled Reservation completed Fired when an accepted Reservation has been completed for this Worker Parameters: Name Type Description reservation Reservation The completed Reservation rejected Fired when a Reservation has been rejected for this Worker Parameters: Name Type Description reservation Reservation The rejected Reservation rescinded Fired when a Reservation has been rescinded for the Worker Parameters: Name Type Description reservation Reservation The rescinded Reservation timeout Fired when a Reservation has been timed out for this Worker Parameters: Name Type Description reservation Reservation The timed out Reservation wrapup Fired when a Reservation has been wrapped up for the Worker Parameters: Name Type Description reservation Reservation The wrapped up Reservation canceled The Task was canceled Parameters: Name Type Description task Task The Task who was canceled completed The Task was completed Parameters: Name Type Description task Task The Task who was completed transferInitiated An OutgoingTransfer has been initiated for Task Parameters: Name Type Description outgoingTransfer OutgoingTransfer The currently in process OutgoingTransfer updated The attributes of this Task was updated Parameters: Name Type Description task Task The Task whose attributes were updated wrapup The Task was wrapped up Parameters: Name Type Description task Task The Task who was wrapped up activityUpdated Worker activity has updated Parameters: Name Type Description worker Worker The updated Worker attributesUpdated Worker attributes have updated Parameters: Name Type Description worker Worker The updated Worker disconnected The signaling layer has lost the websocket connection Parameters: Name Type Description reason Object The reason the Worker websocket disconnected error An error has occurred Parameters: Name Type Description error Error The Error that occurred ready Worker is ready to listen for events and take action reservationCreated A Reservation has been created for the Worker Parameters: Name Type Description reservation Reservation The created Reservation reservationFailed Worker was unable to receive a Reservation for the Task it created Parameters: Name Type Description task Object The raw Task-like payload that failed to generate a Reservation tokenExpired The Worker token has expired tokenUpdated The Worker token has successfully updated × Search results Close Documentation generated by JSDoc 3.6.7 on 2022-10-05T08:55:12+00:00 using the DocStrap template. "},"index.html":{"id":"index.html","title":"Index","body":" Documentation Classes ActivityChannelIncomingTransferOutgoingTransferReservationTaskTaskQueueTransfersWorkerWorkspace Events Channel#event:availabilityUpdatedChannel#event:capacityUpdatedOutgoingTransfer#event:attemptFailedOutgoingTransfer#event:canceledOutgoingTransfer#event:completedOutgoingTransfer#event:failedReservation#event:acceptedReservation#event:canceledReservation#event:completedReservation#event:rejectedReservation#event:rescindedReservation#event:timeoutReservation#event:wrapupTask#event:canceledTask#event:completedTask#event:transferInitiatedTask#event:updatedTask#event:wrapupWorker#event:activityUpdatedWorker#event:attributesUpdatedWorker#event:disconnectedWorker#event:errorWorker#event:readyWorker#event:reservationCreatedWorker#event:reservationFailedWorker#event:tokenExpiredWorker#event:tokenUpdated twilio-taskrouter.js TaskRouter is Twilio's skills based routing system. With this library, you can manage your Workers in the browser or view the state of your Workspace. NOTE: This SDK is in a Developer Preview Release. This version of TaskRouter is intended for Twilio Flex. If you are using it outside of Twilio Flex, you may encounter bugs and instability, and the underlying APIs available in this release may change in subsequent releases. Installation NPM npm install twilio-taskrouter Usage The following is a simple example showing a Worker waiting for Reservations. For more information, refer to the API Docs. const TaskRouter = require('twilio-taskrouter'); const Twilio = require('twilio'); const AccessToken = Twilio.jwt.AccessToken; const TaskRouterGrant = AccessToken.TaskRouterGrant; const accountSid = ''; const signingKeySid = ''; const signingKeySecret = ''; const workspaceSid = ''; const workerSid = ''; const token = createAccessToken(accountSid, signingKeySid, signingKeySecret, workspaceSid, workerSid); const alice = new TaskRouter.Worker(token); alice.on('ready', readyAlice => { console.log(`Worker ${readyAlice.sid} is now ready for work`); }); alice.on('reservationCreated', reservation => { console.log(`Reservation ${reservation.sid} has been created for ${alice.sid}`); console.log(`Task attributes are: ${reservation.task.attributes}`); reservation.on('accepted', acceptedReservation => { console.log(`Reservation ${acceptedReservation.sid} was accepted.`); }); reservation.accept().then(acceptedReservation => { console.log(`Reservation status is ${acceptedReservation.status}`); }).catch((err) => { console.log(`Error: ${err}`); }); }); function createAccessToken(accountSid, signingKeySid, signingKeySecret, workspaceSid, workerSid) { const taskRouterGrant = new TaskRouterGrant({ workerSid: workerSid, workspaceSid: workspaceSid, role: 'worker' }); const accessToken = new AccessToken(accountSid, signingKeySid, signingKeySecret); accessToken.addGrant(taskRouterGrant); accessToken.identity = 'alice'; return accessToken.toJwt(); } Changelog See CHANGELOG.md. License See LICENSE.md. Building Fork and clone the repository. Use npm to install node 8 (other versions may run into problems). Then, install dependencies with: yarn install Then run the build script: yarn build The builds and docs will be placed in the dist/ directory. Before commits, be sure to validate by running: make lint Testing Create a twilio account copy ./test/integration_test_setup/.env.example to ./test/integration_test_setup/.env set ACCOUNT_SID, AUTH_TOKEN, SIGNING_KEY_SID, SIGNING_KEY_SECRET Run ./test/integration_test_setup/RunIntegrationTestLocal.sh this will create everything needed for running E2E tests and run the tests Contributing Bug fixes welcome! If you're not familiar with the GitHub pull request/contribution process, this is a nice tutorial. × Search results Close Documentation generated by JSDoc 3.6.7 on 2022-10-05T08:55:12+00:00 using the DocStrap template. "},"Activity.html":{"id":"Activity.html","title":"Class: Activity","body":" Documentation Classes ActivityChannelIncomingTransferOutgoingTransferReservationTaskTaskQueueTransfersWorkerWorkspace Events Channel#event:availabilityUpdatedChannel#event:capacityUpdatedOutgoingTransfer#event:attemptFailedOutgoingTransfer#event:canceledOutgoingTransfer#event:completedOutgoingTransfer#event:failedReservation#event:acceptedReservation#event:canceledReservation#event:completedReservation#event:rejectedReservation#event:rescindedReservation#event:timeoutReservation#event:wrapupTask#event:canceledTask#event:completedTask#event:transferInitiatedTask#event:updatedTask#event:wrapupWorker#event:activityUpdatedWorker#event:attributesUpdatedWorker#event:disconnectedWorker#event:errorWorker#event:readyWorker#event:reservationCreatedWorker#event:reservationFailedWorker#event:tokenExpiredWorker#event:tokenUpdated Class: Activity Activity An Activity represents a state that a Worker can be in (e.g. Idle, Offline, Busy, ...) new Activity(worker, descriptor) Parameters: Name Type Description worker Worker The Worker descriptor ActivityDescriptor The ActivityDescriptor of this Activity Properties: Name Type Description accountSid string The sid of the Twilio account available boolean If the Worker can handle Tasks in this state dateCreated Date The date this Activity was created dateUpdated Date The date this Activity was last updated isCurrent boolean If this particular Activity represents the current state of the Worker name string The friendly name of this Activity sid string The sid of this Activity workspaceSid string The sid of the Workspace owning this Activity Methods setAsCurrent( [options]) Make this Activity the current state of the Worker Parameters: Name Type Argument Description options Activity.UpdateOptions <optional> Returns: Rejected if the Worker's activity state could not be set Type Promise.<this> Type Definitions UpdateOptions Type: Object Properties: Name Type Argument Default Description rejectPendingReservations boolean <optional> false Represents whether all pending reservations should be rejected with the update to an unavailable Activity. × Search results Close Documentation generated by JSDoc 3.6.7 on 2022-10-05T08:55:12+00:00 using the DocStrap template. "},"Channel.html":{"id":"Channel.html","title":"Class: Channel","body":" Documentation Classes ActivityChannelIncomingTransferOutgoingTransferReservationTaskTaskQueueTransfersWorkerWorkspace Events Channel#event:availabilityUpdatedChannel#event:capacityUpdatedOutgoingTransfer#event:attemptFailedOutgoingTransfer#event:canceledOutgoingTransfer#event:completedOutgoingTransfer#event:failedReservation#event:acceptedReservation#event:canceledReservation#event:completedReservation#event:rejectedReservation#event:rescindedReservation#event:timeoutReservation#event:wrapupTask#event:canceledTask#event:completedTask#event:transferInitiatedTask#event:updatedTask#event:wrapupWorker#event:activityUpdatedWorker#event:attributesUpdatedWorker#event:disconnectedWorker#event:errorWorker#event:readyWorker#event:reservationCreatedWorker#event:reservationFailedWorker#event:tokenExpiredWorker#event:tokenUpdated Class: Channel Channel A Channel distinguishes Tasks into specific types (e.g. Default, Chat, SMS, Video, Voice) new Channel(worker, request, descriptor) Parameters: Name Type Description worker Worker The Worker request Request The Request descriptor WorkerChannelDescriptor The data descriptor which describes this Channel Properties: Name Type Description accountSid string The sid of the Twilio account assignedTasks int The number of Tasks assigned to this Channel available boolean If the Worker should be assigned Tasks of this Channel type availableCapacityPercentage int The current available capacity of this Worker to handle Tasks of this Channel type capacity int The number of Tasks that a Worker can handle of this Channel type lastReservedTime Date The date when the Channel last saw a Task dateCreated Date The date this Channel was created dateUpdated Date The date this Channel was last updated sid string The sid of this Activity taskChannelSid string The sid of the TaskChannel associated to this Worker Channel taskChannelUniqueName string The friendly name of this Channel workerSid string The sid of the Worker owning this Channel workspaceSid string The sid of the Workspace owning this Activity Fires: Channel#event:capacityUpdated Channel#event:availabilityUpdated Events availabilityUpdated The availability of this Channel was updated Parameters: Name Type Description channel Channel The Channel whose availability was updated capacityUpdated The capacity of this Channel was updated Parameters: Name Type Description channel Channel The Channel whose capacity was updated × Search results Close Documentation generated by JSDoc 3.6.7 on 2022-10-05T08:55:12+00:00 using the DocStrap template. "},"IncomingTransfer.html":{"id":"IncomingTransfer.html","title":"Class: IncomingTransfer","body":" Documentation Classes ActivityChannelIncomingTransferOutgoingTransferReservationTaskTaskQueueTransfersWorkerWorkspace Events Channel#event:availabilityUpdatedChannel#event:capacityUpdatedOutgoingTransfer#event:attemptFailedOutgoingTransfer#event:canceledOutgoingTransfer#event:completedOutgoingTransfer#event:failedReservation#event:acceptedReservation#event:canceledReservation#event:completedReservation#event:rejectedReservation#event:rescindedReservation#event:timeoutReservation#event:wrapupTask#event:canceledTask#event:completedTask#event:transferInitiatedTask#event:updatedTask#event:wrapupWorker#event:activityUpdatedWorker#event:attributesUpdatedWorker#event:disconnectedWorker#event:errorWorker#event:readyWorker#event:reservationCreatedWorker#event:reservationFailedWorker#event:tokenExpiredWorker#event:tokenUpdated Class: IncomingTransfer IncomingTransfer An IncomingTransfer represents the transfer of work for the Worker via another Worker or queue new IncomingTransfer(worker, transferDescriptor) Parameters: Name Type Description worker Worker The Worker transferDescriptor TransferDescriptor The transfer descriptor which describes this IncomingTransfer Properties: Name Type Description dateCreated Date The timestamp when this IncomingTransfer was created dateUpdated Date The timestamp when this IncomingTransfer was last updated mode string Transfer mode ['WARM', 'COLD'] reservationSid string The sid of the initiating Reservation. sid string The sid of this IncomingTransfer status string ['INITIATED', 'FAILED', 'COMPLETE', 'CANCELED'] to string The sid of the Worker or TaskQueue this IncomingTransfer is intended for type string The transfer type ['QUEUE', 'WORKER'] workerSid string The sid of the initiating Worker × Search results Close Documentation generated by JSDoc 3.6.7 on 2022-10-05T08:55:12+00:00 using the DocStrap template. "},"OutgoingTransfer.html":{"id":"OutgoingTransfer.html","title":"Class: OutgoingTransfer","body":" Documentation Classes ActivityChannelIncomingTransferOutgoingTransferReservationTaskTaskQueueTransfersWorkerWorkspace Events Channel#event:availabilityUpdatedChannel#event:capacityUpdatedOutgoingTransfer#event:attemptFailedOutgoingTransfer#event:canceledOutgoingTransfer#event:completedOutgoingTransfer#event:failedReservation#event:acceptedReservation#event:canceledReservation#event:completedReservation#event:rejectedReservation#event:rescindedReservation#event:timeoutReservation#event:wrapupTask#event:canceledTask#event:completedTask#event:transferInitiatedTask#event:updatedTask#event:wrapupWorker#event:activityUpdatedWorker#event:attributesUpdatedWorker#event:disconnectedWorker#event:errorWorker#event:readyWorker#event:reservationCreatedWorker#event:reservationFailedWorker#event:tokenExpiredWorker#event:tokenUpdated Class: OutgoingTransfer OutgoingTransfer An OutgoingTransfer represents the currently active outgoing transfer initiated by the Worker to another Worker or queue new OutgoingTransfer(worker, request, taskSid, transferDescriptor) Parameters: Name Type Description worker Worker The Worker request Request The Request taskSid string The sid of the owning Task transferDescriptor TransferDescriptor The transfer descriptor which describes this OutgoingTransfer Properties: Name Type Description dateCreated Date The timestamp when this OutgoingTransfer was created dateUpdated Date The timestamp when this OutgoingTransfer was last updated mode string Transfer mode ['WARM', 'COLD'] reservationSid string The sid of the initiating Reservation. sid string The sid of this OutgoingTransfer status string ['INITIATED', 'FAILED', 'COMPLETED', 'CANCELED'] to string The sid of the Worker or TaskQueue this OutgoingTransfer is intended for transferFailedReason string The reason, if applicable, for why the transfer failed type string The transfer type ['QUEUE', 'WORKER'] workerSid string The sid of the initiating Worker Methods <async> cancel() Cancel the ongoing OutgoingTransfer Returns: Rejected if the OutgoingTransfer state could not be updated to 'canceled' Type Promise.<this> Events attemptFailed The attempt to transfer the Task to the desired entity failed Parameters: Name Type Description outgoingTransfer OutgoingTransfer The OutgoingTransfer that had an attempt failure canceled The Task's current OutgoingTransfer has successfully been cancelled Parameters: Name Type Description outgoingTransfer OutgoingTransfer The OutgoingTransfer that was canceled completed The OutgoingTransfer has successfully been transferred to the desired entity Parameters: Name Type Description outgoingTransfer OutgoingTransfer The OutgoingTransfer that was completed failed All attempts to transfer the Task to the desired entity have failed. No more attempts on the OutgoingTransfer will be made. Parameters: Name Type Description outgoingTransfer OutgoingTransfer The OutgoingTransfer that has failed × Search results Close Documentation generated by JSDoc 3.6.7 on 2022-10-05T08:55:12+00:00 using the DocStrap template. "},"Reservation.html":{"id":"Reservation.html","title":"Class: Reservation","body":" Documentation Classes ActivityChannelIncomingTransferOutgoingTransferReservationTaskTaskQueueTransfersWorkerWorkspace Events Channel#event:availabilityUpdatedChannel#event:capacityUpdatedOutgoingTransfer#event:attemptFailedOutgoingTransfer#event:canceledOutgoingTransfer#event:completedOutgoingTransfer#event:failedReservation#event:acceptedReservation#event:canceledReservation#event:completedReservation#event:rejectedReservation#event:rescindedReservation#event:timeoutReservation#event:wrapupTask#event:canceledTask#event:completedTask#event:transferInitiatedTask#event:updatedTask#event:wrapupWorker#event:activityUpdatedWorker#event:attributesUpdatedWorker#event:disconnectedWorker#event:errorWorker#event:readyWorker#event:reservationCreatedWorker#event:reservationFailedWorker#event:tokenExpiredWorker#event:tokenUpdated Class: Reservation Reservation A Reservation correlates a Task and a Worker new Reservation(worker, request, descriptor) Construct a Reservation. Parameters: Name Type Description worker Worker The Worker request Request The Request descriptor ReservationDescriptor The data descriptor which describes this Reservation Properties: Name Type Description accountSid string The sid of the Twilio account dateCreated Date The date the Reservation was created dateUpdated Date The date the Reservation was last updated canceledReasonCode int The reason code received when Reservation is canceled sid string The sid of the Reservation status string The current state of the Reservation. Options: ['pending', 'accepted', 'rejected', 'timeout', 'canceled', 'rescinded', 'wrapping', 'completed']. task Task The Task tied to the Reservation timeout int The number of seconds until the Task times out workerSid string The sid of the Worker workspaceSid string The sid of the Workspace owning this Reservation version string The version of this Reservation Fires: Reservation#event:accepted Reservation#event:canceled Reservation#event:completed Reservation#event:rejected Reservation#event:rescinded Reservation#event:timeout Reservation#event:wrapup Methods accept() Accept the Reservation Returns: Rejected if unable to issue Accept instruction on the Reservation Type Promise.<this> call(from, url [, options]) Issue a Call to a Worker Parameters: Name Type Argument Description from string The caller id for the call to a Worker url string A valid TwiML URI that is executed on the answering Worker's leg options Reservation.CallOptions <optional> Returns: Rejected if unable to issue Call instruction on the Reservation Type Promise.<this> complete() Complete the Reservation Returns: Rejected if unable to issue Complete instruction on the Reservation Type Promise.<this> conference( [options]) Conference the active Call tied to this Reservation to the Worker Parameters: Name Type Argument Description options Reservation.ConferenceOptions <optional> Returns: Rejected if unable to issue Conference instruction on the link Reservation Type Promise.<this> dequeue( [options]) Dequeue the Reservation to the Worker. This will perform telephony to dequeue a Task that was enqueued using the Enqueue TwiML verb. A contact_uri must exist in the Worker's attributes for this call to go through. Parameters: Name Type Argument Description options Reservation.DequeueOptions <optional> Returns: Rejected if unable to issue Dequeue instruction on the Reservation Type Promise.<this> fetchLatestVersion() Fetch the last version of this Reservation Returns: Type Promise.<Reservation> redirect(callSid, url [, options]) Redirect the active Call tied to this Reservation Parameters: Name Type Argument Description callSid string The sid of the Call to redirect url string A valid TwiML URI that is executed on the Caller's leg upon redirecting options Reservation.RedirectOptions <optional> Returns: Rejected if unable to issue Redirect instruction on the Reservation Type Promise.<this> reject( [options]) Reject the Reservation Parameters: Name Type Argument Description options Reservation.RejectOptions <optional> Returns: Rejected if unable to issue Reject instruction on the Reservation Type Promise.<this> updateParticipant( [options]) Update the Worker's leg in the Conference associated to this Reservation Parameters: Name Type Argument Description options Reservation.ParticipantOptions <optional> Returns: Rejected if unable to update the Worker's leg in the Conference tied to the Reservation Type Promise.<this> wrap() Wrap the Reservation Returns: Rejected if unable to issue Wrap instruction on the Reservation Type Promise.<this> Type Definitions CallOptions Type: Object Properties: Name Type Argument Default Description accept boolean <optional> false Represents whether the Task should be accepted before initiating the call record string <optional> 'do-not-record' To record the call or not statusCallbackUrl string <optional> null A valid status status callback url to string <optional> null The number or endpoint that should be called. If not provided, the contact_uri defined in the Worker attributes will be used timeout number <optional> 60 The integer number of seconds Twilio should allow the phone associated to "contact_uri" to ring ConferenceOptions Type: Object Properties: Name Type Argument Default Description to string <optional> null The contact uri of the Worker; can be a phone number or a client ID. Required, if no contact_uri on the Worker's attributes. from string <optional> null The caller id for the call to the Worker. Must be a verified Twilio number. timeout int <optional> 60 The integer number of seconds that Twilio should allow the call to ring before assuming there is no answer. statusCallback string <optional> null The URL endpoint to receive call status events of the Worker leg. statusCallbackMethod string <optional> 'POST' The HTTP method for the Status Callback URL. statusCallbackEvent string <optional> 'completed' A comma separated list of events to subscribe to. The possible list of events are: ['initiated', 'ringing', 'answered', 'completed']. record string <optional> 'do-not-record' Whether to record the Worker leg of the Conference. muted boolean <optional> false Whether the Worker leg of the Conference is muted. beep string | boolean <optional> true Whether the Worker leg should be when entering the Conference. The options for beep are: [true, false, 'onEnter', 'onExit']. startConferenceOnEnter boolean <optional> true Whether the Conference should start when the Worker leg enters. endConferenceOnExit boolean <optional> false Whether the Conference should end when the Worker leg exits. endConferenceOnCustomerExit boolean <optional> false Whether the Conference should end when the customer leg exits. beepOnCustomerEntrance boolean <optional> true Whether the Conference should beep when the customer leg enters. waitUrl string <optional> default Twilio hold music The URL endpoint to play when waiting for the Conference to begin. waitMethod string <optional> 'POST' The HTTP method for the Wait URL. earlyMedia boolean <optional> true Whether Twilio should feed early media to be played directly into a Conference. maxParticipants int <optional> 10 The number of max participants allowed in a Conference. conferenceStatusCallback string <optional> null The URL endpoint to receive Conference status events. conferenceStatusCallbackMethod string <optional> 'POST' The HTTP method for the Conference Status Callback URL. conferenceStatusCallbackEvent string <optional> 'start,end' A comma separated list of Conference events to subscribe to. The possible list of events are: ['start', 'end', 'join', 'leave', 'mute', 'hold', 'speaker']. conferenceRecord string | boolean <optional> false Whether the entire Conference should be recorded. The possible options for conferenceRecord are: [true, false, 'record-from-start', 'do-not-record']. conferenceTrim string <optional> 'trim-silence' Whether to trim the Conference recording. The options for conferenceTrim are: ['trim-silence', 'do-not-trim']. recordingChannels string <optional> 'mono' Which channel of the Conference to record. The options are: ['mono', 'dual']. recordingStatusCallback string <optional> null The URL endpoint to receive recording status events. recordingStatusCallbackMethod string <optional> 'POST' The HTTP method for the Recording Status Callback URL. conferenceRecordingStatusCallback string <optional> null The URl endpoint to receive Conference events. conferenceRecordingStatusCallbackMethod string <optional> 'POST' The HTTP method of the Conference Recording Status Callback. region string <optional> null The specific region. The options for region are: ['us1', 'ie1', 'sg1', 'br1', 'au1', 'jp1']. sipAuthUsername string <optional> null The SIP auth username to use. sipAuthPassword string <optional> null The SIP auth password to use. DequeueOptions Type: Object Properties: Name Type Argument Default Description from string <optional> null The caller id for the call to the Worker. Must be a verified Twilio number. to string <optional> null The contact uri of the Worker; can be a phone number or a client ID. Required, if no contact_uri on the Worker's attributes. postWorkActivitySid string <optional> null The activitySid to update the Worker to after dequeuing the Reservation. record string <optional> 'do-not-record' Defines which legs of the call should be recorded. timeout int <optional> 60 The integer number of seconds that Twilio should allow the call to ring before assuming there is no answer. statusCallbackUrl string <optional> null A URL that Twilio will send asynchronous webhook this._request. to on a completed call event. statusCallbackEvents string <optional> null A comma separated string of the events to subscribe to ParticipantOptions Type: Object Properties: Name Type Argument Default Description endConferenceOnExit boolean <optional> null Whether the Conference should end when this Worker participant leaves the Conference mute boolean <optional> null Mute or unmute this Worker participant beepOnExit boolean <optional> null Whether there should be a beep sound when this Worker participant leaves the Conference RedirectOptions Type: Object Properties: Name Type Argument Default Description accept boolean <optional> false Represents whether the Task should be accepted before initiating the call RejectOptions Type: Object Properties: Name Type Description activitySid string The sid of the Activity to update the worker to upon rejecting the Reservation Events accepted Fired when a Reservation has been accepted for this Worker Parameters: Name Type Description reservation Reservation The accepted Reservation canceled Fired when a Reservation has been canceled for this Worker Parameters: Name Type Description reservation Reservation The canceled Reservation completed Fired when an accepted Reservation has been completed for this Worker Parameters: Name Type Description reservation Reservation The completed Reservation rejected Fired when a Reservation has been rejected for this Worker Parameters: Name Type Description reservation Reservation The rejected Reservation rescinded Fired when a Reservation has been rescinded for the Worker Parameters: Name Type Description reservation Reservation The rescinded Reservation timeout Fired when a Reservation has been timed out for this Worker Parameters: Name Type Description reservation Reservation The timed out Reservation wrapup Fired when a Reservation has been wrapped up for the Worker Parameters: Name Type Description reservation Reservation The wrapped up Reservation × Search results Close Documentation generated by JSDoc 3.6.7 on 2022-10-05T08:55:12+00:00 using the DocStrap template. "},"Task.html":{"id":"Task.html","title":"Class: Task","body":" Documentation Classes ActivityChannelIncomingTransferOutgoingTransferReservationTaskTaskQueueTransfersWorkerWorkspace Events Channel#event:availabilityUpdatedChannel#event:capacityUpdatedOutgoingTransfer#event:attemptFailedOutgoingTransfer#event:canceledOutgoingTransfer#event:completedOutgoingTransfer#event:failedReservation#event:acceptedReservation#event:canceledReservation#event:completedReservation#event:rejectedReservation#event:rescindedReservation#event:timeoutReservation#event:wrapupTask#event:canceledTask#event:completedTask#event:transferInitiatedTask#event:updatedTask#event:wrapupWorker#event:activityUpdatedWorker#event:attributesUpdatedWorker#event:disconnectedWorker#event:errorWorker#event:readyWorker#event:reservationCreatedWorker#event:reservationFailedWorker#event:tokenExpiredWorker#event:tokenUpdated Class: Task Task A Task represents an item of work new Task(worker, request, reservationSid, descriptor) Parameters: Name Type Description worker Worker The Worker request Request The Request reservationSid string The SID of the Reservation associated with this Task descriptor TaskDescriptor The data descriptor which describes this Task Properties: Name Type Description addOns Object The addons attached to the Task age int The age of the Task in seconds attributes Object The attributes of the Task dateCreated Date The date the Task was created dateUpdated Date The date the Task was last updated priority int The priority of the Task queueName string The friendly name of the TaskQueue the Task is currently in queueSid string The sid of the TaskQueue the Task is currently in reason string The reason the Task was completed or canceled, if applicable routingTarget string The target Sid of the Worker, TaskQueue, or Workflow this Task will be routed to. sid string The sid of the Task status string The status of the Task. Options: ['reserved', 'assigned', 'canceled', 'wrapping', 'completed', 'transferring'] taskChannelSid string The sid of the Task Channel associated to the Task in MultiTask mode taskChannelUniqueName string The unique name of the Task Channel associated to the Task in MultiTask mode timeout int The number of seconds the Task is allowed to live transfers Transfers The IncomingTransfer and OutgoingTransfer related to this Task, if applicable workflowName string The name of the Workflow responsible for routing the Task workflowSid string The sid of the Workflow responsible for routing the Task version string The version of this Task Fires: Task#event:canceled Task#event:completed Task#event:transferAttemptFailed Task#event:transferCanceled Task#event:transferCompleted Task#event:transferFailed Task#event:transferInitiated Task#event:updated Task#event:wrapup Methods complete(reason) Update the Task status to 'completed' Parameters: Name Type Description reason string The reason for completing the Task Returns: Rejected if the Task state could not be updated to 'completed' Type Promise.<this> fetchLatestVersion() Fetch the last version of this Task Returns: Type Promise.<Task> hold(targetWorkerSid, onHold [, options]) Hold the worker's call leg in the Conference associated to this Task and specified TargetWorkerSid Parameters: Name Type Argument Description targetWorkerSid String The target worker's sid which should be put onhold or unhold onHold boolean Whether to hold or unhold the specified worker's call leg in the Conference referenced by the Task options Task.HoldOptions <optional> kick(workerSid) Kick another active Worker participant from the ongoing conference Parameters: Name Type Description workerSid string The Sid of the Worker who is currently in the conference that should be kicked Returns: Rejected if unable to kick the call leg of the targeted Worker in the Conference tied to the Task Type Promise.<this> setAttributes(attributes) Update the Task attributes to the given attributes. Parameters: Name Type Description attributes Object A JSON to update the attributes. Returns: Rejected if the attributes cannot be set Type Promise.<this> transfer(to [, options]) Transfer the Task to another entity. Parameters: Name Type Argument Description to string The Worker or TaskQueue entity sid to transfer the task to. options Task.TransferOptions <optional> Returns: Type Promise.<this> updateParticipant( [options]) Update the Customer leg in the Conference associated to this Task Parameters: Name Type Argument Description options Task.ParticipantOptions <optional> Returns: Rejected if unable to update the Customers's leg in the Conference tied to the Task Type Promise.<this> wrapUp() Update the Task status to 'wrapping' in a multi-task enabled Workspace Returns: Rejected if the Task state could not be updated to 'wrapping' Type Promise.<this> Type Definitions HoldOptions Type: Object Properties: Name Type Argument Default Description holdUrl string <optional> default Twilio hold music The URL endpoint to play when participant is on hold. holdMethod string <optional> 'GET' The HTTP method for the hold URL. ParticipantOptions Type: Object Properties: Name Type Argument Default Description hold boolean <optional> null Whether to hold the customer leg of the Conference referenced by the Task holdUrl string <optional> default Twilio hold music The URL endpoint to play when participant is on hold. holdMethod string <optional> 'GET' The HTTP method for the hold URL. TransferOptions Type: Object Properties: Name Type Argument Default Description attributes Object <optional> Updated attributes for the task mode string <optional> 'WARM' 'WARM' or 'COLD' priority number <optional> Updated priority for the task WrappingOptions Type: Object Properties: Name Type Argument Default Description reason string <optional> null The reason for wrapping up the Task Events canceled The Task was canceled Parameters: Name Type Description task Task The Task who was canceled completed The Task was completed Parameters: Name Type Description task Task The Task who was completed transferInitiated An OutgoingTransfer has been initiated for Task Parameters: Name Type Description outgoingTransfer OutgoingTransfer The currently in process OutgoingTransfer updated The attributes of this Task was updated Parameters: Name Type Description task Task The Task whose attributes were updated wrapup The Task was wrapped up Parameters: Name Type Description task Task The Task who was wrapped up × Search results Close Documentation generated by JSDoc 3.6.7 on 2022-10-05T08:55:12+00:00 using the DocStrap template. "},"TaskQueue.html":{"id":"TaskQueue.html","title":"Class: TaskQueue","body":" Documentation Classes ActivityChannelIncomingTransferOutgoingTransferReservationTaskTaskQueueTransfersWorkerWorkspace Events Channel#event:availabilityUpdatedChannel#event:capacityUpdatedOutgoingTransfer#event:attemptFailedOutgoingTransfer#event:canceledOutgoingTransfer#event:completedOutgoingTransfer#event:failedReservation#event:acceptedReservation#event:canceledReservation#event:completedReservation#event:rejectedReservation#event:rescindedReservation#event:timeoutReservation#event:wrapupTask#event:canceledTask#event:completedTask#event:transferInitiatedTask#event:updatedTask#event:wrapupWorker#event:activityUpdatedWorker#event:attributesUpdatedWorker#event:disconnectedWorker#event:errorWorker#event:readyWorker#event:reservationCreatedWorker#event:reservationFailedWorker#event:tokenExpiredWorker#event:tokenUpdated Class: TaskQueue TaskQueue A TaskQueue represents a set of Tasks awaiting assignment. new TaskQueue(descriptor) Parameters: Name Type Description descriptor TaskQueueDescriptor The TaskQueueDescriptor of this TaskQueue Properties: Name Type Description sid string The Sid of the TaskQueue queueSid string The Sid of the TaskQueue accountSid string The Sid of the owning Account of the TaskQueue} workspaceSid string The Sid of the Workspace the TaskQueue belongs to name string The friendly name of the TaskQueue queueName string The friendly name of the TaskQueue assignmentActivityName string The Activity name for the reservation of the TaskQueue reservationActivityName string The Activity name for the assignment of the TaskQueue assignmentActivitySid string The Sid of the assignment Activity for the TaskQueue reservationActivitySid string The Sid of the reservation Activity for the TaskQueue targetWorkers string The expression used to target workers maxReservedWorkers int The maximum number of reserved workers for the TaskQueue taskOrder string The task order for the TaskQueue FIFO or LIFO dateCreated Date The date when the TaskQueue was created dateUpdated Date The date when the TaskQueue was last updated × Search results Close Documentation generated by JSDoc 3.6.7 on 2022-10-05T08:55:12+00:00 using the DocStrap template. "},"Transfers.html":{"id":"Transfers.html","title":"Class: Transfers","body":" Documentation Classes ActivityChannelIncomingTransferOutgoingTransferReservationTaskTaskQueueTransfersWorkerWorkspace Events Channel#event:availabilityUpdatedChannel#event:capacityUpdatedOutgoingTransfer#event:attemptFailedOutgoingTransfer#event:canceledOutgoingTransfer#event:completedOutgoingTransfer#event:failedReservation#event:acceptedReservation#event:canceledReservation#event:completedReservation#event:rejectedReservation#event:rescindedReservation#event:timeoutReservation#event:wrapupTask#event:canceledTask#event:completedTask#event:transferInitiatedTask#event:updatedTask#event:wrapupWorker#event:activityUpdatedWorker#event:attributesUpdatedWorker#event:disconnectedWorker#event:errorWorker#event:readyWorker#event:reservationCreatedWorker#event:reservationFailedWorker#event:tokenExpiredWorker#event:tokenUpdated Class: Transfers Transfers Transfers contains both the IncomingTransfer and OutgoingTransfer for the Worker new Transfers(worker, request, taskDescriptor) Parameters: Name Type Description worker Worker The Worker request Request The Request taskDescriptor TaskDescriptor The task descriptor which describes the related Task Properties: Name Type Description incoming IncomingTransfer The IncomingTransfer for the Worker if the related Reservation was initiated via transfer by another agent outgoing OutgoingTransfer The current active (initiated but not yet finished) OutgoingTransfer initiated by the Worker to another agent or queue × Search results Close Documentation generated by JSDoc 3.6.7 on 2022-10-05T08:55:12+00:00 using the DocStrap template. "},"Worker.html":{"id":"Worker.html","title":"Class: Worker","body":" Documentation Classes ActivityChannelIncomingTransferOutgoingTransferReservationTaskTaskQueueTransfersWorkerWorkspace Events Channel#event:availabilityUpdatedChannel#event:capacityUpdatedOutgoingTransfer#event:attemptFailedOutgoingTransfer#event:canceledOutgoingTransfer#event:completedOutgoingTransfer#event:failedReservation#event:acceptedReservation#event:canceledReservation#event:completedReservation#event:rejectedReservation#event:rescindedReservation#event:timeoutReservation#event:wrapupTask#event:canceledTask#event:completedTask#event:transferInitiatedTask#event:updatedTask#event:wrapupWorker#event:activityUpdatedWorker#event:attributesUpdatedWorker#event:disconnectedWorker#event:errorWorker#event:readyWorker#event:reservationCreatedWorker#event:reservationFailedWorker#event:tokenExpiredWorker#event:tokenUpdated Class: Worker Worker Create a Worker client representing a TaskRouter Worker new Worker(token [, options]) Parameters: Name Type Argument Description token string The string token options Worker.Options <optional> Properties: Name Type Description accountSid string The sid of the Twilio account activities Map.<string, Activity> The list of possible states a Worker can be activity Activity The current Activity of the Worker activitySid string The sid of the Activity the Worker is currently in activityName string The current Activity name the Worker is currently in attributes Object A JSON representation of the Worker's attributes available boolean Whether or not the Worker is available to take on Tasks channels Map.<string, Channel> The list of available Channels connectActivitySid string The Activity to set the Worker as on connect dateCreated Date The date this Worker was created dateStatusChanged Date The date this Worker's activity was last changed dateUpdated Date The date this Worker was last updated name string The friendly name of the Worker reservations Map.<string, Reservation> A list of pending Reservations for the Worker sid string The sid of the Worker workspaceSid string The sid of the Workspace owning this Worker workerSid string The sid of the Worker, duplicates sid field for backwards compatibility workerActivitySid string The sid of the Activity the Worker is currently in, duplicates activitySid field for backwards compatibility dateActivityChanged Date The date when the Worker's state was last changed, duplicates dateStatusChanged field for backwards compatibility friendlyName string The friendly name of the Worker, duplicates name field for backwards compatibility version string The version of this Worker Fires: Worker#event:activityUpdated Worker#event:attributesUpdated Worker#event:disconnected Worker#event:error Worker#event:ready Worker#event:reservationCreated Worker#event:tokenExpired Worker#event:tokenUpdated Methods createTask(to, from, workflowSid, taskQueueSid [, options]) Create a Task Parameters: Name Type Argument Description to string The contact uri of the customer. Stored in the Task's attributes as "outbound_to" from string The contact uri of the Worker. Stored in the Task's attributes as "from" workflowSid string The Sid of the Workflow this Task should belong to taskQueueSid string The Sid of the TaskQueue this Task should belong to, used for reporting purposes only options Worker.TaskOptions <optional> Returns: Rejected if unable to create a Task on behalf of the Worker. Returns the TaskSid of the created Task. Type Promise.<String> disconnect() Gracefully disconnect the client. Returns: Type void fetchLatestVersion() Fetch the last version of this Worker Returns: Type Promise.<Worker> setAttributes(attributes) Update attributes Parameters: Name Type Description attributes Object A JSON describing the Worker's attributes Returns: Rejected if the attributes cannot be set Type Promise.<this> updateToken(newToken) Update token Parameters: Name Type Description newToken string The new token that should be used for authentication Returns: Emits error if unable to update token Type void Type Definitions Options Type: Object Properties: Name Type Argument Default Description connectActivitySid string <optional> '' The Activity state of the Worker upon connect closeExistingSessions boolean <optional> false Whether other open sessions of this Worker should be terminated logLevel string <optional> 'error' The level of logging to enable ['error', 'warn', 'info', 'debug', 'trace', 'silent'] region string the realm for connections (ex. "stage-us1") edge string the ingress for connections (ex. "sydney") TaskOptions Type: Object Properties: Name Type Argument Default Description attributes object <optional> null Additional attributes for the Task taskChannelUniqueName string <optional> null The friendly name of the Channel this Task belongs to. If not provided, defaults to 'default' channel. taskChannelSid string <optional> null The Sid of the Channel this Task belongs to. If not provided, defaults to 'default' channel. Events activityUpdated Worker activity has updated Parameters: Name Type Description worker Worker The updated Worker attributesUpdated Worker attributes have updated Parameters: Name Type Description worker Worker The updated Worker disconnected The signaling layer has lost the websocket connection Parameters: Name Type Description reason Object The reason the Worker websocket disconnected error An error has occurred Parameters: Name Type Description error Error The Error that occurred ready Worker is ready to listen for events and take action reservationCreated A Reservation has been created for the Worker Parameters: Name Type Description reservation Reservation The created Reservation reservationFailed Worker was unable to receive a Reservation for the Task it created Parameters: Name Type Description task Object The raw Task-like payload that failed to generate a Reservation tokenExpired The Worker token has expired tokenUpdated The Worker token has successfully updated × Search results Close Documentation generated by JSDoc 3.6.7 on 2022-10-05T08:55:12+00:00 using the DocStrap template. "},"Workspace.html":{"id":"Workspace.html","title":"Class: Workspace","body":" Documentation Classes ActivityChannelIncomingTransferOutgoingTransferReservationTaskTaskQueueTransfersWorkerWorkspace Events Channel#event:availabilityUpdatedChannel#event:capacityUpdatedOutgoingTransfer#event:attemptFailedOutgoingTransfer#event:canceledOutgoingTransfer#event:completedOutgoingTransfer#event:failedReservation#event:acceptedReservation#event:canceledReservation#event:completedReservation#event:rejectedReservation#event:rescindedReservation#event:timeoutReservation#event:wrapupTask#event:canceledTask#event:completedTask#event:transferInitiatedTask#event:updatedTask#event:wrapupWorker#event:activityUpdatedWorker#event:attributesUpdatedWorker#event:disconnectedWorker#event:errorWorker#event:readyWorker#event:reservationCreatedWorker#event:reservationFailedWorker#event:tokenExpiredWorker#event:tokenUpdated Class: Workspace Workspace Create a Workspace client representing a TaskRouter Workspace new Workspace(jwt [, options], workspaceSid) Parameters: Name Type Argument Description jwt string The string token options Workspace.Options <optional> workspaceSid string Sid of this Workspace, has to be provided if JWE token is passed Throws: Exception if workspaceSid is not passed with JWE token Methods fetchTaskQueue(queueSid) Fetch task queue of this Workspace by given sid Parameters: Name Type Description queueSid string the sid of the task queue to fetch Returns: A task queue with given sid Type Promise.<TaskQueue> fetchTaskQueues( [options]) Fetch task queues of this Workspace Parameters: Name Type Argument Description options Workspace.FetchTaskQueuesParams <optional> Returns: A map with the task queues Type Promise.<Map.<string, TaskQueue>> fetchWorker(workerSid) Fetch worker of this Workspace by given sid Parameters: Name Type Description workerSid string the sid of the worker to fetch Returns: A worker with given sid Type Promise.<Worker> fetchWorkers( [options]) Fetch workers of this Workspace Parameters: Name Type Argument Description options Workspace.FetchWorkersParams <optional> Returns: A map with the workers Type Promise.<Map.<string, Worker>> updateToken(newToken) Update token Parameters: Name Type Description newToken string The new token that should be used for authentication Returns: throws error if unable to update token Type void Type Definitions FetchTaskQueuesParams Type: Object Properties: Name Type Argument Default Description AfterSid string <optional> null FriendlyName string <optional> null Ordering string <optional> null FetchWorkersParams Type: Object Properties: Name Type Argument Default Description AfterSid string <optional> null FriendlyName string <optional> null ActivitySid string <optional> null ActivityName string <optional> null Ordering string <optional> null TargetWorkersExpression string <optional> null maxWorkers number <optional> null Options Type: Object Properties: Name Type Argument Default Description region string the realm for connections (ex. "stage-us1") edge string the ingress for connections (ex. "sydney") pageSize string The number of items returned in each request logLevel string <optional> 'error' The level of logging to enable ['error', 'warn', 'info', 'debug', 'trace', 'silent'] × Search results Close Documentation generated by JSDoc 3.6.7 on 2022-10-05T08:55:12+00:00 using the DocStrap template. "}}
|
|
9
|
+
{"classes.list.html":{"id":"classes.list.html","title":"Classes","body":" Documentation Classes ActivityChannelIncomingTransferOutgoingTransferReservationTaskTaskQueueTransfersWorkerWorkspace Events Channel#event:availabilityUpdatedChannel#event:capacityUpdatedOutgoingTransfer#event:attemptFailedOutgoingTransfer#event:canceledOutgoingTransfer#event:completedOutgoingTransfer#event:failedReservation#event:acceptedReservation#event:canceledReservation#event:completedReservation#event:rejectedReservation#event:rescindedReservation#event:timeoutReservation#event:wrapupTask#event:canceledTask#event:completedTask#event:transferInitiatedTask#event:updatedTask#event:wrapupWorker#event:activityUpdatedWorker#event:attributesUpdatedWorker#event:disconnectedWorker#event:errorWorker#event:readyWorker#event:reservationCreatedWorker#event:reservationFailedWorker#event:tokenExpiredWorker#event:tokenUpdated Classes Classes Activity Channel IncomingTransfer OutgoingTransfer Reservation Task TaskQueue Transfers Worker Workspace Events availabilityUpdated The availability of this Channel was updated Parameters: Name Type Description channel Channel The Channel whose availability was updated capacityUpdated The capacity of this Channel was updated Parameters: Name Type Description channel Channel The Channel whose capacity was updated attemptFailed The attempt to transfer the Task to the desired entity failed Parameters: Name Type Description outgoingTransfer OutgoingTransfer The OutgoingTransfer that had an attempt failure canceled The Task's current OutgoingTransfer has successfully been cancelled Parameters: Name Type Description outgoingTransfer OutgoingTransfer The OutgoingTransfer that was canceled completed The OutgoingTransfer has successfully been transferred to the desired entity Parameters: Name Type Description outgoingTransfer OutgoingTransfer The OutgoingTransfer that was completed failed All attempts to transfer the Task to the desired entity have failed. No more attempts on the OutgoingTransfer will be made. Parameters: Name Type Description outgoingTransfer OutgoingTransfer The OutgoingTransfer that has failed accepted Fired when a Reservation has been accepted for this Worker Parameters: Name Type Description reservation Reservation The accepted Reservation canceled Fired when a Reservation has been canceled for this Worker Parameters: Name Type Description reservation Reservation The canceled Reservation completed Fired when an accepted Reservation has been completed for this Worker Parameters: Name Type Description reservation Reservation The completed Reservation rejected Fired when a Reservation has been rejected for this Worker Parameters: Name Type Description reservation Reservation The rejected Reservation rescinded Fired when a Reservation has been rescinded for the Worker Parameters: Name Type Description reservation Reservation The rescinded Reservation timeout Fired when a Reservation has been timed out for this Worker Parameters: Name Type Description reservation Reservation The timed out Reservation wrapup Fired when a Reservation has been wrapped up for the Worker Parameters: Name Type Description reservation Reservation The wrapped up Reservation canceled The Task was canceled Parameters: Name Type Description task Task The Task who was canceled completed The Task was completed Parameters: Name Type Description task Task The Task who was completed transferInitiated An OutgoingTransfer has been initiated for Task Parameters: Name Type Description outgoingTransfer OutgoingTransfer The currently in process OutgoingTransfer updated The attributes of this Task was updated Parameters: Name Type Description task Task The Task whose attributes were updated wrapup The Task was wrapped up Parameters: Name Type Description task Task The Task who was wrapped up activityUpdated Worker activity has updated Parameters: Name Type Description worker Worker The updated Worker attributesUpdated Worker attributes have updated Parameters: Name Type Description worker Worker The updated Worker disconnected The signaling layer has lost the websocket connection Parameters: Name Type Description reason Object The reason the Worker websocket disconnected error An error has occurred Parameters: Name Type Description error Error The Error that occurred ready Worker is ready to listen for events and take action reservationCreated A Reservation has been created for the Worker Parameters: Name Type Description reservation Reservation The created Reservation reservationFailed Worker was unable to receive a Reservation for the Task it created Parameters: Name Type Description task Object The raw Task-like payload that failed to generate a Reservation tokenExpired The Worker token has expired tokenUpdated The Worker token has successfully updated × Search results Close Documentation generated by JSDoc 3.6.7 on 2022-11-03T07:19:23+00:00 using the DocStrap template. "},"index.html":{"id":"index.html","title":"Index","body":" Documentation Classes ActivityChannelIncomingTransferOutgoingTransferReservationTaskTaskQueueTransfersWorkerWorkspace Events Channel#event:availabilityUpdatedChannel#event:capacityUpdatedOutgoingTransfer#event:attemptFailedOutgoingTransfer#event:canceledOutgoingTransfer#event:completedOutgoingTransfer#event:failedReservation#event:acceptedReservation#event:canceledReservation#event:completedReservation#event:rejectedReservation#event:rescindedReservation#event:timeoutReservation#event:wrapupTask#event:canceledTask#event:completedTask#event:transferInitiatedTask#event:updatedTask#event:wrapupWorker#event:activityUpdatedWorker#event:attributesUpdatedWorker#event:disconnectedWorker#event:errorWorker#event:readyWorker#event:reservationCreatedWorker#event:reservationFailedWorker#event:tokenExpiredWorker#event:tokenUpdated twilio-taskrouter.js TaskRouter is Twilio's skills based routing system. With this library, you can manage your Workers in the browser or view the state of your Workspace. NOTE: This SDK is in a Developer Preview Release. This version of TaskRouter is intended for Twilio Flex. If you are using it outside of Twilio Flex, you may encounter bugs and instability, and the underlying APIs available in this release may change in subsequent releases. Installation NPM npm install twilio-taskrouter Usage The following is a simple example showing a Worker waiting for Reservations. For more information, refer to the API Docs. const TaskRouter = require('twilio-taskrouter'); const Twilio = require('twilio'); const AccessToken = Twilio.jwt.AccessToken; const TaskRouterGrant = AccessToken.TaskRouterGrant; const accountSid = ''; const signingKeySid = ''; const signingKeySecret = ''; const workspaceSid = ''; const workerSid = ''; const token = createAccessToken(accountSid, signingKeySid, signingKeySecret, workspaceSid, workerSid); const alice = new TaskRouter.Worker(token); alice.on('ready', readyAlice => { console.log(`Worker ${readyAlice.sid} is now ready for work`); }); alice.on('reservationCreated', reservation => { console.log(`Reservation ${reservation.sid} has been created for ${alice.sid}`); console.log(`Task attributes are: ${reservation.task.attributes}`); reservation.on('accepted', acceptedReservation => { console.log(`Reservation ${acceptedReservation.sid} was accepted.`); }); reservation.accept().then(acceptedReservation => { console.log(`Reservation status is ${acceptedReservation.status}`); }).catch((err) => { console.log(`Error: ${err}`); }); }); function createAccessToken(accountSid, signingKeySid, signingKeySecret, workspaceSid, workerSid) { const taskRouterGrant = new TaskRouterGrant({ workerSid: workerSid, workspaceSid: workspaceSid, role: 'worker' }); const accessToken = new AccessToken(accountSid, signingKeySid, signingKeySecret); accessToken.addGrant(taskRouterGrant); accessToken.identity = 'alice'; return accessToken.toJwt(); } Changelog See CHANGELOG.md. License See LICENSE.md. Building Fork and clone the repository. Use npm to install node 8 (other versions may run into problems). Then, install dependencies with: yarn install Then run the build script: yarn build The builds and docs will be placed in the dist/ directory. Before commits, be sure to validate by running: make lint Testing Create a twilio account copy ./test/integration_test_setup/.env.example to ./test/integration_test_setup/.env set ACCOUNT_SID, AUTH_TOKEN, SIGNING_KEY_SID, SIGNING_KEY_SECRET Run ./test/integration_test_setup/RunIntegrationTestLocal.sh this will create everything needed for running E2E tests and run the tests Contributing Bug fixes welcome! If you're not familiar with the GitHub pull request/contribution process, this is a nice tutorial. × Search results Close Documentation generated by JSDoc 3.6.7 on 2022-11-03T07:19:23+00:00 using the DocStrap template. "},"Activity.html":{"id":"Activity.html","title":"Class: Activity","body":" Documentation Classes ActivityChannelIncomingTransferOutgoingTransferReservationTaskTaskQueueTransfersWorkerWorkspace Events Channel#event:availabilityUpdatedChannel#event:capacityUpdatedOutgoingTransfer#event:attemptFailedOutgoingTransfer#event:canceledOutgoingTransfer#event:completedOutgoingTransfer#event:failedReservation#event:acceptedReservation#event:canceledReservation#event:completedReservation#event:rejectedReservation#event:rescindedReservation#event:timeoutReservation#event:wrapupTask#event:canceledTask#event:completedTask#event:transferInitiatedTask#event:updatedTask#event:wrapupWorker#event:activityUpdatedWorker#event:attributesUpdatedWorker#event:disconnectedWorker#event:errorWorker#event:readyWorker#event:reservationCreatedWorker#event:reservationFailedWorker#event:tokenExpiredWorker#event:tokenUpdated Class: Activity Activity An Activity represents a state that a Worker can be in (e.g. Idle, Offline, Busy, ...) new Activity(worker, descriptor) Parameters: Name Type Description worker Worker The Worker descriptor ActivityDescriptor The ActivityDescriptor of this Activity Properties: Name Type Description accountSid string The sid of the Twilio account available boolean If the Worker can handle Tasks in this state dateCreated Date The date this Activity was created dateUpdated Date The date this Activity was last updated isCurrent boolean If this particular Activity represents the current state of the Worker name string The friendly name of this Activity sid string The sid of this Activity workspaceSid string The sid of the Workspace owning this Activity Methods setAsCurrent( [options]) Make this Activity the current state of the Worker Parameters: Name Type Argument Description options Activity.UpdateOptions <optional> Returns: Rejected if the Worker's activity state could not be set Type Promise.<this> Type Definitions UpdateOptions Type: Object Properties: Name Type Argument Default Description rejectPendingReservations boolean <optional> false Represents whether all pending reservations should be rejected with the update to an unavailable Activity. × Search results Close Documentation generated by JSDoc 3.6.7 on 2022-11-03T07:19:23+00:00 using the DocStrap template. "},"Channel.html":{"id":"Channel.html","title":"Class: Channel","body":" Documentation Classes ActivityChannelIncomingTransferOutgoingTransferReservationTaskTaskQueueTransfersWorkerWorkspace Events Channel#event:availabilityUpdatedChannel#event:capacityUpdatedOutgoingTransfer#event:attemptFailedOutgoingTransfer#event:canceledOutgoingTransfer#event:completedOutgoingTransfer#event:failedReservation#event:acceptedReservation#event:canceledReservation#event:completedReservation#event:rejectedReservation#event:rescindedReservation#event:timeoutReservation#event:wrapupTask#event:canceledTask#event:completedTask#event:transferInitiatedTask#event:updatedTask#event:wrapupWorker#event:activityUpdatedWorker#event:attributesUpdatedWorker#event:disconnectedWorker#event:errorWorker#event:readyWorker#event:reservationCreatedWorker#event:reservationFailedWorker#event:tokenExpiredWorker#event:tokenUpdated Class: Channel Channel A Channel distinguishes Tasks into specific types (e.g. Default, Chat, SMS, Video, Voice) new Channel(worker, request, descriptor) Parameters: Name Type Description worker Worker The Worker request Request The Request descriptor WorkerChannelDescriptor The data descriptor which describes this Channel Properties: Name Type Description accountSid string The sid of the Twilio account assignedTasks int The number of Tasks assigned to this Channel available boolean If the Worker should be assigned Tasks of this Channel type availableCapacityPercentage int The current available capacity of this Worker to handle Tasks of this Channel type capacity int The number of Tasks that a Worker can handle of this Channel type lastReservedTime Date The date when the Channel last saw a Task dateCreated Date The date this Channel was created dateUpdated Date The date this Channel was last updated sid string The sid of this Activity taskChannelSid string The sid of the TaskChannel associated to this Worker Channel taskChannelUniqueName string The friendly name of this Channel workerSid string The sid of the Worker owning this Channel workspaceSid string The sid of the Workspace owning this Activity Fires: Channel#event:capacityUpdated Channel#event:availabilityUpdated Events availabilityUpdated The availability of this Channel was updated Parameters: Name Type Description channel Channel The Channel whose availability was updated capacityUpdated The capacity of this Channel was updated Parameters: Name Type Description channel Channel The Channel whose capacity was updated × Search results Close Documentation generated by JSDoc 3.6.7 on 2022-11-03T07:19:23+00:00 using the DocStrap template. "},"IncomingTransfer.html":{"id":"IncomingTransfer.html","title":"Class: IncomingTransfer","body":" Documentation Classes ActivityChannelIncomingTransferOutgoingTransferReservationTaskTaskQueueTransfersWorkerWorkspace Events Channel#event:availabilityUpdatedChannel#event:capacityUpdatedOutgoingTransfer#event:attemptFailedOutgoingTransfer#event:canceledOutgoingTransfer#event:completedOutgoingTransfer#event:failedReservation#event:acceptedReservation#event:canceledReservation#event:completedReservation#event:rejectedReservation#event:rescindedReservation#event:timeoutReservation#event:wrapupTask#event:canceledTask#event:completedTask#event:transferInitiatedTask#event:updatedTask#event:wrapupWorker#event:activityUpdatedWorker#event:attributesUpdatedWorker#event:disconnectedWorker#event:errorWorker#event:readyWorker#event:reservationCreatedWorker#event:reservationFailedWorker#event:tokenExpiredWorker#event:tokenUpdated Class: IncomingTransfer IncomingTransfer An IncomingTransfer represents the transfer of work for the Worker via another Worker or queue new IncomingTransfer(worker, transferDescriptor) Parameters: Name Type Description worker Worker The Worker transferDescriptor TransferDescriptor The transfer descriptor which describes this IncomingTransfer Properties: Name Type Description dateCreated Date The timestamp when this IncomingTransfer was created dateUpdated Date The timestamp when this IncomingTransfer was last updated mode string Transfer mode ['WARM', 'COLD'] reservationSid string The sid of the initiating Reservation. sid string The sid of this IncomingTransfer status string ['INITIATED', 'FAILED', 'COMPLETE', 'CANCELED'] to string The sid of the Worker or TaskQueue this IncomingTransfer is intended for type string The transfer type ['QUEUE', 'WORKER'] workerSid string The sid of the initiating Worker × Search results Close Documentation generated by JSDoc 3.6.7 on 2022-11-03T07:19:23+00:00 using the DocStrap template. "},"OutgoingTransfer.html":{"id":"OutgoingTransfer.html","title":"Class: OutgoingTransfer","body":" Documentation Classes ActivityChannelIncomingTransferOutgoingTransferReservationTaskTaskQueueTransfersWorkerWorkspace Events Channel#event:availabilityUpdatedChannel#event:capacityUpdatedOutgoingTransfer#event:attemptFailedOutgoingTransfer#event:canceledOutgoingTransfer#event:completedOutgoingTransfer#event:failedReservation#event:acceptedReservation#event:canceledReservation#event:completedReservation#event:rejectedReservation#event:rescindedReservation#event:timeoutReservation#event:wrapupTask#event:canceledTask#event:completedTask#event:transferInitiatedTask#event:updatedTask#event:wrapupWorker#event:activityUpdatedWorker#event:attributesUpdatedWorker#event:disconnectedWorker#event:errorWorker#event:readyWorker#event:reservationCreatedWorker#event:reservationFailedWorker#event:tokenExpiredWorker#event:tokenUpdated Class: OutgoingTransfer OutgoingTransfer An OutgoingTransfer represents the currently active outgoing transfer initiated by the Worker to another Worker or queue new OutgoingTransfer(worker, request, taskSid, transferDescriptor) Parameters: Name Type Description worker Worker The Worker request Request The Request taskSid string The sid of the owning Task transferDescriptor TransferDescriptor The transfer descriptor which describes this OutgoingTransfer Properties: Name Type Description dateCreated Date The timestamp when this OutgoingTransfer was created dateUpdated Date The timestamp when this OutgoingTransfer was last updated mode string Transfer mode ['WARM', 'COLD'] reservationSid string The sid of the initiating Reservation. sid string The sid of this OutgoingTransfer status string ['INITIATED', 'FAILED', 'COMPLETED', 'CANCELED'] to string The sid of the Worker or TaskQueue this OutgoingTransfer is intended for transferFailedReason string The reason, if applicable, for why the transfer failed type string The transfer type ['QUEUE', 'WORKER'] workerSid string The sid of the initiating Worker Methods <async> cancel() Cancel the ongoing OutgoingTransfer Returns: Rejected if the OutgoingTransfer state could not be updated to 'canceled' Type Promise.<this> Events attemptFailed The attempt to transfer the Task to the desired entity failed Parameters: Name Type Description outgoingTransfer OutgoingTransfer The OutgoingTransfer that had an attempt failure canceled The Task's current OutgoingTransfer has successfully been cancelled Parameters: Name Type Description outgoingTransfer OutgoingTransfer The OutgoingTransfer that was canceled completed The OutgoingTransfer has successfully been transferred to the desired entity Parameters: Name Type Description outgoingTransfer OutgoingTransfer The OutgoingTransfer that was completed failed All attempts to transfer the Task to the desired entity have failed. No more attempts on the OutgoingTransfer will be made. Parameters: Name Type Description outgoingTransfer OutgoingTransfer The OutgoingTransfer that has failed × Search results Close Documentation generated by JSDoc 3.6.7 on 2022-11-03T07:19:23+00:00 using the DocStrap template. "},"Reservation.html":{"id":"Reservation.html","title":"Class: Reservation","body":" Documentation Classes ActivityChannelIncomingTransferOutgoingTransferReservationTaskTaskQueueTransfersWorkerWorkspace Events Channel#event:availabilityUpdatedChannel#event:capacityUpdatedOutgoingTransfer#event:attemptFailedOutgoingTransfer#event:canceledOutgoingTransfer#event:completedOutgoingTransfer#event:failedReservation#event:acceptedReservation#event:canceledReservation#event:completedReservation#event:rejectedReservation#event:rescindedReservation#event:timeoutReservation#event:wrapupTask#event:canceledTask#event:completedTask#event:transferInitiatedTask#event:updatedTask#event:wrapupWorker#event:activityUpdatedWorker#event:attributesUpdatedWorker#event:disconnectedWorker#event:errorWorker#event:readyWorker#event:reservationCreatedWorker#event:reservationFailedWorker#event:tokenExpiredWorker#event:tokenUpdated Class: Reservation Reservation A Reservation correlates a Task and a Worker new Reservation(worker, request, descriptor) Construct a Reservation. Parameters: Name Type Description worker Worker The Worker request Request The Request descriptor ReservationDescriptor The data descriptor which describes this Reservation Properties: Name Type Description accountSid string The sid of the Twilio account dateCreated Date The date the Reservation was created dateUpdated Date The date the Reservation was last updated canceledReasonCode int The reason code received when Reservation is canceled sid string The sid of the Reservation status string The current state of the Reservation. Options: ['pending', 'accepted', 'rejected', 'timeout', 'canceled', 'rescinded', 'wrapping', 'completed']. task Task The Task tied to the Reservation timeout int The number of seconds until the Task times out workerSid string The sid of the Worker workspaceSid string The sid of the Workspace owning this Reservation version string The version of this Reservation Fires: Reservation#event:accepted Reservation#event:canceled Reservation#event:completed Reservation#event:rejected Reservation#event:rescinded Reservation#event:timeout Reservation#event:wrapup Methods accept() Accept the Reservation Returns: Rejected if unable to issue Accept instruction on the Reservation Type Promise.<this> call(from, url [, options]) Issue a Call to a Worker Parameters: Name Type Argument Description from string The caller id for the call to a Worker url string A valid TwiML URI that is executed on the answering Worker's leg options Reservation.CallOptions <optional> Returns: Rejected if unable to issue Call instruction on the Reservation Type Promise.<this> complete() Complete the Reservation Returns: Rejected if unable to issue Complete instruction on the Reservation Type Promise.<this> conference( [options]) Conference the active Call tied to this Reservation to the Worker Parameters: Name Type Argument Description options Reservation.ConferenceOptions <optional> Returns: Rejected if unable to issue Conference instruction on the link Reservation Type Promise.<this> dequeue( [options]) Dequeue the Reservation to the Worker. This will perform telephony to dequeue a Task that was enqueued using the Enqueue TwiML verb. A contact_uri must exist in the Worker's attributes for this call to go through. Parameters: Name Type Argument Description options Reservation.DequeueOptions <optional> Returns: Rejected if unable to issue Dequeue instruction on the Reservation Type Promise.<this> fetchLatestVersion() Fetch the last version of this Reservation Returns: Type Promise.<Reservation> redirect(callSid, url [, options]) Redirect the active Call tied to this Reservation Parameters: Name Type Argument Description callSid string The sid of the Call to redirect url string A valid TwiML URI that is executed on the Caller's leg upon redirecting options Reservation.RedirectOptions <optional> Returns: Rejected if unable to issue Redirect instruction on the Reservation Type Promise.<this> reject( [options]) Reject the Reservation Parameters: Name Type Argument Description options Reservation.RejectOptions <optional> Returns: Rejected if unable to issue Reject instruction on the Reservation Type Promise.<this> updateParticipant( [options]) Update the Worker's leg in the Conference associated to this Reservation Parameters: Name Type Argument Description options Reservation.ParticipantOptions <optional> Returns: Rejected if unable to update the Worker's leg in the Conference tied to the Reservation Type Promise.<this> wrap() Wrap the Reservation Returns: Rejected if unable to issue Wrap instruction on the Reservation Type Promise.<this> Type Definitions CallOptions Type: Object Properties: Name Type Argument Default Description accept boolean <optional> false Represents whether the Task should be accepted before initiating the call record string <optional> 'do-not-record' To record the call or not statusCallbackUrl string <optional> null A valid status status callback url to string <optional> null The number or endpoint that should be called. If not provided, the contact_uri defined in the Worker attributes will be used timeout number <optional> 60 The integer number of seconds Twilio should allow the phone associated to "contact_uri" to ring ConferenceOptions Type: Object Properties: Name Type Argument Default Description to string <optional> null The contact uri of the Worker; can be a phone number or a client ID. Required, if no contact_uri on the Worker's attributes. from string <optional> null The caller id for the call to the Worker. Must be a verified Twilio number. timeout int <optional> 60 The integer number of seconds that Twilio should allow the call to ring before assuming there is no answer. statusCallback string <optional> null The URL endpoint to receive call status events of the Worker leg. statusCallbackMethod string <optional> 'POST' The HTTP method for the Status Callback URL. statusCallbackEvent string <optional> 'completed' A comma separated list of events to subscribe to. The possible list of events are: ['initiated', 'ringing', 'answered', 'completed']. record string <optional> 'do-not-record' Whether to record the Worker leg of the Conference. muted boolean <optional> false Whether the Worker leg of the Conference is muted. beep string | boolean <optional> true Whether the Worker leg should be when entering the Conference. The options for beep are: [true, false, 'onEnter', 'onExit']. startConferenceOnEnter boolean <optional> true Whether the Conference should start when the Worker leg enters. endConferenceOnExit boolean <optional> false Whether the Conference should end when the Worker leg exits. endConferenceOnCustomerExit boolean <optional> false Whether the Conference should end when the customer leg exits. beepOnCustomerEntrance boolean <optional> true Whether the Conference should beep when the customer leg enters. waitUrl string <optional> default Twilio hold music The URL endpoint to play when waiting for the Conference to begin. waitMethod string <optional> 'POST' The HTTP method for the Wait URL. earlyMedia boolean <optional> true Whether Twilio should feed early media to be played directly into a Conference. maxParticipants int <optional> 10 The number of max participants allowed in a Conference. conferenceStatusCallback string <optional> null The URL endpoint to receive Conference status events. conferenceStatusCallbackMethod string <optional> 'POST' The HTTP method for the Conference Status Callback URL. conferenceStatusCallbackEvent string <optional> 'start,end' A comma separated list of Conference events to subscribe to. The possible list of events are: ['start', 'end', 'join', 'leave', 'mute', 'hold', 'speaker']. conferenceRecord string | boolean <optional> false Whether the entire Conference should be recorded. The possible options for conferenceRecord are: [true, false, 'record-from-start', 'do-not-record']. conferenceTrim string <optional> 'trim-silence' Whether to trim the Conference recording. The options for conferenceTrim are: ['trim-silence', 'do-not-trim']. recordingChannels string <optional> 'mono' Which channel of the Conference to record. The options are: ['mono', 'dual']. recordingStatusCallback string <optional> null The URL endpoint to receive recording status events. recordingStatusCallbackMethod string <optional> 'POST' The HTTP method for the Recording Status Callback URL. conferenceRecordingStatusCallback string <optional> null The URl endpoint to receive Conference events. conferenceRecordingStatusCallbackMethod string <optional> 'POST' The HTTP method of the Conference Recording Status Callback. region string <optional> null The specific region. The options for region are: ['us1', 'ie1', 'sg1', 'br1', 'au1', 'jp1']. sipAuthUsername string <optional> null The SIP auth username to use. sipAuthPassword string <optional> null The SIP auth password to use. DequeueOptions Type: Object Properties: Name Type Argument Default Description from string <optional> null The caller id for the call to the Worker. Must be a verified Twilio number. to string <optional> null The contact uri of the Worker; can be a phone number or a client ID. Required, if no contact_uri on the Worker's attributes. postWorkActivitySid string <optional> null The activitySid to update the Worker to after dequeuing the Reservation. record string <optional> 'do-not-record' Defines which legs of the call should be recorded. timeout int <optional> 60 The integer number of seconds that Twilio should allow the call to ring before assuming there is no answer. statusCallbackUrl string <optional> null A URL that Twilio will send asynchronous webhook this._request. to on a completed call event. statusCallbackEvents string <optional> null A comma separated string of the events to subscribe to ParticipantOptions Type: Object Properties: Name Type Argument Default Description endConferenceOnExit boolean <optional> null Whether the Conference should end when this Worker participant leaves the Conference mute boolean <optional> null Mute or unmute this Worker participant beepOnExit boolean <optional> null Whether there should be a beep sound when this Worker participant leaves the Conference RedirectOptions Type: Object Properties: Name Type Argument Default Description accept boolean <optional> false Represents whether the Task should be accepted before initiating the call RejectOptions Type: Object Properties: Name Type Description activitySid string The sid of the Activity to update the worker to upon rejecting the Reservation Events accepted Fired when a Reservation has been accepted for this Worker Parameters: Name Type Description reservation Reservation The accepted Reservation canceled Fired when a Reservation has been canceled for this Worker Parameters: Name Type Description reservation Reservation The canceled Reservation completed Fired when an accepted Reservation has been completed for this Worker Parameters: Name Type Description reservation Reservation The completed Reservation rejected Fired when a Reservation has been rejected for this Worker Parameters: Name Type Description reservation Reservation The rejected Reservation rescinded Fired when a Reservation has been rescinded for the Worker Parameters: Name Type Description reservation Reservation The rescinded Reservation timeout Fired when a Reservation has been timed out for this Worker Parameters: Name Type Description reservation Reservation The timed out Reservation wrapup Fired when a Reservation has been wrapped up for the Worker Parameters: Name Type Description reservation Reservation The wrapped up Reservation × Search results Close Documentation generated by JSDoc 3.6.7 on 2022-11-03T07:19:23+00:00 using the DocStrap template. "},"Task.html":{"id":"Task.html","title":"Class: Task","body":" Documentation Classes ActivityChannelIncomingTransferOutgoingTransferReservationTaskTaskQueueTransfersWorkerWorkspace Events Channel#event:availabilityUpdatedChannel#event:capacityUpdatedOutgoingTransfer#event:attemptFailedOutgoingTransfer#event:canceledOutgoingTransfer#event:completedOutgoingTransfer#event:failedReservation#event:acceptedReservation#event:canceledReservation#event:completedReservation#event:rejectedReservation#event:rescindedReservation#event:timeoutReservation#event:wrapupTask#event:canceledTask#event:completedTask#event:transferInitiatedTask#event:updatedTask#event:wrapupWorker#event:activityUpdatedWorker#event:attributesUpdatedWorker#event:disconnectedWorker#event:errorWorker#event:readyWorker#event:reservationCreatedWorker#event:reservationFailedWorker#event:tokenExpiredWorker#event:tokenUpdated Class: Task Task A Task represents an item of work new Task(worker, request, reservationSid, descriptor) Parameters: Name Type Description worker Worker The Worker request Request The Request reservationSid string The SID of the Reservation associated with this Task descriptor TaskDescriptor The data descriptor which describes this Task Properties: Name Type Description addOns Object The addons attached to the Task age int The age of the Task in seconds attributes Object The attributes of the Task dateCreated Date The date the Task was created dateUpdated Date The date the Task was last updated priority int The priority of the Task queueName string The friendly name of the TaskQueue the Task is currently in queueSid string The sid of the TaskQueue the Task is currently in reason string The reason the Task was completed or canceled, if applicable routingTarget string The target Sid of the Worker, TaskQueue, or Workflow this Task will be routed to. sid string The sid of the Task status string The status of the Task. Options: ['reserved', 'assigned', 'canceled', 'wrapping', 'completed', 'transferring'] taskChannelSid string The sid of the Task Channel associated to the Task in MultiTask mode taskChannelUniqueName string The unique name of the Task Channel associated to the Task in MultiTask mode timeout int The number of seconds the Task is allowed to live transfers Transfers The IncomingTransfer and OutgoingTransfer related to this Task, if applicable workflowName string The name of the Workflow responsible for routing the Task workflowSid string The sid of the Workflow responsible for routing the Task version string The version of this Task Fires: Task#event:canceled Task#event:completed Task#event:transferAttemptFailed Task#event:transferCanceled Task#event:transferCompleted Task#event:transferFailed Task#event:transferInitiated Task#event:updated Task#event:wrapup Methods complete(reason) Update the Task status to 'completed' Parameters: Name Type Description reason string The reason for completing the Task Returns: Rejected if the Task state could not be updated to 'completed' Type Promise.<this> fetchLatestVersion() Fetch the last version of this Task Returns: Type Promise.<Task> hold(targetWorkerSid, onHold [, options]) Hold the worker's call leg in the Conference associated to this Task and specified TargetWorkerSid Parameters: Name Type Argument Description targetWorkerSid String The target worker's sid which should be put onhold or unhold onHold boolean Whether to hold or unhold the specified worker's call leg in the Conference referenced by the Task options Task.HoldOptions <optional> kick(workerSid) Kick another active Worker participant from the ongoing conference Parameters: Name Type Description workerSid string The Sid of the Worker who is currently in the conference that should be kicked Returns: Rejected if unable to kick the call leg of the targeted Worker in the Conference tied to the Task Type Promise.<this> setAttributes(attributes) Update the Task attributes to the given attributes. Parameters: Name Type Description attributes Object A JSON to update the attributes. Returns: Rejected if the attributes cannot be set Type Promise.<this> transfer(to [, options]) Transfer the Task to another entity. Parameters: Name Type Argument Description to string The Worker or TaskQueue entity sid to transfer the task to. options Task.TransferOptions <optional> Returns: Type Promise.<this> updateParticipant( [options]) Update the Customer leg in the Conference associated to this Task Parameters: Name Type Argument Description options Task.ParticipantOptions <optional> Returns: Rejected if unable to update the Customers's leg in the Conference tied to the Task Type Promise.<this> wrapUp() Update the Task status to 'wrapping' in a multi-task enabled Workspace Returns: Rejected if the Task state could not be updated to 'wrapping' Type Promise.<this> Type Definitions HoldOptions Type: Object Properties: Name Type Argument Default Description holdUrl string <optional> default Twilio hold music The URL endpoint to play when participant is on hold. holdMethod string <optional> 'GET' The HTTP method for the hold URL. ParticipantOptions Type: Object Properties: Name Type Argument Default Description hold boolean <optional> null Whether to hold the customer leg of the Conference referenced by the Task holdUrl string <optional> default Twilio hold music The URL endpoint to play when participant is on hold. holdMethod string <optional> 'GET' The HTTP method for the hold URL. TransferOptions Type: Object Properties: Name Type Argument Default Description attributes Object <optional> Updated attributes for the task mode string <optional> 'WARM' 'WARM' or 'COLD' priority number <optional> Updated priority for the task WrappingOptions Type: Object Properties: Name Type Argument Default Description reason string <optional> null The reason for wrapping up the Task Events canceled The Task was canceled Parameters: Name Type Description task Task The Task who was canceled completed The Task was completed Parameters: Name Type Description task Task The Task who was completed transferInitiated An OutgoingTransfer has been initiated for Task Parameters: Name Type Description outgoingTransfer OutgoingTransfer The currently in process OutgoingTransfer updated The attributes of this Task was updated Parameters: Name Type Description task Task The Task whose attributes were updated wrapup The Task was wrapped up Parameters: Name Type Description task Task The Task who was wrapped up × Search results Close Documentation generated by JSDoc 3.6.7 on 2022-11-03T07:19:23+00:00 using the DocStrap template. "},"TaskQueue.html":{"id":"TaskQueue.html","title":"Class: TaskQueue","body":" Documentation Classes ActivityChannelIncomingTransferOutgoingTransferReservationTaskTaskQueueTransfersWorkerWorkspace Events Channel#event:availabilityUpdatedChannel#event:capacityUpdatedOutgoingTransfer#event:attemptFailedOutgoingTransfer#event:canceledOutgoingTransfer#event:completedOutgoingTransfer#event:failedReservation#event:acceptedReservation#event:canceledReservation#event:completedReservation#event:rejectedReservation#event:rescindedReservation#event:timeoutReservation#event:wrapupTask#event:canceledTask#event:completedTask#event:transferInitiatedTask#event:updatedTask#event:wrapupWorker#event:activityUpdatedWorker#event:attributesUpdatedWorker#event:disconnectedWorker#event:errorWorker#event:readyWorker#event:reservationCreatedWorker#event:reservationFailedWorker#event:tokenExpiredWorker#event:tokenUpdated Class: TaskQueue TaskQueue A TaskQueue represents a set of Tasks awaiting assignment. new TaskQueue(descriptor) Parameters: Name Type Description descriptor TaskQueueDescriptor The TaskQueueDescriptor of this TaskQueue Properties: Name Type Description sid string The Sid of the TaskQueue queueSid string The Sid of the TaskQueue accountSid string The Sid of the owning Account of the TaskQueue} workspaceSid string The Sid of the Workspace the TaskQueue belongs to name string The friendly name of the TaskQueue queueName string The friendly name of the TaskQueue assignmentActivityName string The Activity name for the reservation of the TaskQueue reservationActivityName string The Activity name for the assignment of the TaskQueue assignmentActivitySid string The Sid of the assignment Activity for the TaskQueue reservationActivitySid string The Sid of the reservation Activity for the TaskQueue targetWorkers string The expression used to target workers maxReservedWorkers int The maximum number of reserved workers for the TaskQueue taskOrder string The task order for the TaskQueue FIFO or LIFO dateCreated Date The date when the TaskQueue was created dateUpdated Date The date when the TaskQueue was last updated × Search results Close Documentation generated by JSDoc 3.6.7 on 2022-11-03T07:19:23+00:00 using the DocStrap template. "},"Transfers.html":{"id":"Transfers.html","title":"Class: Transfers","body":" Documentation Classes ActivityChannelIncomingTransferOutgoingTransferReservationTaskTaskQueueTransfersWorkerWorkspace Events Channel#event:availabilityUpdatedChannel#event:capacityUpdatedOutgoingTransfer#event:attemptFailedOutgoingTransfer#event:canceledOutgoingTransfer#event:completedOutgoingTransfer#event:failedReservation#event:acceptedReservation#event:canceledReservation#event:completedReservation#event:rejectedReservation#event:rescindedReservation#event:timeoutReservation#event:wrapupTask#event:canceledTask#event:completedTask#event:transferInitiatedTask#event:updatedTask#event:wrapupWorker#event:activityUpdatedWorker#event:attributesUpdatedWorker#event:disconnectedWorker#event:errorWorker#event:readyWorker#event:reservationCreatedWorker#event:reservationFailedWorker#event:tokenExpiredWorker#event:tokenUpdated Class: Transfers Transfers Transfers contains both the IncomingTransfer and OutgoingTransfer for the Worker new Transfers(worker, request, taskDescriptor) Parameters: Name Type Description worker Worker The Worker request Request The Request taskDescriptor TaskDescriptor The task descriptor which describes the related Task Properties: Name Type Description incoming IncomingTransfer The IncomingTransfer for the Worker if the related Reservation was initiated via transfer by another agent outgoing OutgoingTransfer The current active (initiated but not yet finished) OutgoingTransfer initiated by the Worker to another agent or queue × Search results Close Documentation generated by JSDoc 3.6.7 on 2022-11-03T07:19:23+00:00 using the DocStrap template. "},"Worker.html":{"id":"Worker.html","title":"Class: Worker","body":" Documentation Classes ActivityChannelIncomingTransferOutgoingTransferReservationTaskTaskQueueTransfersWorkerWorkspace Events Channel#event:availabilityUpdatedChannel#event:capacityUpdatedOutgoingTransfer#event:attemptFailedOutgoingTransfer#event:canceledOutgoingTransfer#event:completedOutgoingTransfer#event:failedReservation#event:acceptedReservation#event:canceledReservation#event:completedReservation#event:rejectedReservation#event:rescindedReservation#event:timeoutReservation#event:wrapupTask#event:canceledTask#event:completedTask#event:transferInitiatedTask#event:updatedTask#event:wrapupWorker#event:activityUpdatedWorker#event:attributesUpdatedWorker#event:disconnectedWorker#event:errorWorker#event:readyWorker#event:reservationCreatedWorker#event:reservationFailedWorker#event:tokenExpiredWorker#event:tokenUpdated Class: Worker Worker Create a Worker client representing a TaskRouter Worker new Worker(token [, options]) Parameters: Name Type Argument Description token string The string token options Worker.Options <optional> Properties: Name Type Description accountSid string The sid of the Twilio account activities Map.<string, Activity> The list of possible states a Worker can be activity Activity The current Activity of the Worker activitySid string The sid of the Activity the Worker is currently in activityName string The current Activity name the Worker is currently in attributes Object A JSON representation of the Worker's attributes available boolean Whether or not the Worker is available to take on Tasks channels Map.<string, Channel> The list of available Channels connectActivitySid string The Activity to set the Worker as on connect dateCreated Date The date this Worker was created dateStatusChanged Date The date this Worker's activity was last changed dateUpdated Date The date this Worker was last updated name string The friendly name of the Worker reservations Map.<string, Reservation> A list of pending Reservations for the Worker sid string The sid of the Worker workspaceSid string The sid of the Workspace owning this Worker workerSid string The sid of the Worker, duplicates sid field for backwards compatibility workerActivitySid string The sid of the Activity the Worker is currently in, duplicates activitySid field for backwards compatibility dateActivityChanged Date The date when the Worker's state was last changed, duplicates dateStatusChanged field for backwards compatibility friendlyName string The friendly name of the Worker, duplicates name field for backwards compatibility version string The version of this Worker Fires: Worker#event:activityUpdated Worker#event:attributesUpdated Worker#event:disconnected Worker#event:error Worker#event:ready Worker#event:reservationCreated Worker#event:tokenExpired Worker#event:tokenUpdated Methods createTask(to, from, workflowSid, taskQueueSid [, options]) Create a Task Parameters: Name Type Argument Description to string The contact uri of the customer. Stored in the Task's attributes as "outbound_to" from string The contact uri of the Worker. Stored in the Task's attributes as "from" workflowSid string The Sid of the Workflow this Task should belong to taskQueueSid string The Sid of the TaskQueue this Task should belong to, used for reporting purposes only options Worker.TaskOptions <optional> Returns: Rejected if unable to create a Task on behalf of the Worker. Returns the TaskSid of the created Task. Type Promise.<String> disconnect() Gracefully disconnect the client. Returns: Type void fetchLatestVersion() Fetch the last version of this Worker Returns: Type Promise.<Worker> setAttributes(attributes) Update attributes Parameters: Name Type Description attributes Object A JSON describing the Worker's attributes Returns: Rejected if the attributes cannot be set Type Promise.<this> updateToken(newToken) Update token Parameters: Name Type Description newToken string The new token that should be used for authentication Returns: Emits error if unable to update token Type void Type Definitions Options Type: Object Properties: Name Type Argument Default Description connectActivitySid string <optional> '' The Activity state of the Worker upon connect closeExistingSessions boolean <optional> false Whether other open sessions of this Worker should be terminated logLevel string <optional> 'error' The level of logging to enable ['error', 'warn', 'info', 'debug', 'trace', 'silent'] region string the realm for connections (ex. "stage-us1") edge string the ingress for connections (ex. "sydney") TaskOptions Type: Object Properties: Name Type Argument Default Description attributes object <optional> null Additional attributes for the Task taskChannelUniqueName string <optional> null The friendly name of the Channel this Task belongs to. If not provided, defaults to 'default' channel. taskChannelSid string <optional> null The Sid of the Channel this Task belongs to. If not provided, defaults to 'default' channel. Events activityUpdated Worker activity has updated Parameters: Name Type Description worker Worker The updated Worker attributesUpdated Worker attributes have updated Parameters: Name Type Description worker Worker The updated Worker disconnected The signaling layer has lost the websocket connection Parameters: Name Type Description reason Object The reason the Worker websocket disconnected error An error has occurred Parameters: Name Type Description error Error The Error that occurred ready Worker is ready to listen for events and take action reservationCreated A Reservation has been created for the Worker Parameters: Name Type Description reservation Reservation The created Reservation reservationFailed Worker was unable to receive a Reservation for the Task it created Parameters: Name Type Description task Object The raw Task-like payload that failed to generate a Reservation tokenExpired The Worker token has expired tokenUpdated The Worker token has successfully updated × Search results Close Documentation generated by JSDoc 3.6.7 on 2022-11-03T07:19:23+00:00 using the DocStrap template. "},"Workspace.html":{"id":"Workspace.html","title":"Class: Workspace","body":" Documentation Classes ActivityChannelIncomingTransferOutgoingTransferReservationTaskTaskQueueTransfersWorkerWorkspace Events Channel#event:availabilityUpdatedChannel#event:capacityUpdatedOutgoingTransfer#event:attemptFailedOutgoingTransfer#event:canceledOutgoingTransfer#event:completedOutgoingTransfer#event:failedReservation#event:acceptedReservation#event:canceledReservation#event:completedReservation#event:rejectedReservation#event:rescindedReservation#event:timeoutReservation#event:wrapupTask#event:canceledTask#event:completedTask#event:transferInitiatedTask#event:updatedTask#event:wrapupWorker#event:activityUpdatedWorker#event:attributesUpdatedWorker#event:disconnectedWorker#event:errorWorker#event:readyWorker#event:reservationCreatedWorker#event:reservationFailedWorker#event:tokenExpiredWorker#event:tokenUpdated Class: Workspace Workspace Create a Workspace client representing a TaskRouter Workspace new Workspace(jwt [, options], workspaceSid) Parameters: Name Type Argument Description jwt string The string token options Workspace.Options <optional> workspaceSid string Sid of this Workspace, has to be provided if JWE token is passed Throws: Exception if workspaceSid is not passed with JWE token Methods fetchTaskQueue(queueSid) Fetch task queue of this Workspace by given sid Parameters: Name Type Description queueSid string the sid of the task queue to fetch Returns: A task queue with given sid Type Promise.<TaskQueue> fetchTaskQueues( [options]) Fetch task queues of this Workspace Parameters: Name Type Argument Description options Workspace.FetchTaskQueuesParams <optional> Returns: A map with the task queues Type Promise.<Map.<string, TaskQueue>> fetchWorker(workerSid) Fetch worker of this Workspace by given sid Parameters: Name Type Description workerSid string the sid of the worker to fetch Returns: A worker with given sid Type Promise.<Worker> fetchWorkers( [options]) Fetch workers of this Workspace Parameters: Name Type Argument Description options Workspace.FetchWorkersParams <optional> Returns: A map with the workers Type Promise.<Map.<string, Worker>> updateToken(newToken) Update token Parameters: Name Type Description newToken string The new token that should be used for authentication Returns: throws error if unable to update token Type void Type Definitions FetchTaskQueuesParams Type: Object Properties: Name Type Argument Default Description AfterSid string <optional> null FriendlyName string <optional> null Ordering string <optional> null FetchWorkersParams Type: Object Properties: Name Type Argument Default Description AfterSid string <optional> null FriendlyName string <optional> null ActivitySid string <optional> null ActivityName string <optional> null Ordering string <optional> null TargetWorkersExpression string <optional> null maxWorkers number <optional> null Options Type: Object Properties: Name Type Argument Default Description region string the realm for connections (ex. "stage-us1") edge string the ingress for connections (ex. "sydney") pageSize string The number of items returned in each request logLevel string <optional> 'error' The level of logging to enable ['error', 'warn', 'info', 'debug', 'trace', 'silent'] × Search results Close Documentation generated by JSDoc 3.6.7 on 2022-11-03T07:19:23+00:00 using the DocStrap template. "}}
|
|
10
10
|
</script>
|
|
11
11
|
|
|
12
12
|
<script type="text/javascript">
|
package/dist/index.commonjs2.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
/*! For license information please see index.commonjs2.js.LICENSE.txt */
|
|
2
|
-
/*! twilio-taskrouter.js 0.7.0 */(()=>{var e={266:(e,t,r)=>{"use strict";r.r(t),r.d(t,{Supervisor:()=>Oe,TaskRouterEventHandler:()=>be,Worker:()=>Ae,Workspace:()=>Ie});const i=require("lodash");var s=r.n(i);const n=r(142).Gf,o=r(622),a=["trace","debug","info","warn","error","silent"];class d{constructor(e,t){if(!e)throw n.INVALID_ARGUMENT.clone("Error instantiating Logger. <string>moduleName is a required parameter.");this._log=o.getLogger(e),a.forEach(function(e){this[e]=(...t)=>this._log[e](this._getTimestamp(),...t)}.bind(this)),t&&this.setLevel(t)}setLevel(e){if(-1===a.indexOf(e))throw n.INVALID_ARGUMENT.clone("Error setting Logger level. <string>level must be one of ['trace', 'debug', 'info', 'warn', 'error', 'silent']");this._log.setLevel(e,!1),this._log.setDefaultLevel(e)}getLevel(){return a[this._log.getLevel()]}_getTimestamp(){return`[${(new Date).toISOString()}]`}}class c{constructor(e,t={}){if(!s().isString(e))throw new TypeError("Failed to initialize Configuration. <string>token is a required parameter.");this.logIdentifier=t.logIdentifier||+new Date,this._logLevel=t.logLevel||"error",this._log=new d(`Configuration-${this.logIdentifier}`,this._logLevel),this.token=e;let r="";t.edge&&(r+=`.${t.edge}`),t.region&&(r+=`.${t.region}`),this.EB_SERVER=`https://event-bridge${r}.twilio.com/v1/wschannels`,this.WS_SERVER=`wss://event-bridge${r}.twilio.com/v1/wschannels`}updateToken(e){if(!s().isString(e))throw new TypeError("To update the Twilio token, a new Twilio token must be passed in. <string>newToken is a required parameter.");this.token=e}getLogIdentifier(){return this.logIdentifier}}var h=r(142);const l=require("events");var u=r(813);const p="0.7.0",g=global.window||global,_=g.WebSocket?g.WebSocket:r(352),k=p;class f extends l.EventEmitter{constructor(e,t={}){if(super(),!(e&&e instanceof Ae))throw h.Gf.INVALID_ARGUMENT.clone("<Worker>worker is a required parameter to construct EventBridgeSignaling.");const r=e.getLogger(`EventBridgeSignaling-${e.sid}`);if(!s().isNil(t.closeExistingSessions)&&!s().isBoolean(t.closeExistingSessions))throw new TypeError("Invalid type passed for <boolean>closeExistingSessions");this._heartbeat=null,this.webSocket=null,this._log=r,this._worker=e,this.closeExistingSessions=t.closeExistingSessions||!1,this._config=e._config,this.reconnect=!1,this.tokenTimer=null,this.setUpWebSocket()}updateToken(e){if(!e)throw h.Gf.INVALID_ARGUMENT.clone("To update the Twilio token, a new Twilio token must be passed in. <string>newToken is a required parameter.");this.setTokenExpirationEvent(),this._log.info("Updated token for Worker "+this._worker.sid),this.reconnect=!0,this.webSocket.readyState!==this.webSocket.CLOSING&&this.webSocket.readyState!==this.webSocket.CLOSED||this.createWebSocket()}setTokenExpirationEvent(){clearTimeout(this.tokenTimer),this.tokenTimer=setTimeout((()=>{this.reconnect=!1,this.emit("tokenExpired")}),this.tokenLifetime-5e3)}setUpWebSocket(){this._heartbeat&&(this._heartbeat.onsleep=()=>{}),this._heartbeat=new u.y({interval:60}),this.createWebSocket()}setLifetime(e){this.tokenLifetime=e,this.setTokenExpirationEvent()}createWebSocket(){this.numAttempts=1,this.reconnect=!0;const e=`?${h.Iv.TOKEN}=${this._config.token}&${h.Iv.CLOSE_EXISTING_SESSIONS}=${this.closeExistingSessions}&${h.Iv.CLIENT_VERSION}=${k}`;this.webSocket=new _(this._config.WS_SERVER+e),this.webSocket.onopen=()=>{this.numAttempts=1,this.emit("connected"),this._heartbeat.onsleep=()=>{this._log.info("Heartbeat not received in the past 60 seconds. Proceeding to disconnect websocket."),this.webSocket.close()},this._heartbeat.beat()},this.webSocket.onmessage=e=>{if(this._log.debug("Received event",e.data),this._heartbeat.beat(),0===e.data.trim().length)return;let t;try{t=JSON.parse(e.data)}catch(t){return this._log.error("Received data is not valid JSON: "+e.data),void this.emit("error",h.Gf.INVALID_GATEWAY_MESSAGE)}this._log.debug("Emitting event: %s with %s",t.event_type,JSON.stringify(t.payload)),this.emit(t.event_type,t.payload||null,t.event_type)},this.webSocket.onerror=e=>{this._log.error("WebSocket error occurred: ",e),this.emit("error",h.Gf.GATEWAY_CONNECTION_FAILED)},this.webSocket.onclose=e=>{this.reconnect?this._log.info("WebSocket connection has closed. Trying to reconnect."):this._log.info("WebSocket connection has closed. Not reconnecting due to token expiration.");let t=e.reason;const r=e.code;if(s().isEmpty(t)&&(t=`Websocket closed with errorCode=${r}`),this.emit("disconnected",{message:t}),this._heartbeat.onsleep=()=>{},this.reconnect){const e=this.generateBackOffInterval(this.numAttempts);setTimeout((()=>{this.numAttempts++,this.createWebSocket()}),e)}}}generateBackOffInterval(e){const t=Math.ceil(800),r=Math.floor(1e3*Math.min(30,Math.pow(2,e)-1));return Math.round(Math.floor(Math.random()*(r-t+1))+t)}disconnect(){this._log.info("Disconnecting websocket"),null!==this.webSocket&&(["onmessage","onclose","onopen","onerror"].forEach((e=>{this.webSocket[e]=null})),this._heartbeat.onsleep=()=>{},this.webSocket.close()),this.emit("disconnected",{message:"SDK Disconnect"})}}const w=require("axios"),v=require("https"),m={GET:"GET",POST:"POST"};Object.freeze(m);const S=p;class E{constructor(e){if(!(e instanceof c))throw new TypeError("Failed to initialize Request. <Configuration>config is a required parameter.");const t=new v.Agent({maxVersion:"TLSv1.2",minVersion:"TLSv1.2"});this._config=e,this._postClient=w.create({method:m.POST,timeout:h.jz,headers:{clientVersion:S},httpsAgent:t})}post(e,t,r,i){if(!e)throw new Error("Failed to make POST request. <string>url is a required parameter.");if(!s().isObject(t))throw new Error("Failed to make POST request. <object>paramsJSON is a required parameter.");if(!r)throw new Error("Failed to make POST request. <string>apiVersion is a required parameter.");const n=this.buildRequest(m.POST,e,t);let o={apiVersion:r};return this._postClient.post(this._config.EB_SERVER,n,{headers:o}).then((e=>Promise.resolve(e.data.payload)))}get(e,t,r){if(!e)throw new Error("Failed to make GET request. <string>url is a required parameter.");if(!t)throw new Error("Failed to make GET request. <string>apiVersion is a required parameter.");if(r=r||{},!s().isObject(r))throw new Error("Failed to make GET request. <object>paramsJSON is a required parameter.");const i=this.buildRequest(m.GET,e,r);return this._postClient.post(this._config.EB_SERVER,i,{headers:{apiVersion:t}}).then((e=>Promise.resolve(e.data.payload)))}buildRequest(e,t,r){return JSON.stringify({url:t,method:e,params:r,token:this._config.token})}}class T{constructor(){this.routes={}}getRoute(e,...t){if(!this.routes[e])throw h.Gf.INVALID_ARGUMENT.clone(`Invalid route fetched <string>route "${e}" does not exist.`);if(t.length){let r=Object.assign({},this.routes[e]);if(t.length!==(r.path.match(/%s/g)||[]).length)throw h.Gf.INVALID_ARGUMENT.clone(`Invalid number of positional arguments supplied for route ${e}`);for(let e of t)r.path=r.path.replace(/%s/,e);return r}return this.routes[e]}}const y=require("path");var b=r.n(y);const R=r(142).Gf,W="reservationList",q="reservationInstance",A="workerInstance",O="taskReservationInstance",C="taskList",x="taskInstance",F="taskTransferList",j="taskTransferInstance",N="workerChannels",D="activitiesList",P="customerParticipantInstance",U="workerParticipantInstance",L="holdWorkerParticipantInstance",$="kickWorkerParticipant";class I extends T{constructor(e,t){if(super(),!e||!t)throw R.INVALID_ARGUMENT.clone("Error instantiating Routes class. <string>workspaceSid and <string>workerSid are required parameters.");this.workspaceSid=e,this.workerSid=t,this.routes={[D]:{path:b().join("Workspaces",this.workspaceSid,"Activities")},[A]:{path:b().join("Workspaces",this.workspaceSid,"Workers",this.workerSid)},[q]:{path:b().join("Workspaces",this.workspaceSid,"Workers",this.workerSid,"Reservations","%s")},[W]:{path:b().join("Workspaces",this.workspaceSid,"Workers",this.workerSid,"Reservations")},[C]:{path:b().join("Workspaces",this.workspaceSid,"Tasks")},[x]:{path:b().join("Workspaces",this.workspaceSid,"Tasks","%s")},[F]:{path:b().join("Workspaces",this.workspaceSid,"Workers",this.workerSid,"Transfers")},[j]:{path:b().join("Workspaces",this.workspaceSid,"Workers",this.workerSid,"Transfers","%s")},[O]:{path:b().join("Workspaces",this.workspaceSid,"Tasks","%s","Reservations","%s")},[N]:{path:b().join("Workspaces",this.workspaceSid,"Workers",this.workerSid,"WorkerChannels")},[P]:{path:b().join("Workspaces",this.workspaceSid,"Workers",this.workerSid,"CustomerParticipant")},[U]:{path:b().join("Workspaces",this.workspaceSid,"Workers",this.workerSid,"WorkerParticipant")},[L]:{path:b().join("Workspaces",this.workspaceSid,"Workers",this.workerSid,"HoldWorkerParticipant")},[$]:{path:b().join("Workspaces",this.workspaceSid,"Workers",this.workerSid,"KickWorkerParticipant")}}}}var z=r(834);class H{constructor(e){if(!s().isObject(e))throw new TypeError("Failed to create a WorkerDescriptor. <Descriptor>descriptor is a required parameter.");if(!qe.every((t=>t in e)))throw new TypeError("Failed to create a WorkerDescriptor. The provided <Descriptor>descriptor does not contain all properties of a Worker.");this.accountSid=e.account_sid,this.activityName=e.activity_name,this.activitySid=e.activity_sid,this.attributes=JSON.parse(e.attributes),this.available=e.available,this.dateCreated=(0,z.T)(1e3*e.date_created),this.dateStatusChanged=(0,z.T)(1e3*e.date_status_changed),this.dateUpdated=(0,z.T)(1e3*e.date_updated),this.name=e.friendly_name,this.sid=e.sid,this.workspaceSid=e.workspace_sid,this.version=String(e.version),this.workerSid=e.sid,this.workerActivitySid=e.activity_sid,this.dateActivityChanged=(0,z.T)(1e3*e.date_status_changed),this.friendlyName=e.friendly_name}}class M{constructor(e){if(!s().isObject(e))throw new TypeError("Failed to instantiate ActivityDescriptor. <Descriptor>descriptor is required.");if(!B.every((t=>t in e)))throw new TypeError("Failed to instantiate ActivityDescriptor. <Descriptor>descriptor does not contain all properties of an Activity.");this.accountSid=e.account_sid,this.available=e.available,this.dateCreated=(0,z.T)(1e3*e.date_created),this.dateUpdated=(0,z.T)(1e3*e.date_updated),this.name=e.friendly_name,this.sid=e.sid,this.workspaceSid=e.workspace_sid}}const G=r(834).n;const B=["account_sid","available","date_created","date_updated","friendly_name","sid","workspace_sid"],Q=class{constructor(e,t){if(!s().isObject(e))throw new TypeError("Failed to create an Activity. <Worker>worker is a required parameter.");if(!(t instanceof M))throw new TypeError("Failed to create an Activity. <ActivityDescriptor>descriptor is a required parameter.");Object.assign(this,t),this._worker=e,this._isCurrent=!1}get isCurrent(){return this._isCurrent}setAsCurrent(e={}){if(!G(e,{rejectPendingReservations:e=>s().isBoolean(e)}))throw new TypeError(`Failed to set activity=${this.sid}. The options passed in did not match the required types.`);if(e.rejectPendingReservations&&this.available)throw new Error("Unable to reject pending reservations when updating to an Available activity state.");return this._worker._updateWorkerActivity(this.sid,e).then((()=>this))}},V=r(142).Gf;class J{constructor(e,t,r){if(!e)throw V.INVALID_ARGUMENT.clone("Error instantiating Paginator. <Array>items is a required parameter.");if(!t)throw V.INVALID_ARGUMENT.clone("Error instantiating Paginator. <Function>source is a required parameter.");this._nextToken=r,this._source=t,this.hasNextPage=!!this._nextToken,this.items=e}nextPage(){return this.hasNextPage?this._source(this._nextToken):Promise.reject(V.TASKROUTER_ERROR.clone("Error getting the next page. No next page exists."))}}class K{constructor(e,t,r={}){if(!s().isObject(e))throw new TypeError("Failed to initialize ActivitiesEntity. <Worker>worker is a required parameter.");this._activities=new Map,this._log=e.getLogger(`ActivitiesEntity-${e.sid}`),this._request=t,this._worker=e,this._pageSize=r.pageSize||h.L8,s().inRange(this._pageSize,1,h.L8+1)||(this._log.warn("PageSize range for ActivitiesEntity must be between 1 and %d. Setting pageSize to default size=%d",h.L8,h.L8),this._pageSize=1e3)}get activities(){return this._activities}fetchActivities(){const e=this._getPage();return this._getAllActivities(e)}_getAllActivities(e){return e.then((e=>(e.items.forEach((e=>{this._insertActivity(e)})),e.hasNextPage?this._getAllActivities(e.nextPage()):Promise.resolve())))}_getPage(e){e=e||{};const t=this._worker.getRoutes().getRoute(D).path,r={PageSize:this._pageSize};return e.AfterSid&&(r.AfterSid=e.AfterSid),this._request.get(t,h.x6,r).then((e=>new J(e.contents.map((e=>new M(e))),(e=>this._getPage({AfterSid:e})),e.after_sid)))}_insertActivity(e){const t=e.sid;this._log.trace(`_insertActivity(sid=${t}, data=${JSON.stringify(e)}`);try{const r=new Q(this._worker,e);this._activities.set(t,r)}catch(e){this._log.error(`Unable to create an Activity for sid=${t}. Skipping insert into Activities map. Error: ${e}`)}}}class Y{constructor(e){if(!s().isObject(e))throw new TypeError("Failed to instantiate WorkerChannelDescriptor. <Descriptor>descriptor is required.");if(!ee.every((t=>t in e)))throw new TypeError("Failed to create a WorkerChannelDescriptor. <Descriptor>descriptor does not contain all properties of a Channel.");this.accountSid=e.account_sid,this.assignedTasks=e.assigned_tasks,this.available=!!e.available,this.availableCapacityPercentage=e.available_capacity_percentage,this.capacity=e.configured_capacity,this.dateCreated=(0,z.T)(1e3*e.date_created),this.dateUpdated=(0,z.T)(1e3*e.date_updated),this.lastReservedTime=(0,z.T)(e.last_reserved_time),this.sid=e.sid,this.taskChannelSid=e.task_channel_sid,this.taskChannelUniqueName=e.task_channel_unique_name,this.workerSid=e.worker_sid,this.workspaceSid=e.workspace_sid}}const X=["capacity","available","assignedTasks","availableCapacityPercentage","dateUpdated","lastReservedTime"];class Z extends l.EventEmitter{constructor(e,t,r){if(super(),!(e instanceof Ae))throw new TypeError("Failed to instantiate Worker. <Worker>worker is a required parameter.");if(!(r instanceof Y))throw new TypeError("Failed to instantiate Channel. <WorkerChannelDescriptor>descriptor is a required parameter.");this._request=t,this._log=e.getLogger(`Channel-${r.sid}`),Object.assign(this,r)}_emitEvent(e,t){if(!s().isString(e))throw new TypeError("Error calling _emitEvent(). <string>eventType is a required parameter.");if(!s().isObject(t))throw new TypeError("Error calling method _emitEvent(). <object>rawEventData is a required parameter.");this._update(t),this.emit(e,this)}_update(e){try{const t=new Y(e);X.forEach((e=>{this[e]=t[e]}))}catch(t){this._log.warn("Failed to update Channel sid=%s. Update aborted. Error: %s.",e.sid,t)}return this}}const ee=["account_sid","assigned_tasks","available","available_capacity_percentage","configured_capacity","date_created","date_updated","last_reserved_time","sid","task_channel_sid","task_channel_unique_name","worker_sid","workspace_sid"],te=Z;class re{constructor(e,t,r={}){if(!(e instanceof Ae))throw new TypeError("Failed to initialize ChannelsEntity. <Worker>worker is a required parameter.");this._channels=new Map,this._log=e.getLogger("ChannelsEntity"),this._request=t,this._pageSize=r.pageSize||h.L8,this._worker=e,s().inRange(this._pageSize,1,h.L8+1)||(this._log.warn("PageSize range for ChannelsEntity must be between 1 and %d. Setting pageSize to default size=%d",h.L8,h.L8),this._pageSize=1e3)}get channels(){return this._channels}fetchChannels(){const e=this._getPage();return this._getAllChannels(e)}_getAllChannels(e){return e.then((e=>(e.items.forEach((e=>{this._insertChannel(e)})),e.hasNextPage?this._getAllChannels(e.nextPage()):Promise.resolve())))}_getPage(e){e=e||{};const t=this._worker.getRoutes().getRoute(N).path,r={PageSize:this._pageSize};return e.AfterSid&&(r.AfterSid=e.AfterSid),this._request.get(t,h.x6,r).then((e=>new J(e.contents.map((e=>new Y(e))),(e=>this._getPage({AfterSid:e})),e.after_sid)))}_insertChannel(e){const t=e.sid;this._log.trace(`_insertChannel(sid=${t}, data=${JSON.stringify(e)}`);try{const r=new te(this._worker,this._request,e);this._channels.set(t,r)}catch(e){this._log.error(`Unable to create a Channel for sid=${t}. Skipping insert into Channels map. Error: ${e}`)}}}class ie{constructor(e){if(!s().isObject(e))throw new TypeError("Failed to instantiate TransferDescriptor. <Descriptor>descriptor is required.");if(!oe.every((t=>t in e)))throw new TypeError("Failed to instantiate TransferDescriptor. <Descriptor>descriptor does not contain all properties of a Transfer.");this.dateCreated=(0,z.T)(1e3*e.date_created),this.dateUpdated=(0,z.T)(1e3*e.date_updated),this.mode=e.transfer_mode,this.queueSid=e.initiating_queue_sid,this.reservationSid=e.initiating_reservation_sid,this.to=e.transfer_to,this.transferFailedReason=e.transfer_failed_reason,this.type=e.transfer_type,this.sid=e.sid,this.status=e.transfer_status,this.workerSid=e.initiating_worker_sid,this.workflowSid=e.initiating_workflow_sid}}const se=["dateUpdated","status","transferFailedReason"];class ne extends l.EventEmitter{constructor(e,t){if(super(),!(t instanceof ie))throw new TypeError("Failed to instantiate Transfer. <TransferDescriptor>descriptor is a required parameter.");this._log=e.getLogger(`Transfer-${t.sid}`),Object.assign(this,t)}_update(e){try{const t=new ie(e);se.forEach((e=>{this[e]=t[e]}))}catch(t){throw this._log.error(`Failed to update Transfer sid=${e.sid}. Update aborted.`,t),new Error(`Failed to update Transfer sid=${e.sid}. Update aborted. Error: ${t}.`)}return this}}const oe=["date_created","date_updated","initiating_reservation_sid","initiating_worker_sid","initiating_queue_sid","initiating_workflow_sid","sid","transfer_mode","transfer_to","transfer_type","transfer_status"],ae=ne;const de=class extends ae{constructor(e,t){super(e,t)}};const ce=class extends ae{constructor(e,t,r,i){if(super(e,i),"string"!=typeof r)throw new TypeError("Failed to instantiate OutgoingTransfer. <string>taskSid is a required parameter.");this._worker=e,this._request=t,this.taskSid=r}_emitEvent(e,t){if(this._log.trace(`_emitEvent(${e}, ${JSON.stringify(t)})`),!s().isString(e))throw new TypeError("Error calling _emitEvent(). <string>eventType is a required parameter.");if(!s().isObject(t))throw new TypeError("Error calling method _emitEvent(). <object>payload is a required parameter.");this.emit(e,this)}async cancel(){const e=this._worker.getRoutes().getRoute(j,this.sid).path,t={TaskSid:this.taskSid,TransferStatus:h.Uf.canceled},r=await this._request.post(e,t,h.F3);return this._update(r)}};class he extends l.EventEmitter{constructor(e,t,r){if(super(),!(r instanceof ke))throw new TypeError("Failed to instantiate Transfers. <TaskDescriptor>taskDescriptor is a required parameter.");this._log=e.getLogger(`Transfers-${r.sid}`),this._worker=e,this._request=t,this.incoming=r.incomingTransferDescriptor?new de(e,r.incomingTransferDescriptor):null,this.outgoing=r.outgoingTransferDescriptor?new ce(e,t,r.sid,r.outgoingTransferDescriptor):null}_emitEvent(e,t){if(this._log.trace(`_emitEvent(${e}, ${JSON.stringify(t)})`),!s().isString(e))throw new TypeError("Error calling _emitEvent(). <string>eventType is a required parameter.");if(!s().isObject(t))throw new TypeError("Error calling method _emitEvent(). <object>payload is a required parameter.");const r=h._G[e];this.outgoing?this.outgoing.sid===t.sid?Object.keys(s().pick(h._G,["transfer-attempt-failed","transfer-completed","transfer-failed","transfer-canceled"])).indexOf(e)>-1&&(this._updateOutgoing(t),this.outgoing._emitEvent(r,t)):this._log.warn("The transfer %s specified by Event: transfer.%s does not match the current active outgoing transfer for Worker %s. Skipping event.",t.sid,r,this._worker.sid):this._log.warn("An active outgoing transfer does currently exist in Worker %s transfers map for Event: transfer.%s. Skipping event.",this._worker.sid,r)}_updateOutgoing(e,t=!1){!this.outgoing||t?this.outgoing=new ce(this._worker,this._request,e.task_sid,new ie(e)):this.outgoing._update(e)}_update(e){if(e.incoming)if(this.incoming)this.incoming._update(e.incoming);else{const t=new ie(e.incoming);this.incoming=new de(this._worker,this._request,e.incoming.task_sid,t)}if(e.outgoing)if(this.outgoing)this.outgoing._update(e.outgoing);else{const t=new ie(e.outgoing);this.outgoing=new ce(this._worker,this._request,e.outgoing.task_sid,t)}}}const le=he,ue=["attributes","status","workflowSid","workflowName","queueSid","queueName","priority","reason","routingTarget","timeout","taskChannelSid","taskChannelUniqueName","age","addOns","dateUpdated","transfers","version"];class pe extends l.EventEmitter{constructor(e,t,r,i){if(super(),!(e instanceof Ae))throw new TypeError("Failed to instantiate Task. <Worker>worker is a required parameter.");if(!i)throw new TypeError("Failed to instantiate Task. <TaskDescriptor>descriptor is a required parameter.");if(!(i instanceof ke))throw new TypeError("descriptor should be of type <TaskDescriptor>");if("string"!=typeof r)throw new TypeError("Failed to instantiate Task. <string>reservationSid is a required parameter.");this._worker=e,this._log=e.getLogger(`Task-${i.sid}`),this._request=t,this.transfers=new le(e,t,i),Object.assign(this,i),this.reservationSid=r}complete(e){if(!s().isString(e))throw new TypeError("Error calling method complete(). <string>reason is a required parameter.");const t=this._worker.getRoutes().getRoute(x,this.sid).path,r={AssignmentStatus:h.Qh,Reason:e};return this._request.post(t,r,h.x6,this.version).then((e=>this._update(e)))}async transfer(e,t={}){if(!s().isString(e))throw new TypeError("Error calling method transfer(). <string>to is a required parameter.");const r=this._worker.getRoutes().getRoute(F).path,i={ReservationSid:this.reservationSid,TaskSid:this.sid,To:e};t.attributes&&(i.Attributes=t.attributes),t.mode&&(i.Mode=t.mode),t.priority&&(i.Priority=t.priority);const n=await this._request.post(r,i,h.F3);return this._log.info(`Received response to transfer request to Worker/TaskQueue=${e}`),this._log.debug("Response object",n),this.transfers._updateOutgoing(n,!0),this}wrapUp(e={}){const t=this._worker.getRoutes().getRoute(x,this.sid).path,r={AssignmentStatus:h.Nt};if(e.reason){if(!s().isString(e.reason))throw new Error(`Failed to call wrapUp() on Task sid=${this.sid}. A <string>reason is required.`);r.Reason=e.reason}return this._request.post(t,r,h.x6,this.version).then((e=>this._update(e)))}setAttributes(e){if(!s().isObject(e))throw new TypeError("Unable to set attributes on Task. <object>attributes is a required parameter.");const t=this._worker.getRoutes().getRoute(x,this.sid).path,r={Attributes:e};return this._request.post(t,r,h.x6,this.version).then((e=>this._update(e)))}updateParticipant(e){const t={hold:e=>s().isBoolean(e),holdUrl:e=>s().isString(e),holdMethod:e=>s().isString(e)};if(!(0,z.n)(e,t))throw new TypeError(`Failed to update Participant tied to Task sid=${this.sid}. The options passed in did not match the required types.`);const r=this._worker.getRoutes().getRoute(P).path,i={TaskSid:this.sid};for(const t in e)i[s().upperFirst(t)]=e[t];return this._request.post(r,i,h.F3).then((e=>this._update(e)))}kick(e){if(!s().isString(e))throw new TypeError("Error calling method kick(). <string>workerSid is a required parameter.");const t=this._worker.getRoutes().getRoute($).path,r={TaskSid:this.sid,TargetWorkerSid:e};return this._request.post(t,r,h.F3).then((e=>this._update(e)))}hold(e,t,r){const i={holdUrl:e=>s().isString(e),holdMethod:e=>s().isString(e)};if(!s().isString(e))throw new TypeError("Error calling method hold(). <string>targetWorkerSid is a required parameter.");if(!s().isBoolean(t))throw new TypeError("Error calling method hold(). <boolean>onHold is a required parameter that is either true or false.");if(!(0,z.n)(r,i))throw new TypeError(`Failed to update Participant tied to Task sid=${this.sid}. The options passed in did not match the required types.`);const n=this._worker.getRoutes().getRoute(L).path,o={TaskSid:this.sid,TargetWorkerSid:e,Hold:t};for(const e in r)o[s().upperFirst(e)]=r[e];return this._request.post(n,o,h.F3).then((e=>this._update(e)))}fetchLatestVersion(){const e=this._worker.getRoutes().getRoute(x,this.sid).path;return this._request.get(e,h.x6).then((e=>this._update(e)))}_emitEvent(e,t){if(this._log.trace(`_emitEvent(${e}, ${JSON.stringify(t)})`),!s().isString(e))throw new TypeError("Error calling _emitEvent(). <string>eventType is a required parameter.");if(!s().isObject(t))throw new TypeError("Error calling method _emitEvent(). <object>payload is a required parameter.");this.emit(e,this,t)}async _emitEventForOutgoingTransfer(e,t){if(this._log.debug(`_emitEventForOutgoingTransfer(${e}, ${JSON.stringify(t)})`),!s().isString(e))throw new TypeError("Error calling _emitEventForOutgoingTransfer(). <string>eventType is a required parameter.");if(!s().isObject(t))throw new TypeError("Error calling method _emitEventForOutgoingTransfer(). <object>payload is a required parameter.");this.transfers.outgoing||this._log.debug("The transfers.outgoing object is NOT present");let r=0;for(;!this.transfers.outgoing&&r<20;)await new Promise((e=>setTimeout(e,500))),r++,this._log.debug("Transfer event arrived, waiting for API response, because transfer object missing",r);for(r=0;this.transfers.outgoing&&this.transfers.outgoing.sid!==t.sid&&r<20;)await new Promise((e=>setTimeout(e,500))),r++,this._log.debug("Transfer event arrived, waiting for API response to get the correct transfer SID",r);this._log.debug("Transfer sid from API response:",this.transfers&&this.transfers.outgoing?this.transfers.outgoing.sid:"No sid"),this._log.debug("Transfer sid from event:",t.sid),this.transfers.outgoing&&this.transfers.outgoing.sid===t.sid?Object.keys(s().pick(h._G,[h.PQ])).indexOf(e)>-1?(this.transfers._updateOutgoing(t),this.emit(h._G[h.PQ],this.transfers.outgoing)):this.transfers._emitEvent(e,t):this._log.debug(`The transfers.outgoing object is either not present or does not match the transfer sid in the event. ${JSON.stringify(t)}`)}_update(e,t={}){try{const r=new ke(e,this._config);ue.forEach((e=>{"transfers"===e?(t.incoming||t.outgoing)&&this.transfers._update(t):this[e]=r[e]}))}catch(t){throw this._log.error(`Failed to update Task sid=${e.sid}. Update aborted.`,t),new Error(`Failed to update Task sid=${e.sid}. Update aborted. Error: ${t}.`)}return this}}const ge=["addons","age","attributes","date_created","date_updated","priority","queue_name","queue_sid","reason","routing_target","sid","assignment_status","task_channel_unique_name","task_channel_sid","timeout","workflow_name","workflow_sid","version"],_e=pe;class ke{constructor(e){if(!s().isObject(e))throw new TypeError("Failed to instantiate TaskDescriptor. <Descriptor>descriptor is required.");if(!ge.every((t=>t in e)))throw new TypeError("Failed to instantiate TaskDescriptor. <Descriptor>descriptor does not contain all properties of a Task.");this.addOns=JSON.parse(e.addons),this.age=e.age,this.attributes=JSON.parse(e.attributes),this.dateCreated=(0,z.T)(1e3*e.date_created),this.dateUpdated=(0,z.T)(1e3*e.date_updated),this.priority=e.priority,this.queueName=e.queue_name,this.queueSid=e.queue_sid,this.reason=e.reason,this.routingTarget=e.routing_target,this.sid=e.sid,this.status=e.assignment_status,this.taskChannelUniqueName=e.task_channel_unique_name,this.taskChannelSid=e.task_channel_sid,this.timeout=e.timeout,this.workflowName=e.workflow_name,this.workflowSid=e.workflow_sid,this.incomingTransferDescriptor=null,this.outgoingTransferDescriptor=null,this.version=String(e.version)}}class fe{constructor(e,t,r=[]){if(!s().isObject(e))throw new TypeError("Failed to instantiate ReservationDescriptor. <Descriptor>descriptor is required.");if(!s().isObject(t))throw new TypeError("Failed to instantiate ReservationDescriptor. <Worker>worker is required.");const i=s().filter(Ee,(e=>-1===r.indexOf(e)));if(!s().every(i,(t=>t in e))){const t=s().difference(i,Object.keys(e)).join(", ");throw new TypeError(`Failed to instantiate ReservationDescriptor. <Descriptor>descriptor does not contain all properties of a Reservation. Missing: ${t}`)}this.accountSid=e.account_sid,this.dateCreated=(0,z.T)(1e3*e.date_created),this.dateUpdated=(0,z.T)(1e3*e.date_updated),this.sid=e.sid,this.status=e.reservation_status,this.timeout=e.reservation_timeout,this.workerSid=e.worker_sid,this.workspaceSid=e.workspace_sid,this.taskDescriptor=null,this.version=String(e.version),e.canceled_reason_code&&(this.canceledReasonCode=e.canceled_reason_code);const n=t.getLogger(`ReservationDescriptor-${this.sid}`);if(-1===r.indexOf("task"))try{this.taskDescriptor=new ke(e.task)}catch(e){throw n.error("Failed to create a ReservationDescriptor. The 'task' property is malformed."),e}if(-1===r.indexOf(h.fc.taskTransfer)&&"object"==typeof e.task_transfer)try{this.taskDescriptor.incomingTransferDescriptor=new ie(e.task_transfer),this.transferDescriptor=new ie(e.task_transfer)}catch(e){throw n.error("Failed to create a ReservationDescriptor. The 'task_transfer' property is malformed."),e}if(-1===r.indexOf(h.fc.activeOutgoingTaskTransfer)&&"object"==typeof e.active_outgoing_task_transfer)try{this.taskDescriptor.outgoingTransferDescriptor=new ie(e.active_outgoing_task_transfer)}catch(e){throw n.error("Failed to create a ReservationDescriptor. The 'active_outgoing_task_transfer' property is malformed."),e}}}const we=r(834).n,ve=["dateUpdated","canceledReasonCode","status","timeout","task","task_transfer","version"],me=["reservation_timeout","task","canceled_reason_code"];class Se extends l.EventEmitter{constructor(e,t,r){if(super(),!(e instanceof Ae))throw new TypeError("Failed to instantiate Reservation. <Worker>worker is a required parameter.");if(!(r instanceof fe))throw new TypeError("Failed to instantiate Reservation. <ReservationDescriptor>descriptor is a required parameter.");this._worker=e,this._log=e.getLogger(`Reservation-${r.sid}`),this._request=t,this.task=this._createTask(r),r.transferDescriptor&&(this.transfer=this._createTransfer(r)),Object.assign(this,r),delete this.taskDescriptor,delete this.transferDescriptor}accept(){const e=this._worker.getRoutes().getRoute(q,this.sid).path,t={ReservationStatus:h.M0};return this._request.post(e,t,h.x6,this.version).then((e=>this._update(e,me)))}complete(){const e=this._worker.getRoutes().getRoute(q,this.sid).path,t={ReservationStatus:h.in};return this._request.post(e,t,h.x6,this.version).then((e=>this._update(e,me)))}reject(e={}){const t=this._worker.getRoutes().getRoute(q,this.sid).path,r={ReservationStatus:h.j3};if(!we(e,{activitySid:e=>s().isString(e)}))throw new TypeError(`Failed to issue Instruction:reject on Reservation sid=${this.sid}. The options passed in did not match the required types.`);for(const t in e)r[h.iR[t]]=e[t];return this._request.post(t,r,h.x6,this.version).then((e=>this._update(e,me)))}wrap(){const e=this._worker.getRoutes().getRoute(q,this.sid).path,t={ReservationStatus:h.hO};return this._request.post(e,t,h.x6,this.version).then((e=>this._update(e,me)))}call(e,t,r={}){if(!s().isString(e))throw new TypeError("Error calling method call(). <string>from is a required parameter.");if(!s().isString(t))throw new TypeError("Error calling method call(). <string>url is a required parameter.");const i=this._worker.getRoutes().getRoute(q,this.sid).path,n={Instruction:h.O,CallFrom:e,CallUrl:t};if(!we(r,{accept:e=>s().isBoolean(e),record:e=>s().isString(e),statusCallbackUrl:e=>s().isString(e),timeout:e=>s().isInteger(e),to:e=>s().isString(e)}))throw new TypeError(`Failed to issue Instruction:call on Reservation sid=${this.sid}. The options passed in did not match the required types.`);for(const e in r)n[h.xf[e]]=r[e];return this._request.post(i,n,h.x6).then((e=>this._update(e,me)))}dequeue(e={}){const t=this._worker.getRoutes().getRoute(q,this.sid).path,r={Instruction:h.iz};if(!we(e,{from:e=>s().isString(e),to:e=>s().isString(e),postWorkActivitySid:e=>s().isString(e),record:e=>s().isString(e),timeout:e=>s().isInteger(e),statusCallbackUrl:e=>s().isString(e),statusCallbackEvents:e=>s().isString(e)}))throw new TypeError(`Failed to issue Instruction:dequeue on Reservation sid=${this.sid}. The options passed in did not match the required types.`);for(const t in e)r[h.EA[t]]=e[t];return this._request.post(t,r,h.x6).then((e=>this._update(e,me)))}redirect(e,t,r={}){if(!s().isString(e))throw new TypeError("Error calling method redirect(). <string>callSid is a required parameter.");if(!s().isString(t))throw new TypeError("Error calling method redirect(). <string>url is a required parameter.");const i=this._worker.getRoutes().getRoute(q,this.sid).path,n={accept:e=>s().isBoolean(e)},o={Instruction:h.nB,RedirectCallSid:e,RedirectUrl:t};if(!we(r,n))throw new TypeError(`Failed to issue Instruction:redirect on Reservation sid=${this.sid}. The options passed in did not match the required types.`);for(const e in r)o[h.qG[e]]=r[e];return this._request.post(i,o,h.x6).then((e=>this._update(e,me)))}conference(e={}){if(!we(e,{to:e=>s().isString(e),from:e=>s().isString(e),timeout:e=>s().isInteger(e),statusCallback:e=>s().isString(e),statusCallbackMethod:e=>s().isString(e),statusCallbackEvent:e=>s().isString(e),record:e=>s().isString(e),muted:e=>s().isBoolean(e),beep:e=>s().isBoolean(e)||s().isString(e),startConferenceOnEnter:e=>s().isBoolean(e),endConferenceOnExit:e=>s().isBoolean(e),endConferenceOnCustomerExit:e=>s().isBoolean(e),waitUrl:e=>s().isString(e),waitMethod:e=>s().isString(e),earlyMedia:e=>s().isBoolean(e),maxParticipants:e=>s().isInteger(e),conferenceStatusCallback:e=>s().isString(e),conferenceStatusCallbackMethod:e=>s().isString(e),conferenceStatusCallbackEvent:e=>s().isString(e),conferenceRecord:e=>s().isBoolean(e)||s().isString(e),conferenceTrim:e=>s().isString(e),recordingChannels:e=>s().isString(e),recordingStatusCallback:e=>s().isString(e),recordingStatusCallbackMethod:e=>s().isString(e),conferenceRecordingStatusCallback:e=>s().isString(e),conferenceRecordingStatusCallbackMethod:e=>s().isString(e),region:e=>s().isString(e),sipAuthUsername:e=>s().isString(e),sipAuthPassword:e=>s().isString(e)}))throw new TypeError(`Failed to issue Instruction:conference on Reservation sid=${this.sid}. The options passed in did not match the required types.`);const t=this._worker.getRoutes().getRoute(q,this.sid).path,r={Instruction:h.FB};for(const t in e)r[s().upperFirst(t)]=e[t];return this._request.post(t,r,h.x6).then((()=>this))}updateParticipant(e){if(!we(e,{endConferenceOnExit:e=>s().isBoolean(e),mute:e=>s().isBoolean(e),beepOnExit:e=>s().isBoolean(e)}))throw new TypeError(`Failed to update Worker Participant tied to Reservation sid=${this.sid}. The options passed in did not match the required types.`);const t=this._worker.getRoutes().getRoute(U).path,r={ReservationSid:this.sid};for(const t in e)r[s().upperFirst(t)]=e[t];return this._request.post(t,r,h.F3).then((()=>this))}fetchLatestVersion(){const e=this._worker.getRoutes().getRoute(q,this.sid).path;return this._request.get(e,h.x6).then((e=>this._update(e)))}_createTask(e){if(!(e instanceof fe))return this._log.error(`Error calling method _createTask() for Reservation sid=${this.sid}. <ReservationDescriptor>reservationDescriptor is a required parameter.`),{};const t=e.taskDescriptor;try{return new _e(this._worker,this._request,e.sid,t)}catch(e){return this._log.error(`Failed to create a Task for Reservation sid=${this.sid}. Error: ${e}`),{}}}_createTransfer(e){if(!(e instanceof fe))return this._log.error(`Error calling method _createTransfer() for Reservation sid=${this.sid}. <ReservationDescriptor>reservationDescriptor is a required parameter.`),{};const t=e.transferDescriptor;try{return new de(this._worker,t)}catch(e){return this._log.error(`Failed to create a Transfer for Reservation sid=${this.sid}. Error: ${e}`),{}}}_update(e,t=[]){try{const r=new fe(e,this._worker,t);ve.forEach((i=>{if("task"===i){if(-1===t.indexOf("task")){const t=e.task_transfer,r=e.active_outgoing_task_transfer;this.task._update(e.task,{incoming:t,outgoing:r})}}else"canceledReasonCode"===i?-1===t.indexOf("canceled_reason_code")&&e.canceled_reason_code&&(this[i]=r[i]):"task_transfer"===i&&e.task_transfer?this.transfer._update(e.task_transfer):this[i]=r[i]}))}catch(t){throw this._log.error(`Failed to update Reservation sid=${e.sid}. Update aborted. Error: ${t}.`),t}return this}_emitEvent(e,t){if(!s().isString(e))throw new TypeError("Error calling _emitEvent(). <string>eventType is a required parameter.");if(!s().isObject(t))throw new TypeError("Error calling method _emitEvent(). <object>rawEventData is a required parameter.");this._update(t),this.emit(e,this)}}const Ee=["account_sid","date_created","date_updated","reservation_status","sid","task","reservation_timeout","worker_sid","workspace_sid","version"],Te=Se;class ye extends l.EventEmitter{constructor(e,t,r={}){if(super(),!(e instanceof Ae))throw new TypeError("Failed to initialize ReservationsEntity. <Worker>worker is a required parameter.");this._worker=e,this._log=e.getLogger("ReservationsEntity"),this._request=t,this._reservations=new Map,this._reservationSidsByTask=new Map,this._pageSize=r.pageSize||h.L8,s().inRange(this._pageSize,1,h.L8+1)||(this._log.warn("PageSize range for ReservationsEntity must be between 1 and %d. Setting pageSize to default size=%d",h.L8,h.L8),this._pageSize=1e3)}get reservations(){return new Map(Array.from(this._reservations).filter((e=>!e[1][1])).map((e=>[e[0],e[1][0]])))}fetchReservations(){const e=this._getPage();return this._reservations.clear(),this._getAllReservations(e)}_getAllReservations(e){return e.then((e=>{e.items.forEach((e=>{this._insertReservation(e)})),e.hasNextPage&&this._getAllReservations(e.nextPage())}))}_getPage(e){e=e||{};const t=this._worker.getRoutes().getRoute(W).path,r={Active:"true",PageSize:this._pageSize};return e.AfterSid&&(r.AfterSid=e.AfterSid),this._request.get(t,h.F3,r).then((e=>new J(e.contents.map((e=>new fe(e,this._worker))),(e=>this._getPage({AfterSid:e})),e.after_sid)))}_insertReservation(e){const t=e.sid;this._log.trace("_insertReservation(sid=%s, data=%s)",t,JSON.stringify(e)),this._reservations.has(t)&&this._log.debug("Reservation %s already exists for Worker %s. Attempting to overwrite it.",t,this._worker.sid);try{const r=new Te(this._worker,this._request,e);return this._reservations.set(t,[r,!1]),this._reservationSidsByTask.has(r.task.sid)?this._reservationSidsByTask.get(r.task.sid).add(r.sid):this._reservationSidsByTask.set(r.task.sid,new Set([r.sid])),this._log.debug("Successfully created and inserted %s for %s to Task-Reservation lookup. Contents: %s",r.sid,r.task.sid,this._reservationSidsByTask.get(r.task.sid)),r}catch(e){throw this._log.error("Unable to create a Reservation for sid=%s. Skipping insert into Reservations map. Error: %s",t,e),e}}insert(e){this._log.trace("_insertReservation(sid=%s, data=%s)",e.sid,JSON.stringify(e));const t=new fe(e,this._worker);return this._insertReservation(t)}getTasks(e){if(!this._reservationSidsByTask.has(e))return null;const t=this._reservationSidsByTask.get(e),r=[];return t.forEach((e=>{const t=this._reservations.get(e);t&&t[0].task&&r.push(t[0].task)})),r}_deleteByReservationSid(e){this._log.trace("_deleteByReservationSid(sid=%s)",e);const t=this.reservations.get(e);t?(this._log.info("Found Reservation sid=%s for Worker %s. Removing reservation and task.",e,this._worker.sid),this._cleanUpReservationAndTask(t)):this._log.info("Reservation with sid=%s not found. Unable to remove Reservation.",e)}_cleanUpReservationAndTask(e){this._log.debug("Soft deleting Reservation sid=%s for Worker %s",e.sid,this._worker.sid),this._reservations.set(e.sid,[e,!0]),setTimeout((()=>{this._log.debug("Hard deleting of Reservation sid=%s for Worker %s",e.sid,this._worker.sid),this._reservations.delete(e.sid)||this._log.warn("Failed to hard delete Reservation sid=%s for Worker %s",e.sid,this._worker.sid)}),5e3)}}class be{constructor(e,t={}){this._worker=e,this._logLevel=t.logLevel||"error",this._log=new d("WorkerEventHandler",this._logLevel)}getTREventsToHandlerMapping(){return{"worker.activity.update":"_workerActivityUpdateHandler","worker.attributes.update":"_workerAttributesUpdateHandler","worker.capacity.update":"_workerCapacityUpdateHandler","worker.channel.availability.update":"_workerChannelAvailabilityUpdateHandler","reservation.created":"_reservationCreatedHandler","reservation.failed":"_reservationFailedHandler","reservation.accepted":"_reservationUpdateHandler","reservation.wrapup":"_reservationUpdateHandler","reservation.completed":"_reservationCleanupEventsHandler","reservation.rejected":"_reservationCleanupEventsHandler","reservation.timeout":"_reservationCleanupEventsHandler","reservation.canceled":"_reservationCleanupEventsHandler","reservation.rescinded":"_reservationCleanupEventsHandler","task.updated":"_taskTypeEventHandler","task.canceled":"_taskTypeEventHandler","task.completed":"_taskTypeEventHandler","task.wrapup":"_taskTypeEventHandler","task.transfer-attempt-failed":"_transferTaskEventHandler","task.transfer-completed":"_transferTaskEventHandler","task.transfer-failed":"_transferTaskEventHandler","task.transfer-initiated":"_transferTaskEventHandler","task.transfer-canceled":"_transferTaskEventHandler"}}_workerActivityUpdateHandler(e){if(this._log.info("Worker %s received Event: worker.activity.update. Proceeding to update ...",this._worker.sid),!e.activity_sid)throw this._log.error("Event: worker.activity.update did not contain an activity_sid. Unable to update Worker %s.",this._worker.sid),new Error(`Failed to update Worker ${this._worker.sid} activity.`);{const t=this._worker.activities.get(e.activity_sid);if(!t)throw this._log.error("The Activity sid=%s specified in Event: worker.activity.update does not exist in the Worker's map of Activities. Unable to update Worker %s activity.",e.activity_sid,this._worker.sid),new Error(`Failed to update Worker ${this._worker.sid} activity.`);this._worker.activity._isCurrent=!1,this._worker.activity=t,t._isCurrent=!0,this._worker.emit("activityUpdated",this._worker._update(e))}}_workerAttributesUpdateHandler(e){this._log.info(`Worker ${this._worker.sid} received Event: worker.attributes.update. Proceeding to update ...`),this._worker.emit("attributesUpdated",this._worker._update(e))}_workerCapacityUpdateHandler(e){if(this._log.info(`Worker ${this._worker.sid} received Event: worker.capacity.update.`),!e.sid)throw this._log.error("Event: worker.capacity.update did not contain a Channel sid. Unable to update Channel for Worker %s.",this._worker.sid),new Error(`Failed to update Worker ${this._worker.sid} channel.`);{const t=this._worker.channels.get(e.sid);if(!t)throw this._log.error("The Channel sid=%s specified in Event: worker.capacity.update does not exist in the Worker's map of Channels. Unable to update Worker %s channel.",e.sid,this._worker.sid),new Error(`Failed to update Worker ${this._worker.sid} channel.`);t._emitEvent("capacityUpdated",e)}}_workerChannelAvailabilityUpdateHandler(e){if(this._log.info("Worker %s received Event: worker.channel.availability.update.",this._worker.sid),!e.sid)throw this._log.error("Event: worker.capacity.update did not contain a Channel sid. Unable to update Channel for Worker %s.",this._worker.sid),new Error(`Failed to update Worker ${this._worker.sid} channel.`);{const t=this._worker.channels.get(e.sid);if(!t)throw this._log.error("The Channel sid=%s specified in Event: worker.channel.availability.update does not exist in the Worker's map of Channels. Unable to update Worker %s channel.",e.sid,this._worker.sid),new Error(`Failed to update Worker ${this._worker.sid} channel.`);t._emitEvent("availabilityUpdated",e)}}_reservationCreatedHandler(e){if(this._log.info("Worker %s received Event: reservation.created.",this._worker.sid),!e.sid)throw this._log.error("Event: reservationCreated did not contain a Reservation sid. Unable to create a Reservation for Worker %s.",this._worker.sid),new Error(`Failed to create Reservation for Worker ${this._worker.sid}.`);try{this._log.info("Attempting to create and insert Reservation into Worker %s reservations map.",this._worker.sid);const t=this._worker._dataServices.reservationsEntity.insert(e);this._worker._bumpVersion(),this._worker.emit("reservationCreated",t)}catch(e){throw this._log.info("Failed to create and insert Reservation into Worker %s reservations map.",this._worker.sid),new Error(`Failed to create a Reservation for Worker ${this._worker.sid} on Event: reservationCreated. Error: ${e}`)}}_reservationFailedHandler(e){this._log.info("Worker %s received Event: reservation.failed.",this._worker.sid),this._worker.emit("reservationFailed",e)}_reservationUpdateHandler(e,t){const r=h.zb[t];if(this._log.info("Worker %s received Event: %s mapped to %s.",this._worker.sid,t,r),!e.sid)throw this._log.error(`Event: reservation.${r} did not contain a Reservation sid. Unable to update Reservation for Worker ${this._worker.sid}`),new Error(`Failed to update Reservation for Worker ${this._worker.sid}.`);{const t=this._worker.reservations.get(e.sid);if(!t)throw this._log.error(`The Resevation sid=${e.sid} specified in Event: reservation.${r} does not exist in the Worker's map of Reservations. Unable to update Worker ${this._worker.sid} reservation.`),new Error(`Failed to update Worker ${this._worker.sid} reservation.`);t._emitEvent(r,e)}}_reservationCleanupEventsHandler(e,t){const r=h.zb[t];if(this._log.info("Worker %s received Event: %s mapped to %s.",this._worker.sid,t,r),!e.sid)throw this._log.error("Event: reservation.%s did not contain a Reservation sid. Unable to update Reservation for Worker %s.",r,this._worker.sid),new Error(`Failed to update Reservation for Worker ${this._worker.sid}.`);{const t=this._worker.reservations.get(e.sid);t?(this._worker._dataServices.reservationsEntity._deleteByReservationSid(e.sid),t._emitEvent(r,e)):this._log.warn("The reservation specified by Event: reservation.%s does not exist in Worker %s Reservations map. Skipping event.",r,this._worker.sid)}}_taskTypeEventHandler(e,t){const r=h.L3[t];if(this._log.info("Worker %s received Event: %s mapped to %s.",this._worker.sid,t,r),!e.sid)throw this._log.error("Event: task.%s did not contain a Task sid. Unable to emit event for Worker %s.",r,this._worker.sid),new Error(`Failed to emit event for Worker ${this._worker.sid}.`);{const t=this._worker._dataServices.reservationsEntity.getTasks(e.sid);t&&t.length>0?t.forEach((t=>{t._update(e),t._emitEvent(r,e)})):this._log.warn("The task specified by Event: task.%s does not exist in Worker %s Reservations map. Skipping event.",r,this._worker.sid)}}_transferTaskEventHandler(e,t){const r=h.l4[t];if(this._log.info("Worker %s received Event: % mapped to %s.",this._worker.sid,t,r),!e.initiating_reservation_sid||!e.task_sid)throw this._log.error("Event: task.%s did not contain a Reservation sid or Task sid. Unable to emit event for Worker %s.",r,this._worker.sid),new Error(`Failed to emit event for Worker ${this._worker.sid}.`);{const t=this._worker.reservations.get(e.initiating_reservation_sid);t?t.task.sid===e.task_sid?t.task._emitEventForOutgoingTransfer(r,e):this._log.warn("The task %s related to Event: task.%s does not match the expected owning Reservation %s for Worker %s. Skipping event.",e.task_sid,r,t.sid,this._worker.sid):this._log.warn("The reservation %s related to Event: task.%s does not exist in Worker %s Reservations map. Skipping event.",e.initiating_reservation_sid,r,this._worker.sid)}}}const Re=["dateUpdated","dateStatusChanged","attributes","name","available","version"];class We extends l.EventEmitter{constructor(e,t={},r={Request:E,EventBridgeSignaling:f}){if(super(),!s().isString(e))throw new TypeError("Failed to instantiate Worker. <string>token is a required parameter.");const i={connectActivitySid:e=>s().isString(e),closeExistingSessions:e=>s().isBoolean(e),logLevel:e=>s().isString(e),ebServer:e=>s().isString(e),wsServer:e=>s().isString(e),region:e=>s().isString(e)};let n;(0,z.n)(t,i),this._connectActivitySid=t.connectActivitySid,this._closeExistingSessions=t.closeExistingSessions,this._logLevel=t.logLevel||"error",this._config=new c(e,t),this._log=new d(`Worker-${this._config.getLogIdentifier()}`,this._logLevel),this._request=new r.Request(this._config),this._dataServices={activitiesEntity:new K(this,this._request),channelsEntity:new re(this,this._request),reservationsEntity:new ye(this,this._request)},this._signaling=new r.EventBridgeSignaling(this,{closeExistingSessions:t.closeExistingSessions}),this._subscribeToSignalingEvents(),n=t.eventHandlerClass?new t.eventHandlerClass(this):new be(this),this.taskRouterEventHandler=n}createTask(e,t,r,i,n={}){if(!s().isString(e))throw new TypeError("Error calling method createTask(). <string>to is a required parameter.");if(!s().isString(t))throw new TypeError("Error calling method createTask(). <string>from is a required parameter.");if(!s().isString(r))throw new TypeError("Error calling method createTask(). <string>workflowSid is a required parameter.");if(!s().isString(i))throw new TypeError("Error calling method createTask(). <string>taskQueueSid is a required parameter.");const o={attributes:e=>s().isObject(e),taskChannelUniqueName:e=>s().isString(e),taskChannelSid:e=>s().isString(e)};if(!(0,z.n)(n,o))throw new TypeError(`Failed to create a Task for Worker ${this.sid}. The options passed in did not match the required types.`);const a=this.getRoutes().getRoute(C).path,d={WorkflowSid:r,TaskQueueSid:i,RoutingTarget:this.sid};for(const e in n)"attributes"===e||(d[h.VH[e]]=n[e]);const c={outbound_to:e,from:t};return d.Attributes=Object.assign({},n.attributes,c),this._request.post(a,d,h.x6).then((e=>e.sid))}getLogger(e){return new d(`${e}-${this.sid}`,this._config._logLevel)}setAttributes(e){if(!s().isObject(e))throw new TypeError("Unable to set attributes on Worker. <object>attributes is a required parameter.");const t=this.getRoutes().getRoute(A).path,r={Attributes:e};return this._request.post(t,r,h.x6,this.version).then((e=>this._update(e)))}_bumpVersion(){this.version&&(this.version=String(Number(this.version)+1))}updateToken(e){if(!s().isString(e))throw new TypeError("To update the Twilio token, a new Twilio token must be passed in. <string>newToken is a required parameter.");this._log.info("Proceeding to update the Worker's current active token with a new token."),this._log.debug("New token: "+e);try{this._config.updateToken(e),this._signaling.updateToken(e),this.emit("tokenUpdated")}catch(e){this.emit("error",e)}}fetchLatestVersion(){const e=this.getRoutes().getRoute(A).path;return this._request.get(e,h.x6).then((e=>this._update(e)))}_subscribeToSignalingEvents(){this._log.info("Subscribing to Signaling events .... "),this._signaling.on("connected",(()=>{this._log.info("Received Event: 'connected' from Signaling layer. Pending initialization.",this.sid)})),this._signaling.on("disconnected",(e=>{this._log.info("Received Event: 'disconnected' from Signaling layer for Worker %s. %s",this.sid,e),this._unSubscribeFromTaskRouterEvents(),this.emit("disconnected",e)})),this._signaling.on("init",(e=>{this._log.info("Received Event: 'init' from Signaling layer. Proceeding to initialize Worker %s.",e.channel_id),this.sid=e.channel_id,this.accountSid=e.account_sid,this.workspaceSid=e.workspace_sid,this._signaling.setLifetime(e.token_lifetime),this._initialize()})),this._signaling.on("error",(e=>{this._log.info("Received Event: 'error' from Signaling layer for Worker %s.",this.sid),this.emit("error",e)})),this._signaling.on("tokenExpired",(()=>{this._log.info("Received Event: 'tokenExpired' for for Worker %s. Please update the token. Websocket will not reconnect automatically until token is updated.",this.sid),this.emit("tokenExpired")}))}_subscribeToTaskRouterEvents(){this._log.info("Subscribing to TaskRouter events ... ");for(let[e,t]of Object.entries(this.taskRouterEventHandler.getTREventsToHandlerMapping()))this._signaling.on(e,this.taskRouterEventHandler[t])}_unSubscribeFromTaskRouterEvents(){this._log.info("Unsubscribing from TaskRouter events ... ");for(let[e,t]of Object.entries(this.taskRouterEventHandler.getTREventsToHandlerMapping()))this._signaling.removeListener(e,this.taskRouterEventHandler[t])}_initialize(){this._routes=new I(this.workspaceSid,this.sid),this._log.info("Initializing Worker %s...",this.sid);const e=this.getRoutes().getRoute(A).path;let t;this._request.get(e,h.x6).then((e=>{const r=new H(e);return t=r.activitySid,delete r.activityName,delete r.activitySid,delete r.available,Object.assign(this,r),Promise.all([this._dataServices.activitiesEntity.fetchActivities(),this._dataServices.channelsEntity.fetchChannels(),this._dataServices.reservationsEntity.fetchReservations()])})).then((()=>{this._log.info("Worker %s activities, channels and pending reservations initialized",this.sid),this._setCurrentActivity(t),this._connectActivitySid?this._setWorkerConnectActivity().then((()=>{this._log.info("Successfully updated Worker on connect to Activity=%s",this._connectActivitySid),this._log.info("Worker %s successfully initialized",this.sid)})):this._log.info("Worker %s successfully initialized",this.sid),this._subscribeToTaskRouterEvents(),this.emit("ready",this)})).catch((e=>{this._log.error("Failed to initialize Worker %s. Error: %s",this.sid,e),this.emit("error",`Failed to initialize Worker ${this.sid}`)}))}get channels(){return this._dataServices.channelsEntity.channels}get activities(){return this._dataServices.activitiesEntity.activities}get reservations(){return this._dataServices.reservationsEntity.reservations}_setCurrentActivity(e){const t=this.activities.get(e);if(!t)throw new Error(`Unable to set the current Activity sid=${e} on the Worker.`);t._isCurrent=!0,this.activity=t,this.activity._isCurrent=!0}_setWorkerConnectActivity(){if(!s().isString(this._connectActivitySid))throw new TypeError("Failed to set the Worker's activity to the provided optional connectActivitySid. <string>connectActivitySid must be a string.");return this._updateWorkerActivity(this._connectActivitySid).then((()=>(this._log.info("Successfully set the Worker's activity to the provided connectActivitySid=%s on connection.",this._connectActivitySid),this._connectRetry=0,this))).catch((e=>{if(this._connectRetry>=3)throw this._log.error("Unable to set Worker %s activity to the provided %s on successful connection. %s",this.sid,this._connectActivitySid,e),e;return this._connectRetry=this._connectRetry>0?this._connectRetry+1:1,new Promise((e=>setTimeout(e,500))).then(this._setWorkerConnectActivity.bind(this))}))}_updateWorkerActivity(e,t={}){if(!s().isString(e))throw new TypeError("Error updating Worker Activity: <string>activitySid is a required parameter");const r=this.getRoutes().getRoute(A).path,i={ActivitySid:e};for(const e in t)i[h.UA[e]]=t[e];return this._request.post(r,i,h.x6,this.version).then((t=>{try{this._update(t),this.activity._isCurrent=!1;const e=this.activities.get(t.activity_sid);this.activity=e,this.activity._isCurrent=!0}catch(t){throw this._log.error("Failed to update the Worker's activity to sid=%s. Error: %s",e,t),t}return this}))}_update(e){this._log.trace("Attempting to update Worker %s with latest Worker data=%s",this.sid,JSON.stringify(e));try{const t=new H(e);Re.forEach((e=>{this[e]=t[e]}))}catch(t){this._log.error("Failed to update Worker sid=%s. Update aborted. Error: %s.",e.sid,t)}return this}disconnect(){this._signaling.disconnect()}getRoutes(){return this._routes}}const qe=["account_sid","activity_name","activity_sid","attributes","available","date_created","date_status_changed","date_updated","friendly_name","sid","workspace_sid","version"],Ae=We;const Oe=class extends Ae{monitor(e,t,r){if(!s().isString(e))throw new TypeError("Error monitoring reservation: <string>taskSid is a required parameter");if(!s().isString(t))throw new TypeError("Error monitoring reservation: <string>reservationSid is a required parameter");if(r&&!s().isObject(r))throw new TypeError("Error monitoring reservation: <string>extraParams must be an object");return this._supervise("monitor",e,t,r)}_supervise(e,t,r,i){const s=this.getRoutes().getRoute(O,t,r).path,n=Object.assign({},i,{Instruction:"supervise",Supervisor:this.sid,SupervisorMode:e});return this._request.post(s,n,h.x6).then((()=>{}))}};const Ce=["friendly_name","reservation_activity_name","assignment_activity_name","target_workers","max_reserved_workers","task_order","reservation_activity_sid","assignment_activity_sid","workspace_sid","account_sid","sid","date_created","date_updated","lifo_queue"],xe=class{constructor(e){if(!(e instanceof Fe))throw new TypeError("Failed to create a TaskQueue. <TaskQueueDescriptor>descriptor is a required parameter.");Object.assign(this,e)}};class Fe{constructor(e){if(!s().isObject(e))throw new TypeError("Failed to instantiate TaskQueueDescriptor. <Descriptor>descriptor is required.");if(!Ce.every((t=>t in e)))throw new TypeError("Failed to instantiate TaskQueueDescriptor. <Descriptor>descriptor does not contain all properties of a TaskQueue.");this.sid=e.sid,this.queueSid=e.sid,this.accountSid=e.account_sid,this.workspaceSid=e.workspace_sid,this.name=e.friendly_name,this.queueName=e.friendly_name,this.assignmentActivityName=e.assignment_activity_name,this.reservationActivityName=e.reservation_activity_name,this.assignmentActivitySid=e.assignment_activity_sid,this.reservationActivitySid=e.reservation_activity_sid,this.targetWorkers=e.target_workers,this.maxReservedWorkers=e.max_reserved_workers,this.taskOrder=e.task_order,this.dateCreated=(0,z.T)(1e3*e.date_created),this.dateUpdated=(0,z.T)(1e3*e.date_updated)}}const je=class{constructor(e){if(!(e instanceof H))throw new TypeError("Failed to create a WorkerContainer. <WorkerDescriptor>descriptor is a required parameter.");Object.assign(this,e)}},Ne="workerList",De="taskQueueList";class Pe extends T{constructor(e){if(super(),!e)throw h.Gf.INVALID_ARGUMENT.clone("Error instantiating WorkspaceRoutes class. <string>workspaceSid is required.");this.workspaceSid=e,this.routes={[Ne]:{path:b().join("Workspaces",this.workspaceSid,"Workers")},[De]:{path:b().join("Workspaces",this.workspaceSid,"TaskQueues")}}}}class Ue{constructor(e,t,r={}){this._Workers=new Map,this._TaskQueues=new Map,this._routes=new Pe(e),this._request=t,this._log=new d(`WorkspaceEntity-${e}`,r.logLevel),this._pageSize=r.pageSize||h.L8,s().inRange(this._pageSize,1,h.L8+1)||(this._log.warn("PageSize range for WorkspaceEntity must be between 1 and %d. Setting pageSize to default size=%d",h.L8,h.L8),this._pageSize=h.L8)}get Workers(){return this._Workers}get TaskQueues(){return this._TaskQueues}fetchWorker(e){const t=b().join(this._routes.getRoute(Ne).path,e);return this._request.get(t,h.x6).then((e=>new je(new H(e))))}fetchWorkers(e){this._Workers=new Map;const{MaxWorkers:t,...r}=e||{};return this._getAllWorkers(this._getWorkerPage(r),t)}fetchTaskQueue(e){const t=b().join(this._routes.getRoute(De).path,e);return this._request.get(t,h.x6).then((e=>new xe(new Fe(e))))}fetchTaskQueues(e){return this._TaskQueues=new Map,this._getAllTaskQueues(this._getTaskQueuePage(e))}_getAllWorkers(e,t=h.hS){return e.then((async e=>{for(const r of e.items){if(this._Workers.size>=t)break;this._insertWorker(r)}e.hasNextPage&&(this._Workers.size>=t||await this._getAllWorkers(e.nextPage()))}))}_getWorkerPage(e){e=e||{};const t=this._routes.getRoute(Ne).path,r={PageSize:this._pageSize};return["AfterSid","FriendlyName","ActivitySid","ActivityName","Ordering","TargetWorkersExpression","NextToken"].forEach((t=>{e[t]&&(r[t]=e[t])})),this._request.get(t,h.x6,r).then((e=>{const{Ordering:t,...i}=r,s=t?"NextToken":"AfterSid";return new J(e.contents.map((e=>new H(e))),(e=>this._getWorkerPage({...i,Ordering:t,[s]:e})),t?e.meta.next_token:e.after_sid)}))}_insertWorker(e){const t=e.sid;this._log.trace("_insertWorker(sid=%s, data=%s)",t,JSON.stringify(e));try{this._Workers.set(t,new je(e))}catch(e){this._log.error("Unable to create a Worker for sid=%s. Skipping insert into Worker map. Error: %s",t,e)}}async _getAllTaskQueues(e){return e.then((async e=>{e.items.forEach((e=>this._insertTaskQueue(e))),e.hasNextPage&&await this._getAllTaskQueues(e.nextPage())}))}_getTaskQueuePage(e){e=e||{};const t=this._routes.getRoute(De).path,r={PageSize:this._pageSize};return["AfterSid","FriendlyName","Ordering","NextToken"].forEach((t=>{e[t]&&(r[t]=e[t])})),this._request.get(t,h.x6,r).then((e=>{const{Ordering:t,...i}=r,s=t?"NextToken":"AfterSid";return new J(e.contents.map((e=>new Fe(e))),(e=>this._getTaskQueuePage({...i,Ordering:t,[s]:e})),t?e.meta.next_token:e.after_sid)}))}_insertTaskQueue(e){const t=e.sid;this._log.trace("_insertTaskQueue(sid=%s, data=%s",t,JSON.stringify(e));try{this._TaskQueues.set(t,new xe(e))}catch(e){this._log.error("Unable to create a TaskQueue for sid=%s. Skipping insert into TaskQueue map. Error: %s",t,e)}}}const Le=require("jwt-decode");var $e=r.n(Le);const Ie=class{constructor(e,t={},r){this._config=new c(e,t),this._request=new E(this._config),this._logLevel=t.logLevel||"error",this._log=new d(`Workspace-${this._config.getLogIdentifier()}`,this._logLevel),this.shouldDecodeToken=!r,this.workspaceSid=r,this._updateJWTProperties(e),this.workspaceEntity=new Ue(this.workspaceSid,this._request,t)}fetchWorker(e){return this.workspaceEntity.fetchWorker(e)}fetchWorkers(e){return this.workspaceEntity.fetchWorkers(e).then((()=>this.workspaceEntity.Workers))}fetchTaskQueue(e){return this.workspaceEntity.fetchTaskQueue(e)}fetchTaskQueues(e){return this.workspaceEntity.fetchTaskQueues(e).then((()=>this.workspaceEntity.TaskQueues))}updateToken(e){if(!s().isString(e))throw new TypeError("To update the Twilio token, a new Twilio token must be passed in. <string>newToken is a required parameter.");this._config.updateToken(e),this._updateJWTProperties(e)}_updateJWTProperties(e){if(!this.shouldDecodeToken)return;const t=$e()(e);this.jwt=t,this.accountSid=t.sub,this.workspaceSid=t.grants.task_router.workspace_sid,this.workerSid=t.grants.task_router.worker_sid,this.role=t.grants.task_router.role}}},142:(e,t,r)=>{"use strict";r.d(t,{M0:()=>i,in:()=>s,j3:()=>n,hO:()=>o,O:()=>a,iz:()=>d,nB:()=>c,FB:()=>h,Uf:()=>l,iR:()=>u,UA:()=>p,xf:()=>g,EA:()=>_,qG:()=>k,VH:()=>f,Qh:()=>w,Nt:()=>v,L3:()=>m,zb:()=>S,fc:()=>E,PQ:()=>T,_G:()=>y,l4:()=>b,x6:()=>R,F3:()=>W,L8:()=>q,hS:()=>A,jz:()=>O,Iv:()=>C,Gf:()=>F});const i="accepted",s="completed",n="rejected",o="wrapping",a="call",d="dequeue",c="redirect",h="conference",l=Object.freeze({canceled:"canceled",complete:"complete",failed:"failed",initiated:"initiated"}),u={activitySid:"WorkerActivitySid"};Object.freeze(u);const p={rejectPendingReservations:"RejectPendingReservations"};Object.freeze(p);const g={accept:"CallAccept",record:"CallRecord",statusCallbackUrl:"CallStatusCallbackUrl",timeout:"CallTimeout",to:"CallTo"};Object.freeze(g);const _={to:"DequeueTo",from:"DequeueFrom",postWorkActivitySid:"DequeuePostWorkActivitySid",record:"DequeueRecord",timeout:"DequeueTimeout",statusCallbackUrl:"DequeueStatusCallbackUrl",statusCallbackEvents:"DequeueStatusCallbackEvents"};Object.freeze(_);const k={accept:"RedirectAccept"};Object.freeze(k);const f={taskChannelUniqueName:"TaskChannelUniqueName",taskChannelSid:"TaskChannelSid",attributes:"Attributes"},w="completed",v="wrapping";Object.freeze({accepted:0,rejected:1,timeout:2,canceled:3,rescinded:4,completed:5,wrapup:6});const m={"task.updated":"updated","task.canceled":"canceled","task.completed":"completed","task.wrapup":"wrapup"};Object.freeze(m);const S={"reservation.completed":"completed","reservation.rejected":"rejected","reservation.timeout":"timeout","reservation.canceled":"canceled","reservation.rescinded":"rescinded","reservation.accepted":"accepted","reservation.wrapup":"wrapup"};Object.freeze(S);const E=Object.freeze({taskTransfer:"task_transfer",activeOutgoingTaskTransfer:"active_outgoing_task_transfer"}),T="transfer-initiated",y={"transfer-attempt-failed":"attemptFailed","transfer-completed":"completed","transfer-failed":"failed","transfer-initiated":"transferInitiated","transfer-canceled":"canceled"};Object.freeze(y);const b={"task.transfer-attempt-failed":"transfer-attempt-failed","task.transfer-completed":"transfer-completed","task.transfer-failed":"transfer-failed","task.transfer-initiated":"transfer-initiated","task.transfer-canceled":"transfer-canceled"};Object.freeze(b);const R="v1",W="v2",q=1e3,A=1e3,O=5e3,C={TOKEN:"token",CLOSE_EXISTING_SESSIONS:"closeExistingSessions",CLIENT_VERSION:"clientVersion"},x=r(830),F=[{name:"INVALID_ARGUMENT",message:"One or more arguments passed were invalid."},{name:"INVALID_TOKEN",message:"The token is invalid or malformed."},{name:"TOKEN_EXPIRED",message:"Worker's active token has expired."},{name:"GATEWAY_CONNECTION_FAILED",message:"Could not connect to Twilio's servers."},{name:"GATEWAY_DISCONNECTED",message:"Connection to Twilio's servers was lost."},{name:"INVALID_GATEWAY_MESSAGE",message:"The JSON message received was malformed."},{name:"TASKROUTER_ERROR",message:"TaskRouter failed to complete the request."}].reduce(((e,t)=>(e[t.name]=new x(t),e)),{})},813:(e,t)=>{function r(e){if(!(this instanceof r))return new r(e);e=e||{};const t=function(){},i={interval:10,now:function(){return(new Date).getTime()},repeat:function(e,t){return setInterval(e,t)},stop:function(e,t){return clearInterval(e,t)},onsleep:t,onwakeup:t};for(let t in i)t in e||(e[t]=i[t]);this.interval=e.interval,this.lastbeat=0,this.pintvl=null,this.onsleep=e.onsleep,this.onwakeup=e.onwakeup,this.repeat=e.repeat,this.stop=e.stop,this.now=e.now}r.toString=function(){return"[Twilio.Heartbeat class]"},r.prototype.toString=function(){return"[Twilio.Heartbeat instance]"},r.prototype.beat=function(){if(this.lastbeat=this.now(),this.sleeping()){this.onwakeup&&this.onwakeup();var e=this;this.pintvl=this.repeat.call(null,(function(){e.check()}),1e3*this.interval)}},r.prototype.check=function(){const e=this.now()-this.lastbeat;!this.sleeping()&&e>=1e3*this.interval&&(this.onsleep&&this.onsleep(),this.stop.call(null,this.pintvl),this.pintvl=null)},r.prototype.sleeping=function(){return null===this.pintvl},t.y=r},834:(e,t,r)=>{"use strict";function i(e){try{return new Date(e)}catch(e){return null}}function s(e,t){for(const r in e)if(r in t&&!t[r](e[r]))throw new TypeError(`Option key: ${r} does not meet the required type.`);return!0}r.d(t,{T:()=>i,n:()=>s})},830:(e,t,r)=>{function i(e,t){Object.defineProperties(this,{_errorData:{value:e},name:{value:e.name},message:{value:t||e.message}})}(0,r(464).inherits)(i,Error),i.prototype.clone=function(e){return new i(this._errorData,e)},e.exports=i},622:e=>{"use strict";e.exports=require("loglevel")},464:e=>{"use strict";e.exports=require("util")},352:e=>{"use strict";e.exports=require("ws")}},t={};function r(i){var s=t[i];if(void 0!==s)return s.exports;var n=t[i]={exports:{}};return e[i](n,n.exports,r),n.exports}r.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return r.d(t,{a:t}),t},r.d=(e,t)=>{for(var i in t)r.o(t,i)&&!r.o(e,i)&&Object.defineProperty(e,i,{enumerable:!0,get:t[i]})},r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var i=r(266);module.exports=i})();
|
|
2
|
+
/*! twilio-taskrouter.js 0.7.2 */(()=>{var e={266:(e,t,r)=>{"use strict";r.r(t),r.d(t,{Supervisor:()=>Oe,TaskRouterEventHandler:()=>be,Worker:()=>Ae,Workspace:()=>Ie});const i=require("lodash");var s=r.n(i);const n=r(142).Gf,o=r(622),a=["trace","debug","info","warn","error","silent"];class d{constructor(e,t){if(!e)throw n.INVALID_ARGUMENT.clone("Error instantiating Logger. <string>moduleName is a required parameter.");this._log=o.getLogger(e),a.forEach(function(e){this[e]=(...t)=>this._log[e](this._getTimestamp(),...t)}.bind(this)),t&&this.setLevel(t)}setLevel(e){if(-1===a.indexOf(e))throw n.INVALID_ARGUMENT.clone("Error setting Logger level. <string>level must be one of ['trace', 'debug', 'info', 'warn', 'error', 'silent']");this._log.setLevel(e,!1),this._log.setDefaultLevel(e)}getLevel(){return a[this._log.getLevel()]}_getTimestamp(){return`[${(new Date).toISOString()}]`}}class c{constructor(e,t={}){if(!s().isString(e))throw new TypeError("Failed to initialize Configuration. <string>token is a required parameter.");if(this.logIdentifier=t.logIdentifier||+new Date,this._logLevel=t.logLevel,this._log=new d(`Configuration-${this.logIdentifier}`,this._logLevel),this.token=e,this.EB_SERVER=t.ebServer,this.WS_SERVER=t.wsServer,t.ebServer||t.wsServer)return this._log.warn('"ebServer" and "wsServer" parameter will be removed in next major version. You may start using "region" and "edge".');let r="";t.region&&(r+=`.${t.region}`),this.EB_SERVER=`https://event-bridge${r}.twilio.com/v1/wschannels`,this.WS_SERVER=`wss://event-bridge${r}.twilio.com/v1/wschannels`}updateToken(e){if(!s().isString(e))throw new TypeError("To update the Twilio token, a new Twilio token must be passed in. <string>newToken is a required parameter.");this.token=e}getLogIdentifier(){return this.logIdentifier}}var h=r(142);const l=require("events");var u=r(813);const p="0.7.2",g=global.window||global,_=g.WebSocket?g.WebSocket:r(352),k=p;class f extends l.EventEmitter{constructor(e,t={}){if(super(),!(e&&e instanceof Ae))throw h.Gf.INVALID_ARGUMENT.clone("<Worker>worker is a required parameter to construct EventBridgeSignaling.");const r=e.getLogger(`EventBridgeSignaling-${e.sid}`);if(!s().isNil(t.closeExistingSessions)&&!s().isBoolean(t.closeExistingSessions))throw new TypeError("Invalid type passed for <boolean>closeExistingSessions");this._heartbeat=null,this.webSocket=null,this._log=r,this._worker=e,this.closeExistingSessions=t.closeExistingSessions||!1,this._config=e._config,this.reconnect=!1,this.tokenTimer=null,this.setUpWebSocket()}updateToken(e){if(!e)throw h.Gf.INVALID_ARGUMENT.clone("To update the Twilio token, a new Twilio token must be passed in. <string>newToken is a required parameter.");this.setTokenExpirationEvent(),this._log.info("Updated token for Worker "+this._worker.sid),this.reconnect=!0,this.webSocket.readyState!==this.webSocket.CLOSING&&this.webSocket.readyState!==this.webSocket.CLOSED||this.createWebSocket()}setTokenExpirationEvent(){clearTimeout(this.tokenTimer),this.tokenTimer=setTimeout((()=>{this.reconnect=!1,this.emit("tokenExpired")}),this.tokenLifetime-5e3)}setUpWebSocket(){this._heartbeat&&(this._heartbeat.onsleep=()=>{}),this._heartbeat=new u.y({interval:60}),this.createWebSocket()}setLifetime(e){this.tokenLifetime=e,this.setTokenExpirationEvent()}createWebSocket(){this.numAttempts=1,this.reconnect=!0;const e=`?${h.Iv.TOKEN}=${this._config.token}&${h.Iv.CLOSE_EXISTING_SESSIONS}=${this.closeExistingSessions}&${h.Iv.CLIENT_VERSION}=${k}`;this.webSocket=new _(this._config.WS_SERVER+e),this.webSocket.onopen=()=>{this.numAttempts=1,this.emit("connected"),this._heartbeat.onsleep=()=>{this._log.info("Heartbeat not received in the past 60 seconds. Proceeding to disconnect websocket."),this.webSocket.close()},this._heartbeat.beat()},this.webSocket.onmessage=e=>{if(this._log.debug("Received event",e.data),this._heartbeat.beat(),0===e.data.trim().length)return;let t;try{t=JSON.parse(e.data)}catch(t){return this._log.error("Received data is not valid JSON: "+e.data),void this.emit("error",h.Gf.INVALID_GATEWAY_MESSAGE)}this._log.debug("Emitting event: %s with %s",t.event_type,JSON.stringify(t.payload)),this.emit(t.event_type,t.payload||null,t.event_type)},this.webSocket.onerror=e=>{this._log.error("WebSocket error occurred: ",e),this.emit("error",h.Gf.GATEWAY_CONNECTION_FAILED)},this.webSocket.onclose=e=>{this.reconnect?this._log.info("WebSocket connection has closed. Trying to reconnect."):this._log.info("WebSocket connection has closed. Not reconnecting due to token expiration.");let t=e.reason;const r=e.code;if(s().isEmpty(t)&&(t=`Websocket closed with errorCode=${r}`),this.emit("disconnected",{message:t}),this._heartbeat.onsleep=()=>{},this.reconnect){const e=this.generateBackOffInterval(this.numAttempts);setTimeout((()=>{this.numAttempts++,this.createWebSocket()}),e)}}}generateBackOffInterval(e){const t=Math.ceil(800),r=Math.floor(1e3*Math.min(30,Math.pow(2,e)-1));return Math.round(Math.floor(Math.random()*(r-t+1))+t)}disconnect(){this._log.info("Disconnecting websocket"),null!==this.webSocket&&(["onmessage","onclose","onopen","onerror"].forEach((e=>{this.webSocket[e]=null})),this._heartbeat.onsleep=()=>{},this.webSocket.close()),this.emit("disconnected",{message:"SDK Disconnect"})}}const w=require("axios"),v=require("https"),m={GET:"GET",POST:"POST"};Object.freeze(m);const S=p;class E{constructor(e){if(!(e instanceof c))throw new TypeError("Failed to initialize Request. <Configuration>config is a required parameter.");const t=new v.Agent({maxVersion:"TLSv1.2",minVersion:"TLSv1.2"});this._config=e,this._postClient=w.create({method:m.POST,timeout:h.jz,headers:{clientVersion:S},httpsAgent:t})}post(e,t,r,i){if(!e)throw new Error("Failed to make POST request. <string>url is a required parameter.");if(!s().isObject(t))throw new Error("Failed to make POST request. <object>paramsJSON is a required parameter.");if(!r)throw new Error("Failed to make POST request. <string>apiVersion is a required parameter.");const n=this.buildRequest(m.POST,e,t);let o={apiVersion:r};return this._postClient.post(this._config.EB_SERVER,n,{headers:o}).then((e=>Promise.resolve(e.data.payload)))}get(e,t,r){if(!e)throw new Error("Failed to make GET request. <string>url is a required parameter.");if(!t)throw new Error("Failed to make GET request. <string>apiVersion is a required parameter.");if(r=r||{},!s().isObject(r))throw new Error("Failed to make GET request. <object>paramsJSON is a required parameter.");const i=this.buildRequest(m.GET,e,r);return this._postClient.post(this._config.EB_SERVER,i,{headers:{apiVersion:t}}).then((e=>Promise.resolve(e.data.payload)))}buildRequest(e,t,r){return JSON.stringify({url:t,method:e,params:r,token:this._config.token})}}class T{constructor(){this.routes={}}getRoute(e,...t){if(!this.routes[e])throw h.Gf.INVALID_ARGUMENT.clone(`Invalid route fetched <string>route "${e}" does not exist.`);if(t.length){let r=Object.assign({},this.routes[e]);if(t.length!==(r.path.match(/%s/g)||[]).length)throw h.Gf.INVALID_ARGUMENT.clone(`Invalid number of positional arguments supplied for route ${e}`);for(let e of t)r.path=r.path.replace(/%s/,e);return r}return this.routes[e]}}const y=require("path");var b=r.n(y);const R=r(142).Gf,W="reservationList",q="reservationInstance",A="workerInstance",O="taskReservationInstance",C="taskList",x="taskInstance",F="taskTransferList",j="taskTransferInstance",N="workerChannels",D="activitiesList",P="customerParticipantInstance",U="workerParticipantInstance",L="holdWorkerParticipantInstance",$="kickWorkerParticipant";class I extends T{constructor(e,t){if(super(),!e||!t)throw R.INVALID_ARGUMENT.clone("Error instantiating Routes class. <string>workspaceSid and <string>workerSid are required parameters.");this.workspaceSid=e,this.workerSid=t,this.routes={[D]:{path:b().join("Workspaces",this.workspaceSid,"Activities")},[A]:{path:b().join("Workspaces",this.workspaceSid,"Workers",this.workerSid)},[q]:{path:b().join("Workspaces",this.workspaceSid,"Workers",this.workerSid,"Reservations","%s")},[W]:{path:b().join("Workspaces",this.workspaceSid,"Workers",this.workerSid,"Reservations")},[C]:{path:b().join("Workspaces",this.workspaceSid,"Tasks")},[x]:{path:b().join("Workspaces",this.workspaceSid,"Tasks","%s")},[F]:{path:b().join("Workspaces",this.workspaceSid,"Workers",this.workerSid,"Transfers")},[j]:{path:b().join("Workspaces",this.workspaceSid,"Workers",this.workerSid,"Transfers","%s")},[O]:{path:b().join("Workspaces",this.workspaceSid,"Tasks","%s","Reservations","%s")},[N]:{path:b().join("Workspaces",this.workspaceSid,"Workers",this.workerSid,"WorkerChannels")},[P]:{path:b().join("Workspaces",this.workspaceSid,"Workers",this.workerSid,"CustomerParticipant")},[U]:{path:b().join("Workspaces",this.workspaceSid,"Workers",this.workerSid,"WorkerParticipant")},[L]:{path:b().join("Workspaces",this.workspaceSid,"Workers",this.workerSid,"HoldWorkerParticipant")},[$]:{path:b().join("Workspaces",this.workspaceSid,"Workers",this.workerSid,"KickWorkerParticipant")}}}}var z=r(834);class H{constructor(e){if(!s().isObject(e))throw new TypeError("Failed to create a WorkerDescriptor. <Descriptor>descriptor is a required parameter.");if(!qe.every((t=>t in e)))throw new TypeError("Failed to create a WorkerDescriptor. The provided <Descriptor>descriptor does not contain all properties of a Worker.");this.accountSid=e.account_sid,this.activityName=e.activity_name,this.activitySid=e.activity_sid,this.attributes=JSON.parse(e.attributes),this.available=e.available,this.dateCreated=(0,z.T)(1e3*e.date_created),this.dateStatusChanged=(0,z.T)(1e3*e.date_status_changed),this.dateUpdated=(0,z.T)(1e3*e.date_updated),this.name=e.friendly_name,this.sid=e.sid,this.workspaceSid=e.workspace_sid,this.version=String(e.version),this.workerSid=e.sid,this.workerActivitySid=e.activity_sid,this.dateActivityChanged=(0,z.T)(1e3*e.date_status_changed),this.friendlyName=e.friendly_name}}class M{constructor(e){if(!s().isObject(e))throw new TypeError("Failed to instantiate ActivityDescriptor. <Descriptor>descriptor is required.");if(!B.every((t=>t in e)))throw new TypeError("Failed to instantiate ActivityDescriptor. <Descriptor>descriptor does not contain all properties of an Activity.");this.accountSid=e.account_sid,this.available=e.available,this.dateCreated=(0,z.T)(1e3*e.date_created),this.dateUpdated=(0,z.T)(1e3*e.date_updated),this.name=e.friendly_name,this.sid=e.sid,this.workspaceSid=e.workspace_sid}}const G=r(834).n;const B=["account_sid","available","date_created","date_updated","friendly_name","sid","workspace_sid"],Q=class{constructor(e,t){if(!s().isObject(e))throw new TypeError("Failed to create an Activity. <Worker>worker is a required parameter.");if(!(t instanceof M))throw new TypeError("Failed to create an Activity. <ActivityDescriptor>descriptor is a required parameter.");Object.assign(this,t),this._worker=e,this._isCurrent=!1}get isCurrent(){return this._isCurrent}setAsCurrent(e={}){if(!G(e,{rejectPendingReservations:e=>s().isBoolean(e)}))throw new TypeError(`Failed to set activity=${this.sid}. The options passed in did not match the required types.`);if(e.rejectPendingReservations&&this.available)throw new Error("Unable to reject pending reservations when updating to an Available activity state.");return this._worker._updateWorkerActivity(this.sid,e).then((()=>this))}},V=r(142).Gf;class J{constructor(e,t,r){if(!e)throw V.INVALID_ARGUMENT.clone("Error instantiating Paginator. <Array>items is a required parameter.");if(!t)throw V.INVALID_ARGUMENT.clone("Error instantiating Paginator. <Function>source is a required parameter.");this._nextToken=r,this._source=t,this.hasNextPage=!!this._nextToken,this.items=e}nextPage(){return this.hasNextPage?this._source(this._nextToken):Promise.reject(V.TASKROUTER_ERROR.clone("Error getting the next page. No next page exists."))}}class K{constructor(e,t,r={}){if(!s().isObject(e))throw new TypeError("Failed to initialize ActivitiesEntity. <Worker>worker is a required parameter.");this._activities=new Map,this._log=e.getLogger(`ActivitiesEntity-${e.sid}`),this._request=t,this._worker=e,this._pageSize=r.pageSize||h.L8,s().inRange(this._pageSize,1,h.L8+1)||(this._log.warn("PageSize range for ActivitiesEntity must be between 1 and %d. Setting pageSize to default size=%d",h.L8,h.L8),this._pageSize=1e3)}get activities(){return this._activities}fetchActivities(){const e=this._getPage();return this._getAllActivities(e)}_getAllActivities(e){return e.then((e=>(e.items.forEach((e=>{this._insertActivity(e)})),e.hasNextPage?this._getAllActivities(e.nextPage()):Promise.resolve())))}_getPage(e){e=e||{};const t=this._worker.getRoutes().getRoute(D).path,r={PageSize:this._pageSize};return e.AfterSid&&(r.AfterSid=e.AfterSid),this._request.get(t,h.x6,r).then((e=>new J(e.contents.map((e=>new M(e))),(e=>this._getPage({AfterSid:e})),e.after_sid)))}_insertActivity(e){const t=e.sid;this._log.trace(`_insertActivity(sid=${t}, data=${JSON.stringify(e)}`);try{const r=new Q(this._worker,e);this._activities.set(t,r)}catch(e){this._log.error(`Unable to create an Activity for sid=${t}. Skipping insert into Activities map. Error: ${e}`)}}}class Y{constructor(e){if(!s().isObject(e))throw new TypeError("Failed to instantiate WorkerChannelDescriptor. <Descriptor>descriptor is required.");if(!ee.every((t=>t in e)))throw new TypeError("Failed to create a WorkerChannelDescriptor. <Descriptor>descriptor does not contain all properties of a Channel.");this.accountSid=e.account_sid,this.assignedTasks=e.assigned_tasks,this.available=!!e.available,this.availableCapacityPercentage=e.available_capacity_percentage,this.capacity=e.configured_capacity,this.dateCreated=(0,z.T)(1e3*e.date_created),this.dateUpdated=(0,z.T)(1e3*e.date_updated),this.lastReservedTime=(0,z.T)(e.last_reserved_time),this.sid=e.sid,this.taskChannelSid=e.task_channel_sid,this.taskChannelUniqueName=e.task_channel_unique_name,this.workerSid=e.worker_sid,this.workspaceSid=e.workspace_sid}}const X=["capacity","available","assignedTasks","availableCapacityPercentage","dateUpdated","lastReservedTime"];class Z extends l.EventEmitter{constructor(e,t,r){if(super(),!(e instanceof Ae))throw new TypeError("Failed to instantiate Worker. <Worker>worker is a required parameter.");if(!(r instanceof Y))throw new TypeError("Failed to instantiate Channel. <WorkerChannelDescriptor>descriptor is a required parameter.");this._request=t,this._log=e.getLogger(`Channel-${r.sid}`),Object.assign(this,r)}_emitEvent(e,t){if(!s().isString(e))throw new TypeError("Error calling _emitEvent(). <string>eventType is a required parameter.");if(!s().isObject(t))throw new TypeError("Error calling method _emitEvent(). <object>rawEventData is a required parameter.");this._update(t),this.emit(e,this)}_update(e){try{const t=new Y(e);X.forEach((e=>{this[e]=t[e]}))}catch(t){this._log.warn("Failed to update Channel sid=%s. Update aborted. Error: %s.",e.sid,t)}return this}}const ee=["account_sid","assigned_tasks","available","available_capacity_percentage","configured_capacity","date_created","date_updated","last_reserved_time","sid","task_channel_sid","task_channel_unique_name","worker_sid","workspace_sid"],te=Z;class re{constructor(e,t,r={}){if(!(e instanceof Ae))throw new TypeError("Failed to initialize ChannelsEntity. <Worker>worker is a required parameter.");this._channels=new Map,this._log=e.getLogger("ChannelsEntity"),this._request=t,this._pageSize=r.pageSize||h.L8,this._worker=e,s().inRange(this._pageSize,1,h.L8+1)||(this._log.warn("PageSize range for ChannelsEntity must be between 1 and %d. Setting pageSize to default size=%d",h.L8,h.L8),this._pageSize=1e3)}get channels(){return this._channels}fetchChannels(){const e=this._getPage();return this._getAllChannels(e)}_getAllChannels(e){return e.then((e=>(e.items.forEach((e=>{this._insertChannel(e)})),e.hasNextPage?this._getAllChannels(e.nextPage()):Promise.resolve())))}_getPage(e){e=e||{};const t=this._worker.getRoutes().getRoute(N).path,r={PageSize:this._pageSize};return e.AfterSid&&(r.AfterSid=e.AfterSid),this._request.get(t,h.x6,r).then((e=>new J(e.contents.map((e=>new Y(e))),(e=>this._getPage({AfterSid:e})),e.after_sid)))}_insertChannel(e){const t=e.sid;this._log.trace(`_insertChannel(sid=${t}, data=${JSON.stringify(e)}`);try{const r=new te(this._worker,this._request,e);this._channels.set(t,r)}catch(e){this._log.error(`Unable to create a Channel for sid=${t}. Skipping insert into Channels map. Error: ${e}`)}}}class ie{constructor(e){if(!s().isObject(e))throw new TypeError("Failed to instantiate TransferDescriptor. <Descriptor>descriptor is required.");if(!oe.every((t=>t in e)))throw new TypeError("Failed to instantiate TransferDescriptor. <Descriptor>descriptor does not contain all properties of a Transfer.");this.dateCreated=(0,z.T)(1e3*e.date_created),this.dateUpdated=(0,z.T)(1e3*e.date_updated),this.mode=e.transfer_mode,this.queueSid=e.initiating_queue_sid,this.reservationSid=e.initiating_reservation_sid,this.to=e.transfer_to,this.transferFailedReason=e.transfer_failed_reason,this.type=e.transfer_type,this.sid=e.sid,this.status=e.transfer_status,this.workerSid=e.initiating_worker_sid,this.workflowSid=e.initiating_workflow_sid}}const se=["dateUpdated","status","transferFailedReason"];class ne extends l.EventEmitter{constructor(e,t){if(super(),!(t instanceof ie))throw new TypeError("Failed to instantiate Transfer. <TransferDescriptor>descriptor is a required parameter.");this._log=e.getLogger(`Transfer-${t.sid}`),Object.assign(this,t)}_update(e){try{const t=new ie(e);se.forEach((e=>{this[e]=t[e]}))}catch(t){throw this._log.error(`Failed to update Transfer sid=${e.sid}. Update aborted.`,t),new Error(`Failed to update Transfer sid=${e.sid}. Update aborted. Error: ${t}.`)}return this}}const oe=["date_created","date_updated","initiating_reservation_sid","initiating_worker_sid","initiating_queue_sid","initiating_workflow_sid","sid","transfer_mode","transfer_to","transfer_type","transfer_status"],ae=ne;const de=class extends ae{constructor(e,t){super(e,t)}};const ce=class extends ae{constructor(e,t,r,i){if(super(e,i),"string"!=typeof r)throw new TypeError("Failed to instantiate OutgoingTransfer. <string>taskSid is a required parameter.");this._worker=e,this._request=t,this.taskSid=r}_emitEvent(e,t){if(this._log.trace(`_emitEvent(${e}, ${JSON.stringify(t)})`),!s().isString(e))throw new TypeError("Error calling _emitEvent(). <string>eventType is a required parameter.");if(!s().isObject(t))throw new TypeError("Error calling method _emitEvent(). <object>payload is a required parameter.");this.emit(e,this)}async cancel(){const e=this._worker.getRoutes().getRoute(j,this.sid).path,t={TaskSid:this.taskSid,TransferStatus:h.Uf.canceled},r=await this._request.post(e,t,h.F3);return this._update(r)}};class he extends l.EventEmitter{constructor(e,t,r){if(super(),!(r instanceof ke))throw new TypeError("Failed to instantiate Transfers. <TaskDescriptor>taskDescriptor is a required parameter.");this._log=e.getLogger(`Transfers-${r.sid}`),this._worker=e,this._request=t,this.incoming=r.incomingTransferDescriptor?new de(e,r.incomingTransferDescriptor):null,this.outgoing=r.outgoingTransferDescriptor?new ce(e,t,r.sid,r.outgoingTransferDescriptor):null}_emitEvent(e,t){if(this._log.trace(`_emitEvent(${e}, ${JSON.stringify(t)})`),!s().isString(e))throw new TypeError("Error calling _emitEvent(). <string>eventType is a required parameter.");if(!s().isObject(t))throw new TypeError("Error calling method _emitEvent(). <object>payload is a required parameter.");const r=h._G[e];this.outgoing?this.outgoing.sid===t.sid?Object.keys(s().pick(h._G,["transfer-attempt-failed","transfer-completed","transfer-failed","transfer-canceled"])).indexOf(e)>-1&&(this._updateOutgoing(t),this.outgoing._emitEvent(r,t)):this._log.warn("The transfer %s specified by Event: transfer.%s does not match the current active outgoing transfer for Worker %s. Skipping event.",t.sid,r,this._worker.sid):this._log.warn("An active outgoing transfer does currently exist in Worker %s transfers map for Event: transfer.%s. Skipping event.",this._worker.sid,r)}_updateOutgoing(e,t=!1){!this.outgoing||t?this.outgoing=new ce(this._worker,this._request,e.task_sid,new ie(e)):this.outgoing._update(e)}_update(e){if(e.incoming)if(this.incoming)this.incoming._update(e.incoming);else{const t=new ie(e.incoming);this.incoming=new de(this._worker,this._request,e.incoming.task_sid,t)}if(e.outgoing)if(this.outgoing)this.outgoing._update(e.outgoing);else{const t=new ie(e.outgoing);this.outgoing=new ce(this._worker,this._request,e.outgoing.task_sid,t)}}}const le=he,ue=["attributes","status","workflowSid","workflowName","queueSid","queueName","priority","reason","routingTarget","timeout","taskChannelSid","taskChannelUniqueName","age","addOns","dateUpdated","transfers","version"];class pe extends l.EventEmitter{constructor(e,t,r,i){if(super(),!(e instanceof Ae))throw new TypeError("Failed to instantiate Task. <Worker>worker is a required parameter.");if(!i)throw new TypeError("Failed to instantiate Task. <TaskDescriptor>descriptor is a required parameter.");if(!(i instanceof ke))throw new TypeError("descriptor should be of type <TaskDescriptor>");if("string"!=typeof r)throw new TypeError("Failed to instantiate Task. <string>reservationSid is a required parameter.");this._worker=e,this._log=e.getLogger(`Task-${i.sid}`),this._request=t,this.transfers=new le(e,t,i),Object.assign(this,i),this.reservationSid=r}complete(e){if(!s().isString(e))throw new TypeError("Error calling method complete(). <string>reason is a required parameter.");const t=this._worker.getRoutes().getRoute(x,this.sid).path,r={AssignmentStatus:h.Qh,Reason:e};return this._request.post(t,r,h.x6,this.version).then((e=>this._update(e)))}async transfer(e,t={}){if(!s().isString(e))throw new TypeError("Error calling method transfer(). <string>to is a required parameter.");const r=this._worker.getRoutes().getRoute(F).path,i={ReservationSid:this.reservationSid,TaskSid:this.sid,To:e};t.attributes&&(i.Attributes=t.attributes),t.mode&&(i.Mode=t.mode),t.priority&&(i.Priority=t.priority);const n=await this._request.post(r,i,h.F3);return this._log.info(`Received response to transfer request to Worker/TaskQueue=${e}`),this._log.debug("Response object",n),this.transfers._updateOutgoing(n,!0),this}wrapUp(e={}){const t=this._worker.getRoutes().getRoute(x,this.sid).path,r={AssignmentStatus:h.Nt};if(e.reason){if(!s().isString(e.reason))throw new Error(`Failed to call wrapUp() on Task sid=${this.sid}. A <string>reason is required.`);r.Reason=e.reason}return this._request.post(t,r,h.x6,this.version).then((e=>this._update(e)))}setAttributes(e){if(!s().isObject(e))throw new TypeError("Unable to set attributes on Task. <object>attributes is a required parameter.");const t=this._worker.getRoutes().getRoute(x,this.sid).path,r={Attributes:e};return this._request.post(t,r,h.x6,this.version).then((e=>this._update(e)))}updateParticipant(e){const t={hold:e=>s().isBoolean(e),holdUrl:e=>s().isString(e),holdMethod:e=>s().isString(e)};if(!(0,z.n)(e,t))throw new TypeError(`Failed to update Participant tied to Task sid=${this.sid}. The options passed in did not match the required types.`);const r=this._worker.getRoutes().getRoute(P).path,i={TaskSid:this.sid};for(const t in e)i[s().upperFirst(t)]=e[t];return this._request.post(r,i,h.F3).then((e=>this._update(e)))}kick(e){if(!s().isString(e))throw new TypeError("Error calling method kick(). <string>workerSid is a required parameter.");const t=this._worker.getRoutes().getRoute($).path,r={TaskSid:this.sid,TargetWorkerSid:e};return this._request.post(t,r,h.F3).then((e=>this._update(e)))}hold(e,t,r){const i={holdUrl:e=>s().isString(e),holdMethod:e=>s().isString(e)};if(!s().isString(e))throw new TypeError("Error calling method hold(). <string>targetWorkerSid is a required parameter.");if(!s().isBoolean(t))throw new TypeError("Error calling method hold(). <boolean>onHold is a required parameter that is either true or false.");if(!(0,z.n)(r,i))throw new TypeError(`Failed to update Participant tied to Task sid=${this.sid}. The options passed in did not match the required types.`);const n=this._worker.getRoutes().getRoute(L).path,o={TaskSid:this.sid,TargetWorkerSid:e,Hold:t};for(const e in r)o[s().upperFirst(e)]=r[e];return this._request.post(n,o,h.F3).then((e=>this._update(e)))}fetchLatestVersion(){const e=this._worker.getRoutes().getRoute(x,this.sid).path;return this._request.get(e,h.x6).then((e=>this._update(e)))}_emitEvent(e,t){if(this._log.trace(`_emitEvent(${e}, ${JSON.stringify(t)})`),!s().isString(e))throw new TypeError("Error calling _emitEvent(). <string>eventType is a required parameter.");if(!s().isObject(t))throw new TypeError("Error calling method _emitEvent(). <object>payload is a required parameter.");this.emit(e,this,t)}async _emitEventForOutgoingTransfer(e,t){if(this._log.debug(`_emitEventForOutgoingTransfer(${e}, ${JSON.stringify(t)})`),!s().isString(e))throw new TypeError("Error calling _emitEventForOutgoingTransfer(). <string>eventType is a required parameter.");if(!s().isObject(t))throw new TypeError("Error calling method _emitEventForOutgoingTransfer(). <object>payload is a required parameter.");this.transfers.outgoing||this._log.debug("The transfers.outgoing object is NOT present");let r=0;for(;!this.transfers.outgoing&&r<20;)await new Promise((e=>setTimeout(e,500))),r++,this._log.debug("Transfer event arrived, waiting for API response, because transfer object missing",r);for(r=0;this.transfers.outgoing&&this.transfers.outgoing.sid!==t.sid&&r<20;)await new Promise((e=>setTimeout(e,500))),r++,this._log.debug("Transfer event arrived, waiting for API response to get the correct transfer SID",r);this._log.debug("Transfer sid from API response:",this.transfers&&this.transfers.outgoing?this.transfers.outgoing.sid:"No sid"),this._log.debug("Transfer sid from event:",t.sid),this.transfers.outgoing&&this.transfers.outgoing.sid===t.sid?Object.keys(s().pick(h._G,[h.PQ])).indexOf(e)>-1?(this.transfers._updateOutgoing(t),this.emit(h._G[h.PQ],this.transfers.outgoing)):this.transfers._emitEvent(e,t):this._log.debug(`The transfers.outgoing object is either not present or does not match the transfer sid in the event. ${JSON.stringify(t)}`)}_update(e,t={}){try{const r=new ke(e,this._config);ue.forEach((e=>{"transfers"===e?(t.incoming||t.outgoing)&&this.transfers._update(t):this[e]=r[e]}))}catch(t){throw this._log.error(`Failed to update Task sid=${e.sid}. Update aborted.`,t),new Error(`Failed to update Task sid=${e.sid}. Update aborted. Error: ${t}.`)}return this}}const ge=["addons","age","attributes","date_created","date_updated","priority","queue_name","queue_sid","reason","routing_target","sid","assignment_status","task_channel_unique_name","task_channel_sid","timeout","workflow_name","workflow_sid","version"],_e=pe;class ke{constructor(e){if(!s().isObject(e))throw new TypeError("Failed to instantiate TaskDescriptor. <Descriptor>descriptor is required.");if(!ge.every((t=>t in e)))throw new TypeError("Failed to instantiate TaskDescriptor. <Descriptor>descriptor does not contain all properties of a Task.");this.addOns=JSON.parse(e.addons),this.age=e.age,this.attributes=JSON.parse(e.attributes),this.dateCreated=(0,z.T)(1e3*e.date_created),this.dateUpdated=(0,z.T)(1e3*e.date_updated),this.priority=e.priority,this.queueName=e.queue_name,this.queueSid=e.queue_sid,this.reason=e.reason,this.routingTarget=e.routing_target,this.sid=e.sid,this.status=e.assignment_status,this.taskChannelUniqueName=e.task_channel_unique_name,this.taskChannelSid=e.task_channel_sid,this.timeout=e.timeout,this.workflowName=e.workflow_name,this.workflowSid=e.workflow_sid,this.incomingTransferDescriptor=null,this.outgoingTransferDescriptor=null,this.version=String(e.version)}}class fe{constructor(e,t,r=[]){if(!s().isObject(e))throw new TypeError("Failed to instantiate ReservationDescriptor. <Descriptor>descriptor is required.");if(!s().isObject(t))throw new TypeError("Failed to instantiate ReservationDescriptor. <Worker>worker is required.");const i=s().filter(Ee,(e=>-1===r.indexOf(e)));if(!s().every(i,(t=>t in e))){const t=s().difference(i,Object.keys(e)).join(", ");throw new TypeError(`Failed to instantiate ReservationDescriptor. <Descriptor>descriptor does not contain all properties of a Reservation. Missing: ${t}`)}this.accountSid=e.account_sid,this.dateCreated=(0,z.T)(1e3*e.date_created),this.dateUpdated=(0,z.T)(1e3*e.date_updated),this.sid=e.sid,this.status=e.reservation_status,this.timeout=e.reservation_timeout,this.workerSid=e.worker_sid,this.workspaceSid=e.workspace_sid,this.taskDescriptor=null,this.version=String(e.version),e.canceled_reason_code&&(this.canceledReasonCode=e.canceled_reason_code);const n=t.getLogger(`ReservationDescriptor-${this.sid}`);if(-1===r.indexOf("task"))try{this.taskDescriptor=new ke(e.task)}catch(e){throw n.error("Failed to create a ReservationDescriptor. The 'task' property is malformed."),e}if(-1===r.indexOf(h.fc.taskTransfer)&&"object"==typeof e.task_transfer)try{this.taskDescriptor.incomingTransferDescriptor=new ie(e.task_transfer),this.transferDescriptor=new ie(e.task_transfer)}catch(e){throw n.error("Failed to create a ReservationDescriptor. The 'task_transfer' property is malformed."),e}if(-1===r.indexOf(h.fc.activeOutgoingTaskTransfer)&&"object"==typeof e.active_outgoing_task_transfer)try{this.taskDescriptor.outgoingTransferDescriptor=new ie(e.active_outgoing_task_transfer)}catch(e){throw n.error("Failed to create a ReservationDescriptor. The 'active_outgoing_task_transfer' property is malformed."),e}}}const we=r(834).n,ve=["dateUpdated","canceledReasonCode","status","timeout","task","task_transfer","version"],me=["reservation_timeout","task","canceled_reason_code"];class Se extends l.EventEmitter{constructor(e,t,r){if(super(),!(e instanceof Ae))throw new TypeError("Failed to instantiate Reservation. <Worker>worker is a required parameter.");if(!(r instanceof fe))throw new TypeError("Failed to instantiate Reservation. <ReservationDescriptor>descriptor is a required parameter.");this._worker=e,this._log=e.getLogger(`Reservation-${r.sid}`),this._request=t,this.task=this._createTask(r),r.transferDescriptor&&(this.transfer=this._createTransfer(r)),Object.assign(this,r),delete this.taskDescriptor,delete this.transferDescriptor}accept(){const e=this._worker.getRoutes().getRoute(q,this.sid).path,t={ReservationStatus:h.M0};return this._request.post(e,t,h.x6,this.version).then((e=>this._update(e,me)))}complete(){const e=this._worker.getRoutes().getRoute(q,this.sid).path,t={ReservationStatus:h.in};return this._request.post(e,t,h.x6,this.version).then((e=>this._update(e,me)))}reject(e={}){const t=this._worker.getRoutes().getRoute(q,this.sid).path,r={ReservationStatus:h.j3};if(!we(e,{activitySid:e=>s().isString(e)}))throw new TypeError(`Failed to issue Instruction:reject on Reservation sid=${this.sid}. The options passed in did not match the required types.`);for(const t in e)r[h.iR[t]]=e[t];return this._request.post(t,r,h.x6,this.version).then((e=>this._update(e,me)))}wrap(){const e=this._worker.getRoutes().getRoute(q,this.sid).path,t={ReservationStatus:h.hO};return this._request.post(e,t,h.x6,this.version).then((e=>this._update(e,me)))}call(e,t,r={}){if(!s().isString(e))throw new TypeError("Error calling method call(). <string>from is a required parameter.");if(!s().isString(t))throw new TypeError("Error calling method call(). <string>url is a required parameter.");const i=this._worker.getRoutes().getRoute(q,this.sid).path,n={Instruction:h.O,CallFrom:e,CallUrl:t};if(!we(r,{accept:e=>s().isBoolean(e),record:e=>s().isString(e),statusCallbackUrl:e=>s().isString(e),timeout:e=>s().isInteger(e),to:e=>s().isString(e)}))throw new TypeError(`Failed to issue Instruction:call on Reservation sid=${this.sid}. The options passed in did not match the required types.`);for(const e in r)n[h.xf[e]]=r[e];return this._request.post(i,n,h.x6).then((e=>this._update(e,me)))}dequeue(e={}){const t=this._worker.getRoutes().getRoute(q,this.sid).path,r={Instruction:h.iz};if(!we(e,{from:e=>s().isString(e),to:e=>s().isString(e),postWorkActivitySid:e=>s().isString(e),record:e=>s().isString(e),timeout:e=>s().isInteger(e),statusCallbackUrl:e=>s().isString(e),statusCallbackEvents:e=>s().isString(e)}))throw new TypeError(`Failed to issue Instruction:dequeue on Reservation sid=${this.sid}. The options passed in did not match the required types.`);for(const t in e)r[h.EA[t]]=e[t];return this._request.post(t,r,h.x6).then((e=>this._update(e,me)))}redirect(e,t,r={}){if(!s().isString(e))throw new TypeError("Error calling method redirect(). <string>callSid is a required parameter.");if(!s().isString(t))throw new TypeError("Error calling method redirect(). <string>url is a required parameter.");const i=this._worker.getRoutes().getRoute(q,this.sid).path,n={accept:e=>s().isBoolean(e)},o={Instruction:h.nB,RedirectCallSid:e,RedirectUrl:t};if(!we(r,n))throw new TypeError(`Failed to issue Instruction:redirect on Reservation sid=${this.sid}. The options passed in did not match the required types.`);for(const e in r)o[h.qG[e]]=r[e];return this._request.post(i,o,h.x6).then((e=>this._update(e,me)))}conference(e={}){if(!we(e,{to:e=>s().isString(e),from:e=>s().isString(e),timeout:e=>s().isInteger(e),statusCallback:e=>s().isString(e),statusCallbackMethod:e=>s().isString(e),statusCallbackEvent:e=>s().isString(e),record:e=>s().isString(e),muted:e=>s().isBoolean(e),beep:e=>s().isBoolean(e)||s().isString(e),startConferenceOnEnter:e=>s().isBoolean(e),endConferenceOnExit:e=>s().isBoolean(e),endConferenceOnCustomerExit:e=>s().isBoolean(e),waitUrl:e=>s().isString(e),waitMethod:e=>s().isString(e),earlyMedia:e=>s().isBoolean(e),maxParticipants:e=>s().isInteger(e),conferenceStatusCallback:e=>s().isString(e),conferenceStatusCallbackMethod:e=>s().isString(e),conferenceStatusCallbackEvent:e=>s().isString(e),conferenceRecord:e=>s().isBoolean(e)||s().isString(e),conferenceTrim:e=>s().isString(e),recordingChannels:e=>s().isString(e),recordingStatusCallback:e=>s().isString(e),recordingStatusCallbackMethod:e=>s().isString(e),conferenceRecordingStatusCallback:e=>s().isString(e),conferenceRecordingStatusCallbackMethod:e=>s().isString(e),region:e=>s().isString(e),sipAuthUsername:e=>s().isString(e),sipAuthPassword:e=>s().isString(e)}))throw new TypeError(`Failed to issue Instruction:conference on Reservation sid=${this.sid}. The options passed in did not match the required types.`);const t=this._worker.getRoutes().getRoute(q,this.sid).path,r={Instruction:h.FB};for(const t in e)r[s().upperFirst(t)]=e[t];return this._request.post(t,r,h.x6).then((()=>this))}updateParticipant(e){if(!we(e,{endConferenceOnExit:e=>s().isBoolean(e),mute:e=>s().isBoolean(e),beepOnExit:e=>s().isBoolean(e)}))throw new TypeError(`Failed to update Worker Participant tied to Reservation sid=${this.sid}. The options passed in did not match the required types.`);const t=this._worker.getRoutes().getRoute(U).path,r={ReservationSid:this.sid};for(const t in e)r[s().upperFirst(t)]=e[t];return this._request.post(t,r,h.F3).then((()=>this))}fetchLatestVersion(){const e=this._worker.getRoutes().getRoute(q,this.sid).path;return this._request.get(e,h.x6).then((e=>this._update(e)))}_createTask(e){if(!(e instanceof fe))return this._log.error(`Error calling method _createTask() for Reservation sid=${this.sid}. <ReservationDescriptor>reservationDescriptor is a required parameter.`),{};const t=e.taskDescriptor;try{return new _e(this._worker,this._request,e.sid,t)}catch(e){return this._log.error(`Failed to create a Task for Reservation sid=${this.sid}. Error: ${e}`),{}}}_createTransfer(e){if(!(e instanceof fe))return this._log.error(`Error calling method _createTransfer() for Reservation sid=${this.sid}. <ReservationDescriptor>reservationDescriptor is a required parameter.`),{};const t=e.transferDescriptor;try{return new de(this._worker,t)}catch(e){return this._log.error(`Failed to create a Transfer for Reservation sid=${this.sid}. Error: ${e}`),{}}}_update(e,t=[]){try{const r=new fe(e,this._worker,t);ve.forEach((i=>{if("task"===i){if(-1===t.indexOf("task")){const t=e.task_transfer,r=e.active_outgoing_task_transfer;this.task._update(e.task,{incoming:t,outgoing:r})}}else"canceledReasonCode"===i?-1===t.indexOf("canceled_reason_code")&&e.canceled_reason_code&&(this[i]=r[i]):"task_transfer"===i&&e.task_transfer?this.transfer._update(e.task_transfer):this[i]=r[i]}))}catch(t){throw this._log.error(`Failed to update Reservation sid=${e.sid}. Update aborted. Error: ${t}.`),t}return this}_emitEvent(e,t){if(!s().isString(e))throw new TypeError("Error calling _emitEvent(). <string>eventType is a required parameter.");if(!s().isObject(t))throw new TypeError("Error calling method _emitEvent(). <object>rawEventData is a required parameter.");this._update(t),this.emit(e,this)}}const Ee=["account_sid","date_created","date_updated","reservation_status","sid","task","reservation_timeout","worker_sid","workspace_sid","version"],Te=Se;class ye extends l.EventEmitter{constructor(e,t,r={}){if(super(),!(e instanceof Ae))throw new TypeError("Failed to initialize ReservationsEntity. <Worker>worker is a required parameter.");this._worker=e,this._log=e.getLogger("ReservationsEntity"),this._request=t,this._reservations=new Map,this._reservationSidsByTask=new Map,this._pageSize=r.pageSize||h.L8,s().inRange(this._pageSize,1,h.L8+1)||(this._log.warn("PageSize range for ReservationsEntity must be between 1 and %d. Setting pageSize to default size=%d",h.L8,h.L8),this._pageSize=1e3)}get reservations(){return new Map(Array.from(this._reservations).filter((e=>!e[1][1])).map((e=>[e[0],e[1][0]])))}fetchReservations(){const e=this._getPage();return this._reservations.clear(),this._getAllReservations(e)}_getAllReservations(e){return e.then((e=>{e.items.forEach((e=>{this._insertReservation(e)})),e.hasNextPage&&this._getAllReservations(e.nextPage())}))}_getPage(e){e=e||{};const t=this._worker.getRoutes().getRoute(W).path,r={Active:"true",PageSize:this._pageSize};return e.AfterSid&&(r.AfterSid=e.AfterSid),this._request.get(t,h.F3,r).then((e=>new J(e.contents.map((e=>new fe(e,this._worker))),(e=>this._getPage({AfterSid:e})),e.after_sid)))}_insertReservation(e){const t=e.sid;this._log.trace("_insertReservation(sid=%s, data=%s)",t,JSON.stringify(e)),this._reservations.has(t)&&this._log.debug("Reservation %s already exists for Worker %s. Attempting to overwrite it.",t,this._worker.sid);try{const r=new Te(this._worker,this._request,e);return this._reservations.set(t,[r,!1]),this._reservationSidsByTask.has(r.task.sid)?this._reservationSidsByTask.get(r.task.sid).add(r.sid):this._reservationSidsByTask.set(r.task.sid,new Set([r.sid])),this._log.debug("Successfully created and inserted %s for %s to Task-Reservation lookup. Contents: %s",r.sid,r.task.sid,this._reservationSidsByTask.get(r.task.sid)),r}catch(e){throw this._log.error("Unable to create a Reservation for sid=%s. Skipping insert into Reservations map. Error: %s",t,e),e}}insert(e){this._log.trace("_insertReservation(sid=%s, data=%s)",e.sid,JSON.stringify(e));const t=new fe(e,this._worker);return this._insertReservation(t)}getTasks(e){if(!this._reservationSidsByTask.has(e))return null;const t=this._reservationSidsByTask.get(e),r=[];return t.forEach((e=>{const t=this._reservations.get(e);t&&t[0].task&&r.push(t[0].task)})),r}_deleteByReservationSid(e){this._log.trace("_deleteByReservationSid(sid=%s)",e);const t=this.reservations.get(e);t?(this._log.info("Found Reservation sid=%s for Worker %s. Removing reservation and task.",e,this._worker.sid),this._cleanUpReservationAndTask(t)):this._log.info("Reservation with sid=%s not found. Unable to remove Reservation.",e)}_cleanUpReservationAndTask(e){this._log.debug("Soft deleting Reservation sid=%s for Worker %s",e.sid,this._worker.sid),this._reservations.set(e.sid,[e,!0]),setTimeout((()=>{this._log.debug("Hard deleting of Reservation sid=%s for Worker %s",e.sid,this._worker.sid),this._reservations.delete(e.sid)||this._log.warn("Failed to hard delete Reservation sid=%s for Worker %s",e.sid,this._worker.sid)}),5e3)}}class be{constructor(e,t={}){this._worker=e,this._logLevel=t.logLevel||"error",this._log=new d("WorkerEventHandler",this._logLevel)}getTREventsToHandlerMapping(){return{"worker.activity.update":"_workerActivityUpdateHandler","worker.attributes.update":"_workerAttributesUpdateHandler","worker.capacity.update":"_workerCapacityUpdateHandler","worker.channel.availability.update":"_workerChannelAvailabilityUpdateHandler","reservation.created":"_reservationCreatedHandler","reservation.failed":"_reservationFailedHandler","reservation.accepted":"_reservationUpdateHandler","reservation.wrapup":"_reservationUpdateHandler","reservation.completed":"_reservationCleanupEventsHandler","reservation.rejected":"_reservationCleanupEventsHandler","reservation.timeout":"_reservationCleanupEventsHandler","reservation.canceled":"_reservationCleanupEventsHandler","reservation.rescinded":"_reservationCleanupEventsHandler","task.updated":"_taskTypeEventHandler","task.canceled":"_taskTypeEventHandler","task.completed":"_taskTypeEventHandler","task.wrapup":"_taskTypeEventHandler","task.transfer-attempt-failed":"_transferTaskEventHandler","task.transfer-completed":"_transferTaskEventHandler","task.transfer-failed":"_transferTaskEventHandler","task.transfer-initiated":"_transferTaskEventHandler","task.transfer-canceled":"_transferTaskEventHandler"}}_workerActivityUpdateHandler(e){if(this._log.info("Worker %s received Event: worker.activity.update. Proceeding to update ...",this._worker.sid),!e.activity_sid)throw this._log.error("Event: worker.activity.update did not contain an activity_sid. Unable to update Worker %s.",this._worker.sid),new Error(`Failed to update Worker ${this._worker.sid} activity.`);{const t=this._worker.activities.get(e.activity_sid);if(!t)throw this._log.error("The Activity sid=%s specified in Event: worker.activity.update does not exist in the Worker's map of Activities. Unable to update Worker %s activity.",e.activity_sid,this._worker.sid),new Error(`Failed to update Worker ${this._worker.sid} activity.`);this._worker.activity._isCurrent=!1,this._worker.activity=t,t._isCurrent=!0,this._worker.emit("activityUpdated",this._worker._update(e))}}_workerAttributesUpdateHandler(e){this._log.info(`Worker ${this._worker.sid} received Event: worker.attributes.update. Proceeding to update ...`),this._worker.emit("attributesUpdated",this._worker._update(e))}_workerCapacityUpdateHandler(e){if(this._log.info(`Worker ${this._worker.sid} received Event: worker.capacity.update.`),!e.sid)throw this._log.error("Event: worker.capacity.update did not contain a Channel sid. Unable to update Channel for Worker %s.",this._worker.sid),new Error(`Failed to update Worker ${this._worker.sid} channel.`);{const t=this._worker.channels.get(e.sid);if(!t)throw this._log.error("The Channel sid=%s specified in Event: worker.capacity.update does not exist in the Worker's map of Channels. Unable to update Worker %s channel.",e.sid,this._worker.sid),new Error(`Failed to update Worker ${this._worker.sid} channel.`);t._emitEvent("capacityUpdated",e)}}_workerChannelAvailabilityUpdateHandler(e){if(this._log.info("Worker %s received Event: worker.channel.availability.update.",this._worker.sid),!e.sid)throw this._log.error("Event: worker.capacity.update did not contain a Channel sid. Unable to update Channel for Worker %s.",this._worker.sid),new Error(`Failed to update Worker ${this._worker.sid} channel.`);{const t=this._worker.channels.get(e.sid);if(!t)throw this._log.error("The Channel sid=%s specified in Event: worker.channel.availability.update does not exist in the Worker's map of Channels. Unable to update Worker %s channel.",e.sid,this._worker.sid),new Error(`Failed to update Worker ${this._worker.sid} channel.`);t._emitEvent("availabilityUpdated",e)}}_reservationCreatedHandler(e){if(this._log.info("Worker %s received Event: reservation.created.",this._worker.sid),!e.sid)throw this._log.error("Event: reservationCreated did not contain a Reservation sid. Unable to create a Reservation for Worker %s.",this._worker.sid),new Error(`Failed to create Reservation for Worker ${this._worker.sid}.`);try{this._log.info("Attempting to create and insert Reservation into Worker %s reservations map.",this._worker.sid);const t=this._worker._dataServices.reservationsEntity.insert(e);this._worker._bumpVersion(),this._worker.emit("reservationCreated",t)}catch(e){throw this._log.info("Failed to create and insert Reservation into Worker %s reservations map.",this._worker.sid),new Error(`Failed to create a Reservation for Worker ${this._worker.sid} on Event: reservationCreated. Error: ${e}`)}}_reservationFailedHandler(e){this._log.info("Worker %s received Event: reservation.failed.",this._worker.sid),this._worker.emit("reservationFailed",e)}_reservationUpdateHandler(e,t){const r=h.zb[t];if(this._log.info("Worker %s received Event: %s mapped to %s.",this._worker.sid,t,r),!e.sid)throw this._log.error(`Event: reservation.${r} did not contain a Reservation sid. Unable to update Reservation for Worker ${this._worker.sid}`),new Error(`Failed to update Reservation for Worker ${this._worker.sid}.`);{const t=this._worker.reservations.get(e.sid);if(!t)throw this._log.error(`The Resevation sid=${e.sid} specified in Event: reservation.${r} does not exist in the Worker's map of Reservations. Unable to update Worker ${this._worker.sid} reservation.`),new Error(`Failed to update Worker ${this._worker.sid} reservation.`);t._emitEvent(r,e)}}_reservationCleanupEventsHandler(e,t){const r=h.zb[t];if(this._log.info("Worker %s received Event: %s mapped to %s.",this._worker.sid,t,r),!e.sid)throw this._log.error("Event: reservation.%s did not contain a Reservation sid. Unable to update Reservation for Worker %s.",r,this._worker.sid),new Error(`Failed to update Reservation for Worker ${this._worker.sid}.`);{const t=this._worker.reservations.get(e.sid);t?(this._worker._dataServices.reservationsEntity._deleteByReservationSid(e.sid),t._emitEvent(r,e)):this._log.warn("The reservation specified by Event: reservation.%s does not exist in Worker %s Reservations map. Skipping event.",r,this._worker.sid)}}_taskTypeEventHandler(e,t){const r=h.L3[t];if(this._log.info("Worker %s received Event: %s mapped to %s.",this._worker.sid,t,r),!e.sid)throw this._log.error("Event: task.%s did not contain a Task sid. Unable to emit event for Worker %s.",r,this._worker.sid),new Error(`Failed to emit event for Worker ${this._worker.sid}.`);{const t=this._worker._dataServices.reservationsEntity.getTasks(e.sid);t&&t.length>0?t.forEach((t=>{t._update(e),t._emitEvent(r,e)})):this._log.warn("The task specified by Event: task.%s does not exist in Worker %s Reservations map. Skipping event.",r,this._worker.sid)}}_transferTaskEventHandler(e,t){const r=h.l4[t];if(this._log.info("Worker %s received Event: % mapped to %s.",this._worker.sid,t,r),!e.initiating_reservation_sid||!e.task_sid)throw this._log.error("Event: task.%s did not contain a Reservation sid or Task sid. Unable to emit event for Worker %s.",r,this._worker.sid),new Error(`Failed to emit event for Worker ${this._worker.sid}.`);{const t=this._worker.reservations.get(e.initiating_reservation_sid);t?t.task.sid===e.task_sid?t.task._emitEventForOutgoingTransfer(r,e):this._log.warn("The task %s related to Event: task.%s does not match the expected owning Reservation %s for Worker %s. Skipping event.",e.task_sid,r,t.sid,this._worker.sid):this._log.warn("The reservation %s related to Event: task.%s does not exist in Worker %s Reservations map. Skipping event.",e.initiating_reservation_sid,r,this._worker.sid)}}}const Re=["dateUpdated","dateStatusChanged","attributes","name","available","version"];class We extends l.EventEmitter{constructor(e,t={},r={Request:E,EventBridgeSignaling:f}){if(super(),!s().isString(e))throw new TypeError("Failed to instantiate Worker. <string>token is a required parameter.");const i={connectActivitySid:e=>s().isString(e),closeExistingSessions:e=>s().isBoolean(e),logLevel:e=>s().isString(e),ebServer:e=>s().isString(e),wsServer:e=>s().isString(e),region:e=>s().isString(e)};let n;(0,z.n)(t,i),this._connectActivitySid=t.connectActivitySid,this._closeExistingSessions=t.closeExistingSessions,this._logLevel=t.logLevel||"error",this._config=new c(e,t),this._log=new d(`Worker-${this._config.getLogIdentifier()}`,this._logLevel),this._request=new r.Request(this._config),this._dataServices={activitiesEntity:new K(this,this._request),channelsEntity:new re(this,this._request),reservationsEntity:new ye(this,this._request)},this._signaling=new r.EventBridgeSignaling(this,{closeExistingSessions:t.closeExistingSessions}),this._subscribeToSignalingEvents(),n=t.eventHandlerClass?new t.eventHandlerClass(this):new be(this),this.taskRouterEventHandler=n}createTask(e,t,r,i,n={}){if(!s().isString(e))throw new TypeError("Error calling method createTask(). <string>to is a required parameter.");if(!s().isString(t))throw new TypeError("Error calling method createTask(). <string>from is a required parameter.");if(!s().isString(r))throw new TypeError("Error calling method createTask(). <string>workflowSid is a required parameter.");if(!s().isString(i))throw new TypeError("Error calling method createTask(). <string>taskQueueSid is a required parameter.");const o={attributes:e=>s().isObject(e),taskChannelUniqueName:e=>s().isString(e),taskChannelSid:e=>s().isString(e)};if(!(0,z.n)(n,o))throw new TypeError(`Failed to create a Task for Worker ${this.sid}. The options passed in did not match the required types.`);const a=this.getRoutes().getRoute(C).path,d={WorkflowSid:r,TaskQueueSid:i,RoutingTarget:this.sid};for(const e in n)"attributes"===e||(d[h.VH[e]]=n[e]);const c={outbound_to:e,from:t};return d.Attributes=Object.assign({},n.attributes,c),this._request.post(a,d,h.x6).then((e=>e.sid))}getLogger(e){return new d(`${e}-${this.sid}`,this._config._logLevel)}setAttributes(e){if(!s().isObject(e))throw new TypeError("Unable to set attributes on Worker. <object>attributes is a required parameter.");const t=this.getRoutes().getRoute(A).path,r={Attributes:e};return this._request.post(t,r,h.x6,this.version).then((e=>this._update(e)))}_bumpVersion(){this.version&&(this.version=String(Number(this.version)+1))}updateToken(e){if(!s().isString(e))throw new TypeError("To update the Twilio token, a new Twilio token must be passed in. <string>newToken is a required parameter.");this._log.info("Proceeding to update the Worker's current active token with a new token."),this._log.debug("New token: "+e);try{this._config.updateToken(e),this._signaling.updateToken(e),this.emit("tokenUpdated")}catch(e){this.emit("error",e)}}fetchLatestVersion(){const e=this.getRoutes().getRoute(A).path;return this._request.get(e,h.x6).then((e=>this._update(e)))}_subscribeToSignalingEvents(){this._log.info("Subscribing to Signaling events .... "),this._signaling.on("connected",(()=>{this._log.info("Received Event: 'connected' from Signaling layer. Pending initialization.",this.sid)})),this._signaling.on("disconnected",(e=>{this._log.info("Received Event: 'disconnected' from Signaling layer for Worker %s. %s",this.sid,e),this._unSubscribeFromTaskRouterEvents(),this.emit("disconnected",e)})),this._signaling.on("init",(e=>{this._log.info("Received Event: 'init' from Signaling layer. Proceeding to initialize Worker %s.",e.channel_id),this.sid=e.channel_id,this.accountSid=e.account_sid,this.workspaceSid=e.workspace_sid,this._signaling.setLifetime(e.token_lifetime),this._initialize()})),this._signaling.on("error",(e=>{this._log.info("Received Event: 'error' from Signaling layer for Worker %s.",this.sid),this.emit("error",e)})),this._signaling.on("tokenExpired",(()=>{this._log.info("Received Event: 'tokenExpired' for for Worker %s. Please update the token. Websocket will not reconnect automatically until token is updated.",this.sid),this.emit("tokenExpired")}))}_subscribeToTaskRouterEvents(){this._log.info("Subscribing to TaskRouter events ... ");for(let[e,t]of Object.entries(this.taskRouterEventHandler.getTREventsToHandlerMapping()))this._signaling.on(e,this.taskRouterEventHandler[t])}_unSubscribeFromTaskRouterEvents(){this._log.info("Unsubscribing from TaskRouter events ... ");for(let[e,t]of Object.entries(this.taskRouterEventHandler.getTREventsToHandlerMapping()))this._signaling.removeListener(e,this.taskRouterEventHandler[t])}_initialize(){this._routes=new I(this.workspaceSid,this.sid),this._log.info("Initializing Worker %s...",this.sid);const e=this.getRoutes().getRoute(A).path;let t;this._request.get(e,h.x6).then((e=>{const r=new H(e);return t=r.activitySid,delete r.activityName,delete r.activitySid,delete r.available,Object.assign(this,r),Promise.all([this._dataServices.activitiesEntity.fetchActivities(),this._dataServices.channelsEntity.fetchChannels(),this._dataServices.reservationsEntity.fetchReservations()])})).then((()=>{this._log.info("Worker %s activities, channels and pending reservations initialized",this.sid),this._setCurrentActivity(t),this._connectActivitySid?this._setWorkerConnectActivity().then((()=>{this._log.info("Successfully updated Worker on connect to Activity=%s",this._connectActivitySid),this._log.info("Worker %s successfully initialized",this.sid)})):this._log.info("Worker %s successfully initialized",this.sid),this._subscribeToTaskRouterEvents(),this.emit("ready",this)})).catch((e=>{this._log.error("Failed to initialize Worker %s. Error: %s",this.sid,e),this.emit("error",`Failed to initialize Worker ${this.sid}`)}))}get channels(){return this._dataServices.channelsEntity.channels}get activities(){return this._dataServices.activitiesEntity.activities}get reservations(){return this._dataServices.reservationsEntity.reservations}_setCurrentActivity(e){const t=this.activities.get(e);if(!t)throw new Error(`Unable to set the current Activity sid=${e} on the Worker.`);t._isCurrent=!0,this.activity=t,this.activity._isCurrent=!0}_setWorkerConnectActivity(){if(!s().isString(this._connectActivitySid))throw new TypeError("Failed to set the Worker's activity to the provided optional connectActivitySid. <string>connectActivitySid must be a string.");return this._updateWorkerActivity(this._connectActivitySid).then((()=>(this._log.info("Successfully set the Worker's activity to the provided connectActivitySid=%s on connection.",this._connectActivitySid),this._connectRetry=0,this))).catch((e=>{if(this._connectRetry>=3)throw this._log.error("Unable to set Worker %s activity to the provided %s on successful connection. %s",this.sid,this._connectActivitySid,e),e;return this._connectRetry=this._connectRetry>0?this._connectRetry+1:1,new Promise((e=>setTimeout(e,500))).then(this._setWorkerConnectActivity.bind(this))}))}_updateWorkerActivity(e,t={}){if(!s().isString(e))throw new TypeError("Error updating Worker Activity: <string>activitySid is a required parameter");const r=this.getRoutes().getRoute(A).path,i={ActivitySid:e};for(const e in t)i[h.UA[e]]=t[e];return this._request.post(r,i,h.x6,this.version).then((t=>{try{this._update(t),this.activity._isCurrent=!1;const e=this.activities.get(t.activity_sid);this.activity=e,this.activity._isCurrent=!0}catch(t){throw this._log.error("Failed to update the Worker's activity to sid=%s. Error: %s",e,t),t}return this}))}_update(e){this._log.trace("Attempting to update Worker %s with latest Worker data=%s",this.sid,JSON.stringify(e));try{const t=new H(e);Re.forEach((e=>{this[e]=t[e]}))}catch(t){this._log.error("Failed to update Worker sid=%s. Update aborted. Error: %s.",e.sid,t)}return this}disconnect(){this._signaling.disconnect()}getRoutes(){return this._routes}}const qe=["account_sid","activity_name","activity_sid","attributes","available","date_created","date_status_changed","date_updated","friendly_name","sid","workspace_sid","version"],Ae=We;const Oe=class extends Ae{monitor(e,t,r){if(!s().isString(e))throw new TypeError("Error monitoring reservation: <string>taskSid is a required parameter");if(!s().isString(t))throw new TypeError("Error monitoring reservation: <string>reservationSid is a required parameter");if(r&&!s().isObject(r))throw new TypeError("Error monitoring reservation: <string>extraParams must be an object");return this._supervise("monitor",e,t,r)}_supervise(e,t,r,i){const s=this.getRoutes().getRoute(O,t,r).path,n=Object.assign({},i,{Instruction:"supervise",Supervisor:this.sid,SupervisorMode:e});return this._request.post(s,n,h.x6).then((()=>{}))}};const Ce=["friendly_name","reservation_activity_name","assignment_activity_name","target_workers","max_reserved_workers","task_order","reservation_activity_sid","assignment_activity_sid","workspace_sid","account_sid","sid","date_created","date_updated","lifo_queue"],xe=class{constructor(e){if(!(e instanceof Fe))throw new TypeError("Failed to create a TaskQueue. <TaskQueueDescriptor>descriptor is a required parameter.");Object.assign(this,e)}};class Fe{constructor(e){if(!s().isObject(e))throw new TypeError("Failed to instantiate TaskQueueDescriptor. <Descriptor>descriptor is required.");if(!Ce.every((t=>t in e)))throw new TypeError("Failed to instantiate TaskQueueDescriptor. <Descriptor>descriptor does not contain all properties of a TaskQueue.");this.sid=e.sid,this.queueSid=e.sid,this.accountSid=e.account_sid,this.workspaceSid=e.workspace_sid,this.name=e.friendly_name,this.queueName=e.friendly_name,this.assignmentActivityName=e.assignment_activity_name,this.reservationActivityName=e.reservation_activity_name,this.assignmentActivitySid=e.assignment_activity_sid,this.reservationActivitySid=e.reservation_activity_sid,this.targetWorkers=e.target_workers,this.maxReservedWorkers=e.max_reserved_workers,this.taskOrder=e.task_order,this.dateCreated=(0,z.T)(1e3*e.date_created),this.dateUpdated=(0,z.T)(1e3*e.date_updated)}}const je=class{constructor(e){if(!(e instanceof H))throw new TypeError("Failed to create a WorkerContainer. <WorkerDescriptor>descriptor is a required parameter.");Object.assign(this,e)}},Ne="workerList",De="taskQueueList";class Pe extends T{constructor(e){if(super(),!e)throw h.Gf.INVALID_ARGUMENT.clone("Error instantiating WorkspaceRoutes class. <string>workspaceSid is required.");this.workspaceSid=e,this.routes={[Ne]:{path:b().join("Workspaces",this.workspaceSid,"Workers")},[De]:{path:b().join("Workspaces",this.workspaceSid,"TaskQueues")}}}}class Ue{constructor(e,t,r={}){this._Workers=new Map,this._TaskQueues=new Map,this._routes=new Pe(e),this._request=t,this._log=new d(`WorkspaceEntity-${e}`,r.logLevel),this._pageSize=r.pageSize||h.L8,s().inRange(this._pageSize,1,h.L8+1)||(this._log.warn("PageSize range for WorkspaceEntity must be between 1 and %d. Setting pageSize to default size=%d",h.L8,h.L8),this._pageSize=h.L8)}get Workers(){return this._Workers}get TaskQueues(){return this._TaskQueues}fetchWorker(e){const t=b().join(this._routes.getRoute(Ne).path,e);return this._request.get(t,h.x6).then((e=>new je(new H(e))))}fetchWorkers(e){this._Workers=new Map;const{MaxWorkers:t,...r}=e||{};return this._getAllWorkers(this._getWorkerPage(r),t)}fetchTaskQueue(e){const t=b().join(this._routes.getRoute(De).path,e);return this._request.get(t,h.x6).then((e=>new xe(new Fe(e))))}fetchTaskQueues(e){return this._TaskQueues=new Map,this._getAllTaskQueues(this._getTaskQueuePage(e))}_getAllWorkers(e,t=h.hS){return e.then((async e=>{for(const r of e.items){if(this._Workers.size>=t)break;this._insertWorker(r)}e.hasNextPage&&(this._Workers.size>=t||await this._getAllWorkers(e.nextPage()))}))}_getWorkerPage(e){e=e||{};const t=this._routes.getRoute(Ne).path,r={PageSize:this._pageSize};return["AfterSid","FriendlyName","ActivitySid","ActivityName","Ordering","TargetWorkersExpression","NextToken"].forEach((t=>{e[t]&&(r[t]=e[t])})),this._request.get(t,h.x6,r).then((e=>{const{Ordering:t,...i}=r,s=t?"NextToken":"AfterSid";return new J(e.contents.map((e=>new H(e))),(e=>this._getWorkerPage({...i,Ordering:t,[s]:e})),t?e.meta.next_token:e.after_sid)}))}_insertWorker(e){const t=e.sid;this._log.trace("_insertWorker(sid=%s, data=%s)",t,JSON.stringify(e));try{this._Workers.set(t,new je(e))}catch(e){this._log.error("Unable to create a Worker for sid=%s. Skipping insert into Worker map. Error: %s",t,e)}}async _getAllTaskQueues(e){return e.then((async e=>{e.items.forEach((e=>this._insertTaskQueue(e))),e.hasNextPage&&await this._getAllTaskQueues(e.nextPage())}))}_getTaskQueuePage(e){e=e||{};const t=this._routes.getRoute(De).path,r={PageSize:this._pageSize};return["AfterSid","FriendlyName","Ordering","NextToken"].forEach((t=>{e[t]&&(r[t]=e[t])})),this._request.get(t,h.x6,r).then((e=>{const{Ordering:t,...i}=r,s=t?"NextToken":"AfterSid";return new J(e.contents.map((e=>new Fe(e))),(e=>this._getTaskQueuePage({...i,Ordering:t,[s]:e})),t?e.meta.next_token:e.after_sid)}))}_insertTaskQueue(e){const t=e.sid;this._log.trace("_insertTaskQueue(sid=%s, data=%s",t,JSON.stringify(e));try{this._TaskQueues.set(t,new xe(e))}catch(e){this._log.error("Unable to create a TaskQueue for sid=%s. Skipping insert into TaskQueue map. Error: %s",t,e)}}}const Le=require("jwt-decode");var $e=r.n(Le);const Ie=class{constructor(e,t={},r){this._config=new c(e,t),this._request=new E(this._config),this._logLevel=t.logLevel||"error",this._log=new d(`Workspace-${this._config.getLogIdentifier()}`,this._logLevel),this.shouldDecodeToken=!r,this.workspaceSid=r,this._updateJWTProperties(e),this.workspaceEntity=new Ue(this.workspaceSid,this._request,t)}fetchWorker(e){return this.workspaceEntity.fetchWorker(e)}fetchWorkers(e){return this.workspaceEntity.fetchWorkers(e).then((()=>this.workspaceEntity.Workers))}fetchTaskQueue(e){return this.workspaceEntity.fetchTaskQueue(e)}fetchTaskQueues(e){return this.workspaceEntity.fetchTaskQueues(e).then((()=>this.workspaceEntity.TaskQueues))}updateToken(e){if(!s().isString(e))throw new TypeError("To update the Twilio token, a new Twilio token must be passed in. <string>newToken is a required parameter.");this._config.updateToken(e),this._updateJWTProperties(e)}_updateJWTProperties(e){if(!this.shouldDecodeToken)return;const t=$e()(e);this.jwt=t,this.accountSid=t.sub,this.workspaceSid=t.grants.task_router.workspace_sid,this.workerSid=t.grants.task_router.worker_sid,this.role=t.grants.task_router.role}}},142:(e,t,r)=>{"use strict";r.d(t,{M0:()=>i,in:()=>s,j3:()=>n,hO:()=>o,O:()=>a,iz:()=>d,nB:()=>c,FB:()=>h,Uf:()=>l,iR:()=>u,UA:()=>p,xf:()=>g,EA:()=>_,qG:()=>k,VH:()=>f,Qh:()=>w,Nt:()=>v,L3:()=>m,zb:()=>S,fc:()=>E,PQ:()=>T,_G:()=>y,l4:()=>b,x6:()=>R,F3:()=>W,L8:()=>q,hS:()=>A,jz:()=>O,Iv:()=>C,Gf:()=>F});const i="accepted",s="completed",n="rejected",o="wrapping",a="call",d="dequeue",c="redirect",h="conference",l=Object.freeze({canceled:"canceled",complete:"complete",failed:"failed",initiated:"initiated"}),u={activitySid:"WorkerActivitySid"};Object.freeze(u);const p={rejectPendingReservations:"RejectPendingReservations"};Object.freeze(p);const g={accept:"CallAccept",record:"CallRecord",statusCallbackUrl:"CallStatusCallbackUrl",timeout:"CallTimeout",to:"CallTo"};Object.freeze(g);const _={to:"DequeueTo",from:"DequeueFrom",postWorkActivitySid:"DequeuePostWorkActivitySid",record:"DequeueRecord",timeout:"DequeueTimeout",statusCallbackUrl:"DequeueStatusCallbackUrl",statusCallbackEvents:"DequeueStatusCallbackEvents"};Object.freeze(_);const k={accept:"RedirectAccept"};Object.freeze(k);const f={taskChannelUniqueName:"TaskChannelUniqueName",taskChannelSid:"TaskChannelSid",attributes:"Attributes"},w="completed",v="wrapping";Object.freeze({accepted:0,rejected:1,timeout:2,canceled:3,rescinded:4,completed:5,wrapup:6});const m={"task.updated":"updated","task.canceled":"canceled","task.completed":"completed","task.wrapup":"wrapup"};Object.freeze(m);const S={"reservation.completed":"completed","reservation.rejected":"rejected","reservation.timeout":"timeout","reservation.canceled":"canceled","reservation.rescinded":"rescinded","reservation.accepted":"accepted","reservation.wrapup":"wrapup"};Object.freeze(S);const E=Object.freeze({taskTransfer:"task_transfer",activeOutgoingTaskTransfer:"active_outgoing_task_transfer"}),T="transfer-initiated",y={"transfer-attempt-failed":"attemptFailed","transfer-completed":"completed","transfer-failed":"failed","transfer-initiated":"transferInitiated","transfer-canceled":"canceled"};Object.freeze(y);const b={"task.transfer-attempt-failed":"transfer-attempt-failed","task.transfer-completed":"transfer-completed","task.transfer-failed":"transfer-failed","task.transfer-initiated":"transfer-initiated","task.transfer-canceled":"transfer-canceled"};Object.freeze(b);const R="v1",W="v2",q=1e3,A=1e3,O=5e3,C={TOKEN:"token",CLOSE_EXISTING_SESSIONS:"closeExistingSessions",CLIENT_VERSION:"clientVersion"},x=r(830),F=[{name:"INVALID_ARGUMENT",message:"One or more arguments passed were invalid."},{name:"INVALID_TOKEN",message:"The token is invalid or malformed."},{name:"TOKEN_EXPIRED",message:"Worker's active token has expired."},{name:"GATEWAY_CONNECTION_FAILED",message:"Could not connect to Twilio's servers."},{name:"GATEWAY_DISCONNECTED",message:"Connection to Twilio's servers was lost."},{name:"INVALID_GATEWAY_MESSAGE",message:"The JSON message received was malformed."},{name:"TASKROUTER_ERROR",message:"TaskRouter failed to complete the request."}].reduce(((e,t)=>(e[t.name]=new x(t),e)),{})},813:(e,t)=>{function r(e){if(!(this instanceof r))return new r(e);e=e||{};const t=function(){},i={interval:10,now:function(){return(new Date).getTime()},repeat:function(e,t){return setInterval(e,t)},stop:function(e,t){return clearInterval(e,t)},onsleep:t,onwakeup:t};for(let t in i)t in e||(e[t]=i[t]);this.interval=e.interval,this.lastbeat=0,this.pintvl=null,this.onsleep=e.onsleep,this.onwakeup=e.onwakeup,this.repeat=e.repeat,this.stop=e.stop,this.now=e.now}r.toString=function(){return"[Twilio.Heartbeat class]"},r.prototype.toString=function(){return"[Twilio.Heartbeat instance]"},r.prototype.beat=function(){if(this.lastbeat=this.now(),this.sleeping()){this.onwakeup&&this.onwakeup();var e=this;this.pintvl=this.repeat.call(null,(function(){e.check()}),1e3*this.interval)}},r.prototype.check=function(){const e=this.now()-this.lastbeat;!this.sleeping()&&e>=1e3*this.interval&&(this.onsleep&&this.onsleep(),this.stop.call(null,this.pintvl),this.pintvl=null)},r.prototype.sleeping=function(){return null===this.pintvl},t.y=r},834:(e,t,r)=>{"use strict";function i(e){try{return new Date(e)}catch(e){return null}}function s(e,t){for(const r in e)if(r in t&&!t[r](e[r]))throw new TypeError(`Option key: ${r} does not meet the required type.`);return!0}r.d(t,{T:()=>i,n:()=>s})},830:(e,t,r)=>{function i(e,t){Object.defineProperties(this,{_errorData:{value:e},name:{value:e.name},message:{value:t||e.message}})}(0,r(464).inherits)(i,Error),i.prototype.clone=function(e){return new i(this._errorData,e)},e.exports=i},622:e=>{"use strict";e.exports=require("loglevel")},464:e=>{"use strict";e.exports=require("util")},352:e=>{"use strict";e.exports=require("ws")}},t={};function r(i){var s=t[i];if(void 0!==s)return s.exports;var n=t[i]={exports:{}};return e[i](n,n.exports,r),n.exports}r.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return r.d(t,{a:t}),t},r.d=(e,t)=>{for(var i in t)r.o(t,i)&&!r.o(e,i)&&Object.defineProperty(e,i,{enumerable:!0,get:t[i]})},r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var i=r(266);module.exports=i})();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
/*! twilio-taskrouter.js 0.7.
|
|
1
|
+
/*! twilio-taskrouter.js 0.7.2 */
|
package/dist/index.window.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
/*! For license information please see index.window.js.LICENSE.txt */
|
|
2
|
-
/*! twilio-taskrouter.js 0.7.
|
|
3
|
-
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.TaskRouter=t():e.TaskRouter=t()}(self,(function(){return(()=>{var e={142:(e,t,r)=>{"use strict";r.d(t,{M0:()=>i,in:()=>s,j3:()=>n,hO:()=>o,O:()=>a,iz:()=>d,nB:()=>c,FB:()=>h,Uf:()=>l,iR:()=>u,UA:()=>p,xf:()=>g,EA:()=>_,qG:()=>k,VH:()=>f,Qh:()=>v,Nt:()=>w,L3:()=>m,zb:()=>S,fc:()=>E,PQ:()=>y,_G:()=>T,l4:()=>b,x6:()=>R,F3:()=>W,L8:()=>A,hS:()=>q,jz:()=>C,Iv:()=>O,Gf:()=>j});const i="accepted",s="completed",n="rejected",o="wrapping",a="call",d="dequeue",c="redirect",h="conference",l=Object.freeze({canceled:"canceled",complete:"complete",failed:"failed",initiated:"initiated"}),u={activitySid:"WorkerActivitySid"};Object.freeze(u);const p={rejectPendingReservations:"RejectPendingReservations"};Object.freeze(p);const g={accept:"CallAccept",record:"CallRecord",statusCallbackUrl:"CallStatusCallbackUrl",timeout:"CallTimeout",to:"CallTo"};Object.freeze(g);const _={to:"DequeueTo",from:"DequeueFrom",postWorkActivitySid:"DequeuePostWorkActivitySid",record:"DequeueRecord",timeout:"DequeueTimeout",statusCallbackUrl:"DequeueStatusCallbackUrl",statusCallbackEvents:"DequeueStatusCallbackEvents"};Object.freeze(_);const k={accept:"RedirectAccept"};Object.freeze(k);const f={taskChannelUniqueName:"TaskChannelUniqueName",taskChannelSid:"TaskChannelSid",attributes:"Attributes"},v="completed",w="wrapping";Object.freeze({accepted:0,rejected:1,timeout:2,canceled:3,rescinded:4,completed:5,wrapup:6});const m={"task.updated":"updated","task.canceled":"canceled","task.completed":"completed","task.wrapup":"wrapup"};Object.freeze(m);const S={"reservation.completed":"completed","reservation.rejected":"rejected","reservation.timeout":"timeout","reservation.canceled":"canceled","reservation.rescinded":"rescinded","reservation.accepted":"accepted","reservation.wrapup":"wrapup"};Object.freeze(S);const E=Object.freeze({taskTransfer:"task_transfer",activeOutgoingTaskTransfer:"active_outgoing_task_transfer"}),y="transfer-initiated",T={"transfer-attempt-failed":"attemptFailed","transfer-completed":"completed","transfer-failed":"failed","transfer-initiated":"transferInitiated","transfer-canceled":"canceled"};Object.freeze(T);const b={"task.transfer-attempt-failed":"transfer-attempt-failed","task.transfer-completed":"transfer-completed","task.transfer-failed":"transfer-failed","task.transfer-initiated":"transfer-initiated","task.transfer-canceled":"transfer-canceled"};Object.freeze(b);const R="v1",W="v2",A=1e3,q=1e3,C=5e3,O={TOKEN:"token",CLOSE_EXISTING_SESSIONS:"closeExistingSessions",CLIENT_VERSION:"clientVersion"},x=r(830),j=[{name:"INVALID_ARGUMENT",message:"One or more arguments passed were invalid."},{name:"INVALID_TOKEN",message:"The token is invalid or malformed."},{name:"TOKEN_EXPIRED",message:"Worker's active token has expired."},{name:"GATEWAY_CONNECTION_FAILED",message:"Could not connect to Twilio's servers."},{name:"GATEWAY_DISCONNECTED",message:"Connection to Twilio's servers was lost."},{name:"INVALID_GATEWAY_MESSAGE",message:"The JSON message received was malformed."},{name:"TASKROUTER_ERROR",message:"TaskRouter failed to complete the request."}].reduce(((e,t)=>(e[t.name]=new x(t),e)),{})},813:(e,t)=>{function r(e){if(!(this instanceof r))return new r(e);e=e||{};const t=function(){},i={interval:10,now:function(){return(new Date).getTime()},repeat:function(e,t){return setInterval(e,t)},stop:function(e,t){return clearInterval(e,t)},onsleep:t,onwakeup:t};for(let t in i)t in e||(e[t]=i[t]);this.interval=e.interval,this.lastbeat=0,this.pintvl=null,this.onsleep=e.onsleep,this.onwakeup=e.onwakeup,this.repeat=e.repeat,this.stop=e.stop,this.now=e.now}r.toString=function(){return"[Twilio.Heartbeat class]"},r.prototype.toString=function(){return"[Twilio.Heartbeat instance]"},r.prototype.beat=function(){if(this.lastbeat=this.now(),this.sleeping()){this.onwakeup&&this.onwakeup();var e=this;this.pintvl=this.repeat.call(null,(function(){e.check()}),1e3*this.interval)}},r.prototype.check=function(){const e=this.now()-this.lastbeat;!this.sleeping()&&e>=1e3*this.interval&&(this.onsleep&&this.onsleep(),this.stop.call(null,this.pintvl),this.pintvl=null)},r.prototype.sleeping=function(){return null===this.pintvl},t.y=r},834:(e,t,r)=>{"use strict";function i(e){try{return new Date(e)}catch(e){return null}}function s(e,t){for(const r in e)if(r in t&&!t[r](e[r]))throw new TypeError(`Option key: ${r} does not meet the required type.`);return!0}r.d(t,{T:()=>i,n:()=>s})},830:(e,t,r)=>{function i(e,t){Object.defineProperties(this,{_errorData:{value:e},name:{value:e.name},message:{value:t||e.message}})}(0,r(464).inherits)(i,Error),i.prototype.clone=function(e){return new i(this._errorData,e)},e.exports=i},296:(e,t,r)=>{"use strict";r.r(t),r.d(t,{Supervisor:()=>Ce,TaskRouterEventHandler:()=>be,Worker:()=>qe,Workspace:()=>Ie});const i=require("lodash");var s=r.n(i);const n=r(142).Gf,o=r(622),a=["trace","debug","info","warn","error","silent"];class d{constructor(e,t){if(!e)throw n.INVALID_ARGUMENT.clone("Error instantiating Logger. <string>moduleName is a required parameter.");this._log=o.getLogger(e),a.forEach(function(e){this[e]=(...t)=>this._log[e](this._getTimestamp(),...t)}.bind(this)),t&&this.setLevel(t)}setLevel(e){if(-1===a.indexOf(e))throw n.INVALID_ARGUMENT.clone("Error setting Logger level. <string>level must be one of ['trace', 'debug', 'info', 'warn', 'error', 'silent']");this._log.setLevel(e,!1),this._log.setDefaultLevel(e)}getLevel(){return a[this._log.getLevel()]}_getTimestamp(){return`[${(new Date).toISOString()}]`}}class c{constructor(e,t={}){if(!s().isString(e))throw new TypeError("Failed to initialize Configuration. <string>token is a required parameter.");this.logIdentifier=t.logIdentifier||+new Date,this._logLevel=t.logLevel||"error",this._log=new d(`Configuration-${this.logIdentifier}`,this._logLevel),this.token=e;let r="";t.edge&&(r+=`.${t.edge}`),t.region&&(r+=`.${t.region}`),this.EB_SERVER=`https://event-bridge${r}.twilio.com/v1/wschannels`,this.WS_SERVER=`wss://event-bridge${r}.twilio.com/v1/wschannels`}updateToken(e){if(!s().isString(e))throw new TypeError("To update the Twilio token, a new Twilio token must be passed in. <string>newToken is a required parameter.");this.token=e}getLogIdentifier(){return this.logIdentifier}}var h=r(142);const l=require("events");var u=r(813);const p="0.7.0",g=r.g.window||r.g,_=g.WebSocket?g.WebSocket:r(352),k=p;class f extends l.EventEmitter{constructor(e,t={}){if(super(),!(e&&e instanceof qe))throw h.Gf.INVALID_ARGUMENT.clone("<Worker>worker is a required parameter to construct EventBridgeSignaling.");const r=e.getLogger(`EventBridgeSignaling-${e.sid}`);if(!s().isNil(t.closeExistingSessions)&&!s().isBoolean(t.closeExistingSessions))throw new TypeError("Invalid type passed for <boolean>closeExistingSessions");this._heartbeat=null,this.webSocket=null,this._log=r,this._worker=e,this.closeExistingSessions=t.closeExistingSessions||!1,this._config=e._config,this.reconnect=!1,this.tokenTimer=null,this.setUpWebSocket()}updateToken(e){if(!e)throw h.Gf.INVALID_ARGUMENT.clone("To update the Twilio token, a new Twilio token must be passed in. <string>newToken is a required parameter.");this.setTokenExpirationEvent(),this._log.info("Updated token for Worker "+this._worker.sid),this.reconnect=!0,this.webSocket.readyState!==this.webSocket.CLOSING&&this.webSocket.readyState!==this.webSocket.CLOSED||this.createWebSocket()}setTokenExpirationEvent(){clearTimeout(this.tokenTimer),this.tokenTimer=setTimeout((()=>{this.reconnect=!1,this.emit("tokenExpired")}),this.tokenLifetime-5e3)}setUpWebSocket(){this._heartbeat&&(this._heartbeat.onsleep=()=>{}),this._heartbeat=new u.y({interval:60}),this.createWebSocket()}setLifetime(e){this.tokenLifetime=e,this.setTokenExpirationEvent()}createWebSocket(){this.numAttempts=1,this.reconnect=!0;const e=`?${h.Iv.TOKEN}=${this._config.token}&${h.Iv.CLOSE_EXISTING_SESSIONS}=${this.closeExistingSessions}&${h.Iv.CLIENT_VERSION}=${k}`;this.webSocket=new _(this._config.WS_SERVER+e),this.webSocket.onopen=()=>{this.numAttempts=1,this.emit("connected"),this._heartbeat.onsleep=()=>{this._log.info("Heartbeat not received in the past 60 seconds. Proceeding to disconnect websocket."),this.webSocket.close()},this._heartbeat.beat()},this.webSocket.onmessage=e=>{if(this._log.debug("Received event",e.data),this._heartbeat.beat(),0===e.data.trim().length)return;let t;try{t=JSON.parse(e.data)}catch(t){return this._log.error("Received data is not valid JSON: "+e.data),void this.emit("error",h.Gf.INVALID_GATEWAY_MESSAGE)}this._log.debug("Emitting event: %s with %s",t.event_type,JSON.stringify(t.payload)),this.emit(t.event_type,t.payload||null,t.event_type)},this.webSocket.onerror=e=>{this._log.error("WebSocket error occurred: ",e),this.emit("error",h.Gf.GATEWAY_CONNECTION_FAILED)},this.webSocket.onclose=e=>{this.reconnect?this._log.info("WebSocket connection has closed. Trying to reconnect."):this._log.info("WebSocket connection has closed. Not reconnecting due to token expiration.");let t=e.reason;const r=e.code;if(s().isEmpty(t)&&(t=`Websocket closed with errorCode=${r}`),this.emit("disconnected",{message:t}),this._heartbeat.onsleep=()=>{},this.reconnect){const e=this.generateBackOffInterval(this.numAttempts);setTimeout((()=>{this.numAttempts++,this.createWebSocket()}),e)}}}generateBackOffInterval(e){const t=Math.ceil(800),r=Math.floor(1e3*Math.min(30,Math.pow(2,e)-1));return Math.round(Math.floor(Math.random()*(r-t+1))+t)}disconnect(){this._log.info("Disconnecting websocket"),null!==this.webSocket&&(["onmessage","onclose","onopen","onerror"].forEach((e=>{this.webSocket[e]=null})),this._heartbeat.onsleep=()=>{},this.webSocket.close()),this.emit("disconnected",{message:"SDK Disconnect"})}}const v=require("axios");var w=r(997);const m={GET:"GET",POST:"POST"};Object.freeze(m);const S=p;class E{constructor(e){if(!(e instanceof c))throw new TypeError("Failed to initialize Request. <Configuration>config is a required parameter.");const t=new w.Agent({maxVersion:"TLSv1.2",minVersion:"TLSv1.2"});this._config=e,this._postClient=v.create({method:m.POST,timeout:h.jz,headers:{clientVersion:S},httpsAgent:t})}post(e,t,r,i){if(!e)throw new Error("Failed to make POST request. <string>url is a required parameter.");if(!s().isObject(t))throw new Error("Failed to make POST request. <object>paramsJSON is a required parameter.");if(!r)throw new Error("Failed to make POST request. <string>apiVersion is a required parameter.");const n=this.buildRequest(m.POST,e,t);let o={apiVersion:r};return this._postClient.post(this._config.EB_SERVER,n,{headers:o}).then((e=>Promise.resolve(e.data.payload)))}get(e,t,r){if(!e)throw new Error("Failed to make GET request. <string>url is a required parameter.");if(!t)throw new Error("Failed to make GET request. <string>apiVersion is a required parameter.");if(r=r||{},!s().isObject(r))throw new Error("Failed to make GET request. <object>paramsJSON is a required parameter.");const i=this.buildRequest(m.GET,e,r);return this._postClient.post(this._config.EB_SERVER,i,{headers:{apiVersion:t}}).then((e=>Promise.resolve(e.data.payload)))}buildRequest(e,t,r){return JSON.stringify({url:t,method:e,params:r,token:this._config.token})}}class y{constructor(){this.routes={}}getRoute(e,...t){if(!this.routes[e])throw h.Gf.INVALID_ARGUMENT.clone(`Invalid route fetched <string>route "${e}" does not exist.`);if(t.length){let r=Object.assign({},this.routes[e]);if(t.length!==(r.path.match(/%s/g)||[]).length)throw h.Gf.INVALID_ARGUMENT.clone(`Invalid number of positional arguments supplied for route ${e}`);for(let e of t)r.path=r.path.replace(/%s/,e);return r}return this.routes[e]}}var T=r(470),b=r.n(T);const R=r(142).Gf,W="reservationList",A="reservationInstance",q="workerInstance",C="taskReservationInstance",O="taskList",x="taskInstance",j="taskTransferList",F="taskTransferInstance",N="workerChannels",D="activitiesList",P="customerParticipantInstance",U="workerParticipantInstance",L="holdWorkerParticipantInstance",$="kickWorkerParticipant";class I extends y{constructor(e,t){if(super(),!e||!t)throw R.INVALID_ARGUMENT.clone("Error instantiating Routes class. <string>workspaceSid and <string>workerSid are required parameters.");this.workspaceSid=e,this.workerSid=t,this.routes={[D]:{path:b().join("Workspaces",this.workspaceSid,"Activities")},[q]:{path:b().join("Workspaces",this.workspaceSid,"Workers",this.workerSid)},[A]:{path:b().join("Workspaces",this.workspaceSid,"Workers",this.workerSid,"Reservations","%s")},[W]:{path:b().join("Workspaces",this.workspaceSid,"Workers",this.workerSid,"Reservations")},[O]:{path:b().join("Workspaces",this.workspaceSid,"Tasks")},[x]:{path:b().join("Workspaces",this.workspaceSid,"Tasks","%s")},[j]:{path:b().join("Workspaces",this.workspaceSid,"Workers",this.workerSid,"Transfers")},[F]:{path:b().join("Workspaces",this.workspaceSid,"Workers",this.workerSid,"Transfers","%s")},[C]:{path:b().join("Workspaces",this.workspaceSid,"Tasks","%s","Reservations","%s")},[N]:{path:b().join("Workspaces",this.workspaceSid,"Workers",this.workerSid,"WorkerChannels")},[P]:{path:b().join("Workspaces",this.workspaceSid,"Workers",this.workerSid,"CustomerParticipant")},[U]:{path:b().join("Workspaces",this.workspaceSid,"Workers",this.workerSid,"WorkerParticipant")},[L]:{path:b().join("Workspaces",this.workspaceSid,"Workers",this.workerSid,"HoldWorkerParticipant")},[$]:{path:b().join("Workspaces",this.workspaceSid,"Workers",this.workerSid,"KickWorkerParticipant")}}}}var z=r(834);class H{constructor(e){if(!s().isObject(e))throw new TypeError("Failed to create a WorkerDescriptor. <Descriptor>descriptor is a required parameter.");if(!Ae.every((t=>t in e)))throw new TypeError("Failed to create a WorkerDescriptor. The provided <Descriptor>descriptor does not contain all properties of a Worker.");this.accountSid=e.account_sid,this.activityName=e.activity_name,this.activitySid=e.activity_sid,this.attributes=JSON.parse(e.attributes),this.available=e.available,this.dateCreated=(0,z.T)(1e3*e.date_created),this.dateStatusChanged=(0,z.T)(1e3*e.date_status_changed),this.dateUpdated=(0,z.T)(1e3*e.date_updated),this.name=e.friendly_name,this.sid=e.sid,this.workspaceSid=e.workspace_sid,this.version=String(e.version),this.workerSid=e.sid,this.workerActivitySid=e.activity_sid,this.dateActivityChanged=(0,z.T)(1e3*e.date_status_changed),this.friendlyName=e.friendly_name}}class M{constructor(e){if(!s().isObject(e))throw new TypeError("Failed to instantiate ActivityDescriptor. <Descriptor>descriptor is required.");if(!B.every((t=>t in e)))throw new TypeError("Failed to instantiate ActivityDescriptor. <Descriptor>descriptor does not contain all properties of an Activity.");this.accountSid=e.account_sid,this.available=e.available,this.dateCreated=(0,z.T)(1e3*e.date_created),this.dateUpdated=(0,z.T)(1e3*e.date_updated),this.name=e.friendly_name,this.sid=e.sid,this.workspaceSid=e.workspace_sid}}const G=r(834).n;const B=["account_sid","available","date_created","date_updated","friendly_name","sid","workspace_sid"],Q=class{constructor(e,t){if(!s().isObject(e))throw new TypeError("Failed to create an Activity. <Worker>worker is a required parameter.");if(!(t instanceof M))throw new TypeError("Failed to create an Activity. <ActivityDescriptor>descriptor is a required parameter.");Object.assign(this,t),this._worker=e,this._isCurrent=!1}get isCurrent(){return this._isCurrent}setAsCurrent(e={}){if(!G(e,{rejectPendingReservations:e=>s().isBoolean(e)}))throw new TypeError(`Failed to set activity=${this.sid}. The options passed in did not match the required types.`);if(e.rejectPendingReservations&&this.available)throw new Error("Unable to reject pending reservations when updating to an Available activity state.");return this._worker._updateWorkerActivity(this.sid,e).then((()=>this))}},V=r(142).Gf;class J{constructor(e,t,r){if(!e)throw V.INVALID_ARGUMENT.clone("Error instantiating Paginator. <Array>items is a required parameter.");if(!t)throw V.INVALID_ARGUMENT.clone("Error instantiating Paginator. <Function>source is a required parameter.");this._nextToken=r,this._source=t,this.hasNextPage=!!this._nextToken,this.items=e}nextPage(){return this.hasNextPage?this._source(this._nextToken):Promise.reject(V.TASKROUTER_ERROR.clone("Error getting the next page. No next page exists."))}}class K{constructor(e,t,r={}){if(!s().isObject(e))throw new TypeError("Failed to initialize ActivitiesEntity. <Worker>worker is a required parameter.");this._activities=new Map,this._log=e.getLogger(`ActivitiesEntity-${e.sid}`),this._request=t,this._worker=e,this._pageSize=r.pageSize||h.L8,s().inRange(this._pageSize,1,h.L8+1)||(this._log.warn("PageSize range for ActivitiesEntity must be between 1 and %d. Setting pageSize to default size=%d",h.L8,h.L8),this._pageSize=1e3)}get activities(){return this._activities}fetchActivities(){const e=this._getPage();return this._getAllActivities(e)}_getAllActivities(e){return e.then((e=>(e.items.forEach((e=>{this._insertActivity(e)})),e.hasNextPage?this._getAllActivities(e.nextPage()):Promise.resolve())))}_getPage(e){e=e||{};const t=this._worker.getRoutes().getRoute(D).path,r={PageSize:this._pageSize};return e.AfterSid&&(r.AfterSid=e.AfterSid),this._request.get(t,h.x6,r).then((e=>new J(e.contents.map((e=>new M(e))),(e=>this._getPage({AfterSid:e})),e.after_sid)))}_insertActivity(e){const t=e.sid;this._log.trace(`_insertActivity(sid=${t}, data=${JSON.stringify(e)}`);try{const r=new Q(this._worker,e);this._activities.set(t,r)}catch(e){this._log.error(`Unable to create an Activity for sid=${t}. Skipping insert into Activities map. Error: ${e}`)}}}class Y{constructor(e){if(!s().isObject(e))throw new TypeError("Failed to instantiate WorkerChannelDescriptor. <Descriptor>descriptor is required.");if(!ee.every((t=>t in e)))throw new TypeError("Failed to create a WorkerChannelDescriptor. <Descriptor>descriptor does not contain all properties of a Channel.");this.accountSid=e.account_sid,this.assignedTasks=e.assigned_tasks,this.available=!!e.available,this.availableCapacityPercentage=e.available_capacity_percentage,this.capacity=e.configured_capacity,this.dateCreated=(0,z.T)(1e3*e.date_created),this.dateUpdated=(0,z.T)(1e3*e.date_updated),this.lastReservedTime=(0,z.T)(e.last_reserved_time),this.sid=e.sid,this.taskChannelSid=e.task_channel_sid,this.taskChannelUniqueName=e.task_channel_unique_name,this.workerSid=e.worker_sid,this.workspaceSid=e.workspace_sid}}const X=["capacity","available","assignedTasks","availableCapacityPercentage","dateUpdated","lastReservedTime"];class Z extends l.EventEmitter{constructor(e,t,r){if(super(),!(e instanceof qe))throw new TypeError("Failed to instantiate Worker. <Worker>worker is a required parameter.");if(!(r instanceof Y))throw new TypeError("Failed to instantiate Channel. <WorkerChannelDescriptor>descriptor is a required parameter.");this._request=t,this._log=e.getLogger(`Channel-${r.sid}`),Object.assign(this,r)}_emitEvent(e,t){if(!s().isString(e))throw new TypeError("Error calling _emitEvent(). <string>eventType is a required parameter.");if(!s().isObject(t))throw new TypeError("Error calling method _emitEvent(). <object>rawEventData is a required parameter.");this._update(t),this.emit(e,this)}_update(e){try{const t=new Y(e);X.forEach((e=>{this[e]=t[e]}))}catch(t){this._log.warn("Failed to update Channel sid=%s. Update aborted. Error: %s.",e.sid,t)}return this}}const ee=["account_sid","assigned_tasks","available","available_capacity_percentage","configured_capacity","date_created","date_updated","last_reserved_time","sid","task_channel_sid","task_channel_unique_name","worker_sid","workspace_sid"],te=Z;class re{constructor(e,t,r={}){if(!(e instanceof qe))throw new TypeError("Failed to initialize ChannelsEntity. <Worker>worker is a required parameter.");this._channels=new Map,this._log=e.getLogger("ChannelsEntity"),this._request=t,this._pageSize=r.pageSize||h.L8,this._worker=e,s().inRange(this._pageSize,1,h.L8+1)||(this._log.warn("PageSize range for ChannelsEntity must be between 1 and %d. Setting pageSize to default size=%d",h.L8,h.L8),this._pageSize=1e3)}get channels(){return this._channels}fetchChannels(){const e=this._getPage();return this._getAllChannels(e)}_getAllChannels(e){return e.then((e=>(e.items.forEach((e=>{this._insertChannel(e)})),e.hasNextPage?this._getAllChannels(e.nextPage()):Promise.resolve())))}_getPage(e){e=e||{};const t=this._worker.getRoutes().getRoute(N).path,r={PageSize:this._pageSize};return e.AfterSid&&(r.AfterSid=e.AfterSid),this._request.get(t,h.x6,r).then((e=>new J(e.contents.map((e=>new Y(e))),(e=>this._getPage({AfterSid:e})),e.after_sid)))}_insertChannel(e){const t=e.sid;this._log.trace(`_insertChannel(sid=${t}, data=${JSON.stringify(e)}`);try{const r=new te(this._worker,this._request,e);this._channels.set(t,r)}catch(e){this._log.error(`Unable to create a Channel for sid=${t}. Skipping insert into Channels map. Error: ${e}`)}}}class ie{constructor(e){if(!s().isObject(e))throw new TypeError("Failed to instantiate TransferDescriptor. <Descriptor>descriptor is required.");if(!oe.every((t=>t in e)))throw new TypeError("Failed to instantiate TransferDescriptor. <Descriptor>descriptor does not contain all properties of a Transfer.");this.dateCreated=(0,z.T)(1e3*e.date_created),this.dateUpdated=(0,z.T)(1e3*e.date_updated),this.mode=e.transfer_mode,this.queueSid=e.initiating_queue_sid,this.reservationSid=e.initiating_reservation_sid,this.to=e.transfer_to,this.transferFailedReason=e.transfer_failed_reason,this.type=e.transfer_type,this.sid=e.sid,this.status=e.transfer_status,this.workerSid=e.initiating_worker_sid,this.workflowSid=e.initiating_workflow_sid}}const se=["dateUpdated","status","transferFailedReason"];class ne extends l.EventEmitter{constructor(e,t){if(super(),!(t instanceof ie))throw new TypeError("Failed to instantiate Transfer. <TransferDescriptor>descriptor is a required parameter.");this._log=e.getLogger(`Transfer-${t.sid}`),Object.assign(this,t)}_update(e){try{const t=new ie(e);se.forEach((e=>{this[e]=t[e]}))}catch(t){throw this._log.error(`Failed to update Transfer sid=${e.sid}. Update aborted.`,t),new Error(`Failed to update Transfer sid=${e.sid}. Update aborted. Error: ${t}.`)}return this}}const oe=["date_created","date_updated","initiating_reservation_sid","initiating_worker_sid","initiating_queue_sid","initiating_workflow_sid","sid","transfer_mode","transfer_to","transfer_type","transfer_status"],ae=ne;const de=class extends ae{constructor(e,t){super(e,t)}};const ce=class extends ae{constructor(e,t,r,i){if(super(e,i),"string"!=typeof r)throw new TypeError("Failed to instantiate OutgoingTransfer. <string>taskSid is a required parameter.");this._worker=e,this._request=t,this.taskSid=r}_emitEvent(e,t){if(this._log.trace(`_emitEvent(${e}, ${JSON.stringify(t)})`),!s().isString(e))throw new TypeError("Error calling _emitEvent(). <string>eventType is a required parameter.");if(!s().isObject(t))throw new TypeError("Error calling method _emitEvent(). <object>payload is a required parameter.");this.emit(e,this)}async cancel(){const e=this._worker.getRoutes().getRoute(F,this.sid).path,t={TaskSid:this.taskSid,TransferStatus:h.Uf.canceled},r=await this._request.post(e,t,h.F3);return this._update(r)}};class he extends l.EventEmitter{constructor(e,t,r){if(super(),!(r instanceof ke))throw new TypeError("Failed to instantiate Transfers. <TaskDescriptor>taskDescriptor is a required parameter.");this._log=e.getLogger(`Transfers-${r.sid}`),this._worker=e,this._request=t,this.incoming=r.incomingTransferDescriptor?new de(e,r.incomingTransferDescriptor):null,this.outgoing=r.outgoingTransferDescriptor?new ce(e,t,r.sid,r.outgoingTransferDescriptor):null}_emitEvent(e,t){if(this._log.trace(`_emitEvent(${e}, ${JSON.stringify(t)})`),!s().isString(e))throw new TypeError("Error calling _emitEvent(). <string>eventType is a required parameter.");if(!s().isObject(t))throw new TypeError("Error calling method _emitEvent(). <object>payload is a required parameter.");const r=h._G[e];this.outgoing?this.outgoing.sid===t.sid?Object.keys(s().pick(h._G,["transfer-attempt-failed","transfer-completed","transfer-failed","transfer-canceled"])).indexOf(e)>-1&&(this._updateOutgoing(t),this.outgoing._emitEvent(r,t)):this._log.warn("The transfer %s specified by Event: transfer.%s does not match the current active outgoing transfer for Worker %s. Skipping event.",t.sid,r,this._worker.sid):this._log.warn("An active outgoing transfer does currently exist in Worker %s transfers map for Event: transfer.%s. Skipping event.",this._worker.sid,r)}_updateOutgoing(e,t=!1){!this.outgoing||t?this.outgoing=new ce(this._worker,this._request,e.task_sid,new ie(e)):this.outgoing._update(e)}_update(e){if(e.incoming)if(this.incoming)this.incoming._update(e.incoming);else{const t=new ie(e.incoming);this.incoming=new de(this._worker,this._request,e.incoming.task_sid,t)}if(e.outgoing)if(this.outgoing)this.outgoing._update(e.outgoing);else{const t=new ie(e.outgoing);this.outgoing=new ce(this._worker,this._request,e.outgoing.task_sid,t)}}}const le=he,ue=["attributes","status","workflowSid","workflowName","queueSid","queueName","priority","reason","routingTarget","timeout","taskChannelSid","taskChannelUniqueName","age","addOns","dateUpdated","transfers","version"];class pe extends l.EventEmitter{constructor(e,t,r,i){if(super(),!(e instanceof qe))throw new TypeError("Failed to instantiate Task. <Worker>worker is a required parameter.");if(!i)throw new TypeError("Failed to instantiate Task. <TaskDescriptor>descriptor is a required parameter.");if(!(i instanceof ke))throw new TypeError("descriptor should be of type <TaskDescriptor>");if("string"!=typeof r)throw new TypeError("Failed to instantiate Task. <string>reservationSid is a required parameter.");this._worker=e,this._log=e.getLogger(`Task-${i.sid}`),this._request=t,this.transfers=new le(e,t,i),Object.assign(this,i),this.reservationSid=r}complete(e){if(!s().isString(e))throw new TypeError("Error calling method complete(). <string>reason is a required parameter.");const t=this._worker.getRoutes().getRoute(x,this.sid).path,r={AssignmentStatus:h.Qh,Reason:e};return this._request.post(t,r,h.x6,this.version).then((e=>this._update(e)))}async transfer(e,t={}){if(!s().isString(e))throw new TypeError("Error calling method transfer(). <string>to is a required parameter.");const r=this._worker.getRoutes().getRoute(j).path,i={ReservationSid:this.reservationSid,TaskSid:this.sid,To:e};t.attributes&&(i.Attributes=t.attributes),t.mode&&(i.Mode=t.mode),t.priority&&(i.Priority=t.priority);const n=await this._request.post(r,i,h.F3);return this._log.info(`Received response to transfer request to Worker/TaskQueue=${e}`),this._log.debug("Response object",n),this.transfers._updateOutgoing(n,!0),this}wrapUp(e={}){const t=this._worker.getRoutes().getRoute(x,this.sid).path,r={AssignmentStatus:h.Nt};if(e.reason){if(!s().isString(e.reason))throw new Error(`Failed to call wrapUp() on Task sid=${this.sid}. A <string>reason is required.`);r.Reason=e.reason}return this._request.post(t,r,h.x6,this.version).then((e=>this._update(e)))}setAttributes(e){if(!s().isObject(e))throw new TypeError("Unable to set attributes on Task. <object>attributes is a required parameter.");const t=this._worker.getRoutes().getRoute(x,this.sid).path,r={Attributes:e};return this._request.post(t,r,h.x6,this.version).then((e=>this._update(e)))}updateParticipant(e){const t={hold:e=>s().isBoolean(e),holdUrl:e=>s().isString(e),holdMethod:e=>s().isString(e)};if(!(0,z.n)(e,t))throw new TypeError(`Failed to update Participant tied to Task sid=${this.sid}. The options passed in did not match the required types.`);const r=this._worker.getRoutes().getRoute(P).path,i={TaskSid:this.sid};for(const t in e)i[s().upperFirst(t)]=e[t];return this._request.post(r,i,h.F3).then((e=>this._update(e)))}kick(e){if(!s().isString(e))throw new TypeError("Error calling method kick(). <string>workerSid is a required parameter.");const t=this._worker.getRoutes().getRoute($).path,r={TaskSid:this.sid,TargetWorkerSid:e};return this._request.post(t,r,h.F3).then((e=>this._update(e)))}hold(e,t,r){const i={holdUrl:e=>s().isString(e),holdMethod:e=>s().isString(e)};if(!s().isString(e))throw new TypeError("Error calling method hold(). <string>targetWorkerSid is a required parameter.");if(!s().isBoolean(t))throw new TypeError("Error calling method hold(). <boolean>onHold is a required parameter that is either true or false.");if(!(0,z.n)(r,i))throw new TypeError(`Failed to update Participant tied to Task sid=${this.sid}. The options passed in did not match the required types.`);const n=this._worker.getRoutes().getRoute(L).path,o={TaskSid:this.sid,TargetWorkerSid:e,Hold:t};for(const e in r)o[s().upperFirst(e)]=r[e];return this._request.post(n,o,h.F3).then((e=>this._update(e)))}fetchLatestVersion(){const e=this._worker.getRoutes().getRoute(x,this.sid).path;return this._request.get(e,h.x6).then((e=>this._update(e)))}_emitEvent(e,t){if(this._log.trace(`_emitEvent(${e}, ${JSON.stringify(t)})`),!s().isString(e))throw new TypeError("Error calling _emitEvent(). <string>eventType is a required parameter.");if(!s().isObject(t))throw new TypeError("Error calling method _emitEvent(). <object>payload is a required parameter.");this.emit(e,this,t)}async _emitEventForOutgoingTransfer(e,t){if(this._log.debug(`_emitEventForOutgoingTransfer(${e}, ${JSON.stringify(t)})`),!s().isString(e))throw new TypeError("Error calling _emitEventForOutgoingTransfer(). <string>eventType is a required parameter.");if(!s().isObject(t))throw new TypeError("Error calling method _emitEventForOutgoingTransfer(). <object>payload is a required parameter.");this.transfers.outgoing||this._log.debug("The transfers.outgoing object is NOT present");let r=0;for(;!this.transfers.outgoing&&r<20;)await new Promise((e=>setTimeout(e,500))),r++,this._log.debug("Transfer event arrived, waiting for API response, because transfer object missing",r);for(r=0;this.transfers.outgoing&&this.transfers.outgoing.sid!==t.sid&&r<20;)await new Promise((e=>setTimeout(e,500))),r++,this._log.debug("Transfer event arrived, waiting for API response to get the correct transfer SID",r);this._log.debug("Transfer sid from API response:",this.transfers&&this.transfers.outgoing?this.transfers.outgoing.sid:"No sid"),this._log.debug("Transfer sid from event:",t.sid),this.transfers.outgoing&&this.transfers.outgoing.sid===t.sid?Object.keys(s().pick(h._G,[h.PQ])).indexOf(e)>-1?(this.transfers._updateOutgoing(t),this.emit(h._G[h.PQ],this.transfers.outgoing)):this.transfers._emitEvent(e,t):this._log.debug(`The transfers.outgoing object is either not present or does not match the transfer sid in the event. ${JSON.stringify(t)}`)}_update(e,t={}){try{const r=new ke(e,this._config);ue.forEach((e=>{"transfers"===e?(t.incoming||t.outgoing)&&this.transfers._update(t):this[e]=r[e]}))}catch(t){throw this._log.error(`Failed to update Task sid=${e.sid}. Update aborted.`,t),new Error(`Failed to update Task sid=${e.sid}. Update aborted. Error: ${t}.`)}return this}}const ge=["addons","age","attributes","date_created","date_updated","priority","queue_name","queue_sid","reason","routing_target","sid","assignment_status","task_channel_unique_name","task_channel_sid","timeout","workflow_name","workflow_sid","version"],_e=pe;class ke{constructor(e){if(!s().isObject(e))throw new TypeError("Failed to instantiate TaskDescriptor. <Descriptor>descriptor is required.");if(!ge.every((t=>t in e)))throw new TypeError("Failed to instantiate TaskDescriptor. <Descriptor>descriptor does not contain all properties of a Task.");this.addOns=JSON.parse(e.addons),this.age=e.age,this.attributes=JSON.parse(e.attributes),this.dateCreated=(0,z.T)(1e3*e.date_created),this.dateUpdated=(0,z.T)(1e3*e.date_updated),this.priority=e.priority,this.queueName=e.queue_name,this.queueSid=e.queue_sid,this.reason=e.reason,this.routingTarget=e.routing_target,this.sid=e.sid,this.status=e.assignment_status,this.taskChannelUniqueName=e.task_channel_unique_name,this.taskChannelSid=e.task_channel_sid,this.timeout=e.timeout,this.workflowName=e.workflow_name,this.workflowSid=e.workflow_sid,this.incomingTransferDescriptor=null,this.outgoingTransferDescriptor=null,this.version=String(e.version)}}class fe{constructor(e,t,r=[]){if(!s().isObject(e))throw new TypeError("Failed to instantiate ReservationDescriptor. <Descriptor>descriptor is required.");if(!s().isObject(t))throw new TypeError("Failed to instantiate ReservationDescriptor. <Worker>worker is required.");const i=s().filter(Ee,(e=>-1===r.indexOf(e)));if(!s().every(i,(t=>t in e))){const t=s().difference(i,Object.keys(e)).join(", ");throw new TypeError(`Failed to instantiate ReservationDescriptor. <Descriptor>descriptor does not contain all properties of a Reservation. Missing: ${t}`)}this.accountSid=e.account_sid,this.dateCreated=(0,z.T)(1e3*e.date_created),this.dateUpdated=(0,z.T)(1e3*e.date_updated),this.sid=e.sid,this.status=e.reservation_status,this.timeout=e.reservation_timeout,this.workerSid=e.worker_sid,this.workspaceSid=e.workspace_sid,this.taskDescriptor=null,this.version=String(e.version),e.canceled_reason_code&&(this.canceledReasonCode=e.canceled_reason_code);const n=t.getLogger(`ReservationDescriptor-${this.sid}`);if(-1===r.indexOf("task"))try{this.taskDescriptor=new ke(e.task)}catch(e){throw n.error("Failed to create a ReservationDescriptor. The 'task' property is malformed."),e}if(-1===r.indexOf(h.fc.taskTransfer)&&"object"==typeof e.task_transfer)try{this.taskDescriptor.incomingTransferDescriptor=new ie(e.task_transfer),this.transferDescriptor=new ie(e.task_transfer)}catch(e){throw n.error("Failed to create a ReservationDescriptor. The 'task_transfer' property is malformed."),e}if(-1===r.indexOf(h.fc.activeOutgoingTaskTransfer)&&"object"==typeof e.active_outgoing_task_transfer)try{this.taskDescriptor.outgoingTransferDescriptor=new ie(e.active_outgoing_task_transfer)}catch(e){throw n.error("Failed to create a ReservationDescriptor. The 'active_outgoing_task_transfer' property is malformed."),e}}}const ve=r(834).n,we=["dateUpdated","canceledReasonCode","status","timeout","task","task_transfer","version"],me=["reservation_timeout","task","canceled_reason_code"];class Se extends l.EventEmitter{constructor(e,t,r){if(super(),!(e instanceof qe))throw new TypeError("Failed to instantiate Reservation. <Worker>worker is a required parameter.");if(!(r instanceof fe))throw new TypeError("Failed to instantiate Reservation. <ReservationDescriptor>descriptor is a required parameter.");this._worker=e,this._log=e.getLogger(`Reservation-${r.sid}`),this._request=t,this.task=this._createTask(r),r.transferDescriptor&&(this.transfer=this._createTransfer(r)),Object.assign(this,r),delete this.taskDescriptor,delete this.transferDescriptor}accept(){const e=this._worker.getRoutes().getRoute(A,this.sid).path,t={ReservationStatus:h.M0};return this._request.post(e,t,h.x6,this.version).then((e=>this._update(e,me)))}complete(){const e=this._worker.getRoutes().getRoute(A,this.sid).path,t={ReservationStatus:h.in};return this._request.post(e,t,h.x6,this.version).then((e=>this._update(e,me)))}reject(e={}){const t=this._worker.getRoutes().getRoute(A,this.sid).path,r={ReservationStatus:h.j3};if(!ve(e,{activitySid:e=>s().isString(e)}))throw new TypeError(`Failed to issue Instruction:reject on Reservation sid=${this.sid}. The options passed in did not match the required types.`);for(const t in e)r[h.iR[t]]=e[t];return this._request.post(t,r,h.x6,this.version).then((e=>this._update(e,me)))}wrap(){const e=this._worker.getRoutes().getRoute(A,this.sid).path,t={ReservationStatus:h.hO};return this._request.post(e,t,h.x6,this.version).then((e=>this._update(e,me)))}call(e,t,r={}){if(!s().isString(e))throw new TypeError("Error calling method call(). <string>from is a required parameter.");if(!s().isString(t))throw new TypeError("Error calling method call(). <string>url is a required parameter.");const i=this._worker.getRoutes().getRoute(A,this.sid).path,n={Instruction:h.O,CallFrom:e,CallUrl:t};if(!ve(r,{accept:e=>s().isBoolean(e),record:e=>s().isString(e),statusCallbackUrl:e=>s().isString(e),timeout:e=>s().isInteger(e),to:e=>s().isString(e)}))throw new TypeError(`Failed to issue Instruction:call on Reservation sid=${this.sid}. The options passed in did not match the required types.`);for(const e in r)n[h.xf[e]]=r[e];return this._request.post(i,n,h.x6).then((e=>this._update(e,me)))}dequeue(e={}){const t=this._worker.getRoutes().getRoute(A,this.sid).path,r={Instruction:h.iz};if(!ve(e,{from:e=>s().isString(e),to:e=>s().isString(e),postWorkActivitySid:e=>s().isString(e),record:e=>s().isString(e),timeout:e=>s().isInteger(e),statusCallbackUrl:e=>s().isString(e),statusCallbackEvents:e=>s().isString(e)}))throw new TypeError(`Failed to issue Instruction:dequeue on Reservation sid=${this.sid}. The options passed in did not match the required types.`);for(const t in e)r[h.EA[t]]=e[t];return this._request.post(t,r,h.x6).then((e=>this._update(e,me)))}redirect(e,t,r={}){if(!s().isString(e))throw new TypeError("Error calling method redirect(). <string>callSid is a required parameter.");if(!s().isString(t))throw new TypeError("Error calling method redirect(). <string>url is a required parameter.");const i=this._worker.getRoutes().getRoute(A,this.sid).path,n={accept:e=>s().isBoolean(e)},o={Instruction:h.nB,RedirectCallSid:e,RedirectUrl:t};if(!ve(r,n))throw new TypeError(`Failed to issue Instruction:redirect on Reservation sid=${this.sid}. The options passed in did not match the required types.`);for(const e in r)o[h.qG[e]]=r[e];return this._request.post(i,o,h.x6).then((e=>this._update(e,me)))}conference(e={}){if(!ve(e,{to:e=>s().isString(e),from:e=>s().isString(e),timeout:e=>s().isInteger(e),statusCallback:e=>s().isString(e),statusCallbackMethod:e=>s().isString(e),statusCallbackEvent:e=>s().isString(e),record:e=>s().isString(e),muted:e=>s().isBoolean(e),beep:e=>s().isBoolean(e)||s().isString(e),startConferenceOnEnter:e=>s().isBoolean(e),endConferenceOnExit:e=>s().isBoolean(e),endConferenceOnCustomerExit:e=>s().isBoolean(e),waitUrl:e=>s().isString(e),waitMethod:e=>s().isString(e),earlyMedia:e=>s().isBoolean(e),maxParticipants:e=>s().isInteger(e),conferenceStatusCallback:e=>s().isString(e),conferenceStatusCallbackMethod:e=>s().isString(e),conferenceStatusCallbackEvent:e=>s().isString(e),conferenceRecord:e=>s().isBoolean(e)||s().isString(e),conferenceTrim:e=>s().isString(e),recordingChannels:e=>s().isString(e),recordingStatusCallback:e=>s().isString(e),recordingStatusCallbackMethod:e=>s().isString(e),conferenceRecordingStatusCallback:e=>s().isString(e),conferenceRecordingStatusCallbackMethod:e=>s().isString(e),region:e=>s().isString(e),sipAuthUsername:e=>s().isString(e),sipAuthPassword:e=>s().isString(e)}))throw new TypeError(`Failed to issue Instruction:conference on Reservation sid=${this.sid}. The options passed in did not match the required types.`);const t=this._worker.getRoutes().getRoute(A,this.sid).path,r={Instruction:h.FB};for(const t in e)r[s().upperFirst(t)]=e[t];return this._request.post(t,r,h.x6).then((()=>this))}updateParticipant(e){if(!ve(e,{endConferenceOnExit:e=>s().isBoolean(e),mute:e=>s().isBoolean(e),beepOnExit:e=>s().isBoolean(e)}))throw new TypeError(`Failed to update Worker Participant tied to Reservation sid=${this.sid}. The options passed in did not match the required types.`);const t=this._worker.getRoutes().getRoute(U).path,r={ReservationSid:this.sid};for(const t in e)r[s().upperFirst(t)]=e[t];return this._request.post(t,r,h.F3).then((()=>this))}fetchLatestVersion(){const e=this._worker.getRoutes().getRoute(A,this.sid).path;return this._request.get(e,h.x6).then((e=>this._update(e)))}_createTask(e){if(!(e instanceof fe))return this._log.error(`Error calling method _createTask() for Reservation sid=${this.sid}. <ReservationDescriptor>reservationDescriptor is a required parameter.`),{};const t=e.taskDescriptor;try{return new _e(this._worker,this._request,e.sid,t)}catch(e){return this._log.error(`Failed to create a Task for Reservation sid=${this.sid}. Error: ${e}`),{}}}_createTransfer(e){if(!(e instanceof fe))return this._log.error(`Error calling method _createTransfer() for Reservation sid=${this.sid}. <ReservationDescriptor>reservationDescriptor is a required parameter.`),{};const t=e.transferDescriptor;try{return new de(this._worker,t)}catch(e){return this._log.error(`Failed to create a Transfer for Reservation sid=${this.sid}. Error: ${e}`),{}}}_update(e,t=[]){try{const r=new fe(e,this._worker,t);we.forEach((i=>{if("task"===i){if(-1===t.indexOf("task")){const t=e.task_transfer,r=e.active_outgoing_task_transfer;this.task._update(e.task,{incoming:t,outgoing:r})}}else"canceledReasonCode"===i?-1===t.indexOf("canceled_reason_code")&&e.canceled_reason_code&&(this[i]=r[i]):"task_transfer"===i&&e.task_transfer?this.transfer._update(e.task_transfer):this[i]=r[i]}))}catch(t){throw this._log.error(`Failed to update Reservation sid=${e.sid}. Update aborted. Error: ${t}.`),t}return this}_emitEvent(e,t){if(!s().isString(e))throw new TypeError("Error calling _emitEvent(). <string>eventType is a required parameter.");if(!s().isObject(t))throw new TypeError("Error calling method _emitEvent(). <object>rawEventData is a required parameter.");this._update(t),this.emit(e,this)}}const Ee=["account_sid","date_created","date_updated","reservation_status","sid","task","reservation_timeout","worker_sid","workspace_sid","version"],ye=Se;class Te extends l.EventEmitter{constructor(e,t,r={}){if(super(),!(e instanceof qe))throw new TypeError("Failed to initialize ReservationsEntity. <Worker>worker is a required parameter.");this._worker=e,this._log=e.getLogger("ReservationsEntity"),this._request=t,this._reservations=new Map,this._reservationSidsByTask=new Map,this._pageSize=r.pageSize||h.L8,s().inRange(this._pageSize,1,h.L8+1)||(this._log.warn("PageSize range for ReservationsEntity must be between 1 and %d. Setting pageSize to default size=%d",h.L8,h.L8),this._pageSize=1e3)}get reservations(){return new Map(Array.from(this._reservations).filter((e=>!e[1][1])).map((e=>[e[0],e[1][0]])))}fetchReservations(){const e=this._getPage();return this._reservations.clear(),this._getAllReservations(e)}_getAllReservations(e){return e.then((e=>{e.items.forEach((e=>{this._insertReservation(e)})),e.hasNextPage&&this._getAllReservations(e.nextPage())}))}_getPage(e){e=e||{};const t=this._worker.getRoutes().getRoute(W).path,r={Active:"true",PageSize:this._pageSize};return e.AfterSid&&(r.AfterSid=e.AfterSid),this._request.get(t,h.F3,r).then((e=>new J(e.contents.map((e=>new fe(e,this._worker))),(e=>this._getPage({AfterSid:e})),e.after_sid)))}_insertReservation(e){const t=e.sid;this._log.trace("_insertReservation(sid=%s, data=%s)",t,JSON.stringify(e)),this._reservations.has(t)&&this._log.debug("Reservation %s already exists for Worker %s. Attempting to overwrite it.",t,this._worker.sid);try{const r=new ye(this._worker,this._request,e);return this._reservations.set(t,[r,!1]),this._reservationSidsByTask.has(r.task.sid)?this._reservationSidsByTask.get(r.task.sid).add(r.sid):this._reservationSidsByTask.set(r.task.sid,new Set([r.sid])),this._log.debug("Successfully created and inserted %s for %s to Task-Reservation lookup. Contents: %s",r.sid,r.task.sid,this._reservationSidsByTask.get(r.task.sid)),r}catch(e){throw this._log.error("Unable to create a Reservation for sid=%s. Skipping insert into Reservations map. Error: %s",t,e),e}}insert(e){this._log.trace("_insertReservation(sid=%s, data=%s)",e.sid,JSON.stringify(e));const t=new fe(e,this._worker);return this._insertReservation(t)}getTasks(e){if(!this._reservationSidsByTask.has(e))return null;const t=this._reservationSidsByTask.get(e),r=[];return t.forEach((e=>{const t=this._reservations.get(e);t&&t[0].task&&r.push(t[0].task)})),r}_deleteByReservationSid(e){this._log.trace("_deleteByReservationSid(sid=%s)",e);const t=this.reservations.get(e);t?(this._log.info("Found Reservation sid=%s for Worker %s. Removing reservation and task.",e,this._worker.sid),this._cleanUpReservationAndTask(t)):this._log.info("Reservation with sid=%s not found. Unable to remove Reservation.",e)}_cleanUpReservationAndTask(e){this._log.debug("Soft deleting Reservation sid=%s for Worker %s",e.sid,this._worker.sid),this._reservations.set(e.sid,[e,!0]),setTimeout((()=>{this._log.debug("Hard deleting of Reservation sid=%s for Worker %s",e.sid,this._worker.sid),this._reservations.delete(e.sid)||this._log.warn("Failed to hard delete Reservation sid=%s for Worker %s",e.sid,this._worker.sid)}),5e3)}}class be{constructor(e,t={}){this._worker=e,this._logLevel=t.logLevel||"error",this._log=new d("WorkerEventHandler",this._logLevel)}getTREventsToHandlerMapping(){return{"worker.activity.update":"_workerActivityUpdateHandler","worker.attributes.update":"_workerAttributesUpdateHandler","worker.capacity.update":"_workerCapacityUpdateHandler","worker.channel.availability.update":"_workerChannelAvailabilityUpdateHandler","reservation.created":"_reservationCreatedHandler","reservation.failed":"_reservationFailedHandler","reservation.accepted":"_reservationUpdateHandler","reservation.wrapup":"_reservationUpdateHandler","reservation.completed":"_reservationCleanupEventsHandler","reservation.rejected":"_reservationCleanupEventsHandler","reservation.timeout":"_reservationCleanupEventsHandler","reservation.canceled":"_reservationCleanupEventsHandler","reservation.rescinded":"_reservationCleanupEventsHandler","task.updated":"_taskTypeEventHandler","task.canceled":"_taskTypeEventHandler","task.completed":"_taskTypeEventHandler","task.wrapup":"_taskTypeEventHandler","task.transfer-attempt-failed":"_transferTaskEventHandler","task.transfer-completed":"_transferTaskEventHandler","task.transfer-failed":"_transferTaskEventHandler","task.transfer-initiated":"_transferTaskEventHandler","task.transfer-canceled":"_transferTaskEventHandler"}}_workerActivityUpdateHandler(e){if(this._log.info("Worker %s received Event: worker.activity.update. Proceeding to update ...",this._worker.sid),!e.activity_sid)throw this._log.error("Event: worker.activity.update did not contain an activity_sid. Unable to update Worker %s.",this._worker.sid),new Error(`Failed to update Worker ${this._worker.sid} activity.`);{const t=this._worker.activities.get(e.activity_sid);if(!t)throw this._log.error("The Activity sid=%s specified in Event: worker.activity.update does not exist in the Worker's map of Activities. Unable to update Worker %s activity.",e.activity_sid,this._worker.sid),new Error(`Failed to update Worker ${this._worker.sid} activity.`);this._worker.activity._isCurrent=!1,this._worker.activity=t,t._isCurrent=!0,this._worker.emit("activityUpdated",this._worker._update(e))}}_workerAttributesUpdateHandler(e){this._log.info(`Worker ${this._worker.sid} received Event: worker.attributes.update. Proceeding to update ...`),this._worker.emit("attributesUpdated",this._worker._update(e))}_workerCapacityUpdateHandler(e){if(this._log.info(`Worker ${this._worker.sid} received Event: worker.capacity.update.`),!e.sid)throw this._log.error("Event: worker.capacity.update did not contain a Channel sid. Unable to update Channel for Worker %s.",this._worker.sid),new Error(`Failed to update Worker ${this._worker.sid} channel.`);{const t=this._worker.channels.get(e.sid);if(!t)throw this._log.error("The Channel sid=%s specified in Event: worker.capacity.update does not exist in the Worker's map of Channels. Unable to update Worker %s channel.",e.sid,this._worker.sid),new Error(`Failed to update Worker ${this._worker.sid} channel.`);t._emitEvent("capacityUpdated",e)}}_workerChannelAvailabilityUpdateHandler(e){if(this._log.info("Worker %s received Event: worker.channel.availability.update.",this._worker.sid),!e.sid)throw this._log.error("Event: worker.capacity.update did not contain a Channel sid. Unable to update Channel for Worker %s.",this._worker.sid),new Error(`Failed to update Worker ${this._worker.sid} channel.`);{const t=this._worker.channels.get(e.sid);if(!t)throw this._log.error("The Channel sid=%s specified in Event: worker.channel.availability.update does not exist in the Worker's map of Channels. Unable to update Worker %s channel.",e.sid,this._worker.sid),new Error(`Failed to update Worker ${this._worker.sid} channel.`);t._emitEvent("availabilityUpdated",e)}}_reservationCreatedHandler(e){if(this._log.info("Worker %s received Event: reservation.created.",this._worker.sid),!e.sid)throw this._log.error("Event: reservationCreated did not contain a Reservation sid. Unable to create a Reservation for Worker %s.",this._worker.sid),new Error(`Failed to create Reservation for Worker ${this._worker.sid}.`);try{this._log.info("Attempting to create and insert Reservation into Worker %s reservations map.",this._worker.sid);const t=this._worker._dataServices.reservationsEntity.insert(e);this._worker._bumpVersion(),this._worker.emit("reservationCreated",t)}catch(e){throw this._log.info("Failed to create and insert Reservation into Worker %s reservations map.",this._worker.sid),new Error(`Failed to create a Reservation for Worker ${this._worker.sid} on Event: reservationCreated. Error: ${e}`)}}_reservationFailedHandler(e){this._log.info("Worker %s received Event: reservation.failed.",this._worker.sid),this._worker.emit("reservationFailed",e)}_reservationUpdateHandler(e,t){const r=h.zb[t];if(this._log.info("Worker %s received Event: %s mapped to %s.",this._worker.sid,t,r),!e.sid)throw this._log.error(`Event: reservation.${r} did not contain a Reservation sid. Unable to update Reservation for Worker ${this._worker.sid}`),new Error(`Failed to update Reservation for Worker ${this._worker.sid}.`);{const t=this._worker.reservations.get(e.sid);if(!t)throw this._log.error(`The Resevation sid=${e.sid} specified in Event: reservation.${r} does not exist in the Worker's map of Reservations. Unable to update Worker ${this._worker.sid} reservation.`),new Error(`Failed to update Worker ${this._worker.sid} reservation.`);t._emitEvent(r,e)}}_reservationCleanupEventsHandler(e,t){const r=h.zb[t];if(this._log.info("Worker %s received Event: %s mapped to %s.",this._worker.sid,t,r),!e.sid)throw this._log.error("Event: reservation.%s did not contain a Reservation sid. Unable to update Reservation for Worker %s.",r,this._worker.sid),new Error(`Failed to update Reservation for Worker ${this._worker.sid}.`);{const t=this._worker.reservations.get(e.sid);t?(this._worker._dataServices.reservationsEntity._deleteByReservationSid(e.sid),t._emitEvent(r,e)):this._log.warn("The reservation specified by Event: reservation.%s does not exist in Worker %s Reservations map. Skipping event.",r,this._worker.sid)}}_taskTypeEventHandler(e,t){const r=h.L3[t];if(this._log.info("Worker %s received Event: %s mapped to %s.",this._worker.sid,t,r),!e.sid)throw this._log.error("Event: task.%s did not contain a Task sid. Unable to emit event for Worker %s.",r,this._worker.sid),new Error(`Failed to emit event for Worker ${this._worker.sid}.`);{const t=this._worker._dataServices.reservationsEntity.getTasks(e.sid);t&&t.length>0?t.forEach((t=>{t._update(e),t._emitEvent(r,e)})):this._log.warn("The task specified by Event: task.%s does not exist in Worker %s Reservations map. Skipping event.",r,this._worker.sid)}}_transferTaskEventHandler(e,t){const r=h.l4[t];if(this._log.info("Worker %s received Event: % mapped to %s.",this._worker.sid,t,r),!e.initiating_reservation_sid||!e.task_sid)throw this._log.error("Event: task.%s did not contain a Reservation sid or Task sid. Unable to emit event for Worker %s.",r,this._worker.sid),new Error(`Failed to emit event for Worker ${this._worker.sid}.`);{const t=this._worker.reservations.get(e.initiating_reservation_sid);t?t.task.sid===e.task_sid?t.task._emitEventForOutgoingTransfer(r,e):this._log.warn("The task %s related to Event: task.%s does not match the expected owning Reservation %s for Worker %s. Skipping event.",e.task_sid,r,t.sid,this._worker.sid):this._log.warn("The reservation %s related to Event: task.%s does not exist in Worker %s Reservations map. Skipping event.",e.initiating_reservation_sid,r,this._worker.sid)}}}const Re=["dateUpdated","dateStatusChanged","attributes","name","available","version"];class We extends l.EventEmitter{constructor(e,t={},r={Request:E,EventBridgeSignaling:f}){if(super(),!s().isString(e))throw new TypeError("Failed to instantiate Worker. <string>token is a required parameter.");const i={connectActivitySid:e=>s().isString(e),closeExistingSessions:e=>s().isBoolean(e),logLevel:e=>s().isString(e),ebServer:e=>s().isString(e),wsServer:e=>s().isString(e),region:e=>s().isString(e)};let n;(0,z.n)(t,i),this._connectActivitySid=t.connectActivitySid,this._closeExistingSessions=t.closeExistingSessions,this._logLevel=t.logLevel||"error",this._config=new c(e,t),this._log=new d(`Worker-${this._config.getLogIdentifier()}`,this._logLevel),this._request=new r.Request(this._config),this._dataServices={activitiesEntity:new K(this,this._request),channelsEntity:new re(this,this._request),reservationsEntity:new Te(this,this._request)},this._signaling=new r.EventBridgeSignaling(this,{closeExistingSessions:t.closeExistingSessions}),this._subscribeToSignalingEvents(),n=t.eventHandlerClass?new t.eventHandlerClass(this):new be(this),this.taskRouterEventHandler=n}createTask(e,t,r,i,n={}){if(!s().isString(e))throw new TypeError("Error calling method createTask(). <string>to is a required parameter.");if(!s().isString(t))throw new TypeError("Error calling method createTask(). <string>from is a required parameter.");if(!s().isString(r))throw new TypeError("Error calling method createTask(). <string>workflowSid is a required parameter.");if(!s().isString(i))throw new TypeError("Error calling method createTask(). <string>taskQueueSid is a required parameter.");const o={attributes:e=>s().isObject(e),taskChannelUniqueName:e=>s().isString(e),taskChannelSid:e=>s().isString(e)};if(!(0,z.n)(n,o))throw new TypeError(`Failed to create a Task for Worker ${this.sid}. The options passed in did not match the required types.`);const a=this.getRoutes().getRoute(O).path,d={WorkflowSid:r,TaskQueueSid:i,RoutingTarget:this.sid};for(const e in n)"attributes"===e||(d[h.VH[e]]=n[e]);const c={outbound_to:e,from:t};return d.Attributes=Object.assign({},n.attributes,c),this._request.post(a,d,h.x6).then((e=>e.sid))}getLogger(e){return new d(`${e}-${this.sid}`,this._config._logLevel)}setAttributes(e){if(!s().isObject(e))throw new TypeError("Unable to set attributes on Worker. <object>attributes is a required parameter.");const t=this.getRoutes().getRoute(q).path,r={Attributes:e};return this._request.post(t,r,h.x6,this.version).then((e=>this._update(e)))}_bumpVersion(){this.version&&(this.version=String(Number(this.version)+1))}updateToken(e){if(!s().isString(e))throw new TypeError("To update the Twilio token, a new Twilio token must be passed in. <string>newToken is a required parameter.");this._log.info("Proceeding to update the Worker's current active token with a new token."),this._log.debug("New token: "+e);try{this._config.updateToken(e),this._signaling.updateToken(e),this.emit("tokenUpdated")}catch(e){this.emit("error",e)}}fetchLatestVersion(){const e=this.getRoutes().getRoute(q).path;return this._request.get(e,h.x6).then((e=>this._update(e)))}_subscribeToSignalingEvents(){this._log.info("Subscribing to Signaling events .... "),this._signaling.on("connected",(()=>{this._log.info("Received Event: 'connected' from Signaling layer. Pending initialization.",this.sid)})),this._signaling.on("disconnected",(e=>{this._log.info("Received Event: 'disconnected' from Signaling layer for Worker %s. %s",this.sid,e),this._unSubscribeFromTaskRouterEvents(),this.emit("disconnected",e)})),this._signaling.on("init",(e=>{this._log.info("Received Event: 'init' from Signaling layer. Proceeding to initialize Worker %s.",e.channel_id),this.sid=e.channel_id,this.accountSid=e.account_sid,this.workspaceSid=e.workspace_sid,this._signaling.setLifetime(e.token_lifetime),this._initialize()})),this._signaling.on("error",(e=>{this._log.info("Received Event: 'error' from Signaling layer for Worker %s.",this.sid),this.emit("error",e)})),this._signaling.on("tokenExpired",(()=>{this._log.info("Received Event: 'tokenExpired' for for Worker %s. Please update the token. Websocket will not reconnect automatically until token is updated.",this.sid),this.emit("tokenExpired")}))}_subscribeToTaskRouterEvents(){this._log.info("Subscribing to TaskRouter events ... ");for(let[e,t]of Object.entries(this.taskRouterEventHandler.getTREventsToHandlerMapping()))this._signaling.on(e,this.taskRouterEventHandler[t])}_unSubscribeFromTaskRouterEvents(){this._log.info("Unsubscribing from TaskRouter events ... ");for(let[e,t]of Object.entries(this.taskRouterEventHandler.getTREventsToHandlerMapping()))this._signaling.removeListener(e,this.taskRouterEventHandler[t])}_initialize(){this._routes=new I(this.workspaceSid,this.sid),this._log.info("Initializing Worker %s...",this.sid);const e=this.getRoutes().getRoute(q).path;let t;this._request.get(e,h.x6).then((e=>{const r=new H(e);return t=r.activitySid,delete r.activityName,delete r.activitySid,delete r.available,Object.assign(this,r),Promise.all([this._dataServices.activitiesEntity.fetchActivities(),this._dataServices.channelsEntity.fetchChannels(),this._dataServices.reservationsEntity.fetchReservations()])})).then((()=>{this._log.info("Worker %s activities, channels and pending reservations initialized",this.sid),this._setCurrentActivity(t),this._connectActivitySid?this._setWorkerConnectActivity().then((()=>{this._log.info("Successfully updated Worker on connect to Activity=%s",this._connectActivitySid),this._log.info("Worker %s successfully initialized",this.sid)})):this._log.info("Worker %s successfully initialized",this.sid),this._subscribeToTaskRouterEvents(),this.emit("ready",this)})).catch((e=>{this._log.error("Failed to initialize Worker %s. Error: %s",this.sid,e),this.emit("error",`Failed to initialize Worker ${this.sid}`)}))}get channels(){return this._dataServices.channelsEntity.channels}get activities(){return this._dataServices.activitiesEntity.activities}get reservations(){return this._dataServices.reservationsEntity.reservations}_setCurrentActivity(e){const t=this.activities.get(e);if(!t)throw new Error(`Unable to set the current Activity sid=${e} on the Worker.`);t._isCurrent=!0,this.activity=t,this.activity._isCurrent=!0}_setWorkerConnectActivity(){if(!s().isString(this._connectActivitySid))throw new TypeError("Failed to set the Worker's activity to the provided optional connectActivitySid. <string>connectActivitySid must be a string.");return this._updateWorkerActivity(this._connectActivitySid).then((()=>(this._log.info("Successfully set the Worker's activity to the provided connectActivitySid=%s on connection.",this._connectActivitySid),this._connectRetry=0,this))).catch((e=>{if(this._connectRetry>=3)throw this._log.error("Unable to set Worker %s activity to the provided %s on successful connection. %s",this.sid,this._connectActivitySid,e),e;return this._connectRetry=this._connectRetry>0?this._connectRetry+1:1,new Promise((e=>setTimeout(e,500))).then(this._setWorkerConnectActivity.bind(this))}))}_updateWorkerActivity(e,t={}){if(!s().isString(e))throw new TypeError("Error updating Worker Activity: <string>activitySid is a required parameter");const r=this.getRoutes().getRoute(q).path,i={ActivitySid:e};for(const e in t)i[h.UA[e]]=t[e];return this._request.post(r,i,h.x6,this.version).then((t=>{try{this._update(t),this.activity._isCurrent=!1;const e=this.activities.get(t.activity_sid);this.activity=e,this.activity._isCurrent=!0}catch(t){throw this._log.error("Failed to update the Worker's activity to sid=%s. Error: %s",e,t),t}return this}))}_update(e){this._log.trace("Attempting to update Worker %s with latest Worker data=%s",this.sid,JSON.stringify(e));try{const t=new H(e);Re.forEach((e=>{this[e]=t[e]}))}catch(t){this._log.error("Failed to update Worker sid=%s. Update aborted. Error: %s.",e.sid,t)}return this}disconnect(){this._signaling.disconnect()}getRoutes(){return this._routes}}const Ae=["account_sid","activity_name","activity_sid","attributes","available","date_created","date_status_changed","date_updated","friendly_name","sid","workspace_sid","version"],qe=We;const Ce=class extends qe{monitor(e,t,r){if(!s().isString(e))throw new TypeError("Error monitoring reservation: <string>taskSid is a required parameter");if(!s().isString(t))throw new TypeError("Error monitoring reservation: <string>reservationSid is a required parameter");if(r&&!s().isObject(r))throw new TypeError("Error monitoring reservation: <string>extraParams must be an object");return this._supervise("monitor",e,t,r)}_supervise(e,t,r,i){const s=this.getRoutes().getRoute(C,t,r).path,n=Object.assign({},i,{Instruction:"supervise",Supervisor:this.sid,SupervisorMode:e});return this._request.post(s,n,h.x6).then((()=>{}))}};const Oe=["friendly_name","reservation_activity_name","assignment_activity_name","target_workers","max_reserved_workers","task_order","reservation_activity_sid","assignment_activity_sid","workspace_sid","account_sid","sid","date_created","date_updated","lifo_queue"],xe=class{constructor(e){if(!(e instanceof je))throw new TypeError("Failed to create a TaskQueue. <TaskQueueDescriptor>descriptor is a required parameter.");Object.assign(this,e)}};class je{constructor(e){if(!s().isObject(e))throw new TypeError("Failed to instantiate TaskQueueDescriptor. <Descriptor>descriptor is required.");if(!Oe.every((t=>t in e)))throw new TypeError("Failed to instantiate TaskQueueDescriptor. <Descriptor>descriptor does not contain all properties of a TaskQueue.");this.sid=e.sid,this.queueSid=e.sid,this.accountSid=e.account_sid,this.workspaceSid=e.workspace_sid,this.name=e.friendly_name,this.queueName=e.friendly_name,this.assignmentActivityName=e.assignment_activity_name,this.reservationActivityName=e.reservation_activity_name,this.assignmentActivitySid=e.assignment_activity_sid,this.reservationActivitySid=e.reservation_activity_sid,this.targetWorkers=e.target_workers,this.maxReservedWorkers=e.max_reserved_workers,this.taskOrder=e.task_order,this.dateCreated=(0,z.T)(1e3*e.date_created),this.dateUpdated=(0,z.T)(1e3*e.date_updated)}}const Fe=class{constructor(e){if(!(e instanceof H))throw new TypeError("Failed to create a WorkerContainer. <WorkerDescriptor>descriptor is a required parameter.");Object.assign(this,e)}},Ne="workerList",De="taskQueueList";class Pe extends y{constructor(e){if(super(),!e)throw h.Gf.INVALID_ARGUMENT.clone("Error instantiating WorkspaceRoutes class. <string>workspaceSid is required.");this.workspaceSid=e,this.routes={[Ne]:{path:b().join("Workspaces",this.workspaceSid,"Workers")},[De]:{path:b().join("Workspaces",this.workspaceSid,"TaskQueues")}}}}class Ue{constructor(e,t,r={}){this._Workers=new Map,this._TaskQueues=new Map,this._routes=new Pe(e),this._request=t,this._log=new d(`WorkspaceEntity-${e}`,r.logLevel),this._pageSize=r.pageSize||h.L8,s().inRange(this._pageSize,1,h.L8+1)||(this._log.warn("PageSize range for WorkspaceEntity must be between 1 and %d. Setting pageSize to default size=%d",h.L8,h.L8),this._pageSize=h.L8)}get Workers(){return this._Workers}get TaskQueues(){return this._TaskQueues}fetchWorker(e){const t=b().join(this._routes.getRoute(Ne).path,e);return this._request.get(t,h.x6).then((e=>new Fe(new H(e))))}fetchWorkers(e){this._Workers=new Map;const{MaxWorkers:t,...r}=e||{};return this._getAllWorkers(this._getWorkerPage(r),t)}fetchTaskQueue(e){const t=b().join(this._routes.getRoute(De).path,e);return this._request.get(t,h.x6).then((e=>new xe(new je(e))))}fetchTaskQueues(e){return this._TaskQueues=new Map,this._getAllTaskQueues(this._getTaskQueuePage(e))}_getAllWorkers(e,t=h.hS){return e.then((async e=>{for(const r of e.items){if(this._Workers.size>=t)break;this._insertWorker(r)}e.hasNextPage&&(this._Workers.size>=t||await this._getAllWorkers(e.nextPage()))}))}_getWorkerPage(e){e=e||{};const t=this._routes.getRoute(Ne).path,r={PageSize:this._pageSize};return["AfterSid","FriendlyName","ActivitySid","ActivityName","Ordering","TargetWorkersExpression","NextToken"].forEach((t=>{e[t]&&(r[t]=e[t])})),this._request.get(t,h.x6,r).then((e=>{const{Ordering:t,...i}=r,s=t?"NextToken":"AfterSid";return new J(e.contents.map((e=>new H(e))),(e=>this._getWorkerPage({...i,Ordering:t,[s]:e})),t?e.meta.next_token:e.after_sid)}))}_insertWorker(e){const t=e.sid;this._log.trace("_insertWorker(sid=%s, data=%s)",t,JSON.stringify(e));try{this._Workers.set(t,new Fe(e))}catch(e){this._log.error("Unable to create a Worker for sid=%s. Skipping insert into Worker map. Error: %s",t,e)}}async _getAllTaskQueues(e){return e.then((async e=>{e.items.forEach((e=>this._insertTaskQueue(e))),e.hasNextPage&&await this._getAllTaskQueues(e.nextPage())}))}_getTaskQueuePage(e){e=e||{};const t=this._routes.getRoute(De).path,r={PageSize:this._pageSize};return["AfterSid","FriendlyName","Ordering","NextToken"].forEach((t=>{e[t]&&(r[t]=e[t])})),this._request.get(t,h.x6,r).then((e=>{const{Ordering:t,...i}=r,s=t?"NextToken":"AfterSid";return new J(e.contents.map((e=>new je(e))),(e=>this._getTaskQueuePage({...i,Ordering:t,[s]:e})),t?e.meta.next_token:e.after_sid)}))}_insertTaskQueue(e){const t=e.sid;this._log.trace("_insertTaskQueue(sid=%s, data=%s",t,JSON.stringify(e));try{this._TaskQueues.set(t,new xe(e))}catch(e){this._log.error("Unable to create a TaskQueue for sid=%s. Skipping insert into TaskQueue map. Error: %s",t,e)}}}const Le=require("jwt-decode");var $e=r.n(Le);const Ie=class{constructor(e,t={},r){this._config=new c(e,t),this._request=new E(this._config),this._logLevel=t.logLevel||"error",this._log=new d(`Workspace-${this._config.getLogIdentifier()}`,this._logLevel),this.shouldDecodeToken=!r,this.workspaceSid=r,this._updateJWTProperties(e),this.workspaceEntity=new Ue(this.workspaceSid,this._request,t)}fetchWorker(e){return this.workspaceEntity.fetchWorker(e)}fetchWorkers(e){return this.workspaceEntity.fetchWorkers(e).then((()=>this.workspaceEntity.Workers))}fetchTaskQueue(e){return this.workspaceEntity.fetchTaskQueue(e)}fetchTaskQueues(e){return this.workspaceEntity.fetchTaskQueues(e).then((()=>this.workspaceEntity.TaskQueues))}updateToken(e){if(!s().isString(e))throw new TypeError("To update the Twilio token, a new Twilio token must be passed in. <string>newToken is a required parameter.");this._config.updateToken(e),this._updateJWTProperties(e)}_updateJWTProperties(e){if(!this.shouldDecodeToken)return;const t=$e()(e);this.jwt=t,this.accountSid=t.sub,this.workspaceSid=t.grants.task_router.workspace_sid,this.workerSid=t.grants.task_router.worker_sid,this.role=t.grants.task_router.role}}},470:e=>{"use strict";function t(e){if("string"!=typeof e)throw new TypeError("Path must be a string. Received "+JSON.stringify(e))}function r(e,t){for(var r,i="",s=0,n=-1,o=0,a=0;a<=e.length;++a){if(a<e.length)r=e.charCodeAt(a);else{if(47===r)break;r=47}if(47===r){if(n===a-1||1===o);else if(n!==a-1&&2===o){if(i.length<2||2!==s||46!==i.charCodeAt(i.length-1)||46!==i.charCodeAt(i.length-2))if(i.length>2){var d=i.lastIndexOf("/");if(d!==i.length-1){-1===d?(i="",s=0):s=(i=i.slice(0,d)).length-1-i.lastIndexOf("/"),n=a,o=0;continue}}else if(2===i.length||1===i.length){i="",s=0,n=a,o=0;continue}t&&(i.length>0?i+="/..":i="..",s=2)}else i.length>0?i+="/"+e.slice(n+1,a):i=e.slice(n+1,a),s=a-n-1;n=a,o=0}else 46===r&&-1!==o?++o:o=-1}return i}var i={resolve:function(){for(var e,i="",s=!1,n=arguments.length-1;n>=-1&&!s;n--){var o;n>=0?o=arguments[n]:(void 0===e&&(e=process.cwd()),o=e),t(o),0!==o.length&&(i=o+"/"+i,s=47===o.charCodeAt(0))}return i=r(i,!s),s?i.length>0?"/"+i:"/":i.length>0?i:"."},normalize:function(e){if(t(e),0===e.length)return".";var i=47===e.charCodeAt(0),s=47===e.charCodeAt(e.length-1);return 0!==(e=r(e,!i)).length||i||(e="."),e.length>0&&s&&(e+="/"),i?"/"+e:e},isAbsolute:function(e){return t(e),e.length>0&&47===e.charCodeAt(0)},join:function(){if(0===arguments.length)return".";for(var e,r=0;r<arguments.length;++r){var s=arguments[r];t(s),s.length>0&&(void 0===e?e=s:e+="/"+s)}return void 0===e?".":i.normalize(e)},relative:function(e,r){if(t(e),t(r),e===r)return"";if((e=i.resolve(e))===(r=i.resolve(r)))return"";for(var s=1;s<e.length&&47===e.charCodeAt(s);++s);for(var n=e.length,o=n-s,a=1;a<r.length&&47===r.charCodeAt(a);++a);for(var d=r.length-a,c=o<d?o:d,h=-1,l=0;l<=c;++l){if(l===c){if(d>c){if(47===r.charCodeAt(a+l))return r.slice(a+l+1);if(0===l)return r.slice(a+l)}else o>c&&(47===e.charCodeAt(s+l)?h=l:0===l&&(h=0));break}var u=e.charCodeAt(s+l);if(u!==r.charCodeAt(a+l))break;47===u&&(h=l)}var p="";for(l=s+h+1;l<=n;++l)l!==n&&47!==e.charCodeAt(l)||(0===p.length?p+="..":p+="/..");return p.length>0?p+r.slice(a+h):(a+=h,47===r.charCodeAt(a)&&++a,r.slice(a))},_makeLong:function(e){return e},dirname:function(e){if(t(e),0===e.length)return".";for(var r=e.charCodeAt(0),i=47===r,s=-1,n=!0,o=e.length-1;o>=1;--o)if(47===(r=e.charCodeAt(o))){if(!n){s=o;break}}else n=!1;return-1===s?i?"/":".":i&&1===s?"//":e.slice(0,s)},basename:function(e,r){if(void 0!==r&&"string"!=typeof r)throw new TypeError('"ext" argument must be a string');t(e);var i,s=0,n=-1,o=!0;if(void 0!==r&&r.length>0&&r.length<=e.length){if(r.length===e.length&&r===e)return"";var a=r.length-1,d=-1;for(i=e.length-1;i>=0;--i){var c=e.charCodeAt(i);if(47===c){if(!o){s=i+1;break}}else-1===d&&(o=!1,d=i+1),a>=0&&(c===r.charCodeAt(a)?-1==--a&&(n=i):(a=-1,n=d))}return s===n?n=d:-1===n&&(n=e.length),e.slice(s,n)}for(i=e.length-1;i>=0;--i)if(47===e.charCodeAt(i)){if(!o){s=i+1;break}}else-1===n&&(o=!1,n=i+1);return-1===n?"":e.slice(s,n)},extname:function(e){t(e);for(var r=-1,i=0,s=-1,n=!0,o=0,a=e.length-1;a>=0;--a){var d=e.charCodeAt(a);if(47!==d)-1===s&&(n=!1,s=a+1),46===d?-1===r?r=a:1!==o&&(o=1):-1!==r&&(o=-1);else if(!n){i=a+1;break}}return-1===r||-1===s||0===o||1===o&&r===s-1&&r===i+1?"":e.slice(r,s)},format:function(e){if(null===e||"object"!=typeof e)throw new TypeError('The "pathObject" argument must be of type Object. Received type '+typeof e);return function(e,t){var r=t.dir||t.root,i=t.base||(t.name||"")+(t.ext||"");return r?r===t.root?r+i:r+e+i:i}("/",e)},parse:function(e){t(e);var r={root:"",dir:"",base:"",ext:"",name:""};if(0===e.length)return r;var i,s=e.charCodeAt(0),n=47===s;n?(r.root="/",i=1):i=0;for(var o=-1,a=0,d=-1,c=!0,h=e.length-1,l=0;h>=i;--h)if(47!==(s=e.charCodeAt(h)))-1===d&&(c=!1,d=h+1),46===s?-1===o?o=h:1!==l&&(l=1):-1!==o&&(l=-1);else if(!c){a=h+1;break}return-1===o||-1===d||0===l||1===l&&o===d-1&&o===a+1?-1!==d&&(r.base=r.name=0===a&&n?e.slice(1,d):e.slice(a,d)):(0===a&&n?(r.name=e.slice(1,o),r.base=e.slice(1,d)):(r.name=e.slice(a,o),r.base=e.slice(a,d)),r.ext=e.slice(o,d)),a>0?r.dir=e.slice(0,a-1):n&&(r.dir="/"),r},sep:"/",delimiter:":",win32:null,posix:null};i.posix=i,e.exports=i},997:e=>{e.exports={Agent:class{constructor(e){}}}},622:e=>{"use strict";e.exports=require("loglevel")},464:e=>{"use strict";e.exports=require("util")},352:e=>{"use strict";e.exports=require("ws")}},t={};function r(i){var s=t[i];if(void 0!==s)return s.exports;var n=t[i]={exports:{}};return e[i](n,n.exports,r),n.exports}return r.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return r.d(t,{a:t}),t},r.d=(e,t)=>{for(var i in t)r.o(t,i)&&!r.o(e,i)&&Object.defineProperty(e,i,{enumerable:!0,get:t[i]})},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r(296)})()}));
|
|
2
|
+
/*! twilio-taskrouter.js 0.7.2 */
|
|
3
|
+
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.TaskRouter=t():e.TaskRouter=t()}(self,(function(){return(()=>{var e={142:(e,t,r)=>{"use strict";r.d(t,{M0:()=>i,in:()=>s,j3:()=>n,hO:()=>o,O:()=>a,iz:()=>d,nB:()=>c,FB:()=>h,Uf:()=>l,iR:()=>u,UA:()=>p,xf:()=>g,EA:()=>_,qG:()=>k,VH:()=>f,Qh:()=>v,Nt:()=>w,L3:()=>m,zb:()=>S,fc:()=>E,PQ:()=>y,_G:()=>T,l4:()=>b,x6:()=>R,F3:()=>W,L8:()=>A,hS:()=>q,jz:()=>C,Iv:()=>O,Gf:()=>j});const i="accepted",s="completed",n="rejected",o="wrapping",a="call",d="dequeue",c="redirect",h="conference",l=Object.freeze({canceled:"canceled",complete:"complete",failed:"failed",initiated:"initiated"}),u={activitySid:"WorkerActivitySid"};Object.freeze(u);const p={rejectPendingReservations:"RejectPendingReservations"};Object.freeze(p);const g={accept:"CallAccept",record:"CallRecord",statusCallbackUrl:"CallStatusCallbackUrl",timeout:"CallTimeout",to:"CallTo"};Object.freeze(g);const _={to:"DequeueTo",from:"DequeueFrom",postWorkActivitySid:"DequeuePostWorkActivitySid",record:"DequeueRecord",timeout:"DequeueTimeout",statusCallbackUrl:"DequeueStatusCallbackUrl",statusCallbackEvents:"DequeueStatusCallbackEvents"};Object.freeze(_);const k={accept:"RedirectAccept"};Object.freeze(k);const f={taskChannelUniqueName:"TaskChannelUniqueName",taskChannelSid:"TaskChannelSid",attributes:"Attributes"},v="completed",w="wrapping";Object.freeze({accepted:0,rejected:1,timeout:2,canceled:3,rescinded:4,completed:5,wrapup:6});const m={"task.updated":"updated","task.canceled":"canceled","task.completed":"completed","task.wrapup":"wrapup"};Object.freeze(m);const S={"reservation.completed":"completed","reservation.rejected":"rejected","reservation.timeout":"timeout","reservation.canceled":"canceled","reservation.rescinded":"rescinded","reservation.accepted":"accepted","reservation.wrapup":"wrapup"};Object.freeze(S);const E=Object.freeze({taskTransfer:"task_transfer",activeOutgoingTaskTransfer:"active_outgoing_task_transfer"}),y="transfer-initiated",T={"transfer-attempt-failed":"attemptFailed","transfer-completed":"completed","transfer-failed":"failed","transfer-initiated":"transferInitiated","transfer-canceled":"canceled"};Object.freeze(T);const b={"task.transfer-attempt-failed":"transfer-attempt-failed","task.transfer-completed":"transfer-completed","task.transfer-failed":"transfer-failed","task.transfer-initiated":"transfer-initiated","task.transfer-canceled":"transfer-canceled"};Object.freeze(b);const R="v1",W="v2",A=1e3,q=1e3,C=5e3,O={TOKEN:"token",CLOSE_EXISTING_SESSIONS:"closeExistingSessions",CLIENT_VERSION:"clientVersion"},x=r(830),j=[{name:"INVALID_ARGUMENT",message:"One or more arguments passed were invalid."},{name:"INVALID_TOKEN",message:"The token is invalid or malformed."},{name:"TOKEN_EXPIRED",message:"Worker's active token has expired."},{name:"GATEWAY_CONNECTION_FAILED",message:"Could not connect to Twilio's servers."},{name:"GATEWAY_DISCONNECTED",message:"Connection to Twilio's servers was lost."},{name:"INVALID_GATEWAY_MESSAGE",message:"The JSON message received was malformed."},{name:"TASKROUTER_ERROR",message:"TaskRouter failed to complete the request."}].reduce(((e,t)=>(e[t.name]=new x(t),e)),{})},813:(e,t)=>{function r(e){if(!(this instanceof r))return new r(e);e=e||{};const t=function(){},i={interval:10,now:function(){return(new Date).getTime()},repeat:function(e,t){return setInterval(e,t)},stop:function(e,t){return clearInterval(e,t)},onsleep:t,onwakeup:t};for(let t in i)t in e||(e[t]=i[t]);this.interval=e.interval,this.lastbeat=0,this.pintvl=null,this.onsleep=e.onsleep,this.onwakeup=e.onwakeup,this.repeat=e.repeat,this.stop=e.stop,this.now=e.now}r.toString=function(){return"[Twilio.Heartbeat class]"},r.prototype.toString=function(){return"[Twilio.Heartbeat instance]"},r.prototype.beat=function(){if(this.lastbeat=this.now(),this.sleeping()){this.onwakeup&&this.onwakeup();var e=this;this.pintvl=this.repeat.call(null,(function(){e.check()}),1e3*this.interval)}},r.prototype.check=function(){const e=this.now()-this.lastbeat;!this.sleeping()&&e>=1e3*this.interval&&(this.onsleep&&this.onsleep(),this.stop.call(null,this.pintvl),this.pintvl=null)},r.prototype.sleeping=function(){return null===this.pintvl},t.y=r},834:(e,t,r)=>{"use strict";function i(e){try{return new Date(e)}catch(e){return null}}function s(e,t){for(const r in e)if(r in t&&!t[r](e[r]))throw new TypeError(`Option key: ${r} does not meet the required type.`);return!0}r.d(t,{T:()=>i,n:()=>s})},830:(e,t,r)=>{function i(e,t){Object.defineProperties(this,{_errorData:{value:e},name:{value:e.name},message:{value:t||e.message}})}(0,r(464).inherits)(i,Error),i.prototype.clone=function(e){return new i(this._errorData,e)},e.exports=i},296:(e,t,r)=>{"use strict";r.r(t),r.d(t,{Supervisor:()=>Ce,TaskRouterEventHandler:()=>be,Worker:()=>qe,Workspace:()=>Ie});const i=require("lodash");var s=r.n(i);const n=r(142).Gf,o=r(622),a=["trace","debug","info","warn","error","silent"];class d{constructor(e,t){if(!e)throw n.INVALID_ARGUMENT.clone("Error instantiating Logger. <string>moduleName is a required parameter.");this._log=o.getLogger(e),a.forEach(function(e){this[e]=(...t)=>this._log[e](this._getTimestamp(),...t)}.bind(this)),t&&this.setLevel(t)}setLevel(e){if(-1===a.indexOf(e))throw n.INVALID_ARGUMENT.clone("Error setting Logger level. <string>level must be one of ['trace', 'debug', 'info', 'warn', 'error', 'silent']");this._log.setLevel(e,!1),this._log.setDefaultLevel(e)}getLevel(){return a[this._log.getLevel()]}_getTimestamp(){return`[${(new Date).toISOString()}]`}}class c{constructor(e,t={}){if(!s().isString(e))throw new TypeError("Failed to initialize Configuration. <string>token is a required parameter.");if(this.logIdentifier=t.logIdentifier||+new Date,this._logLevel=t.logLevel,this._log=new d(`Configuration-${this.logIdentifier}`,this._logLevel),this.token=e,this.EB_SERVER=t.ebServer,this.WS_SERVER=t.wsServer,t.ebServer||t.wsServer)return this._log.warn('"ebServer" and "wsServer" parameter will be removed in next major version. You may start using "region" and "edge".');let r="";t.region&&(r+=`.${t.region}`),this.EB_SERVER=`https://event-bridge${r}.twilio.com/v1/wschannels`,this.WS_SERVER=`wss://event-bridge${r}.twilio.com/v1/wschannels`}updateToken(e){if(!s().isString(e))throw new TypeError("To update the Twilio token, a new Twilio token must be passed in. <string>newToken is a required parameter.");this.token=e}getLogIdentifier(){return this.logIdentifier}}var h=r(142);const l=require("events");var u=r(813);const p="0.7.2",g=r.g.window||r.g,_=g.WebSocket?g.WebSocket:r(352),k=p;class f extends l.EventEmitter{constructor(e,t={}){if(super(),!(e&&e instanceof qe))throw h.Gf.INVALID_ARGUMENT.clone("<Worker>worker is a required parameter to construct EventBridgeSignaling.");const r=e.getLogger(`EventBridgeSignaling-${e.sid}`);if(!s().isNil(t.closeExistingSessions)&&!s().isBoolean(t.closeExistingSessions))throw new TypeError("Invalid type passed for <boolean>closeExistingSessions");this._heartbeat=null,this.webSocket=null,this._log=r,this._worker=e,this.closeExistingSessions=t.closeExistingSessions||!1,this._config=e._config,this.reconnect=!1,this.tokenTimer=null,this.setUpWebSocket()}updateToken(e){if(!e)throw h.Gf.INVALID_ARGUMENT.clone("To update the Twilio token, a new Twilio token must be passed in. <string>newToken is a required parameter.");this.setTokenExpirationEvent(),this._log.info("Updated token for Worker "+this._worker.sid),this.reconnect=!0,this.webSocket.readyState!==this.webSocket.CLOSING&&this.webSocket.readyState!==this.webSocket.CLOSED||this.createWebSocket()}setTokenExpirationEvent(){clearTimeout(this.tokenTimer),this.tokenTimer=setTimeout((()=>{this.reconnect=!1,this.emit("tokenExpired")}),this.tokenLifetime-5e3)}setUpWebSocket(){this._heartbeat&&(this._heartbeat.onsleep=()=>{}),this._heartbeat=new u.y({interval:60}),this.createWebSocket()}setLifetime(e){this.tokenLifetime=e,this.setTokenExpirationEvent()}createWebSocket(){this.numAttempts=1,this.reconnect=!0;const e=`?${h.Iv.TOKEN}=${this._config.token}&${h.Iv.CLOSE_EXISTING_SESSIONS}=${this.closeExistingSessions}&${h.Iv.CLIENT_VERSION}=${k}`;this.webSocket=new _(this._config.WS_SERVER+e),this.webSocket.onopen=()=>{this.numAttempts=1,this.emit("connected"),this._heartbeat.onsleep=()=>{this._log.info("Heartbeat not received in the past 60 seconds. Proceeding to disconnect websocket."),this.webSocket.close()},this._heartbeat.beat()},this.webSocket.onmessage=e=>{if(this._log.debug("Received event",e.data),this._heartbeat.beat(),0===e.data.trim().length)return;let t;try{t=JSON.parse(e.data)}catch(t){return this._log.error("Received data is not valid JSON: "+e.data),void this.emit("error",h.Gf.INVALID_GATEWAY_MESSAGE)}this._log.debug("Emitting event: %s with %s",t.event_type,JSON.stringify(t.payload)),this.emit(t.event_type,t.payload||null,t.event_type)},this.webSocket.onerror=e=>{this._log.error("WebSocket error occurred: ",e),this.emit("error",h.Gf.GATEWAY_CONNECTION_FAILED)},this.webSocket.onclose=e=>{this.reconnect?this._log.info("WebSocket connection has closed. Trying to reconnect."):this._log.info("WebSocket connection has closed. Not reconnecting due to token expiration.");let t=e.reason;const r=e.code;if(s().isEmpty(t)&&(t=`Websocket closed with errorCode=${r}`),this.emit("disconnected",{message:t}),this._heartbeat.onsleep=()=>{},this.reconnect){const e=this.generateBackOffInterval(this.numAttempts);setTimeout((()=>{this.numAttempts++,this.createWebSocket()}),e)}}}generateBackOffInterval(e){const t=Math.ceil(800),r=Math.floor(1e3*Math.min(30,Math.pow(2,e)-1));return Math.round(Math.floor(Math.random()*(r-t+1))+t)}disconnect(){this._log.info("Disconnecting websocket"),null!==this.webSocket&&(["onmessage","onclose","onopen","onerror"].forEach((e=>{this.webSocket[e]=null})),this._heartbeat.onsleep=()=>{},this.webSocket.close()),this.emit("disconnected",{message:"SDK Disconnect"})}}const v=require("axios");var w=r(997);const m={GET:"GET",POST:"POST"};Object.freeze(m);const S=p;class E{constructor(e){if(!(e instanceof c))throw new TypeError("Failed to initialize Request. <Configuration>config is a required parameter.");const t=new w.Agent({maxVersion:"TLSv1.2",minVersion:"TLSv1.2"});this._config=e,this._postClient=v.create({method:m.POST,timeout:h.jz,headers:{clientVersion:S},httpsAgent:t})}post(e,t,r,i){if(!e)throw new Error("Failed to make POST request. <string>url is a required parameter.");if(!s().isObject(t))throw new Error("Failed to make POST request. <object>paramsJSON is a required parameter.");if(!r)throw new Error("Failed to make POST request. <string>apiVersion is a required parameter.");const n=this.buildRequest(m.POST,e,t);let o={apiVersion:r};return this._postClient.post(this._config.EB_SERVER,n,{headers:o}).then((e=>Promise.resolve(e.data.payload)))}get(e,t,r){if(!e)throw new Error("Failed to make GET request. <string>url is a required parameter.");if(!t)throw new Error("Failed to make GET request. <string>apiVersion is a required parameter.");if(r=r||{},!s().isObject(r))throw new Error("Failed to make GET request. <object>paramsJSON is a required parameter.");const i=this.buildRequest(m.GET,e,r);return this._postClient.post(this._config.EB_SERVER,i,{headers:{apiVersion:t}}).then((e=>Promise.resolve(e.data.payload)))}buildRequest(e,t,r){return JSON.stringify({url:t,method:e,params:r,token:this._config.token})}}class y{constructor(){this.routes={}}getRoute(e,...t){if(!this.routes[e])throw h.Gf.INVALID_ARGUMENT.clone(`Invalid route fetched <string>route "${e}" does not exist.`);if(t.length){let r=Object.assign({},this.routes[e]);if(t.length!==(r.path.match(/%s/g)||[]).length)throw h.Gf.INVALID_ARGUMENT.clone(`Invalid number of positional arguments supplied for route ${e}`);for(let e of t)r.path=r.path.replace(/%s/,e);return r}return this.routes[e]}}var T=r(470),b=r.n(T);const R=r(142).Gf,W="reservationList",A="reservationInstance",q="workerInstance",C="taskReservationInstance",O="taskList",x="taskInstance",j="taskTransferList",F="taskTransferInstance",N="workerChannels",D="activitiesList",P="customerParticipantInstance",U="workerParticipantInstance",L="holdWorkerParticipantInstance",$="kickWorkerParticipant";class I extends y{constructor(e,t){if(super(),!e||!t)throw R.INVALID_ARGUMENT.clone("Error instantiating Routes class. <string>workspaceSid and <string>workerSid are required parameters.");this.workspaceSid=e,this.workerSid=t,this.routes={[D]:{path:b().join("Workspaces",this.workspaceSid,"Activities")},[q]:{path:b().join("Workspaces",this.workspaceSid,"Workers",this.workerSid)},[A]:{path:b().join("Workspaces",this.workspaceSid,"Workers",this.workerSid,"Reservations","%s")},[W]:{path:b().join("Workspaces",this.workspaceSid,"Workers",this.workerSid,"Reservations")},[O]:{path:b().join("Workspaces",this.workspaceSid,"Tasks")},[x]:{path:b().join("Workspaces",this.workspaceSid,"Tasks","%s")},[j]:{path:b().join("Workspaces",this.workspaceSid,"Workers",this.workerSid,"Transfers")},[F]:{path:b().join("Workspaces",this.workspaceSid,"Workers",this.workerSid,"Transfers","%s")},[C]:{path:b().join("Workspaces",this.workspaceSid,"Tasks","%s","Reservations","%s")},[N]:{path:b().join("Workspaces",this.workspaceSid,"Workers",this.workerSid,"WorkerChannels")},[P]:{path:b().join("Workspaces",this.workspaceSid,"Workers",this.workerSid,"CustomerParticipant")},[U]:{path:b().join("Workspaces",this.workspaceSid,"Workers",this.workerSid,"WorkerParticipant")},[L]:{path:b().join("Workspaces",this.workspaceSid,"Workers",this.workerSid,"HoldWorkerParticipant")},[$]:{path:b().join("Workspaces",this.workspaceSid,"Workers",this.workerSid,"KickWorkerParticipant")}}}}var z=r(834);class H{constructor(e){if(!s().isObject(e))throw new TypeError("Failed to create a WorkerDescriptor. <Descriptor>descriptor is a required parameter.");if(!Ae.every((t=>t in e)))throw new TypeError("Failed to create a WorkerDescriptor. The provided <Descriptor>descriptor does not contain all properties of a Worker.");this.accountSid=e.account_sid,this.activityName=e.activity_name,this.activitySid=e.activity_sid,this.attributes=JSON.parse(e.attributes),this.available=e.available,this.dateCreated=(0,z.T)(1e3*e.date_created),this.dateStatusChanged=(0,z.T)(1e3*e.date_status_changed),this.dateUpdated=(0,z.T)(1e3*e.date_updated),this.name=e.friendly_name,this.sid=e.sid,this.workspaceSid=e.workspace_sid,this.version=String(e.version),this.workerSid=e.sid,this.workerActivitySid=e.activity_sid,this.dateActivityChanged=(0,z.T)(1e3*e.date_status_changed),this.friendlyName=e.friendly_name}}class M{constructor(e){if(!s().isObject(e))throw new TypeError("Failed to instantiate ActivityDescriptor. <Descriptor>descriptor is required.");if(!B.every((t=>t in e)))throw new TypeError("Failed to instantiate ActivityDescriptor. <Descriptor>descriptor does not contain all properties of an Activity.");this.accountSid=e.account_sid,this.available=e.available,this.dateCreated=(0,z.T)(1e3*e.date_created),this.dateUpdated=(0,z.T)(1e3*e.date_updated),this.name=e.friendly_name,this.sid=e.sid,this.workspaceSid=e.workspace_sid}}const G=r(834).n;const B=["account_sid","available","date_created","date_updated","friendly_name","sid","workspace_sid"],Q=class{constructor(e,t){if(!s().isObject(e))throw new TypeError("Failed to create an Activity. <Worker>worker is a required parameter.");if(!(t instanceof M))throw new TypeError("Failed to create an Activity. <ActivityDescriptor>descriptor is a required parameter.");Object.assign(this,t),this._worker=e,this._isCurrent=!1}get isCurrent(){return this._isCurrent}setAsCurrent(e={}){if(!G(e,{rejectPendingReservations:e=>s().isBoolean(e)}))throw new TypeError(`Failed to set activity=${this.sid}. The options passed in did not match the required types.`);if(e.rejectPendingReservations&&this.available)throw new Error("Unable to reject pending reservations when updating to an Available activity state.");return this._worker._updateWorkerActivity(this.sid,e).then((()=>this))}},V=r(142).Gf;class J{constructor(e,t,r){if(!e)throw V.INVALID_ARGUMENT.clone("Error instantiating Paginator. <Array>items is a required parameter.");if(!t)throw V.INVALID_ARGUMENT.clone("Error instantiating Paginator. <Function>source is a required parameter.");this._nextToken=r,this._source=t,this.hasNextPage=!!this._nextToken,this.items=e}nextPage(){return this.hasNextPage?this._source(this._nextToken):Promise.reject(V.TASKROUTER_ERROR.clone("Error getting the next page. No next page exists."))}}class K{constructor(e,t,r={}){if(!s().isObject(e))throw new TypeError("Failed to initialize ActivitiesEntity. <Worker>worker is a required parameter.");this._activities=new Map,this._log=e.getLogger(`ActivitiesEntity-${e.sid}`),this._request=t,this._worker=e,this._pageSize=r.pageSize||h.L8,s().inRange(this._pageSize,1,h.L8+1)||(this._log.warn("PageSize range for ActivitiesEntity must be between 1 and %d. Setting pageSize to default size=%d",h.L8,h.L8),this._pageSize=1e3)}get activities(){return this._activities}fetchActivities(){const e=this._getPage();return this._getAllActivities(e)}_getAllActivities(e){return e.then((e=>(e.items.forEach((e=>{this._insertActivity(e)})),e.hasNextPage?this._getAllActivities(e.nextPage()):Promise.resolve())))}_getPage(e){e=e||{};const t=this._worker.getRoutes().getRoute(D).path,r={PageSize:this._pageSize};return e.AfterSid&&(r.AfterSid=e.AfterSid),this._request.get(t,h.x6,r).then((e=>new J(e.contents.map((e=>new M(e))),(e=>this._getPage({AfterSid:e})),e.after_sid)))}_insertActivity(e){const t=e.sid;this._log.trace(`_insertActivity(sid=${t}, data=${JSON.stringify(e)}`);try{const r=new Q(this._worker,e);this._activities.set(t,r)}catch(e){this._log.error(`Unable to create an Activity for sid=${t}. Skipping insert into Activities map. Error: ${e}`)}}}class Y{constructor(e){if(!s().isObject(e))throw new TypeError("Failed to instantiate WorkerChannelDescriptor. <Descriptor>descriptor is required.");if(!ee.every((t=>t in e)))throw new TypeError("Failed to create a WorkerChannelDescriptor. <Descriptor>descriptor does not contain all properties of a Channel.");this.accountSid=e.account_sid,this.assignedTasks=e.assigned_tasks,this.available=!!e.available,this.availableCapacityPercentage=e.available_capacity_percentage,this.capacity=e.configured_capacity,this.dateCreated=(0,z.T)(1e3*e.date_created),this.dateUpdated=(0,z.T)(1e3*e.date_updated),this.lastReservedTime=(0,z.T)(e.last_reserved_time),this.sid=e.sid,this.taskChannelSid=e.task_channel_sid,this.taskChannelUniqueName=e.task_channel_unique_name,this.workerSid=e.worker_sid,this.workspaceSid=e.workspace_sid}}const X=["capacity","available","assignedTasks","availableCapacityPercentage","dateUpdated","lastReservedTime"];class Z extends l.EventEmitter{constructor(e,t,r){if(super(),!(e instanceof qe))throw new TypeError("Failed to instantiate Worker. <Worker>worker is a required parameter.");if(!(r instanceof Y))throw new TypeError("Failed to instantiate Channel. <WorkerChannelDescriptor>descriptor is a required parameter.");this._request=t,this._log=e.getLogger(`Channel-${r.sid}`),Object.assign(this,r)}_emitEvent(e,t){if(!s().isString(e))throw new TypeError("Error calling _emitEvent(). <string>eventType is a required parameter.");if(!s().isObject(t))throw new TypeError("Error calling method _emitEvent(). <object>rawEventData is a required parameter.");this._update(t),this.emit(e,this)}_update(e){try{const t=new Y(e);X.forEach((e=>{this[e]=t[e]}))}catch(t){this._log.warn("Failed to update Channel sid=%s. Update aborted. Error: %s.",e.sid,t)}return this}}const ee=["account_sid","assigned_tasks","available","available_capacity_percentage","configured_capacity","date_created","date_updated","last_reserved_time","sid","task_channel_sid","task_channel_unique_name","worker_sid","workspace_sid"],te=Z;class re{constructor(e,t,r={}){if(!(e instanceof qe))throw new TypeError("Failed to initialize ChannelsEntity. <Worker>worker is a required parameter.");this._channels=new Map,this._log=e.getLogger("ChannelsEntity"),this._request=t,this._pageSize=r.pageSize||h.L8,this._worker=e,s().inRange(this._pageSize,1,h.L8+1)||(this._log.warn("PageSize range for ChannelsEntity must be between 1 and %d. Setting pageSize to default size=%d",h.L8,h.L8),this._pageSize=1e3)}get channels(){return this._channels}fetchChannels(){const e=this._getPage();return this._getAllChannels(e)}_getAllChannels(e){return e.then((e=>(e.items.forEach((e=>{this._insertChannel(e)})),e.hasNextPage?this._getAllChannels(e.nextPage()):Promise.resolve())))}_getPage(e){e=e||{};const t=this._worker.getRoutes().getRoute(N).path,r={PageSize:this._pageSize};return e.AfterSid&&(r.AfterSid=e.AfterSid),this._request.get(t,h.x6,r).then((e=>new J(e.contents.map((e=>new Y(e))),(e=>this._getPage({AfterSid:e})),e.after_sid)))}_insertChannel(e){const t=e.sid;this._log.trace(`_insertChannel(sid=${t}, data=${JSON.stringify(e)}`);try{const r=new te(this._worker,this._request,e);this._channels.set(t,r)}catch(e){this._log.error(`Unable to create a Channel for sid=${t}. Skipping insert into Channels map. Error: ${e}`)}}}class ie{constructor(e){if(!s().isObject(e))throw new TypeError("Failed to instantiate TransferDescriptor. <Descriptor>descriptor is required.");if(!oe.every((t=>t in e)))throw new TypeError("Failed to instantiate TransferDescriptor. <Descriptor>descriptor does not contain all properties of a Transfer.");this.dateCreated=(0,z.T)(1e3*e.date_created),this.dateUpdated=(0,z.T)(1e3*e.date_updated),this.mode=e.transfer_mode,this.queueSid=e.initiating_queue_sid,this.reservationSid=e.initiating_reservation_sid,this.to=e.transfer_to,this.transferFailedReason=e.transfer_failed_reason,this.type=e.transfer_type,this.sid=e.sid,this.status=e.transfer_status,this.workerSid=e.initiating_worker_sid,this.workflowSid=e.initiating_workflow_sid}}const se=["dateUpdated","status","transferFailedReason"];class ne extends l.EventEmitter{constructor(e,t){if(super(),!(t instanceof ie))throw new TypeError("Failed to instantiate Transfer. <TransferDescriptor>descriptor is a required parameter.");this._log=e.getLogger(`Transfer-${t.sid}`),Object.assign(this,t)}_update(e){try{const t=new ie(e);se.forEach((e=>{this[e]=t[e]}))}catch(t){throw this._log.error(`Failed to update Transfer sid=${e.sid}. Update aborted.`,t),new Error(`Failed to update Transfer sid=${e.sid}. Update aborted. Error: ${t}.`)}return this}}const oe=["date_created","date_updated","initiating_reservation_sid","initiating_worker_sid","initiating_queue_sid","initiating_workflow_sid","sid","transfer_mode","transfer_to","transfer_type","transfer_status"],ae=ne;const de=class extends ae{constructor(e,t){super(e,t)}};const ce=class extends ae{constructor(e,t,r,i){if(super(e,i),"string"!=typeof r)throw new TypeError("Failed to instantiate OutgoingTransfer. <string>taskSid is a required parameter.");this._worker=e,this._request=t,this.taskSid=r}_emitEvent(e,t){if(this._log.trace(`_emitEvent(${e}, ${JSON.stringify(t)})`),!s().isString(e))throw new TypeError("Error calling _emitEvent(). <string>eventType is a required parameter.");if(!s().isObject(t))throw new TypeError("Error calling method _emitEvent(). <object>payload is a required parameter.");this.emit(e,this)}async cancel(){const e=this._worker.getRoutes().getRoute(F,this.sid).path,t={TaskSid:this.taskSid,TransferStatus:h.Uf.canceled},r=await this._request.post(e,t,h.F3);return this._update(r)}};class he extends l.EventEmitter{constructor(e,t,r){if(super(),!(r instanceof ke))throw new TypeError("Failed to instantiate Transfers. <TaskDescriptor>taskDescriptor is a required parameter.");this._log=e.getLogger(`Transfers-${r.sid}`),this._worker=e,this._request=t,this.incoming=r.incomingTransferDescriptor?new de(e,r.incomingTransferDescriptor):null,this.outgoing=r.outgoingTransferDescriptor?new ce(e,t,r.sid,r.outgoingTransferDescriptor):null}_emitEvent(e,t){if(this._log.trace(`_emitEvent(${e}, ${JSON.stringify(t)})`),!s().isString(e))throw new TypeError("Error calling _emitEvent(). <string>eventType is a required parameter.");if(!s().isObject(t))throw new TypeError("Error calling method _emitEvent(). <object>payload is a required parameter.");const r=h._G[e];this.outgoing?this.outgoing.sid===t.sid?Object.keys(s().pick(h._G,["transfer-attempt-failed","transfer-completed","transfer-failed","transfer-canceled"])).indexOf(e)>-1&&(this._updateOutgoing(t),this.outgoing._emitEvent(r,t)):this._log.warn("The transfer %s specified by Event: transfer.%s does not match the current active outgoing transfer for Worker %s. Skipping event.",t.sid,r,this._worker.sid):this._log.warn("An active outgoing transfer does currently exist in Worker %s transfers map for Event: transfer.%s. Skipping event.",this._worker.sid,r)}_updateOutgoing(e,t=!1){!this.outgoing||t?this.outgoing=new ce(this._worker,this._request,e.task_sid,new ie(e)):this.outgoing._update(e)}_update(e){if(e.incoming)if(this.incoming)this.incoming._update(e.incoming);else{const t=new ie(e.incoming);this.incoming=new de(this._worker,this._request,e.incoming.task_sid,t)}if(e.outgoing)if(this.outgoing)this.outgoing._update(e.outgoing);else{const t=new ie(e.outgoing);this.outgoing=new ce(this._worker,this._request,e.outgoing.task_sid,t)}}}const le=he,ue=["attributes","status","workflowSid","workflowName","queueSid","queueName","priority","reason","routingTarget","timeout","taskChannelSid","taskChannelUniqueName","age","addOns","dateUpdated","transfers","version"];class pe extends l.EventEmitter{constructor(e,t,r,i){if(super(),!(e instanceof qe))throw new TypeError("Failed to instantiate Task. <Worker>worker is a required parameter.");if(!i)throw new TypeError("Failed to instantiate Task. <TaskDescriptor>descriptor is a required parameter.");if(!(i instanceof ke))throw new TypeError("descriptor should be of type <TaskDescriptor>");if("string"!=typeof r)throw new TypeError("Failed to instantiate Task. <string>reservationSid is a required parameter.");this._worker=e,this._log=e.getLogger(`Task-${i.sid}`),this._request=t,this.transfers=new le(e,t,i),Object.assign(this,i),this.reservationSid=r}complete(e){if(!s().isString(e))throw new TypeError("Error calling method complete(). <string>reason is a required parameter.");const t=this._worker.getRoutes().getRoute(x,this.sid).path,r={AssignmentStatus:h.Qh,Reason:e};return this._request.post(t,r,h.x6,this.version).then((e=>this._update(e)))}async transfer(e,t={}){if(!s().isString(e))throw new TypeError("Error calling method transfer(). <string>to is a required parameter.");const r=this._worker.getRoutes().getRoute(j).path,i={ReservationSid:this.reservationSid,TaskSid:this.sid,To:e};t.attributes&&(i.Attributes=t.attributes),t.mode&&(i.Mode=t.mode),t.priority&&(i.Priority=t.priority);const n=await this._request.post(r,i,h.F3);return this._log.info(`Received response to transfer request to Worker/TaskQueue=${e}`),this._log.debug("Response object",n),this.transfers._updateOutgoing(n,!0),this}wrapUp(e={}){const t=this._worker.getRoutes().getRoute(x,this.sid).path,r={AssignmentStatus:h.Nt};if(e.reason){if(!s().isString(e.reason))throw new Error(`Failed to call wrapUp() on Task sid=${this.sid}. A <string>reason is required.`);r.Reason=e.reason}return this._request.post(t,r,h.x6,this.version).then((e=>this._update(e)))}setAttributes(e){if(!s().isObject(e))throw new TypeError("Unable to set attributes on Task. <object>attributes is a required parameter.");const t=this._worker.getRoutes().getRoute(x,this.sid).path,r={Attributes:e};return this._request.post(t,r,h.x6,this.version).then((e=>this._update(e)))}updateParticipant(e){const t={hold:e=>s().isBoolean(e),holdUrl:e=>s().isString(e),holdMethod:e=>s().isString(e)};if(!(0,z.n)(e,t))throw new TypeError(`Failed to update Participant tied to Task sid=${this.sid}. The options passed in did not match the required types.`);const r=this._worker.getRoutes().getRoute(P).path,i={TaskSid:this.sid};for(const t in e)i[s().upperFirst(t)]=e[t];return this._request.post(r,i,h.F3).then((e=>this._update(e)))}kick(e){if(!s().isString(e))throw new TypeError("Error calling method kick(). <string>workerSid is a required parameter.");const t=this._worker.getRoutes().getRoute($).path,r={TaskSid:this.sid,TargetWorkerSid:e};return this._request.post(t,r,h.F3).then((e=>this._update(e)))}hold(e,t,r){const i={holdUrl:e=>s().isString(e),holdMethod:e=>s().isString(e)};if(!s().isString(e))throw new TypeError("Error calling method hold(). <string>targetWorkerSid is a required parameter.");if(!s().isBoolean(t))throw new TypeError("Error calling method hold(). <boolean>onHold is a required parameter that is either true or false.");if(!(0,z.n)(r,i))throw new TypeError(`Failed to update Participant tied to Task sid=${this.sid}. The options passed in did not match the required types.`);const n=this._worker.getRoutes().getRoute(L).path,o={TaskSid:this.sid,TargetWorkerSid:e,Hold:t};for(const e in r)o[s().upperFirst(e)]=r[e];return this._request.post(n,o,h.F3).then((e=>this._update(e)))}fetchLatestVersion(){const e=this._worker.getRoutes().getRoute(x,this.sid).path;return this._request.get(e,h.x6).then((e=>this._update(e)))}_emitEvent(e,t){if(this._log.trace(`_emitEvent(${e}, ${JSON.stringify(t)})`),!s().isString(e))throw new TypeError("Error calling _emitEvent(). <string>eventType is a required parameter.");if(!s().isObject(t))throw new TypeError("Error calling method _emitEvent(). <object>payload is a required parameter.");this.emit(e,this,t)}async _emitEventForOutgoingTransfer(e,t){if(this._log.debug(`_emitEventForOutgoingTransfer(${e}, ${JSON.stringify(t)})`),!s().isString(e))throw new TypeError("Error calling _emitEventForOutgoingTransfer(). <string>eventType is a required parameter.");if(!s().isObject(t))throw new TypeError("Error calling method _emitEventForOutgoingTransfer(). <object>payload is a required parameter.");this.transfers.outgoing||this._log.debug("The transfers.outgoing object is NOT present");let r=0;for(;!this.transfers.outgoing&&r<20;)await new Promise((e=>setTimeout(e,500))),r++,this._log.debug("Transfer event arrived, waiting for API response, because transfer object missing",r);for(r=0;this.transfers.outgoing&&this.transfers.outgoing.sid!==t.sid&&r<20;)await new Promise((e=>setTimeout(e,500))),r++,this._log.debug("Transfer event arrived, waiting for API response to get the correct transfer SID",r);this._log.debug("Transfer sid from API response:",this.transfers&&this.transfers.outgoing?this.transfers.outgoing.sid:"No sid"),this._log.debug("Transfer sid from event:",t.sid),this.transfers.outgoing&&this.transfers.outgoing.sid===t.sid?Object.keys(s().pick(h._G,[h.PQ])).indexOf(e)>-1?(this.transfers._updateOutgoing(t),this.emit(h._G[h.PQ],this.transfers.outgoing)):this.transfers._emitEvent(e,t):this._log.debug(`The transfers.outgoing object is either not present or does not match the transfer sid in the event. ${JSON.stringify(t)}`)}_update(e,t={}){try{const r=new ke(e,this._config);ue.forEach((e=>{"transfers"===e?(t.incoming||t.outgoing)&&this.transfers._update(t):this[e]=r[e]}))}catch(t){throw this._log.error(`Failed to update Task sid=${e.sid}. Update aborted.`,t),new Error(`Failed to update Task sid=${e.sid}. Update aborted. Error: ${t}.`)}return this}}const ge=["addons","age","attributes","date_created","date_updated","priority","queue_name","queue_sid","reason","routing_target","sid","assignment_status","task_channel_unique_name","task_channel_sid","timeout","workflow_name","workflow_sid","version"],_e=pe;class ke{constructor(e){if(!s().isObject(e))throw new TypeError("Failed to instantiate TaskDescriptor. <Descriptor>descriptor is required.");if(!ge.every((t=>t in e)))throw new TypeError("Failed to instantiate TaskDescriptor. <Descriptor>descriptor does not contain all properties of a Task.");this.addOns=JSON.parse(e.addons),this.age=e.age,this.attributes=JSON.parse(e.attributes),this.dateCreated=(0,z.T)(1e3*e.date_created),this.dateUpdated=(0,z.T)(1e3*e.date_updated),this.priority=e.priority,this.queueName=e.queue_name,this.queueSid=e.queue_sid,this.reason=e.reason,this.routingTarget=e.routing_target,this.sid=e.sid,this.status=e.assignment_status,this.taskChannelUniqueName=e.task_channel_unique_name,this.taskChannelSid=e.task_channel_sid,this.timeout=e.timeout,this.workflowName=e.workflow_name,this.workflowSid=e.workflow_sid,this.incomingTransferDescriptor=null,this.outgoingTransferDescriptor=null,this.version=String(e.version)}}class fe{constructor(e,t,r=[]){if(!s().isObject(e))throw new TypeError("Failed to instantiate ReservationDescriptor. <Descriptor>descriptor is required.");if(!s().isObject(t))throw new TypeError("Failed to instantiate ReservationDescriptor. <Worker>worker is required.");const i=s().filter(Ee,(e=>-1===r.indexOf(e)));if(!s().every(i,(t=>t in e))){const t=s().difference(i,Object.keys(e)).join(", ");throw new TypeError(`Failed to instantiate ReservationDescriptor. <Descriptor>descriptor does not contain all properties of a Reservation. Missing: ${t}`)}this.accountSid=e.account_sid,this.dateCreated=(0,z.T)(1e3*e.date_created),this.dateUpdated=(0,z.T)(1e3*e.date_updated),this.sid=e.sid,this.status=e.reservation_status,this.timeout=e.reservation_timeout,this.workerSid=e.worker_sid,this.workspaceSid=e.workspace_sid,this.taskDescriptor=null,this.version=String(e.version),e.canceled_reason_code&&(this.canceledReasonCode=e.canceled_reason_code);const n=t.getLogger(`ReservationDescriptor-${this.sid}`);if(-1===r.indexOf("task"))try{this.taskDescriptor=new ke(e.task)}catch(e){throw n.error("Failed to create a ReservationDescriptor. The 'task' property is malformed."),e}if(-1===r.indexOf(h.fc.taskTransfer)&&"object"==typeof e.task_transfer)try{this.taskDescriptor.incomingTransferDescriptor=new ie(e.task_transfer),this.transferDescriptor=new ie(e.task_transfer)}catch(e){throw n.error("Failed to create a ReservationDescriptor. The 'task_transfer' property is malformed."),e}if(-1===r.indexOf(h.fc.activeOutgoingTaskTransfer)&&"object"==typeof e.active_outgoing_task_transfer)try{this.taskDescriptor.outgoingTransferDescriptor=new ie(e.active_outgoing_task_transfer)}catch(e){throw n.error("Failed to create a ReservationDescriptor. The 'active_outgoing_task_transfer' property is malformed."),e}}}const ve=r(834).n,we=["dateUpdated","canceledReasonCode","status","timeout","task","task_transfer","version"],me=["reservation_timeout","task","canceled_reason_code"];class Se extends l.EventEmitter{constructor(e,t,r){if(super(),!(e instanceof qe))throw new TypeError("Failed to instantiate Reservation. <Worker>worker is a required parameter.");if(!(r instanceof fe))throw new TypeError("Failed to instantiate Reservation. <ReservationDescriptor>descriptor is a required parameter.");this._worker=e,this._log=e.getLogger(`Reservation-${r.sid}`),this._request=t,this.task=this._createTask(r),r.transferDescriptor&&(this.transfer=this._createTransfer(r)),Object.assign(this,r),delete this.taskDescriptor,delete this.transferDescriptor}accept(){const e=this._worker.getRoutes().getRoute(A,this.sid).path,t={ReservationStatus:h.M0};return this._request.post(e,t,h.x6,this.version).then((e=>this._update(e,me)))}complete(){const e=this._worker.getRoutes().getRoute(A,this.sid).path,t={ReservationStatus:h.in};return this._request.post(e,t,h.x6,this.version).then((e=>this._update(e,me)))}reject(e={}){const t=this._worker.getRoutes().getRoute(A,this.sid).path,r={ReservationStatus:h.j3};if(!ve(e,{activitySid:e=>s().isString(e)}))throw new TypeError(`Failed to issue Instruction:reject on Reservation sid=${this.sid}. The options passed in did not match the required types.`);for(const t in e)r[h.iR[t]]=e[t];return this._request.post(t,r,h.x6,this.version).then((e=>this._update(e,me)))}wrap(){const e=this._worker.getRoutes().getRoute(A,this.sid).path,t={ReservationStatus:h.hO};return this._request.post(e,t,h.x6,this.version).then((e=>this._update(e,me)))}call(e,t,r={}){if(!s().isString(e))throw new TypeError("Error calling method call(). <string>from is a required parameter.");if(!s().isString(t))throw new TypeError("Error calling method call(). <string>url is a required parameter.");const i=this._worker.getRoutes().getRoute(A,this.sid).path,n={Instruction:h.O,CallFrom:e,CallUrl:t};if(!ve(r,{accept:e=>s().isBoolean(e),record:e=>s().isString(e),statusCallbackUrl:e=>s().isString(e),timeout:e=>s().isInteger(e),to:e=>s().isString(e)}))throw new TypeError(`Failed to issue Instruction:call on Reservation sid=${this.sid}. The options passed in did not match the required types.`);for(const e in r)n[h.xf[e]]=r[e];return this._request.post(i,n,h.x6).then((e=>this._update(e,me)))}dequeue(e={}){const t=this._worker.getRoutes().getRoute(A,this.sid).path,r={Instruction:h.iz};if(!ve(e,{from:e=>s().isString(e),to:e=>s().isString(e),postWorkActivitySid:e=>s().isString(e),record:e=>s().isString(e),timeout:e=>s().isInteger(e),statusCallbackUrl:e=>s().isString(e),statusCallbackEvents:e=>s().isString(e)}))throw new TypeError(`Failed to issue Instruction:dequeue on Reservation sid=${this.sid}. The options passed in did not match the required types.`);for(const t in e)r[h.EA[t]]=e[t];return this._request.post(t,r,h.x6).then((e=>this._update(e,me)))}redirect(e,t,r={}){if(!s().isString(e))throw new TypeError("Error calling method redirect(). <string>callSid is a required parameter.");if(!s().isString(t))throw new TypeError("Error calling method redirect(). <string>url is a required parameter.");const i=this._worker.getRoutes().getRoute(A,this.sid).path,n={accept:e=>s().isBoolean(e)},o={Instruction:h.nB,RedirectCallSid:e,RedirectUrl:t};if(!ve(r,n))throw new TypeError(`Failed to issue Instruction:redirect on Reservation sid=${this.sid}. The options passed in did not match the required types.`);for(const e in r)o[h.qG[e]]=r[e];return this._request.post(i,o,h.x6).then((e=>this._update(e,me)))}conference(e={}){if(!ve(e,{to:e=>s().isString(e),from:e=>s().isString(e),timeout:e=>s().isInteger(e),statusCallback:e=>s().isString(e),statusCallbackMethod:e=>s().isString(e),statusCallbackEvent:e=>s().isString(e),record:e=>s().isString(e),muted:e=>s().isBoolean(e),beep:e=>s().isBoolean(e)||s().isString(e),startConferenceOnEnter:e=>s().isBoolean(e),endConferenceOnExit:e=>s().isBoolean(e),endConferenceOnCustomerExit:e=>s().isBoolean(e),waitUrl:e=>s().isString(e),waitMethod:e=>s().isString(e),earlyMedia:e=>s().isBoolean(e),maxParticipants:e=>s().isInteger(e),conferenceStatusCallback:e=>s().isString(e),conferenceStatusCallbackMethod:e=>s().isString(e),conferenceStatusCallbackEvent:e=>s().isString(e),conferenceRecord:e=>s().isBoolean(e)||s().isString(e),conferenceTrim:e=>s().isString(e),recordingChannels:e=>s().isString(e),recordingStatusCallback:e=>s().isString(e),recordingStatusCallbackMethod:e=>s().isString(e),conferenceRecordingStatusCallback:e=>s().isString(e),conferenceRecordingStatusCallbackMethod:e=>s().isString(e),region:e=>s().isString(e),sipAuthUsername:e=>s().isString(e),sipAuthPassword:e=>s().isString(e)}))throw new TypeError(`Failed to issue Instruction:conference on Reservation sid=${this.sid}. The options passed in did not match the required types.`);const t=this._worker.getRoutes().getRoute(A,this.sid).path,r={Instruction:h.FB};for(const t in e)r[s().upperFirst(t)]=e[t];return this._request.post(t,r,h.x6).then((()=>this))}updateParticipant(e){if(!ve(e,{endConferenceOnExit:e=>s().isBoolean(e),mute:e=>s().isBoolean(e),beepOnExit:e=>s().isBoolean(e)}))throw new TypeError(`Failed to update Worker Participant tied to Reservation sid=${this.sid}. The options passed in did not match the required types.`);const t=this._worker.getRoutes().getRoute(U).path,r={ReservationSid:this.sid};for(const t in e)r[s().upperFirst(t)]=e[t];return this._request.post(t,r,h.F3).then((()=>this))}fetchLatestVersion(){const e=this._worker.getRoutes().getRoute(A,this.sid).path;return this._request.get(e,h.x6).then((e=>this._update(e)))}_createTask(e){if(!(e instanceof fe))return this._log.error(`Error calling method _createTask() for Reservation sid=${this.sid}. <ReservationDescriptor>reservationDescriptor is a required parameter.`),{};const t=e.taskDescriptor;try{return new _e(this._worker,this._request,e.sid,t)}catch(e){return this._log.error(`Failed to create a Task for Reservation sid=${this.sid}. Error: ${e}`),{}}}_createTransfer(e){if(!(e instanceof fe))return this._log.error(`Error calling method _createTransfer() for Reservation sid=${this.sid}. <ReservationDescriptor>reservationDescriptor is a required parameter.`),{};const t=e.transferDescriptor;try{return new de(this._worker,t)}catch(e){return this._log.error(`Failed to create a Transfer for Reservation sid=${this.sid}. Error: ${e}`),{}}}_update(e,t=[]){try{const r=new fe(e,this._worker,t);we.forEach((i=>{if("task"===i){if(-1===t.indexOf("task")){const t=e.task_transfer,r=e.active_outgoing_task_transfer;this.task._update(e.task,{incoming:t,outgoing:r})}}else"canceledReasonCode"===i?-1===t.indexOf("canceled_reason_code")&&e.canceled_reason_code&&(this[i]=r[i]):"task_transfer"===i&&e.task_transfer?this.transfer._update(e.task_transfer):this[i]=r[i]}))}catch(t){throw this._log.error(`Failed to update Reservation sid=${e.sid}. Update aborted. Error: ${t}.`),t}return this}_emitEvent(e,t){if(!s().isString(e))throw new TypeError("Error calling _emitEvent(). <string>eventType is a required parameter.");if(!s().isObject(t))throw new TypeError("Error calling method _emitEvent(). <object>rawEventData is a required parameter.");this._update(t),this.emit(e,this)}}const Ee=["account_sid","date_created","date_updated","reservation_status","sid","task","reservation_timeout","worker_sid","workspace_sid","version"],ye=Se;class Te extends l.EventEmitter{constructor(e,t,r={}){if(super(),!(e instanceof qe))throw new TypeError("Failed to initialize ReservationsEntity. <Worker>worker is a required parameter.");this._worker=e,this._log=e.getLogger("ReservationsEntity"),this._request=t,this._reservations=new Map,this._reservationSidsByTask=new Map,this._pageSize=r.pageSize||h.L8,s().inRange(this._pageSize,1,h.L8+1)||(this._log.warn("PageSize range for ReservationsEntity must be between 1 and %d. Setting pageSize to default size=%d",h.L8,h.L8),this._pageSize=1e3)}get reservations(){return new Map(Array.from(this._reservations).filter((e=>!e[1][1])).map((e=>[e[0],e[1][0]])))}fetchReservations(){const e=this._getPage();return this._reservations.clear(),this._getAllReservations(e)}_getAllReservations(e){return e.then((e=>{e.items.forEach((e=>{this._insertReservation(e)})),e.hasNextPage&&this._getAllReservations(e.nextPage())}))}_getPage(e){e=e||{};const t=this._worker.getRoutes().getRoute(W).path,r={Active:"true",PageSize:this._pageSize};return e.AfterSid&&(r.AfterSid=e.AfterSid),this._request.get(t,h.F3,r).then((e=>new J(e.contents.map((e=>new fe(e,this._worker))),(e=>this._getPage({AfterSid:e})),e.after_sid)))}_insertReservation(e){const t=e.sid;this._log.trace("_insertReservation(sid=%s, data=%s)",t,JSON.stringify(e)),this._reservations.has(t)&&this._log.debug("Reservation %s already exists for Worker %s. Attempting to overwrite it.",t,this._worker.sid);try{const r=new ye(this._worker,this._request,e);return this._reservations.set(t,[r,!1]),this._reservationSidsByTask.has(r.task.sid)?this._reservationSidsByTask.get(r.task.sid).add(r.sid):this._reservationSidsByTask.set(r.task.sid,new Set([r.sid])),this._log.debug("Successfully created and inserted %s for %s to Task-Reservation lookup. Contents: %s",r.sid,r.task.sid,this._reservationSidsByTask.get(r.task.sid)),r}catch(e){throw this._log.error("Unable to create a Reservation for sid=%s. Skipping insert into Reservations map. Error: %s",t,e),e}}insert(e){this._log.trace("_insertReservation(sid=%s, data=%s)",e.sid,JSON.stringify(e));const t=new fe(e,this._worker);return this._insertReservation(t)}getTasks(e){if(!this._reservationSidsByTask.has(e))return null;const t=this._reservationSidsByTask.get(e),r=[];return t.forEach((e=>{const t=this._reservations.get(e);t&&t[0].task&&r.push(t[0].task)})),r}_deleteByReservationSid(e){this._log.trace("_deleteByReservationSid(sid=%s)",e);const t=this.reservations.get(e);t?(this._log.info("Found Reservation sid=%s for Worker %s. Removing reservation and task.",e,this._worker.sid),this._cleanUpReservationAndTask(t)):this._log.info("Reservation with sid=%s not found. Unable to remove Reservation.",e)}_cleanUpReservationAndTask(e){this._log.debug("Soft deleting Reservation sid=%s for Worker %s",e.sid,this._worker.sid),this._reservations.set(e.sid,[e,!0]),setTimeout((()=>{this._log.debug("Hard deleting of Reservation sid=%s for Worker %s",e.sid,this._worker.sid),this._reservations.delete(e.sid)||this._log.warn("Failed to hard delete Reservation sid=%s for Worker %s",e.sid,this._worker.sid)}),5e3)}}class be{constructor(e,t={}){this._worker=e,this._logLevel=t.logLevel||"error",this._log=new d("WorkerEventHandler",this._logLevel)}getTREventsToHandlerMapping(){return{"worker.activity.update":"_workerActivityUpdateHandler","worker.attributes.update":"_workerAttributesUpdateHandler","worker.capacity.update":"_workerCapacityUpdateHandler","worker.channel.availability.update":"_workerChannelAvailabilityUpdateHandler","reservation.created":"_reservationCreatedHandler","reservation.failed":"_reservationFailedHandler","reservation.accepted":"_reservationUpdateHandler","reservation.wrapup":"_reservationUpdateHandler","reservation.completed":"_reservationCleanupEventsHandler","reservation.rejected":"_reservationCleanupEventsHandler","reservation.timeout":"_reservationCleanupEventsHandler","reservation.canceled":"_reservationCleanupEventsHandler","reservation.rescinded":"_reservationCleanupEventsHandler","task.updated":"_taskTypeEventHandler","task.canceled":"_taskTypeEventHandler","task.completed":"_taskTypeEventHandler","task.wrapup":"_taskTypeEventHandler","task.transfer-attempt-failed":"_transferTaskEventHandler","task.transfer-completed":"_transferTaskEventHandler","task.transfer-failed":"_transferTaskEventHandler","task.transfer-initiated":"_transferTaskEventHandler","task.transfer-canceled":"_transferTaskEventHandler"}}_workerActivityUpdateHandler(e){if(this._log.info("Worker %s received Event: worker.activity.update. Proceeding to update ...",this._worker.sid),!e.activity_sid)throw this._log.error("Event: worker.activity.update did not contain an activity_sid. Unable to update Worker %s.",this._worker.sid),new Error(`Failed to update Worker ${this._worker.sid} activity.`);{const t=this._worker.activities.get(e.activity_sid);if(!t)throw this._log.error("The Activity sid=%s specified in Event: worker.activity.update does not exist in the Worker's map of Activities. Unable to update Worker %s activity.",e.activity_sid,this._worker.sid),new Error(`Failed to update Worker ${this._worker.sid} activity.`);this._worker.activity._isCurrent=!1,this._worker.activity=t,t._isCurrent=!0,this._worker.emit("activityUpdated",this._worker._update(e))}}_workerAttributesUpdateHandler(e){this._log.info(`Worker ${this._worker.sid} received Event: worker.attributes.update. Proceeding to update ...`),this._worker.emit("attributesUpdated",this._worker._update(e))}_workerCapacityUpdateHandler(e){if(this._log.info(`Worker ${this._worker.sid} received Event: worker.capacity.update.`),!e.sid)throw this._log.error("Event: worker.capacity.update did not contain a Channel sid. Unable to update Channel for Worker %s.",this._worker.sid),new Error(`Failed to update Worker ${this._worker.sid} channel.`);{const t=this._worker.channels.get(e.sid);if(!t)throw this._log.error("The Channel sid=%s specified in Event: worker.capacity.update does not exist in the Worker's map of Channels. Unable to update Worker %s channel.",e.sid,this._worker.sid),new Error(`Failed to update Worker ${this._worker.sid} channel.`);t._emitEvent("capacityUpdated",e)}}_workerChannelAvailabilityUpdateHandler(e){if(this._log.info("Worker %s received Event: worker.channel.availability.update.",this._worker.sid),!e.sid)throw this._log.error("Event: worker.capacity.update did not contain a Channel sid. Unable to update Channel for Worker %s.",this._worker.sid),new Error(`Failed to update Worker ${this._worker.sid} channel.`);{const t=this._worker.channels.get(e.sid);if(!t)throw this._log.error("The Channel sid=%s specified in Event: worker.channel.availability.update does not exist in the Worker's map of Channels. Unable to update Worker %s channel.",e.sid,this._worker.sid),new Error(`Failed to update Worker ${this._worker.sid} channel.`);t._emitEvent("availabilityUpdated",e)}}_reservationCreatedHandler(e){if(this._log.info("Worker %s received Event: reservation.created.",this._worker.sid),!e.sid)throw this._log.error("Event: reservationCreated did not contain a Reservation sid. Unable to create a Reservation for Worker %s.",this._worker.sid),new Error(`Failed to create Reservation for Worker ${this._worker.sid}.`);try{this._log.info("Attempting to create and insert Reservation into Worker %s reservations map.",this._worker.sid);const t=this._worker._dataServices.reservationsEntity.insert(e);this._worker._bumpVersion(),this._worker.emit("reservationCreated",t)}catch(e){throw this._log.info("Failed to create and insert Reservation into Worker %s reservations map.",this._worker.sid),new Error(`Failed to create a Reservation for Worker ${this._worker.sid} on Event: reservationCreated. Error: ${e}`)}}_reservationFailedHandler(e){this._log.info("Worker %s received Event: reservation.failed.",this._worker.sid),this._worker.emit("reservationFailed",e)}_reservationUpdateHandler(e,t){const r=h.zb[t];if(this._log.info("Worker %s received Event: %s mapped to %s.",this._worker.sid,t,r),!e.sid)throw this._log.error(`Event: reservation.${r} did not contain a Reservation sid. Unable to update Reservation for Worker ${this._worker.sid}`),new Error(`Failed to update Reservation for Worker ${this._worker.sid}.`);{const t=this._worker.reservations.get(e.sid);if(!t)throw this._log.error(`The Resevation sid=${e.sid} specified in Event: reservation.${r} does not exist in the Worker's map of Reservations. Unable to update Worker ${this._worker.sid} reservation.`),new Error(`Failed to update Worker ${this._worker.sid} reservation.`);t._emitEvent(r,e)}}_reservationCleanupEventsHandler(e,t){const r=h.zb[t];if(this._log.info("Worker %s received Event: %s mapped to %s.",this._worker.sid,t,r),!e.sid)throw this._log.error("Event: reservation.%s did not contain a Reservation sid. Unable to update Reservation for Worker %s.",r,this._worker.sid),new Error(`Failed to update Reservation for Worker ${this._worker.sid}.`);{const t=this._worker.reservations.get(e.sid);t?(this._worker._dataServices.reservationsEntity._deleteByReservationSid(e.sid),t._emitEvent(r,e)):this._log.warn("The reservation specified by Event: reservation.%s does not exist in Worker %s Reservations map. Skipping event.",r,this._worker.sid)}}_taskTypeEventHandler(e,t){const r=h.L3[t];if(this._log.info("Worker %s received Event: %s mapped to %s.",this._worker.sid,t,r),!e.sid)throw this._log.error("Event: task.%s did not contain a Task sid. Unable to emit event for Worker %s.",r,this._worker.sid),new Error(`Failed to emit event for Worker ${this._worker.sid}.`);{const t=this._worker._dataServices.reservationsEntity.getTasks(e.sid);t&&t.length>0?t.forEach((t=>{t._update(e),t._emitEvent(r,e)})):this._log.warn("The task specified by Event: task.%s does not exist in Worker %s Reservations map. Skipping event.",r,this._worker.sid)}}_transferTaskEventHandler(e,t){const r=h.l4[t];if(this._log.info("Worker %s received Event: % mapped to %s.",this._worker.sid,t,r),!e.initiating_reservation_sid||!e.task_sid)throw this._log.error("Event: task.%s did not contain a Reservation sid or Task sid. Unable to emit event for Worker %s.",r,this._worker.sid),new Error(`Failed to emit event for Worker ${this._worker.sid}.`);{const t=this._worker.reservations.get(e.initiating_reservation_sid);t?t.task.sid===e.task_sid?t.task._emitEventForOutgoingTransfer(r,e):this._log.warn("The task %s related to Event: task.%s does not match the expected owning Reservation %s for Worker %s. Skipping event.",e.task_sid,r,t.sid,this._worker.sid):this._log.warn("The reservation %s related to Event: task.%s does not exist in Worker %s Reservations map. Skipping event.",e.initiating_reservation_sid,r,this._worker.sid)}}}const Re=["dateUpdated","dateStatusChanged","attributes","name","available","version"];class We extends l.EventEmitter{constructor(e,t={},r={Request:E,EventBridgeSignaling:f}){if(super(),!s().isString(e))throw new TypeError("Failed to instantiate Worker. <string>token is a required parameter.");const i={connectActivitySid:e=>s().isString(e),closeExistingSessions:e=>s().isBoolean(e),logLevel:e=>s().isString(e),ebServer:e=>s().isString(e),wsServer:e=>s().isString(e),region:e=>s().isString(e)};let n;(0,z.n)(t,i),this._connectActivitySid=t.connectActivitySid,this._closeExistingSessions=t.closeExistingSessions,this._logLevel=t.logLevel||"error",this._config=new c(e,t),this._log=new d(`Worker-${this._config.getLogIdentifier()}`,this._logLevel),this._request=new r.Request(this._config),this._dataServices={activitiesEntity:new K(this,this._request),channelsEntity:new re(this,this._request),reservationsEntity:new Te(this,this._request)},this._signaling=new r.EventBridgeSignaling(this,{closeExistingSessions:t.closeExistingSessions}),this._subscribeToSignalingEvents(),n=t.eventHandlerClass?new t.eventHandlerClass(this):new be(this),this.taskRouterEventHandler=n}createTask(e,t,r,i,n={}){if(!s().isString(e))throw new TypeError("Error calling method createTask(). <string>to is a required parameter.");if(!s().isString(t))throw new TypeError("Error calling method createTask(). <string>from is a required parameter.");if(!s().isString(r))throw new TypeError("Error calling method createTask(). <string>workflowSid is a required parameter.");if(!s().isString(i))throw new TypeError("Error calling method createTask(). <string>taskQueueSid is a required parameter.");const o={attributes:e=>s().isObject(e),taskChannelUniqueName:e=>s().isString(e),taskChannelSid:e=>s().isString(e)};if(!(0,z.n)(n,o))throw new TypeError(`Failed to create a Task for Worker ${this.sid}. The options passed in did not match the required types.`);const a=this.getRoutes().getRoute(O).path,d={WorkflowSid:r,TaskQueueSid:i,RoutingTarget:this.sid};for(const e in n)"attributes"===e||(d[h.VH[e]]=n[e]);const c={outbound_to:e,from:t};return d.Attributes=Object.assign({},n.attributes,c),this._request.post(a,d,h.x6).then((e=>e.sid))}getLogger(e){return new d(`${e}-${this.sid}`,this._config._logLevel)}setAttributes(e){if(!s().isObject(e))throw new TypeError("Unable to set attributes on Worker. <object>attributes is a required parameter.");const t=this.getRoutes().getRoute(q).path,r={Attributes:e};return this._request.post(t,r,h.x6,this.version).then((e=>this._update(e)))}_bumpVersion(){this.version&&(this.version=String(Number(this.version)+1))}updateToken(e){if(!s().isString(e))throw new TypeError("To update the Twilio token, a new Twilio token must be passed in. <string>newToken is a required parameter.");this._log.info("Proceeding to update the Worker's current active token with a new token."),this._log.debug("New token: "+e);try{this._config.updateToken(e),this._signaling.updateToken(e),this.emit("tokenUpdated")}catch(e){this.emit("error",e)}}fetchLatestVersion(){const e=this.getRoutes().getRoute(q).path;return this._request.get(e,h.x6).then((e=>this._update(e)))}_subscribeToSignalingEvents(){this._log.info("Subscribing to Signaling events .... "),this._signaling.on("connected",(()=>{this._log.info("Received Event: 'connected' from Signaling layer. Pending initialization.",this.sid)})),this._signaling.on("disconnected",(e=>{this._log.info("Received Event: 'disconnected' from Signaling layer for Worker %s. %s",this.sid,e),this._unSubscribeFromTaskRouterEvents(),this.emit("disconnected",e)})),this._signaling.on("init",(e=>{this._log.info("Received Event: 'init' from Signaling layer. Proceeding to initialize Worker %s.",e.channel_id),this.sid=e.channel_id,this.accountSid=e.account_sid,this.workspaceSid=e.workspace_sid,this._signaling.setLifetime(e.token_lifetime),this._initialize()})),this._signaling.on("error",(e=>{this._log.info("Received Event: 'error' from Signaling layer for Worker %s.",this.sid),this.emit("error",e)})),this._signaling.on("tokenExpired",(()=>{this._log.info("Received Event: 'tokenExpired' for for Worker %s. Please update the token. Websocket will not reconnect automatically until token is updated.",this.sid),this.emit("tokenExpired")}))}_subscribeToTaskRouterEvents(){this._log.info("Subscribing to TaskRouter events ... ");for(let[e,t]of Object.entries(this.taskRouterEventHandler.getTREventsToHandlerMapping()))this._signaling.on(e,this.taskRouterEventHandler[t])}_unSubscribeFromTaskRouterEvents(){this._log.info("Unsubscribing from TaskRouter events ... ");for(let[e,t]of Object.entries(this.taskRouterEventHandler.getTREventsToHandlerMapping()))this._signaling.removeListener(e,this.taskRouterEventHandler[t])}_initialize(){this._routes=new I(this.workspaceSid,this.sid),this._log.info("Initializing Worker %s...",this.sid);const e=this.getRoutes().getRoute(q).path;let t;this._request.get(e,h.x6).then((e=>{const r=new H(e);return t=r.activitySid,delete r.activityName,delete r.activitySid,delete r.available,Object.assign(this,r),Promise.all([this._dataServices.activitiesEntity.fetchActivities(),this._dataServices.channelsEntity.fetchChannels(),this._dataServices.reservationsEntity.fetchReservations()])})).then((()=>{this._log.info("Worker %s activities, channels and pending reservations initialized",this.sid),this._setCurrentActivity(t),this._connectActivitySid?this._setWorkerConnectActivity().then((()=>{this._log.info("Successfully updated Worker on connect to Activity=%s",this._connectActivitySid),this._log.info("Worker %s successfully initialized",this.sid)})):this._log.info("Worker %s successfully initialized",this.sid),this._subscribeToTaskRouterEvents(),this.emit("ready",this)})).catch((e=>{this._log.error("Failed to initialize Worker %s. Error: %s",this.sid,e),this.emit("error",`Failed to initialize Worker ${this.sid}`)}))}get channels(){return this._dataServices.channelsEntity.channels}get activities(){return this._dataServices.activitiesEntity.activities}get reservations(){return this._dataServices.reservationsEntity.reservations}_setCurrentActivity(e){const t=this.activities.get(e);if(!t)throw new Error(`Unable to set the current Activity sid=${e} on the Worker.`);t._isCurrent=!0,this.activity=t,this.activity._isCurrent=!0}_setWorkerConnectActivity(){if(!s().isString(this._connectActivitySid))throw new TypeError("Failed to set the Worker's activity to the provided optional connectActivitySid. <string>connectActivitySid must be a string.");return this._updateWorkerActivity(this._connectActivitySid).then((()=>(this._log.info("Successfully set the Worker's activity to the provided connectActivitySid=%s on connection.",this._connectActivitySid),this._connectRetry=0,this))).catch((e=>{if(this._connectRetry>=3)throw this._log.error("Unable to set Worker %s activity to the provided %s on successful connection. %s",this.sid,this._connectActivitySid,e),e;return this._connectRetry=this._connectRetry>0?this._connectRetry+1:1,new Promise((e=>setTimeout(e,500))).then(this._setWorkerConnectActivity.bind(this))}))}_updateWorkerActivity(e,t={}){if(!s().isString(e))throw new TypeError("Error updating Worker Activity: <string>activitySid is a required parameter");const r=this.getRoutes().getRoute(q).path,i={ActivitySid:e};for(const e in t)i[h.UA[e]]=t[e];return this._request.post(r,i,h.x6,this.version).then((t=>{try{this._update(t),this.activity._isCurrent=!1;const e=this.activities.get(t.activity_sid);this.activity=e,this.activity._isCurrent=!0}catch(t){throw this._log.error("Failed to update the Worker's activity to sid=%s. Error: %s",e,t),t}return this}))}_update(e){this._log.trace("Attempting to update Worker %s with latest Worker data=%s",this.sid,JSON.stringify(e));try{const t=new H(e);Re.forEach((e=>{this[e]=t[e]}))}catch(t){this._log.error("Failed to update Worker sid=%s. Update aborted. Error: %s.",e.sid,t)}return this}disconnect(){this._signaling.disconnect()}getRoutes(){return this._routes}}const Ae=["account_sid","activity_name","activity_sid","attributes","available","date_created","date_status_changed","date_updated","friendly_name","sid","workspace_sid","version"],qe=We;const Ce=class extends qe{monitor(e,t,r){if(!s().isString(e))throw new TypeError("Error monitoring reservation: <string>taskSid is a required parameter");if(!s().isString(t))throw new TypeError("Error monitoring reservation: <string>reservationSid is a required parameter");if(r&&!s().isObject(r))throw new TypeError("Error monitoring reservation: <string>extraParams must be an object");return this._supervise("monitor",e,t,r)}_supervise(e,t,r,i){const s=this.getRoutes().getRoute(C,t,r).path,n=Object.assign({},i,{Instruction:"supervise",Supervisor:this.sid,SupervisorMode:e});return this._request.post(s,n,h.x6).then((()=>{}))}};const Oe=["friendly_name","reservation_activity_name","assignment_activity_name","target_workers","max_reserved_workers","task_order","reservation_activity_sid","assignment_activity_sid","workspace_sid","account_sid","sid","date_created","date_updated","lifo_queue"],xe=class{constructor(e){if(!(e instanceof je))throw new TypeError("Failed to create a TaskQueue. <TaskQueueDescriptor>descriptor is a required parameter.");Object.assign(this,e)}};class je{constructor(e){if(!s().isObject(e))throw new TypeError("Failed to instantiate TaskQueueDescriptor. <Descriptor>descriptor is required.");if(!Oe.every((t=>t in e)))throw new TypeError("Failed to instantiate TaskQueueDescriptor. <Descriptor>descriptor does not contain all properties of a TaskQueue.");this.sid=e.sid,this.queueSid=e.sid,this.accountSid=e.account_sid,this.workspaceSid=e.workspace_sid,this.name=e.friendly_name,this.queueName=e.friendly_name,this.assignmentActivityName=e.assignment_activity_name,this.reservationActivityName=e.reservation_activity_name,this.assignmentActivitySid=e.assignment_activity_sid,this.reservationActivitySid=e.reservation_activity_sid,this.targetWorkers=e.target_workers,this.maxReservedWorkers=e.max_reserved_workers,this.taskOrder=e.task_order,this.dateCreated=(0,z.T)(1e3*e.date_created),this.dateUpdated=(0,z.T)(1e3*e.date_updated)}}const Fe=class{constructor(e){if(!(e instanceof H))throw new TypeError("Failed to create a WorkerContainer. <WorkerDescriptor>descriptor is a required parameter.");Object.assign(this,e)}},Ne="workerList",De="taskQueueList";class Pe extends y{constructor(e){if(super(),!e)throw h.Gf.INVALID_ARGUMENT.clone("Error instantiating WorkspaceRoutes class. <string>workspaceSid is required.");this.workspaceSid=e,this.routes={[Ne]:{path:b().join("Workspaces",this.workspaceSid,"Workers")},[De]:{path:b().join("Workspaces",this.workspaceSid,"TaskQueues")}}}}class Ue{constructor(e,t,r={}){this._Workers=new Map,this._TaskQueues=new Map,this._routes=new Pe(e),this._request=t,this._log=new d(`WorkspaceEntity-${e}`,r.logLevel),this._pageSize=r.pageSize||h.L8,s().inRange(this._pageSize,1,h.L8+1)||(this._log.warn("PageSize range for WorkspaceEntity must be between 1 and %d. Setting pageSize to default size=%d",h.L8,h.L8),this._pageSize=h.L8)}get Workers(){return this._Workers}get TaskQueues(){return this._TaskQueues}fetchWorker(e){const t=b().join(this._routes.getRoute(Ne).path,e);return this._request.get(t,h.x6).then((e=>new Fe(new H(e))))}fetchWorkers(e){this._Workers=new Map;const{MaxWorkers:t,...r}=e||{};return this._getAllWorkers(this._getWorkerPage(r),t)}fetchTaskQueue(e){const t=b().join(this._routes.getRoute(De).path,e);return this._request.get(t,h.x6).then((e=>new xe(new je(e))))}fetchTaskQueues(e){return this._TaskQueues=new Map,this._getAllTaskQueues(this._getTaskQueuePage(e))}_getAllWorkers(e,t=h.hS){return e.then((async e=>{for(const r of e.items){if(this._Workers.size>=t)break;this._insertWorker(r)}e.hasNextPage&&(this._Workers.size>=t||await this._getAllWorkers(e.nextPage()))}))}_getWorkerPage(e){e=e||{};const t=this._routes.getRoute(Ne).path,r={PageSize:this._pageSize};return["AfterSid","FriendlyName","ActivitySid","ActivityName","Ordering","TargetWorkersExpression","NextToken"].forEach((t=>{e[t]&&(r[t]=e[t])})),this._request.get(t,h.x6,r).then((e=>{const{Ordering:t,...i}=r,s=t?"NextToken":"AfterSid";return new J(e.contents.map((e=>new H(e))),(e=>this._getWorkerPage({...i,Ordering:t,[s]:e})),t?e.meta.next_token:e.after_sid)}))}_insertWorker(e){const t=e.sid;this._log.trace("_insertWorker(sid=%s, data=%s)",t,JSON.stringify(e));try{this._Workers.set(t,new Fe(e))}catch(e){this._log.error("Unable to create a Worker for sid=%s. Skipping insert into Worker map. Error: %s",t,e)}}async _getAllTaskQueues(e){return e.then((async e=>{e.items.forEach((e=>this._insertTaskQueue(e))),e.hasNextPage&&await this._getAllTaskQueues(e.nextPage())}))}_getTaskQueuePage(e){e=e||{};const t=this._routes.getRoute(De).path,r={PageSize:this._pageSize};return["AfterSid","FriendlyName","Ordering","NextToken"].forEach((t=>{e[t]&&(r[t]=e[t])})),this._request.get(t,h.x6,r).then((e=>{const{Ordering:t,...i}=r,s=t?"NextToken":"AfterSid";return new J(e.contents.map((e=>new je(e))),(e=>this._getTaskQueuePage({...i,Ordering:t,[s]:e})),t?e.meta.next_token:e.after_sid)}))}_insertTaskQueue(e){const t=e.sid;this._log.trace("_insertTaskQueue(sid=%s, data=%s",t,JSON.stringify(e));try{this._TaskQueues.set(t,new xe(e))}catch(e){this._log.error("Unable to create a TaskQueue for sid=%s. Skipping insert into TaskQueue map. Error: %s",t,e)}}}const Le=require("jwt-decode");var $e=r.n(Le);const Ie=class{constructor(e,t={},r){this._config=new c(e,t),this._request=new E(this._config),this._logLevel=t.logLevel||"error",this._log=new d(`Workspace-${this._config.getLogIdentifier()}`,this._logLevel),this.shouldDecodeToken=!r,this.workspaceSid=r,this._updateJWTProperties(e),this.workspaceEntity=new Ue(this.workspaceSid,this._request,t)}fetchWorker(e){return this.workspaceEntity.fetchWorker(e)}fetchWorkers(e){return this.workspaceEntity.fetchWorkers(e).then((()=>this.workspaceEntity.Workers))}fetchTaskQueue(e){return this.workspaceEntity.fetchTaskQueue(e)}fetchTaskQueues(e){return this.workspaceEntity.fetchTaskQueues(e).then((()=>this.workspaceEntity.TaskQueues))}updateToken(e){if(!s().isString(e))throw new TypeError("To update the Twilio token, a new Twilio token must be passed in. <string>newToken is a required parameter.");this._config.updateToken(e),this._updateJWTProperties(e)}_updateJWTProperties(e){if(!this.shouldDecodeToken)return;const t=$e()(e);this.jwt=t,this.accountSid=t.sub,this.workspaceSid=t.grants.task_router.workspace_sid,this.workerSid=t.grants.task_router.worker_sid,this.role=t.grants.task_router.role}}},470:e=>{"use strict";function t(e){if("string"!=typeof e)throw new TypeError("Path must be a string. Received "+JSON.stringify(e))}function r(e,t){for(var r,i="",s=0,n=-1,o=0,a=0;a<=e.length;++a){if(a<e.length)r=e.charCodeAt(a);else{if(47===r)break;r=47}if(47===r){if(n===a-1||1===o);else if(n!==a-1&&2===o){if(i.length<2||2!==s||46!==i.charCodeAt(i.length-1)||46!==i.charCodeAt(i.length-2))if(i.length>2){var d=i.lastIndexOf("/");if(d!==i.length-1){-1===d?(i="",s=0):s=(i=i.slice(0,d)).length-1-i.lastIndexOf("/"),n=a,o=0;continue}}else if(2===i.length||1===i.length){i="",s=0,n=a,o=0;continue}t&&(i.length>0?i+="/..":i="..",s=2)}else i.length>0?i+="/"+e.slice(n+1,a):i=e.slice(n+1,a),s=a-n-1;n=a,o=0}else 46===r&&-1!==o?++o:o=-1}return i}var i={resolve:function(){for(var e,i="",s=!1,n=arguments.length-1;n>=-1&&!s;n--){var o;n>=0?o=arguments[n]:(void 0===e&&(e=process.cwd()),o=e),t(o),0!==o.length&&(i=o+"/"+i,s=47===o.charCodeAt(0))}return i=r(i,!s),s?i.length>0?"/"+i:"/":i.length>0?i:"."},normalize:function(e){if(t(e),0===e.length)return".";var i=47===e.charCodeAt(0),s=47===e.charCodeAt(e.length-1);return 0!==(e=r(e,!i)).length||i||(e="."),e.length>0&&s&&(e+="/"),i?"/"+e:e},isAbsolute:function(e){return t(e),e.length>0&&47===e.charCodeAt(0)},join:function(){if(0===arguments.length)return".";for(var e,r=0;r<arguments.length;++r){var s=arguments[r];t(s),s.length>0&&(void 0===e?e=s:e+="/"+s)}return void 0===e?".":i.normalize(e)},relative:function(e,r){if(t(e),t(r),e===r)return"";if((e=i.resolve(e))===(r=i.resolve(r)))return"";for(var s=1;s<e.length&&47===e.charCodeAt(s);++s);for(var n=e.length,o=n-s,a=1;a<r.length&&47===r.charCodeAt(a);++a);for(var d=r.length-a,c=o<d?o:d,h=-1,l=0;l<=c;++l){if(l===c){if(d>c){if(47===r.charCodeAt(a+l))return r.slice(a+l+1);if(0===l)return r.slice(a+l)}else o>c&&(47===e.charCodeAt(s+l)?h=l:0===l&&(h=0));break}var u=e.charCodeAt(s+l);if(u!==r.charCodeAt(a+l))break;47===u&&(h=l)}var p="";for(l=s+h+1;l<=n;++l)l!==n&&47!==e.charCodeAt(l)||(0===p.length?p+="..":p+="/..");return p.length>0?p+r.slice(a+h):(a+=h,47===r.charCodeAt(a)&&++a,r.slice(a))},_makeLong:function(e){return e},dirname:function(e){if(t(e),0===e.length)return".";for(var r=e.charCodeAt(0),i=47===r,s=-1,n=!0,o=e.length-1;o>=1;--o)if(47===(r=e.charCodeAt(o))){if(!n){s=o;break}}else n=!1;return-1===s?i?"/":".":i&&1===s?"//":e.slice(0,s)},basename:function(e,r){if(void 0!==r&&"string"!=typeof r)throw new TypeError('"ext" argument must be a string');t(e);var i,s=0,n=-1,o=!0;if(void 0!==r&&r.length>0&&r.length<=e.length){if(r.length===e.length&&r===e)return"";var a=r.length-1,d=-1;for(i=e.length-1;i>=0;--i){var c=e.charCodeAt(i);if(47===c){if(!o){s=i+1;break}}else-1===d&&(o=!1,d=i+1),a>=0&&(c===r.charCodeAt(a)?-1==--a&&(n=i):(a=-1,n=d))}return s===n?n=d:-1===n&&(n=e.length),e.slice(s,n)}for(i=e.length-1;i>=0;--i)if(47===e.charCodeAt(i)){if(!o){s=i+1;break}}else-1===n&&(o=!1,n=i+1);return-1===n?"":e.slice(s,n)},extname:function(e){t(e);for(var r=-1,i=0,s=-1,n=!0,o=0,a=e.length-1;a>=0;--a){var d=e.charCodeAt(a);if(47!==d)-1===s&&(n=!1,s=a+1),46===d?-1===r?r=a:1!==o&&(o=1):-1!==r&&(o=-1);else if(!n){i=a+1;break}}return-1===r||-1===s||0===o||1===o&&r===s-1&&r===i+1?"":e.slice(r,s)},format:function(e){if(null===e||"object"!=typeof e)throw new TypeError('The "pathObject" argument must be of type Object. Received type '+typeof e);return function(e,t){var r=t.dir||t.root,i=t.base||(t.name||"")+(t.ext||"");return r?r===t.root?r+i:r+e+i:i}("/",e)},parse:function(e){t(e);var r={root:"",dir:"",base:"",ext:"",name:""};if(0===e.length)return r;var i,s=e.charCodeAt(0),n=47===s;n?(r.root="/",i=1):i=0;for(var o=-1,a=0,d=-1,c=!0,h=e.length-1,l=0;h>=i;--h)if(47!==(s=e.charCodeAt(h)))-1===d&&(c=!1,d=h+1),46===s?-1===o?o=h:1!==l&&(l=1):-1!==o&&(l=-1);else if(!c){a=h+1;break}return-1===o||-1===d||0===l||1===l&&o===d-1&&o===a+1?-1!==d&&(r.base=r.name=0===a&&n?e.slice(1,d):e.slice(a,d)):(0===a&&n?(r.name=e.slice(1,o),r.base=e.slice(1,d)):(r.name=e.slice(a,o),r.base=e.slice(a,d)),r.ext=e.slice(o,d)),a>0?r.dir=e.slice(0,a-1):n&&(r.dir="/"),r},sep:"/",delimiter:":",win32:null,posix:null};i.posix=i,e.exports=i},997:e=>{e.exports={Agent:class{constructor(e){}}}},622:e=>{"use strict";e.exports=require("loglevel")},464:e=>{"use strict";e.exports=require("util")},352:e=>{"use strict";e.exports=require("ws")}},t={};function r(i){var s=t[i];if(void 0!==s)return s.exports;var n=t[i]={exports:{}};return e[i](n,n.exports,r),n.exports}return r.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return r.d(t,{a:t}),t},r.d=(e,t)=>{for(var i in t)r.o(t,i)&&!r.o(e,i)&&Object.defineProperty(e,i,{enumerable:!0,get:t[i]})},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r(296)})()}));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
/*! twilio-taskrouter.js 0.7.
|
|
1
|
+
/*! twilio-taskrouter.js 0.7.2 */
|
package/package.json
CHANGED