woodwing-assets
Version:
TypeScript client for interacting with the WoodWing Assets Server API
90 lines (89 loc) • 3.45 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.AssetsWebhook = void 0;
const express_1 = __importDefault(require("express"));
const crypto_1 = __importDefault(require("crypto"));
class AssetsWebhook {
constructor(config) {
this.config = config;
this.serverInstance = null;
}
listen(successHandler, errorHandler) {
const app = (0, express_1.default)();
app.use(express_1.default.raw({
type: '*/*',
limit: '1mb',
}));
app.post('/', (req, res, next) => {
const signature = req.header('x-hook-signature') ?? '';
const rawBody = req.body;
res.status(200).end(); // respond immediately
try {
if (!AssetsWebhook.validateSignature(signature, rawBody, this.config.secretToken)) {
return errorHandler('Invalid webhook signature. Webhook discarded.');
}
const payload = JSON.parse(rawBody.toString());
successHandler(payload);
}
catch (err) {
errorHandler(`Webhook processing error: ${err.message || err}`);
next(err);
}
});
this.serverInstance = app.listen(this.config.port, this.config.bindTo, () => {
console.info(`Webhook listener started on ${this.config.bindTo}:${this.config.port}`);
});
}
stop() {
return new Promise((resolve, reject) => {
if (this.serverInstance) {
this.serverInstance.close((err) => {
if (err) {
return reject(err);
}
console.info('Webhook listener stopped.');
this.serverInstance = null;
resolve();
});
}
else {
resolve();
}
});
}
static validateSignature(signature, data, secretToken) {
const hmac = crypto_1.default.createHmac('sha256', secretToken);
hmac.update(data);
const digest = hmac.digest('hex');
const bufA = Buffer.from(digest, 'utf8');
const bufB = Buffer.from(signature, 'utf8');
if (bufA.length !== bufB.length) {
return false;
}
try {
return crypto_1.default.timingSafeEqual(bufA, bufB);
}
catch {
return false;
}
}
}
exports.AssetsWebhook = AssetsWebhook;
AssetsWebhook.ASSET_CHECKIN = 'asset_checkin';
AssetsWebhook.ASSET_CHECKOUT = 'asset_checkout';
AssetsWebhook.ASSET_CREATE = 'asset_create';
AssetsWebhook.ASSET_CREATE_BY_COPY = 'asset_create_by_copy';
AssetsWebhook.ASSET_CREATE_FROM_FILESTORE_RESCUE = 'asset_create_from_filestore_rescue';
AssetsWebhook.ASSET_MOVE = 'asset_move';
AssetsWebhook.ASSET_PROMOTE = 'asset_promote';
AssetsWebhook.ASSET_REMOVE = 'asset_remove';
AssetsWebhook.ASSET_RENAME = 'asset_rename';
AssetsWebhook.ASSET_UNDO_CHECKOUT = 'asset_undo_checkout';
AssetsWebhook.ASSET_UPDATE_METADATA = 'asset_update_metadata';
AssetsWebhook.AUTHKEY_CREATE = 'authkey_create';
AssetsWebhook.AUTHKEY_REMOVE = 'authkey_remove';
AssetsWebhook.FOLDER_CREATE = 'folder_create';
AssetsWebhook.FOLDER_REMOVE = 'folder_remove';