n8n-nodes-custom-webhook-wait 1.0.3 → 1.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { INodeType, INodeTypeDescription, IWebhookFunctions, IWebhookResponseData } from 'n8n-workflow';
|
|
2
2
|
export declare class WebhookWait implements INodeType {
|
|
3
3
|
description: INodeTypeDescription;
|
|
4
4
|
webhook(this: IWebhookFunctions): Promise<IWebhookResponseData>;
|
|
5
|
-
execute(this: IExecuteFunctions): Promise<INodeExecutionData[][]>;
|
|
6
5
|
}
|
|
@@ -10,7 +10,7 @@ class WebhookWait {
|
|
|
10
10
|
group: ['trigger'],
|
|
11
11
|
version: 1,
|
|
12
12
|
subtitle: '={{$parameter["httpMethod"] + ": /" + $parameter["path"]}}',
|
|
13
|
-
description: 'Pauses workflow execution and waits for a webhook call to continue.
|
|
13
|
+
description: 'Pauses workflow execution and waits for a webhook call to continue. Works with a static URL.',
|
|
14
14
|
defaults: {
|
|
15
15
|
name: 'Webhook Wait',
|
|
16
16
|
},
|
|
@@ -20,29 +20,20 @@ class WebhookWait {
|
|
|
20
20
|
{
|
|
21
21
|
name: 'default',
|
|
22
22
|
httpMethod: '={{$parameter["httpMethod"]}}',
|
|
23
|
-
responseMode: '
|
|
23
|
+
responseMode: 'onReceived',
|
|
24
24
|
path: '={{$parameter["path"]}}',
|
|
25
|
-
restartWebhook:
|
|
26
|
-
isFullPath: true,
|
|
25
|
+
restartWebhook: false,
|
|
27
26
|
},
|
|
28
27
|
],
|
|
29
28
|
properties: [
|
|
30
|
-
{
|
|
31
|
-
displayName: 'Webhook URLs',
|
|
32
|
-
name: 'webhookUrls',
|
|
33
|
-
type: 'notice',
|
|
34
|
-
default: '',
|
|
35
|
-
// eslint-disable-next-line n8n-nodes-base/node-param-description-unencoded-angle-brackets
|
|
36
|
-
description: '<strong>Test URL:</strong><br>{{$parameter["httpMethod"]}} <code style="user-select:all">{{$baseUrl}}/webhook-test/{{$parameter["path"]}}</code><br><br><strong>Production URL:</strong><br>{{$parameter["httpMethod"]}} <code style="user-select:all">{{$baseUrl}}/webhook/{{$parameter["path"]}}</code>',
|
|
37
|
-
},
|
|
38
29
|
{
|
|
39
30
|
displayName: 'Path',
|
|
40
31
|
name: 'path',
|
|
41
32
|
type: 'string',
|
|
42
|
-
default: '',
|
|
43
|
-
placeholder: 'my-webhook-
|
|
33
|
+
default: 'webhook-wait',
|
|
34
|
+
placeholder: 'my-webhook-path',
|
|
44
35
|
required: true,
|
|
45
|
-
description: 'The path for the webhook URL
|
|
36
|
+
description: 'The path for the webhook. Your URL will be: https://your-n8n/webhook/[path] (production) or https://your-n8n/webhook-test/[path] (test)',
|
|
46
37
|
},
|
|
47
38
|
{
|
|
48
39
|
displayName: 'HTTP Method',
|
|
@@ -59,268 +50,92 @@ class WebhookWait {
|
|
|
59
50
|
default: 'POST',
|
|
60
51
|
description: 'The HTTP method to listen to',
|
|
61
52
|
},
|
|
62
|
-
{
|
|
63
|
-
displayName: 'Response Mode',
|
|
64
|
-
name: 'responseMode',
|
|
65
|
-
type: 'options',
|
|
66
|
-
options: [
|
|
67
|
-
{
|
|
68
|
-
name: 'When Webhook Is Received',
|
|
69
|
-
value: 'onReceived',
|
|
70
|
-
description: 'Respond immediately when webhook is received',
|
|
71
|
-
},
|
|
72
|
-
{
|
|
73
|
-
name: 'When Last Node Finishes',
|
|
74
|
-
value: 'lastNode',
|
|
75
|
-
description: 'Respond after the workflow completes',
|
|
76
|
-
},
|
|
77
|
-
],
|
|
78
|
-
default: 'onReceived',
|
|
79
|
-
description: 'When to respond to the webhook call',
|
|
80
|
-
},
|
|
81
53
|
{
|
|
82
54
|
displayName: 'Response Code',
|
|
83
55
|
name: 'responseCode',
|
|
84
56
|
type: 'number',
|
|
85
57
|
default: 200,
|
|
86
|
-
description: 'The HTTP response code to return
|
|
58
|
+
description: 'The HTTP response code to return',
|
|
87
59
|
},
|
|
88
60
|
{
|
|
89
61
|
displayName: 'Response Data',
|
|
90
62
|
name: 'responseData',
|
|
91
63
|
type: 'options',
|
|
92
64
|
options: [
|
|
93
|
-
{
|
|
94
|
-
name: 'All Entries',
|
|
95
|
-
value: 'allEntries',
|
|
96
|
-
description: 'Return all entries from the webhook data',
|
|
97
|
-
},
|
|
98
|
-
{
|
|
99
|
-
name: 'First Entry JSON',
|
|
100
|
-
value: 'firstEntryJson',
|
|
101
|
-
description: 'Return the first entry as JSON',
|
|
102
|
-
},
|
|
103
65
|
{
|
|
104
66
|
name: 'No Response Body',
|
|
105
67
|
value: 'noData',
|
|
106
68
|
description: 'Return no response body',
|
|
107
69
|
},
|
|
70
|
+
{
|
|
71
|
+
name: 'Received Data',
|
|
72
|
+
value: 'allEntries',
|
|
73
|
+
description: 'Return the received webhook data',
|
|
74
|
+
},
|
|
108
75
|
{
|
|
109
76
|
name: 'Custom Response',
|
|
110
77
|
value: 'customResponse',
|
|
111
|
-
description: 'Return a custom response
|
|
78
|
+
description: 'Return a custom response',
|
|
112
79
|
},
|
|
113
80
|
],
|
|
114
81
|
default: 'noData',
|
|
115
82
|
description: 'What data to return in the webhook response',
|
|
116
83
|
},
|
|
117
84
|
{
|
|
118
|
-
displayName: '
|
|
119
|
-
name: '
|
|
85
|
+
displayName: 'Response Message',
|
|
86
|
+
name: 'responseMessage',
|
|
120
87
|
type: 'string',
|
|
121
88
|
displayOptions: {
|
|
122
89
|
show: {
|
|
123
90
|
responseData: ['customResponse'],
|
|
124
91
|
},
|
|
125
92
|
},
|
|
126
|
-
default: '{"status": "
|
|
127
|
-
description: 'Custom JSON response
|
|
128
|
-
},
|
|
129
|
-
{
|
|
130
|
-
displayName: 'Options',
|
|
131
|
-
name: 'options',
|
|
132
|
-
type: 'collection',
|
|
133
|
-
placeholder: 'Add Option',
|
|
134
|
-
default: {},
|
|
135
|
-
options: [
|
|
136
|
-
{
|
|
137
|
-
displayName: 'Response Content-Type',
|
|
138
|
-
name: 'responseContentType',
|
|
139
|
-
type: 'string',
|
|
140
|
-
default: 'application/json',
|
|
141
|
-
description: 'The content type of the response',
|
|
142
|
-
},
|
|
143
|
-
{
|
|
144
|
-
displayName: 'Response Headers',
|
|
145
|
-
name: 'responseHeaders',
|
|
146
|
-
type: 'fixedCollection',
|
|
147
|
-
typeOptions: {
|
|
148
|
-
multipleValues: true,
|
|
149
|
-
},
|
|
150
|
-
default: {},
|
|
151
|
-
options: [
|
|
152
|
-
{
|
|
153
|
-
name: 'entries',
|
|
154
|
-
displayName: 'Header',
|
|
155
|
-
values: [
|
|
156
|
-
{
|
|
157
|
-
displayName: 'Name',
|
|
158
|
-
name: 'name',
|
|
159
|
-
type: 'string',
|
|
160
|
-
default: '',
|
|
161
|
-
},
|
|
162
|
-
{
|
|
163
|
-
displayName: 'Value',
|
|
164
|
-
name: 'value',
|
|
165
|
-
type: 'string',
|
|
166
|
-
default: '',
|
|
167
|
-
},
|
|
168
|
-
],
|
|
169
|
-
},
|
|
170
|
-
],
|
|
171
|
-
description: 'Custom response headers',
|
|
172
|
-
},
|
|
173
|
-
{
|
|
174
|
-
displayName: 'Authentication',
|
|
175
|
-
name: 'authentication',
|
|
176
|
-
type: 'options',
|
|
177
|
-
options: [
|
|
178
|
-
{ name: 'None', value: 'none' },
|
|
179
|
-
{ name: 'Basic Auth', value: 'basicAuth' },
|
|
180
|
-
{ name: 'Header Auth', value: 'headerAuth' },
|
|
181
|
-
],
|
|
182
|
-
default: 'none',
|
|
183
|
-
description: 'Authentication method for the webhook',
|
|
184
|
-
},
|
|
185
|
-
{
|
|
186
|
-
displayName: 'Auth Header Name',
|
|
187
|
-
name: 'authHeaderName',
|
|
188
|
-
type: 'string',
|
|
189
|
-
default: 'Authorization',
|
|
190
|
-
displayOptions: {
|
|
191
|
-
show: {
|
|
192
|
-
authentication: ['headerAuth'],
|
|
193
|
-
},
|
|
194
|
-
},
|
|
195
|
-
description: 'Name of the header to check for authentication',
|
|
196
|
-
},
|
|
197
|
-
{
|
|
198
|
-
displayName: 'Auth Header Value',
|
|
199
|
-
name: 'authHeaderValue',
|
|
200
|
-
type: 'string',
|
|
201
|
-
typeOptions: {
|
|
202
|
-
password: true,
|
|
203
|
-
},
|
|
204
|
-
default: '',
|
|
205
|
-
displayOptions: {
|
|
206
|
-
show: {
|
|
207
|
-
authentication: ['headerAuth'],
|
|
208
|
-
},
|
|
209
|
-
},
|
|
210
|
-
description: 'Expected value of the authentication header',
|
|
211
|
-
},
|
|
212
|
-
{
|
|
213
|
-
displayName: 'Basic Auth Username',
|
|
214
|
-
name: 'basicAuthUsername',
|
|
215
|
-
type: 'string',
|
|
216
|
-
default: '',
|
|
217
|
-
displayOptions: {
|
|
218
|
-
show: {
|
|
219
|
-
authentication: ['basicAuth'],
|
|
220
|
-
},
|
|
221
|
-
},
|
|
222
|
-
},
|
|
223
|
-
{
|
|
224
|
-
displayName: 'Basic Auth Password',
|
|
225
|
-
name: 'basicAuthPassword',
|
|
226
|
-
type: 'string',
|
|
227
|
-
typeOptions: {
|
|
228
|
-
password: true,
|
|
229
|
-
},
|
|
230
|
-
default: '',
|
|
231
|
-
displayOptions: {
|
|
232
|
-
show: {
|
|
233
|
-
authentication: ['basicAuth'],
|
|
234
|
-
},
|
|
235
|
-
},
|
|
236
|
-
},
|
|
237
|
-
{
|
|
238
|
-
displayName: 'Merge Input Data',
|
|
239
|
-
name: 'mergeInputData',
|
|
240
|
-
type: 'boolean',
|
|
241
|
-
default: true,
|
|
242
|
-
description: 'Whether to merge the input data from previous nodes with the webhook data',
|
|
243
|
-
},
|
|
244
|
-
],
|
|
93
|
+
default: '{"status": "ok"}',
|
|
94
|
+
description: 'Custom JSON response to send back',
|
|
245
95
|
},
|
|
246
96
|
],
|
|
247
97
|
};
|
|
248
98
|
}
|
|
249
99
|
async webhook() {
|
|
250
|
-
var _a;
|
|
251
100
|
const req = this.getRequestObject();
|
|
252
|
-
const res = this.getResponseObject();
|
|
253
101
|
const responseCode = this.getNodeParameter('responseCode', 200);
|
|
254
102
|
const responseData = this.getNodeParameter('responseData', 'noData');
|
|
255
|
-
|
|
256
|
-
// Handle authentication
|
|
257
|
-
if (options.authentication === 'headerAuth') {
|
|
258
|
-
const headerName = options.authHeaderName || 'Authorization';
|
|
259
|
-
const expectedValue = options.authHeaderValue || '';
|
|
260
|
-
const actualValue = req.headers[headerName.toLowerCase()];
|
|
261
|
-
if (actualValue !== expectedValue) {
|
|
262
|
-
res.status(401).json({ error: 'Unauthorized' });
|
|
263
|
-
return { noWebhookResponse: true };
|
|
264
|
-
}
|
|
265
|
-
}
|
|
266
|
-
if (options.authentication === 'basicAuth') {
|
|
267
|
-
const authHeader = req.headers.authorization;
|
|
268
|
-
if (!authHeader || !authHeader.startsWith('Basic ')) {
|
|
269
|
-
res.status(401).json({ error: 'Unauthorized' });
|
|
270
|
-
return { noWebhookResponse: true };
|
|
271
|
-
}
|
|
272
|
-
const base64Credentials = authHeader.split(' ')[1];
|
|
273
|
-
const credentials = Buffer.from(base64Credentials, 'base64').toString('utf-8');
|
|
274
|
-
const [username, password] = credentials.split(':');
|
|
275
|
-
if (username !== options.basicAuthUsername || password !== options.basicAuthPassword) {
|
|
276
|
-
res.status(401).json({ error: 'Unauthorized' });
|
|
277
|
-
return { noWebhookResponse: true };
|
|
278
|
-
}
|
|
279
|
-
}
|
|
280
|
-
// Set custom headers
|
|
281
|
-
if ((_a = options.responseHeaders) === null || _a === void 0 ? void 0 : _a.entries) {
|
|
282
|
-
for (const header of options.responseHeaders.entries) {
|
|
283
|
-
res.setHeader(header.name, header.value);
|
|
284
|
-
}
|
|
285
|
-
}
|
|
286
|
-
// Set content type
|
|
287
|
-
if (options.responseContentType) {
|
|
288
|
-
res.setHeader('Content-Type', options.responseContentType);
|
|
289
|
-
}
|
|
290
|
-
// Prepare webhook data
|
|
103
|
+
// Prepare the webhook data to pass to the next node
|
|
291
104
|
const webhookData = {
|
|
292
105
|
json: {
|
|
293
106
|
headers: req.headers,
|
|
294
107
|
params: req.params,
|
|
295
108
|
query: req.query,
|
|
296
109
|
body: req.body,
|
|
297
|
-
webhookUrl: req.url,
|
|
298
110
|
method: req.method,
|
|
299
|
-
timestamp: new Date().toISOString(),
|
|
300
111
|
},
|
|
301
112
|
};
|
|
113
|
+
// If body is the main payload, make it easier to access
|
|
114
|
+
if (req.body && typeof req.body === 'object' && !Buffer.isBuffer(req.body)) {
|
|
115
|
+
webhookData.json = {
|
|
116
|
+
...webhookData.json,
|
|
117
|
+
...req.body,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
302
120
|
// Handle binary data if present
|
|
303
121
|
if (req.body && Buffer.isBuffer(req.body)) {
|
|
304
122
|
webhookData.binary = {
|
|
305
123
|
data: await this.helpers.prepareBinaryData(req.body, 'data'),
|
|
306
124
|
};
|
|
307
125
|
}
|
|
308
|
-
// Prepare response
|
|
126
|
+
// Prepare response
|
|
309
127
|
let responseBody;
|
|
310
128
|
switch (responseData) {
|
|
311
129
|
case 'allEntries':
|
|
312
130
|
responseBody = webhookData.json;
|
|
313
131
|
break;
|
|
314
|
-
case 'firstEntryJson':
|
|
315
|
-
responseBody = webhookData.json.body;
|
|
316
|
-
break;
|
|
317
132
|
case 'customResponse':
|
|
318
|
-
const
|
|
133
|
+
const responseMessage = this.getNodeParameter('responseMessage', '{}');
|
|
319
134
|
try {
|
|
320
|
-
responseBody = JSON.parse(
|
|
135
|
+
responseBody = JSON.parse(responseMessage);
|
|
321
136
|
}
|
|
322
137
|
catch {
|
|
323
|
-
responseBody = { message:
|
|
138
|
+
responseBody = { message: responseMessage };
|
|
324
139
|
}
|
|
325
140
|
break;
|
|
326
141
|
case 'noData':
|
|
@@ -336,31 +151,6 @@ class WebhookWait {
|
|
|
336
151
|
workflowData: [[webhookData]],
|
|
337
152
|
};
|
|
338
153
|
}
|
|
339
|
-
async execute() {
|
|
340
|
-
const items = this.getInputData();
|
|
341
|
-
const path = this.getNodeParameter('path', 0);
|
|
342
|
-
const options = this.getNodeParameter('options', 0, {});
|
|
343
|
-
// Store input data in workflow static data so webhook can access it
|
|
344
|
-
const staticData = this.getWorkflowStaticData('node');
|
|
345
|
-
staticData.inputData = items;
|
|
346
|
-
staticData.mergeInputData = options.mergeInputData !== false;
|
|
347
|
-
// Add webhook info to output for reference
|
|
348
|
-
const outputItems = items.map((item) => ({
|
|
349
|
-
json: {
|
|
350
|
-
...item.json,
|
|
351
|
-
_webhookWait: {
|
|
352
|
-
path,
|
|
353
|
-
waitingForWebhook: true,
|
|
354
|
-
timestamp: new Date().toISOString(),
|
|
355
|
-
},
|
|
356
|
-
},
|
|
357
|
-
binary: item.binary,
|
|
358
|
-
}));
|
|
359
|
-
// Put execution to wait - will resume when webhook is called
|
|
360
|
-
const waitUntil = new Date(Date.now() + 365 * 24 * 60 * 60 * 1000); // 1 year max
|
|
361
|
-
await this.putExecutionToWait(waitUntil);
|
|
362
|
-
return [outputItems];
|
|
363
|
-
}
|
|
364
154
|
}
|
|
365
155
|
exports.WebhookWait = WebhookWait;
|
|
366
156
|
//# sourceMappingURL=WebhookWait.node.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WebhookWait.node.js","sourceRoot":"","sources":["../../../nodes/WebhookWait/WebhookWait.node.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"WebhookWait.node.js","sourceRoot":"","sources":["../../../nodes/WebhookWait/WebhookWait.node.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED