Asterisk AMI client for TypeScript, also implement async AGI
npm install ts-ami-bccptypescript
export declare class Ami {
private static instance;
static readonly hasInstance: boolean;
static getInstance(asteriskManagerUser?: string, asteriskConfigRoot?: string): Ami;
static getInstance(asteriskManagerCredential: c.Credential): Ami;
static generateUniqueActionId(): string;
disconnect(): Promise;
createApiServer(apiId: string): amiApi.Server;
createApiClient(apiId: string): amiApi.Client;
startAgi(scripts: agi.Scripts, defaultScript?: (channel: agi.AGIChannel) => Promise): Promise;
readonly astManForActions: any;
readonly astManForEvents: any;
readonly evt: SyncEvent;
readonly evtUserEvent: SyncEvent;
/**
* Posted when TCP connection with asterisk is lost.
* Note that we will attempt to recover the connection
* automatically.
/
readonly evtTcpConnectionClosed: VoidSyncEvent;
private isReady;
private readonly evtFullyBooted;
readonly credential: Ami.Credential;
constructor(asteriskManagerUser?: string, asteriskConfigRoot?: string);
constructor(asteriskManagerCredential: Ami.Credential);
readonly ready: Promise;
lastActionId: string;
private actionPending;
postAction(action: string, headers: Ami.Headers): Promise;
private _postAction_(action, headers, isRecursion);
private postActionOnNewConnection(action, headers);
userEvent(userEvent: {
userevent: Ami.UserEvent['userevent'];
actionid?: Ami.UserEvent['actionid'];
[key: string]: string | undefined;
}): Promise;
messageSend(to: string, from: string, body: string, packetHeaders?: Record): Promise;
setVar(variable: string, value: string, channel?: string): Promise;
getVar(variable: string, channel?: string): Promise;
dialplanExtensionAdd(context: string, extension: string, priority: number | string, application: string, applicationData?: string, replace?: boolean): Promise;
/* e.g call with ( "from-sip", "_[+0-9].", [ [ "NoOp", "FOO"], [ "Hangup" ] ] ) /
dialplanAddSetOfExtensions(context: string, extension: string, instructionSet: ([string] | [string, string])[]): Promise;
runCliCommand(cliCommand: string): Promise;
/* return true if extension removed /
dialplanExtensionRemove(context: string, extension: string, priority?: number | string): Promise;
removeContext(context: string): Promise;
originateLocalChannel(context: string, extension: string, channelVariables?: Record): Promise;
}
export declare namespace Ami {
type Credential = c.Credential;
type ManagerEvent = {
event: string;
privilege: string;
[header: string]: string;
};
type UserEvent = {
userevent: string;
actionid: string;
[key: string]: string | undefined;
};
type Headers = Record | string[]>;
const asteriskBufferSize = 1024;
const headerValueMaxLength: number;
class ActionError extends Error {
readonly action: string;
readonly headers: Ami.Headers;
readonly asteriskResponse: any;
constructor(action: string, headers: Ami.Headers, asteriskResponse: any);
}
}
``
Integrated AGI over AMI:
``typescript
import { AGIChannel as _AGIChannel_ } from "ts-async-agi";
export declare type AGIChannel = _AGIChannel_;
/* Like { "from-sip": { "_[+0-9].": ...}} /
export declare type Scripts = {
[context: string]: {
[extensionPattern: string]: (channel: AGIChannel) => Promise;
};
};
export declare function start(ami: Ami, scripts: Scripts, defaultScript?: (channel: AGIChannel) => Promise): Promise;
```