Создание триггера
Справочник по API createTrigger() — определяет webhook- или polling-триггеры с хуками жизненного цикла для включения, отключения и обработки событий.
Создание триггера
createTrigger() определяет источник событий, который запускает выполнение пайплайна. Триггеры могут быть основаны на вебхуках (push) или поллинге (pull).
Сигнатура
import { createTrigger } from "@triggo/connector-sdk";
function createTrigger<TAuth = unknown, TProps = unknown>(
config: TriggerConfig<TAuth, TProps>,
): TriggerDefinition<TAuth, TProps>;TriggerConfig
| Поле | Тип | Обязательно | Описание |
|---|---|---|---|
name | string | Да | Уникальный идентификатор триггера. Должен быть в формате snake_case (например, new_message). |
displayName | string | Да | Читаемое имя, отображаемое в интерфейсе. |
description | string | Да | Описание события, на которое реагирует триггер. |
props | Record<string, PropertyDefinition> | Да | Входные свойства. Передайте {} при отсутствии входных данных. |
type | TriggerType | Да | TRIGGER_TYPES.WEBHOOK или TRIGGER_TYPES.POLLING. |
onEnable | (context: TriggerContext) => Promise<void | OnEnableResult> | Да | Вызывается при активации пайплайна. Здесь регистрируются вебхуки или запускается поллинг. |
onDisable | (context: TriggerContext) => Promise<void> | Да | Вызывается при деактивации пайплайна. Очистка вебхуков или остановка поллинга. |
run | (context: TriggerContext) => Promise<unknown[]> | Да | Обрабатывает входящее событие. Должен возвращать массив объектов событий. |
outputSchema | Record<string, unknown> | Нет | JSON Schema, описывающая форму выходных данных триггера. Используется AI-системой. |
sampleData | unknown | Нет | Пример выходных данных для предварительного просмотра и тестирования в интерфейсе. |
test | (context: TriggerContext) => Promise<unknown[]> | Нет | Возвращает примеры событий для тестовой панели без необходимости реального события. |
aiHints | string | Нет | Дополнительный контекст для AI-генератора пайплайнов. |
Типы триггеров
import { TRIGGER_TYPES } from "@triggo/connector-sdk";
TRIGGER_TYPES.WEBHOOK // "WEBHOOK" — external service pushes events via HTTP
TRIGGER_TYPES.POLLING // "POLLING" — Triggo periodically checks for new eventsWebhook-триггеры
Webhook-триггеры получают события, отправленные внешними сервисами. Triggo генерирует уникальный URL вебхука для каждого активного пайплайна. Поле context.webhookUrl содержит этот URL во время вызова onEnable.
Polling-триггеры
Polling-триггеры вызываются по расписанию. Используйте context.store для отслеживания метки времени последнего опроса или курсора, затем запрашивайте только новые события.
Жизненный цикл
Pipeline Activated → onEnable(context) → (register webhook / store cursor)
↓
Event Received → run(context) → returns event[]
↓
Pipeline Stopped → onDisable(context) → (unregister webhook / cleanup)OnEnableResult
onEnable может опционально возвращать объект с внешним ID вебхука для отслеживания:
interface OnEnableResult {
readonly externalWebhookId?: string;
}TriggerContext
interface TriggerContext<TAuth = unknown, TProps = unknown> {
readonly auth: TAuth;
readonly propsValue: TProps;
readonly store: StoreContext;
readonly webhookUrl?: string;
readonly payload?: unknown;
}| Поле | Тип | Описание |
|---|---|---|
auth | TAuth | Учётные данные аутентификации. |
propsValue | TProps | Разрешённые значения свойств. |
store | StoreContext | Персистентное key-value хранилище. |
webhookUrl | string | undefined | Сгенерированный URL вебхука. Доступен в onEnable для webhook-триггеров. |
payload | unknown | undefined | Сырые данные входящего события. Доступны в run для webhook-триггеров. |
Правила валидации
- Формат имени -- должен соответствовать
/^[a-z][a-z0-9]*(?:_[a-z0-9]+)*$/(непустой snake_case) - Некорректные имена вызывают
Errorпри создании
Пример webhook-триггера
import {
createTrigger,
TRIGGER_TYPES,
ConnectorError,
} from "@triggo/connector-sdk";
import { CONNECTOR_ERROR_CODES } from "@triggo/shared";
export const newOrder = createTrigger({
name: "new_order",
displayName: "New Order",
description: "Triggers when a new order is created in the shop.",
props: {},
type: TRIGGER_TYPES.WEBHOOK,
outputSchema: {
type: "object",
properties: {
orderId: { type: "string" },
amount: { type: "number" },
currency: { type: "string" },
},
required: ["orderId", "amount", "currency"],
},
sampleData: { orderId: "ORD-001", amount: 4999, currency: "RUB" },
async onEnable(context) {
const auth = context.auth as { secret: string };
const response = await fetch("https://api.shop.com/webhooks", {
method: "POST",
headers: {
Authorization: `Bearer ${auth.secret}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
url: context.webhookUrl,
events: ["order.created"],
}),
});
if (!response.ok) {
throw new ConnectorError(
CONNECTOR_ERROR_CODES.UPSTREAM_ERROR,
"Failed to register webhook",
);
}
const { id } = (await response.json()) as { id: string };
await context.store.put("webhookId", id);
return { externalWebhookId: id };
},
async onDisable(context) {
const webhookId = (await context.store.get("webhookId")) as string | null;
if (webhookId) {
const auth = context.auth as { secret: string };
await fetch(`https://api.shop.com/webhooks/${webhookId}`, {
method: "DELETE",
headers: { Authorization: `Bearer ${auth.secret}` },
});
await context.store.delete("webhookId");
}
},
async run(context) {
const payload = context.payload as Record<string, unknown>;
return [
{
orderId: payload["id"],
amount: payload["amount"],
currency: payload["currency"],
},
];
},
});Пример polling-триггера
import { createTrigger, TRIGGER_TYPES } from "@triggo/connector-sdk";
export const newItem = createTrigger({
name: "new_item",
displayName: "New Item",
description: "Polls for new items every interval.",
props: {},
type: TRIGGER_TYPES.POLLING,
async onEnable(context) {
await context.store.put("lastPollTime", new Date().toISOString());
},
async onDisable(context) {
await context.store.delete("lastPollTime");
},
async run(context) {
const auth = context.auth as { secret: string };
const since = ((await context.store.get("lastPollTime")) as string) ?? new Date(0).toISOString();
const response = await fetch(
`https://api.example.com/items?since=${since}`,
{ headers: { Authorization: `Bearer ${auth.secret}` } },
);
const items = (await response.json()) as unknown[];
await context.store.put("lastPollTime", new Date().toISOString());
return items;
},
});