# J1.2 Custom Recognition and Action

> Note: This document is about integrating with NodeJS
>
> Note: The returned type of the following registered function can also be Promised, thus you can do async actions inside. Most of actions of Context are async.

## Custom Recognition

```json
{
    "Task": {
        "recognition": "Custom",
        "custom_recognition": "myReco",
        "custom_recognition_param": {
            "msg": "Hello world!"
        },
    }
}
```

```typescript
export interface CustomRecognizerSelf {
    context: Context
    id: maa.TaskId
    name: string
    param: unknown
    image: maa.ImageData
}

res.register_custom_recognizer('myReco', function (this: CustomRecognizerSelf, self: CustomRecognizerSelf) {
    return [
        {
            x: 0,
            y: 0,
            width: 0,
            height: 0
        },
        '111'
    ]
})
```

The following is an example of calling another task to recognize

```typescript
inst.register_custom_recognizer('forward', (self) => {
    return self.context.run_recognition('another_task', self.image)
})
```

## Custom Action

```json
{
    "Task": {
        "action": "Custom",
        "custom_action": "myAct",
        "custom_action_param": {
            "msg": "Hello world!"
        },
    }
}
```

```typescript
interface CustomActionSelf {
    context: Context
    id: maa.TaskId
    name: string
    param: unknown
    box: maa.Rect
    detail: string
}

inst.register_custom_action('myAct', function (this: CustomActionSelf, self: CustomActionSelf) => {
    return true
})
```

The following is an example of calling another task to act

```typescript
inst.register_custom_action('forward', (self) => {
    return self.context.run_action('another_task', box, detail)
})
```
