Software: Apache/2.4.41 (Ubuntu). PHP/8.0.30 uname -a: Linux apirnd 5.4.0-204-generic #224-Ubuntu SMP Thu Dec 5 13:38:28 UTC 2024 x86_64 uid=33(www-data) gid=33(www-data) groups=33(www-data) Safe-mode: OFF (not secure) /var/www/html/wincloud_gateway/node_modules/strapi/lib/services/ drwxr-xr-x | |
| Viewing file: Select action/file-type: /**
* The event hub is Strapi's event control center.
*/
'use strict';
const debug = require('debug')('strapi:webhook');
const _ = require('lodash');
const fetch = require('node-fetch');
const WorkerQueue = require('./worker-queue');
const defaultConfiguration = {
defaultHeaders: {},
};
class WebhookRunner {
constructor({ eventHub, logger, configuration = {} }) {
debug('Initialized webhook runer');
this.eventHub = eventHub;
this.logger = logger;
this.webhooksMap = new Map();
this.listeners = new Map();
if (typeof configuration !== 'object') {
throw new Error(
'Invalid configuration provided to the webhookRunner.\nCheck your server.json -> webhooks configuration'
);
}
this.config = _.merge(defaultConfiguration, configuration);
this.queue = new WorkerQueue({ logger, concurency: 5 });
this.queue.subscribe(this.executeListener.bind(this));
}
deleteListener(event) {
debug(`Deleting listener for event '${event}'`);
if (this.listeners.has(event)) {
const fn = this.listeners.get(event);
this.eventHub.off(event, fn);
this.listeners.delete(event);
}
}
createListener(event) {
debug(`Creating listener for event '${event}'`);
if (this.listeners.has(event)) {
this.logger.error(
`The webhook runner is already listening for the event '${event}'. Did you mean to call .register() ?`
);
}
const listen = info => {
this.queue.enqueue({ event, info });
};
this.listeners.set(event, listen);
this.eventHub.on(event, listen);
}
async executeListener({ event, info }) {
debug(`Executing webhook for event '${event}'`);
const webhooks = this.webhooksMap.get(event) || [];
const activeWebhooks = webhooks.filter(
webhook => webhook.isEnabled === true
);
for (const webhook of activeWebhooks) {
await this.run(webhook, event, info).catch(error => {
this.logger.error('Error running webhook');
this.logger.error(error);
});
}
}
run(webhook, event, info = {}) {
const { url, headers } = webhook;
return fetch(url, {
method: 'post',
body: JSON.stringify({
event,
created_at: new Date(),
...info,
}),
headers: {
...this.config.defaultHeaders,
...headers,
'X-Strapi-Event': event,
'Content-Type': 'application/json',
},
timeout: 10000,
})
.then(async res => {
if (res.ok) {
return {
statusCode: res.status,
};
}
return {
statusCode: res.status,
message: await res.text(),
};
})
.catch(err => {
return {
statusCode: 500,
message: err.message,
};
});
}
add(webhook) {
debug(`Registering webhook '${webhook.id}'`);
const { events } = webhook;
events.forEach(event => {
if (this.webhooksMap.has(event)) {
this.webhooksMap.get(event).push(webhook);
} else {
this.webhooksMap.set(event, [webhook]);
this.createListener(event);
}
});
}
update(webhook) {
debug(`Refreshing webhook '${webhook.id}'`);
this.remove(webhook);
this.add(webhook);
}
remove(webhook) {
debug(`Unregistering webhook '${webhook.id}'`);
this.webhooksMap.forEach((webhooks, event) => {
const filteredWebhooks = webhooks.filter(
value => value.id !== webhook.id
);
// Cleanup hanging listeners
if (filteredWebhooks.length === 0) {
this.webhooksMap.delete(event);
this.deleteListener(event);
} else {
this.webhooksMap.set(event, filteredWebhooks);
}
});
}
}
/**
* Expose a factory function instead of the class
*/
module.exports = function createWebhookRunner(opts) {
return new WebhookRunner(opts);
};
|
:: Command execute :: | |
--[ c99shell v. 2.5 [PHP 8 Update] [24.05.2025] | Generation time: 0.0042 ]-- |