Files
n8n-nodes-signal-cli/nodes/SignalTrigger/SignalTrigger.node.ts
François-Guillaume Ribreau 44f7c0a0a0 fix
2025-05-05 10:25:43 +02:00

90 lines
2.2 KiB
TypeScript
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import {
ITriggerFunctions,
INodeExecutionData,
INodeType,
INodeTypeDescription,
NodeApiError,
ITriggerResponse,
NodeConnectionType,
} from 'n8n-workflow';
import { EventSource } from 'eventsource';
import debug from 'debug';
const signalTriggerDebug = debug('n8n:nodes:signal-trigger');
export class SignalTrigger implements INodeType {
description: INodeTypeDescription = {
displayName: 'Signal Trigger',
name: 'signalTrigger',
group: ['trigger'],
version: 1,
description: 'Triggers when a new message is received',
defaults: {
name: 'Signal Trigger',
},
inputs: [],
outputs: [NodeConnectionType.Main],
credentials: [
{
name: 'signalCliApi',
required: true,
},
],
properties: [
],
};
async trigger(this: ITriggerFunctions): Promise<ITriggerResponse> {
const credentials = await this.getCredentials('signalCliApi');
if (!credentials.url) {
throw new NodeApiError(this.getNode(), { message: 'Signal CLI API URL is not set in credentials' });
}
const url = `${credentials.url}/api/v1/events`;
const eventSource = new EventSource(url);
eventSource.onmessage = (event) => {
signalTriggerDebug('Received event: %o', event);
try {
const data = JSON.parse(event.data);
const message = data.dataMessage?.message;
if (message) {
const item: INodeExecutionData = {
json: { message },
};
this.emit([this.helpers.returnJsonArray([item])]);
}
} catch (error) {
this.logger.error('Error parsing message from Signal API', { error });
}
};
return new Promise((resolve, reject) => {
eventSource.onerror = (err) => {
this.logger.error('EventSource error', {err: err, message: err.message});
reject(err);
};
eventSource.onopen = () => {
signalTriggerDebug('Connected to %s', url);
eventSource.onerror = (err) => {
this.logger.error('EventSource error', {error: err });
};
resolve({
closeFunction: async () => {
eventSource.close();
},
});
}
});
}
}