mirror of
https://github.com/cpvalente/ontime.git
synced 2026-08-06 16:03:52 +00:00
2586b0b10c
* addtime endpoint * create universal Subscription * add http integration * catch error from HTTP integration emit * unify osc and http validateSubscriptionEntry * add necessary endpoint for http subscription * make subscription part of modal generic * add http subscription to integration modal * remove log * Revert "addtime endpoint" This reverts commit4c039220dc. * reuse agent and test url compatibility * simplify retun path * add todo in UI * test for http protocol * import not needed yet * lint * fix merge * lint * fix httpPlaceholder * wip: prepare endpoints * wip: temporary fix to get form to work * disable HTTP integration if enabledOut==false * register/unregister http * refactor: subscription types and form register * refactor: validation * cleanup * cleanup * try GOT * allow https * split url and searchParams allow for post option * add options to post * add retry count * fix test * Revert "fix test" This reverts commit927e88370f. * Revert "add options to post" This reverts commit0523a68ef4. * Revert "split url and searchParams allow for post option" This reverts commit54ab8d4ffe. * missing retryCount in httpPlaceholder * remove global this * remove retry count * remove https --------- Co-authored-by: Carlos Valente <carlosvalente@pm.me>
100 lines
2.5 KiB
TypeScript
100 lines
2.5 KiB
TypeScript
import got from 'got';
|
|
|
|
import { HttpSettings, HttpSubscription, HttpSubscriptionOptions, LogOrigin } from 'ontime-types';
|
|
|
|
import IIntegration, { TimerLifeCycleKey } from './IIntegration.js';
|
|
import { parseTemplateNested } from './integrationUtils.js';
|
|
import { dbModel } from '../../models/dataModel.js';
|
|
import { logger } from '../../classes/Logger.js';
|
|
import { validateHttpSubscriptionObject } from '../../utils/parserFunctions.js';
|
|
|
|
type Action = TimerLifeCycleKey | string;
|
|
|
|
/**
|
|
* @description Class contains logic towards outgoing HTTP communications
|
|
* @class
|
|
*/
|
|
export class HttpIntegration implements IIntegration<HttpSubscriptionOptions> {
|
|
subscriptions: HttpSubscription;
|
|
constructor() {
|
|
this.subscriptions = dbModel.http.subscriptions;
|
|
}
|
|
|
|
/**
|
|
* Initializes httpClient
|
|
*/
|
|
init(config: HttpSettings) {
|
|
const { subscriptions, enabledOut } = config;
|
|
|
|
if (!enabledOut) {
|
|
return {
|
|
success: false,
|
|
message: 'HTTP output disabled',
|
|
};
|
|
}
|
|
|
|
this.initSubscriptions(subscriptions);
|
|
|
|
try {
|
|
return {
|
|
success: true,
|
|
message: `HTTP integration client ready`,
|
|
};
|
|
} catch (error) {
|
|
return {
|
|
success: false,
|
|
message: `Failed initialising HTTP integration: ${error}`,
|
|
};
|
|
}
|
|
}
|
|
|
|
initSubscriptions(subscriptionOptions: HttpSubscription) {
|
|
if (validateHttpSubscriptionObject(subscriptionOptions)) {
|
|
this.subscriptions = { ...subscriptionOptions };
|
|
}
|
|
}
|
|
|
|
dispatch(action: Action, state?: object) {
|
|
if (!action) {
|
|
return {
|
|
success: false,
|
|
message: 'HTTP called with no action',
|
|
};
|
|
}
|
|
|
|
// check subscriptions for action
|
|
const eventSubscriptions = this.subscriptions?.[action] || [];
|
|
|
|
eventSubscriptions.forEach((sub) => {
|
|
const { enabled, message } = sub;
|
|
if (enabled && message) {
|
|
const parsedMessage = parseTemplateNested(message, state || {});
|
|
try {
|
|
const parsedUrl = new URL(parsedMessage);
|
|
this.emit(parsedUrl);
|
|
} catch (err) {
|
|
logger.error(LogOrigin.Tx, `HTTP Integration: ${err}`);
|
|
return {
|
|
success: false,
|
|
message: `${err}`,
|
|
};
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
async emit(path: URL) {
|
|
try {
|
|
await got.get(path, {
|
|
retry: { limit: 0 },
|
|
});
|
|
} catch (err) {
|
|
logger.error(LogOrigin.Tx, `HTTP integration: ${err}`);
|
|
}
|
|
}
|
|
|
|
shutdown() {}
|
|
}
|
|
|
|
export const httpIntegration = new HttpIntegration();
|