npm package: @jozehan/amazon-connect-taskjs
Description: Provides task support to AmazonConnect customers
Author: Amazon Web Services
Latest version: 2.0.1-alpha.1

## AmazonConnectTaskJS

# About
The Amazon Connect Task javascript library (TaskJS) gives you the power to handle task contacts when used together with [Amazon Connect Streams](https://github.com/aws/amazon-connect-streams).

# Learn More
To learn more about Amazon Connect and its capabilities, please check out
the [Amazon Connect User Guide](https://docs.aws.amazon.com/connect/latest/userguide/).

# Getting Started

### Using TaskJS from Github
```
$ git clone https://github.com/amazon-connect/amazon-connect-taskjs
```

### Including TaskJS

[Amazon Connect Streams](https://github.com/aws/amazon-connect-streams) is required to use TaskJS. Ensure you import TaskJS after Streams.

TaskJs v2.0 requires Streams v2.2 or later.

# Building
1. Install latest LTS version of [NodeJS](https://nodejs.org)
2. Checkout this package into workspace and navigate to root folder
3. `npm install`
4. To build (non-minified):
    1. `npm run devo` for a non-minified build.
    2. Find build artifacts in **dist** directory.
5. To build (minified):
    1. `npm run release` for a minified build.
    2. Find build artifacts in **dist** directory.
6. To run unit tests:
    1. `npm run test`
7. To clean node_modules:
    1. `npm run clean`
8. To make webpack watch all files:
    1. `npm run watch`

Find build artifacts in **dist** directory -  This will generate a file called `amazon-connect-task.js` - this is the full Connect TaskJS API which you will want to include in your page.


# Usage:

TaskJS provides a `taskSession` instance for each task contact. You can access the `taskSession` by calling the `getMediaController` method on a `taskConnection`. `getMediaController` returns a promise that resolves with a `taskSession` instance.

For example:

```js
taskConnection.getMediaController().then((taskSession) => { /* ... */ });
```

## Event Handlers

Each of the following event handlers will pass a message object to the callback function containing the following fields:

* `AbsoluteTime`: UTC timestamp of when the event occurred.
* `ContentType`: One of the following strings depending on the event:
  * `application/vnd.amazonaws.connect.event.transfer.initiated`
  * `application/vnd.amazonaws.connect.event.transfer.succeeded`
  * `application/vnd.amazonaws.connect.event.transfer.failed`
  * ` application/vnd.amazonaws.connect.event.expire.warning`
  * `application/vnd.amazonaws.connect.event.expire.complete`
* `Id`: The contact ID
* `InitialContactId`: The [initial contact id](https://github.com/amazon-connect/amazon-connect-streams/blob/master/Documentation.md#contactgetoriginalcontactid--contactgetinitialcontactid).

### `taskSession.onTransferInitiated`

Subscribe a method to be invoked when the server has initiated the task transfer.

```js
taskSession.onTransferInitiated((message) => console.log("Transfer has initiated"))
```

### `taskSession.onTransferSucceeded`

Subscribe a method to be invoked when the task transfer has succeeded.

```js
taskSession.onTransferSucceeded((message) => console.log("Transfer has succeeded"))
```

### `taskSession.onTransferFailed`

Subscribe a method to be invoked when the task transfer has failed.

```js
taskSession.onTransferFailed((message) => console.log("Transfer has failed"))
```

### `taskSession.onTaskExpiring`

Subscribe a method to be invoked two hours before the task expires.

```js
taskSession.onTaskExpiring((message) => console.log("Task will expire in two hours"))
```

### `taskSession.onTaskExpired`

Subscribe a method to be invoked when the task has expired.

```js
taskSession.onTaskExpired((message) => console.log("Task has expired"))
```

### `taskSession.onMessage`

Subscribe a method to be invoked when any one of the above events has occurred.

```js
taskSession.onMessage((message) => console.log("The following event has occurred:", message.ContentType))
```

## Methods

### `agent.createTask()`

Create a new task.

```js
const newTask = {
    name: "string", //required, max len: 512
    description: "string", //optional, max len: 4096
    endpoint: endpointObject, //required for non templated tasks, can be retrieved via `agent.getEndpoints()`. Agent and queue endpoints supported.
    taskTemplateId: "string", //required for templated tasks, ID of the template the task is created from. Template should belong to connect instance
    previousContactId: "string", //optional, the previous contact ID for a linked task
    references: { //optional. Only URL references are supported for non templated tasks
    	"reference name 1": { // string, max len: 4096
    		type: "URL" //required, string, one of connect.ReferenceType types, 
    		value: "https://www.amazon.com" //required, string, max len: 4096
    	},
        "reference name 2": { // string, max len: 4096
    		type: "EMAIL" //required, string, one of connect.ReferenceType types
    		value: "example@abc.com" //required, string, max len: 4096
    	},	
        "reference name 3": { // string, max len: 4096
    		type: "NUMBER" //required, one of connect.ReferenceType types
    		value: 1000 //required, number
    	},
        "reference name 4": { // string, max len: 4096
            type: "DATE", //required, string, one of connect.ReferenceType types
            value: 1649961230 //required, number
        },
        "reference name 5": { // string, max len: 4096
    		type: "STRING" //required, string, one of connect.ReferenceType types
    		value: "example@abc.com" //required, string, max len: 4096
    	}	
    },
    scheduledTime: "number" //optional, UTC timestamp in seconds when the task should be delivered.
};

agent.createTask(newTask, {
	success: function(data) { console.log("Created a task with contact id: ", data.contactId) },
	failure: function(err) { /* ... */ }
});
```

### `agent.updateContact()`

Update a task contact created from a template.

```js
const updatedTaskData = {
    contactId: "string", // required, task contact identifier
    name:  "string", // optional, task name
    description: "string", // optional, task description
    references: { //optional, used to specify updated template fields
        "reference name": { // string
    		type: "NUMBER" //required, one of connect.ReferenceType types
    		value: 1001 //required, number
    	}
        //see more examples in agent.createTask() description
    }
};

agent.updateContact(updatedTaskData, {
	success: function() { console.log("The task updated successfully") },
	failure: function(err) { /* ... */ }
});

```

### `agent.listTaskTemplates()`

Load a list of task templates that belong to a connect instance

```js

const queryParams = {// required
    status: 'active', //optional, string, can be either 'active' or 'inactive'
    maxResults: 50 //optional, number, max value of 100
};

agent.listTaskTemplates(queryParams, {
	success: function(data) { console.log("List of task templates loaded successfully", data) },
	failure: function(err) { /* ... */ }
});

```


### `agent.getTaskTemplate()`

Load a template data, including fields, default values and constraints 

```js

const templateParams = {// required
    id: 'string', //required, string, template ID, template should belong to connect instance
    version: 'string' //optional, string, task template version
};

agent.getTaskTemplate(templateParams, {
	success: function(data) { console.log("Template data loaded successfully", templateParams.id, data) },
	failure: function(err) { /* ... */ }
});

```


## Enumerations

### `connect.ReferenceType`
This enumeration lists the different reference types for a task. Currently supported types: URL, EMAIL, NUMBER, STRING, DATE.

* `ReferenceType.URL`: A URL reference.

## Security

See [CONTRIBUTING](CONTRIBUTING.md#security-issue-notifications) for more information.

## License

This project is licensed under the Apache-2.0 License.